bvb-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bvb-mcpshow me the fundamentals for TLV"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
bvb-mcp
Read-only MCP server for the Bucharest Stock Exchange (Bursa de Valori
București, BVB). It exposes BVB's own public backend — the TradingView-UDF
datafeed at wapi.bvb.ro and the market-list pages at www.bvb.ro — as MCP
tools: instrument universe, symbol search and metadata, and OHLCV candles.
No account, no API key, no token: the BVB backend is public and unauthenticated. Every tool is read-only; there is nothing to trade through here.
Features
OHLCV candles for any BVB ticker or index (
get_candles), with a cleanresolutionparameter that hides the datafeed's1D-not-Dquirk.Full instrument universe scraped from the exchange's market-list pages (
list_instruments) — ticker + ISIN + name — plus the index universe (list_indices).Datafeed symbol search (
search_symbol) and per-symbol metadata (get_symbol_info), with diagnostics (server_time,datafeed_config).Browser-like
User-AgentandReferer: https://www.bvb.ro/on every request (defensive; no cookies, no token).One automatic retry on HTTP 429, honouring
Retry-After(capped at 30s).stdio transport by default, HTTP (
/mcp) on request.
Related MCP server: tokenbel/financial-data
Tools
All tools are read-only (there are no write tools):
Tool | Description |
| List a market's instrument universe (ticker + ISIN + name) by scraping the BVB market-list page. Markets: |
| List the BVB index universe (BET, BET-TR, BET-FI, ROTX, …) |
| Datafeed symbol search by ticker/name (server-capped at ~30 results) |
| Resolve a ticker to its metadata: name, type, session, timezone, currency, sector/industry |
| OHLCV candles for a ticker/index at minute/daily/weekly/monthly resolution |
| Company details + valuation snapshot scraped from the detail page: identity, Indicatori bursieri (market cap, P/E, P/BV, EPS, div yield, dividend), issue info, and ownership structure |
| One-call bundle for a fundamental ("Buffett-style") analysis: |
| Datafeed server time (reachability check) |
| Datafeed configuration: instrument-type codes and supported resolutions |
Notes on the data surface
Search is capped.
search_symbolmirrors the datafeed's own search, which returns roughly 30 results for broad queries. Uselist_instruments(orlist_indices) to enumerate the full universe.The
1Dquirk. The datafeed advertises a bareDfor daily bars but the history endpoint only accepts1D(bareDreturns HTTP 500).get_candlestakes a friendlyresolution(1,5,15,30,60,1D,1W,1M;D/W/Mare accepted too) and sends the correct code.Index metadata is partial.
list_indicesalways returns every index'ssymbol, butname/isinare populated only for the indices BVB renders a server-side profile card for; the rest load via client-side tabs and come back asnull.Rights / structured. BVB publishes no standalone "rights" market page, and "structured products" (datafeed type
T) are split across thewarrantsandcertificatespages —structuredis accepted as an alias forcertificates.No multi-year statements.
get_fundamentals/financial_summaryexpose BVB's current snapshot (valuation ratios, dividend, ownership) — BVB does not publish structured multi-year income/balance/cash-flow statements, so a full 10-year ROE/margin/FCF track record is not available. Pair withget_candlesfor the price trend; the client (LLM) does the analysis.
Configuration
All configuration is via environment variables, and all of it is optional — the BVB backend needs no credentials.
Variable | Default | Purpose |
|
| Datafeed base URL |
|
| Market-list site base URL |
| a Chrome-like UA |
|
|
| Language for the datafeed config endpoint |
Getting started
Run straight from the repository with uv:
uvx --from git+https://github.com/florinel-chis/bvb-mcp bvb-mcpThe server speaks stdio by default; add --transport http --port 8000 to serve
MCP over HTTP at /mcp instead. HTTP binds 127.0.0.1 by default, and a
non-loopback --host is refused unless --allow-remote is also passed — read
the Safety section before using that flag.
MCP client configuration
Add the server to your MCP client's configuration (stdio, via uvx):
{
"mcpServers": {
"bvb": {
"command": "uvx",
"args": ["--from", "git+https://github.com/florinel-chis/bvb-mcp", "bvb-mcp"]
}
}
}Or run the Docker image (build it first, see below):
{
"mcpServers": {
"bvb": {
"command": "docker",
"args": ["run", "-i", "--rm", "bvb-mcp"]
}
}
}Docker
A small (~200 MB) multi-stage image that works both ways an MCP client might use
it — spawned per call over stdio, or as a long-running HTTP server. Both
paths are verified against BVB's live backend. The container only needs outbound
network to reach wapi.bvb.ro / www.bvb.ro; no credentials or volumes.
Build:
docker build -t bvb-mcp .stdio — what an MCP client spawns (use bvb-mcp as the image name in the
docker config above):
docker run -i --rm bvb-mcpHTTP — a shared, long-running server at http://127.0.0.1:8000/mcp/:
docker run --rm -p 127.0.0.1:8000:8000 bvb-mcp \
--transport http --host 0.0.0.0 --port 8000 --allow-remote--host 0.0.0.0 binds inside the container so the port mapping works — which is
why --allow-remote is needed; the 127.0.0.1: prefix on -p keeps the
endpoint reachable from this machine only (it is unauthenticated — see Safety).
If host port 8000 is taken, map another, e.g. -p 127.0.0.1:8010:8000.
Share without a registry — hand the image to someone as a file they
docker load, no Docker Hub / GHCR needed:
docker save bvb-mcp:latest | gzip > bvb-mcp.tar.gz # you: export
docker load < bvb-mcp.tar.gz # them: image is now localSafety
The HTTP transport has no authentication: anyone who can reach the
/mcpendpoint can call every tool. Keep it bound to127.0.0.1(the CLI default; with Docker, publish as-p 127.0.0.1:8000:8000) or put it behind an authenticating reverse proxy. Never expose it directly on a public network.All tools are read-only — this server cannot place orders or move money.
Use at your own risk. Nothing here is investment advice.
Data & terms
This server ships code, not data. It fetches from BVB's own public backend at request time and returns whatever BVB serves. Redistributing or otherwise using BVB price data is subject to BVB's terms and any applicable market-data licensing, and is your responsibility as the operator — the software makes no representation about your right to store, redistribute, or trade on the data it relays.
Development
uv sync
uv run pytest -q
uv run ruff check .Tests are fully offline: HTTP is stubbed with respx against captured BVB
response fixtures in tests/fixtures/.
License
MIT
Available Tools
9 toolsdatafeed_configARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses full return structure and a known inconsistency (D vs 1D). No contradictions with readOnlyHint annotation. Adds context beyond annotations by explaining the resolution issue.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose. Some detail in listing types could be condensed, but overall efficient and informative. The note is essential and well-placed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and an output schema, the description fully explains the return values and a critical caveat. No gaps remain for agent understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; schema coverage 100%. Baseline 4 per guidelines. Description adds no parameter info, but none needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Get the datafeed configuration: instrument types and resolutions.' Specifies exact return fields and their meanings. Distinguishes from sibling tool get_candles by noting resolution translation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit note about discrepancy between 'D' and '1D' and advises to use get_candles for friendly resolution values. Guides agent on when to use this tool (for config) and when to avoid raw codes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
financial_summaryARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | BVB ticker to summarise, e.g. "TLV" or "ATB". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds that the tool returns data, not a verdict, and highlights a data limitation (no multi-year financial statements). This gives useful behavioral context beyond read-only confirmation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: three focused sentences that front-load the purpose and include a caveat. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (not shown), the description does not need to detail return fields. It explains the components (fundamentals + price summary) and the caveat, making it complete for a read-only bundle tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already describes the ticker parameter with examples. The description adds no additional semantic meaning beyond what the schema provides, so baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is a 'one-call bundle for a fundamental analysis' that combines get_fundamentals with a price summary, distinguishing it from sibling tools like get_fundamentals or get_candles. The verb is implicit but the resource is well-defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context as a bundle for convenience and notes a caveat about missing multi-year data. It implies use when both fundamentals and price trends are needed in one call, but does not explicitly state when not to use or name alternatives beyond the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_candlesARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Window end, unix seconds (UTC). Defaults to now. | |
| from_ | No | Window start, unix seconds (UTC). Derived from countback if omitted. | |
| ticker | Yes | BVB ticker, e.g. "TLV", "SNP", or an index like "BET". | |
| adjusted | No | Split/dividend-adjusted prices (True) or raw (False). | |
| currency | No | Quote currency code, e.g. 'RON'. | RON |
| countback | No | Number of bars ending at 'to'. Overrides the from/to span when set; derived from the span (or defaults to 300) otherwise. | |
| resolution | No | Bar size (case-insensitive). Minutes: 1, 5, 15, 30, 60. Daily: 1D (or D). Weekly: 1W. Monthly: 1M. | 1D |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds value by detailing return format (oldest-first), empty list behavior, and window resolution logic. It does not contradict annotations and provides context beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise, with a clear structure that separates return format from window resolution logic. It could be slightly more structured (e.g., bullet points), but it remains focused and front-loaded with the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, high schema coverage, and an output schema, the description covers essential behaviors including return format, edge cases (empty list), and window resolution. It is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover all 7 parameters at 100%. The description adds significant meaning by explaining the window resolution algorithm, default behaviors for to, countback, from_, and how they interact, which goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it fetches OHLCV candles for a BVB ticker, specifying the return format and behavior when no data. It distinguishes itself from sibling tools like get_symbol_info or list_instruments by focusing on candlestick data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the window resolution logic in detail, including defaults and how parameters interact. However, it does not explicitly state when to use this tool over alternatives like get_fundamentals or search_symbol, so it misses explicit exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fundamentalsARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | BVB ticker, e.g. "TLV", "SNP", or "ATB". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses that data is scraped (read-only), indicates amounts in RON, explains null handling for omitted indicators, and aligns with annotations (readOnlyHint=true). Adds value beyond annotations by detailing data source and behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with bulleted lists and clear sections, but is slightly verbose. Every sentence adds value, but could be trimmed for brevity while maintaining clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and description already covers main data categories, null handling, and data source limitations. No missing essential details for proper tool usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and description provides example tickers (TLV, SNP, ATB) which add helpful context beyond the schema description. Parameter semantics are clear but description does not significantly extend meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns company details and valuation snapshot from the detail page, listing specific data categories like valuation ratios, issue info, and ownership structure. It distinguishes from sibling tools like get_candles by noting it provides fundamental data rather than price history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly notes that multi-year financial statements are not available and suggests pairing with get_candles for trend context. This provides clear guidance on when to use and what alternatives exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_symbol_infoARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | BVB ticker, e.g. "TLV", "SNP", or "BRD". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description acknowledges the read-only nature (consistent with readOnlyHint) and adds that errors occur for unresolvable tickers. It lists all returned fields, providing transparency beyond the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a clear opening sentence followed by a bulleted list of returned fields. Every sentence adds value, and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, has output schema), the description is fully complete. It covers the single parameter, lists all return fields, and notes an error condition. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the input schema already describes the parameter. The description adds only examples (e.g., 'TLV') but does not provide extra semantic value beyond what the schema offers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Resolve one BVB ticker to its symbol metadata.' It specifies the action (resolve) and resource (ticker metadata), and is distinct from sibling tools like search_symbol (searching) and get_candles (candles).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a specific BVB ticker is known and metadata is needed, but does not explicitly state when to use or not use this tool versus alternatives. No exclusions or when-not-to guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_indicesARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of indices to return |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses data source ('Scrapes the indices overview page') and explains nullable fields (name, isin) when server-side profile missing, beyond the readOnlyHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Few sentences, front-loaded with purpose, efficiently conveys key usage and behavior without superfluous text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With output schema present, description still adds value by explaining return fields and null behavior; covers main logic and edge cases well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers limit parameter 100%; description adds minimal extra meaning ('Returns up to limit indices') but no new semantic detail beyond what schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description specifies 'List the BVB index universe' with concrete examples (BET, BET-TR) and distinguishes from sibling get_candles by showing how the output is used.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear use case (list indices) and explicitly connects to get_candles for charting, but does not contrast with other siblings like list_instruments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_instrumentsARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of instruments to return | |
| market | No | Instrument market: 'shares', 'bonds', 'fund-units' (ETFs), 'warrants', or 'certificates' ('structured'). For indices use list_indices. | shares |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. Description adds context about scraping behavior, limit handling, and that ISIN may be null. No contradictions. Adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two well-organized paragraphs. First sentence states purpose, second provides technical details. Could be slightly more compact, but effectively front-loaded and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description is complete. It explains the scraping approach, limit, output fields, and null handling. No gaps for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description adds meaning by explaining the output fields (ticker, isin, name, market) and that ISIN can be null, going beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description precisely states it lists the instrument universe for a BVB market, using specific verbs and resources. It distinguishes from siblings by mentioning 'For indices use list_indices' and implies differentiation from search_symbol.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (enumeration of instruments by market) and when not (capped datafeed search). Provides clear alternative for indices via list_indices and explains rationale for scraping.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_symbolARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| query | Yes | Free-text query matched against ticker and name, e.g. "TLV" or "banca". |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only. Description adds details on result cap, field types, and that limit controls max matches. Provides useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise paragraphs with front-loaded purpose and a clear note. No extraneous text; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all needed aspects: purpose, usage, constraints, return fields. Output schema exists, so return format is covered. Complete for a low-complexity read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already describes both parameters with examples. Description does not add new parameter-level information; it only references limit in context of result count. With 100% schema coverage, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it searches for symbols matching a query, lists returned fields, and distinguishes from sibling tools list_instruments/list_indices for enumeration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly notes it is a lookup aid (not for full enumeration) and suggests using list_instruments or list_indices for that purpose. Also mentions result cap at ~30.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_timeARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, and the description confirms a read operation returning two timestamps. No hidden side effects or ambiguities exist; the behavior is fully disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—two sentences that fully convey the tool's purpose, return values, and use cases without superfluous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately covers all relevant aspects: purpose, output format, and usage context. Given the tool's simplicity and the presence of an output schema, no additional details are necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is 100%. The description does not need to add parameter details, earning a baseline score of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves server time with specific return fields (unix and iso). It stands apart from sibling tools like get_candles or search_symbol by focusing on a simple reachability check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly mentions two use cases: reachability check and anchoring time windows for get_candles. While it doesn't list when not to use it, the provided guidance is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
9 tool updates
v0.1.0- First observed
datafeed_config - First observed
financial_summary - First observed
get_candles - First observed
get_fundamentals - First observed
get_symbol_info - First observed
list_indices - First observed
list_instruments - First observed
search_symbol - First observed
server_time
TDQS
Each tool targets a distinct aspect of the BVB datafeed: configuration, symbol lookup, time, search, candles, instrument/indices listing, fundamentals, and a bundled summary. No two tools overlap in purpose.
Eight of nine tools follow a consistent verb_noun pattern (e.g., get_symbol_info, list_instruments). Only financial_summary deviates, but it is still descriptive. Minor inconsistency.
Nine tools cover all core functionalities for a stock exchange datafeed: configuration, symbol info, search, time, candles, instrument/indices listing, fundamentals. Each tool serves a clear and necessary purpose.
The toolset covers basic CRUD for market data: search, list, get candles, get fundamentals. Missing depth like historical financial statements is noted in descriptions as unavailable, so the gap is acknowledged. Minor but acceptable.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read-only MCP server for Belarusian securities: tokens, shares, bonds, companies.
Read-only MCP server for The Quiet Protocol's engines, benchmarks, proof, and business data.
Real-time crypto market data: candles, tickers, orderbooks across 13+ exchanges via MCP.
brapi.dev MCP — Brazilian stock + crypto + ETF quotes.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceReal-time financial market data MCP server. Stocks, crypto, technicals, sentiment, FDA calendar. No API keys required.-
- AlicenseNot gradedqualityDmaintenanceRead-only MCP server providing access to Belarusian securities data: tokens, shares, bonds, companies, ticker search, and company name or UNP search.MIT
- AlicenseAqualityBmaintenanceRead-only MCP server for Blocksize market data discovery, pricing, documentation, and x402 endpoint lookup across crypto, equities, FX, and metals.71MIT
- AlicenseNot gradedqualityDmaintenanceProvides Brazilian financial market data (stocks, dividends, FIIs, crypto, exchange rates, macro indicators) from B3. Works with any MCP client via HTTP, read-only.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/florinel-chis/bvb-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server