Read-only MCP server for the Bucharest Stock Exchange (BVB) public backend
Strong tool definitions with comprehensive descriptions (avg 250+ chars) and complete input schemas. All 9 tools have verb-noun naming (get_*, list_*, search_*) and detailed parameter documentation. Output schemas are documented in descriptions. Main gaps: no explicit error handling guidance, no parameter validation constraints (enums, ranges), and no output schema formalization in JSON Schema format. Tool composition is clean, each tool has one responsibility. Parameter descriptions are thorough but lack format/constraint details (e.g., 'unix seconds' is clear, but no min/max bounds stated).
Get the datafeed configuration: instrument types and resolutions. Returns ``symbols_types`` (each ``{name, value}``, where ``value`` is the one-letter type code: S=Actiuni/shares, B=Obligatiuni/bonds, R=Drepturi/rights, U=Unitati de fond/fund units, T=Structurate, F= Futures, I=Indici/indices) and ``supported_resolutions`` (the datafeed's advertised resolution vocabulary). Note: the config advertises a bare ``"D"`` for daily, but the history endpoint requires ``"1D"`` — get_candles handles that translation, so pass its friendly ``resolution`` values rather than these raw codes.
One-call bundle for a fundamental ("Buffett-style") analysis. Combines get_fundamentals with a price summary (last close, 52-week high/low, 1-year and ~5-year percent change) derived from daily history, so a caller has every input in a single call. It returns data, not a verdict — the analysis/judgement is left to the caller. Caveat (see ``note``): the inputs are a current valuation snapshot + dividend + ownership + price trend. BVB publishes no multi-year financial statements, so a full 10-year ROE/margin/FCF track record is not available from this source.
Fetch OHLCV candles for a BVB ticker. Returns bars oldest-first, each ``{time, open, high, low, close, volume}`` where ``time`` is an ISO 8601 UTC timestamp and ``volume`` is an integer. An empty list means the datafeed had no data for the window (not an error). The window is resolved as: ``to`` defaults to now; ``countback`` (when given) fixes the number of bars, otherwise it is derived from the ``from_``/``to`` span (capped at 5000) or defaults to 300; ``from_`` defaults to ``to`` minus ``countback`` bars. Daily bars reach back to the 1990s; intraday resolutions only cover a recent window.
No explicit error handling guidance. Tools lack recovery hints (e.g., 'ticker not found, try search_symbol() first'). LLMs cannot self-correct without actionable error messages.
Parameter constraints not formalized. 'resolution' accepts 1, 5, 15, 30, 60, 1D, 1W, 1M but no enum constraint in schema. 'limit' has min=1 but no max. LLMs may pass invalid values.
Output schemas documented in descriptions only, not formalized as JSON Schema. LLMs cannot parse response structure programmatically; they must infer from text.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2025-06-18+ | v2 |
Company details + valuation snapshot scraped from the detail page. Returns identity (ticker, name, isin, type, segment, category, status), the "Indicatori bursieri" valuation ratios (market_cap, per, pbv, eps, div_yield, dividend + dividend_year), issue info (shares_outstanding, nominal_value, share_capital, first_trade_date), and the ownership structure (shareholders: name/shares/percent). Amounts are in RON; indicators the page omits come back as null. Note: BVB does not expose multi-year income/balance/cash-flow statements as structured data, so there is no historical ROE/margin/FCF series here — pair this with get_candles (price history) for trend context.
Resolve one BVB ticker to its symbol metadata. Returns: ``ticker``, ``name`` (short name), ``description`` (issuer/full name), ``exchange`` (always "BVB"), ``type`` (e.g. "Shares"), ``session`` (trading hours, e.g. "0700-1830"), ``timezone`` ("Europe/Bucharest"), ``currency_code`` (e.g. "RON"), ``sector``, ``industry``, ``has_intraday`` (whether intraday bars exist), ``supported_resolutions``, and ``pricescale`` (the datafeed's price scaling factor). Errors if the ticker does not resolve.
List the BVB index universe (BET, BET-TR, BET-FI, ROTX, …). Scrapes the indices overview page. Returns up to ``limit`` indices, each ``{symbol, name, isin}``. Every index's ``symbol`` is returned; ``name`` and ``isin`` are populated only for indices BVB renders a server-side profile for (others load via client-side tabs) and are otherwise null. Pass a ``symbol`` to get_candles to chart an index.
List the instrument universe for a BVB market. Scrapes the exchange's market-list page (the datafeed search is capped and unsuitable for enumeration). Returns up to ``limit`` instruments, each ``{ticker, isin, name, market}`` — ``isin`` is the 12-character BVB ISIN (or null if the page omits it), ``name`` is the issuer, and ``market`` echoes the normalised market key.
Search the datafeed for symbols matching a query. Returns up to ``limit`` matches, each with ``symbol``, ``ticker``, ``full_name``, ``description`` (includes the ISIN as its trailing token), ``isin`` (extracted from the description for convenience), ``exchange``, and ``type`` (lowercase: "share", "bond", "structured", …). Note: the datafeed caps this search at roughly 30 results for broad queries, so it is a lookup aid, not a way to enumerate the full universe — use list_instruments (or list_indices) for that.
Get BVB's datafeed server time. Returns ``unix`` (server time in unix seconds) and ``iso`` (the same instant as an ISO 8601 UTC timestamp). Useful as a reachability check and to anchor ``from_``/``to`` windows for get_candles.
No pagination guidance for list tools. 'list_instruments' and 'list_indices' accept 'limit' but no offset/cursor or total_count in response. Large result sets may exceed context window.
Parameter 'from_' uses underscore suffix (Python convention) instead of 'from' or 'start_time'. Inconsistent with REST naming; may confuse LLMs expecting 'from' or 'start'.