Skip to main content
Glama

MCP-BRVM

Get the latest research data from the BRVM stock market (Bourse Régionale des Valeurs Mobilières — the UEMOA regional exchange).

This repository is a research-only Model Context Protocol server. Grok Bot can install it with AddMcpServer; agents such as The Wolf of BRVM can call quotes, issuer profiles, and history tools. There is no trade execution, order routing, or portfolio-advice feature.

Scope

In scope

Out of scope

Equity list and session quotes from brvm.org HTML

Order entry, broker APIs, paper trading

Issuer / listed-company profile from brvm.org HTML

Portfolio construction or “buy/sell” recommendations

Daily (and other) OHLCV from the Fredysessie/brvm-data-public GitHub CSV archive

Real-time FIX / paid vendor feeds

health for adapter liveness

Account, cash, or position tools

Contract notes (not invented features):

  • Official session quotes are EOD / last published table, not a guaranteed last-tick stream. The site often shows “Séance fermée” outside the Abidjan session.

  • Prices are XOF (FCFA).

  • get_issuer indexes /fr/emetteurs/societes-cotees and /fr/pays-societes-cotees/{country} cards, then fetches the issuer node. BRVM’s Drupal pager often repeats the same 10 issuers; country pages are the reliable live path. If no profile page matches, the tool returns quote-derived fields plus a notes[] explanation.

  • Fixture mode ships a representative snapshot (SNTS and a short equity tape) so tools stay callable when live HTML flakes.

Related MCP server: BRVM MCP Server

Terms of use / reproduction risk

Research and personal alerting only. This server is not affiliated with BRVM SA, the AMF-UMOA, or Fredysessie.

Scraping www.brvm.org HTML is a medium–high Terms of Service / reproduction risk. The site publishes market data for human browsing; it does not offer a public machine API. Automated HTML collection can conflict with the site’s terms, robots policy, or copyright in the page markup. Use a polite User-Agent, prefer fixture mode for CI and development, cache live pages (this server uses a 5-minute in-memory TTL), and do not republish BRVM pages wholesale.

The OHLCV adapter reads CSVs already published on GitHub (raw.githubusercontent.com/Fredysessie/brvm-data-public). That archive is a third-party reproduction of BRVM history — treat it as unofficial and verify before any research conclusion.

Do not use this server to place, size, or justify trades. Outputs are observational market data for research agents.

Tools

Tool

Adapter

Result

list_equities

brvm.org /fr/cours-actions/0

Listed tickers, names, volume, previous / open / last, change %

get_quote

same HTML table

One ticker’s session quote

get_ohlcv

Fredysessie CSV {TICKER}/{TICKER}.{period}.csv

OHLCV bars (daily default; weekly / monthly / quarterly / yearly)

get_issuer

brvm.org issuer listing + profile HTML

Legal name, sector, listing date, contacts when present

health

both adapters

Liveness, researchOnly: true, trading: false

Requirements

  • Node.js 20+

  • npm (or a compatible client)

Install and build

git clone https://github.com/LoicMessela/MCP-BRVM.git
cd MCP-BRVM
npm install
npm run build

npm run build compiles src/ to dist/. Fixtures stay in fixtures/ and are read from the package root at runtime.

Run

Default fixture mode (no live scrape). Stdio is the local MCP transport:

BRVM_DATA_MODE=fixture node dist/index.js

HTTP (Streamable HTTP at /mcp) for hosts that only accept a URL — including Grok Bot AddMcpServer:

BRVM_DATA_MODE=fixture node dist/index.js --http
# equivalent: MCP_TRANSPORT=http node dist/index.js

By default HTTP binds 127.0.0.1:8787. Override with MCP_HTTP_HOST, MCP_HTTP_PORT, and MCP_ALLOWED_HOSTS (comma-separated) when binding beyond localhost. Optional MCP_AUTH_TOKEN requires Authorization: Bearer <token> on /mcp.

GET /healthz is a process liveness URL (not an MCP tool).

Live vs fixture

BRVM_DATA_MODE

Behavior

fixture (default)

Parse checked-in HTML/CSV under fixtures/. Deterministic; used by npm run smoke. Issuer/OHLCV fixtures cover SNTS.

live

Fetch brvm.org HTML and Fredysessie CSVs. Subject to site changes, pagination gaps, and ToS risk.

BRVM_DATA_MODE=live node dist/index.js --http

Grok Bot — AddMcpServer

Grok Bot’s AddMcpServer form takes a name, a public HTTPS URL, and optional headers. It does not spawn a local stdio process. Host this server (or a tunnel to --http) so /mcp is reachable, then:

Name:     mcp-brvm
URL:      https://<your-host>/mcp
Headers:  Authorization: Bearer <MCP_AUTH_TOKEN>   # only if you set MCP_AUTH_TOKEN

Attach the connector to The Wolf of BRVM (or any research/alerts agent). Ask for quotes and history only — this package will not grow trading tools.

Local / terminal Grok (grok mcp add) can use stdio instead:

grok mcp add mcp-brvm -- node /absolute/path/to/MCP-BRVM/dist/index.js

Or HTTP:

grok mcp add --transport http mcp-brvm https://<your-host>/mcp

Cursor / other stdio hosts

{
  "mcpServers": {
    "mcp-brvm": {
      "command": "node",
      "args": ["/absolute/path/to/MCP-BRVM/dist/index.js"],
      "env": { "BRVM_DATA_MODE": "fixture" }
    }
  }
}

Smoke (proof)

After npm install and npm run build:

npm run smoke

This drives the official MCP client against createMcpHandler in process (no socket), with BRVM_DATA_MODE=fixture. It asserts that all five tools are registered and return structured results from the adapters.

Inspector (optional):

npx @modelcontextprotocol/inspector node dist/index.js

Layout

src/index.ts            stdio + HTTP entry
src/server.ts           createServer() + five tools
src/adapters/           brvm.org HTML, Fredysessie OHLCV
src/parse.ts            table / profile / CSV parsers
fixtures/               offline HTML + SNTS OHLCV

License

MIT (server code). Upstream market data remains the publishers’.

Available Tools

5 tools
get_issuerA

Get the brvm.org issuer profile for a listed equity (legal name, sector, listing date, contacts when present). Research-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerYesBRVM ticker, e.g. SNTS, ORAC, ECOC

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
nameYes
sectorYes
tickerYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full disclosure burden. 'Research-only' conveys a read-only, side-effect-free operation, and 'when present' acknowledges optionality in the data. It lacks details on unknown-ticker behavior or potential fetch failures, but for a simple getter this is solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler: the main action is stated first, with the content list in parentheses. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only tool with an output schema present, the description is sufficient: it names the source, target scope, data fields, and the research-only restriction. It does not discuss unknown-ticker behavior or contrast with siblings, but these are minor given the schema and sibling names.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the ticker parameter already includes examples (SNTS, ORAC, ECOC), so the description adds no extra parameter semantics. The baseline of 3 applies because the schema handles the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Get') and resource ('brvm.org issuer profile') and enumerates the content: legal name, sector, listing date, and contacts when present. This clearly differentiates it from sibling tools like get_quote and get_ohlcv, which concern pricing and history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Research-only' signals the appropriate context, and the described output makes plain that this tool serves fundamental-data needs rather than market data. However, it does not explicitly name alternatives or state when not to use it, so it provides clear context without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ohlcvA

Get historical OHLCV bars for a BRVM ticker from the Fredysessie/brvm-data-public GitHub CSV archive. Research-only; not a broker feed.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoInclusive end date YYYY-MM-DD
fromNoInclusive start date YYYY-MM-DD
limitNoMax bars to return from the end of the range (default 60)
periodNoAggregation period (default daily)
tickerYesBRVM ticker, e.g. SNTS, ORAC, ECOC

Output Schema

ParametersJSON Schema
NameRequiredDescription
barsYes
countYes
periodYes
tickerYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does reveal the source (GitHub CSV archive) and the non-broker-feed status, which is important context. However, it omits other relevant behavior such as authentication needs, rate limits, error behavior for invalid tickers, or whether the data is delayed/static, leaving clear gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no filler. The core action, resource, source, and key caveat are front-loaded and each clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the full input schema and an output schema, the description only needs to fill domain-specific gaps. It explains the data source and research-only intent, which is useful. It stays thin on when to prefer this over get_quote, but sibling tool names and the tool's own name partially compensate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, with all five parameters documented, so the baseline is 3. The description adds no additional parameter-level meaning beyond 'historical' and 'OHLCV', both already implied by the schema's period enum and tool name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Get') on a specific resource ('historical OHLCV bars for a BRVM ticker') and identifies the data source. It clearly differentiates from sibling tools like get_quote, which suggests current quotes, so an agent can distinguish this tool without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance about when to use this tool versus alternatives such as get_quote, list_equities, or get_issuer. The phrase 'Research-only; not a broker feed' is a caveat about the data's nature, not a routing rule. An agent must infer from the tool name that this is for historical series.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_quoteA

Get the latest official-session quote for one BRVM ticker from brvm.org HTML. Research/alerts only — not an executable price feed.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerYesBRVM ticker, e.g. SNTS, ORAC, ECOC

Output Schema

ParametersJSON Schema
NameRequiredDescription
lastYes
modeYes
nameYes
tickerYes
currencyYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the HTML source and the non-executable nature, but does not elaborate on potential delays, error handling, or what constitutes an 'official-session quote.' The single-sentence description offers some transparency but leaves gaps that annotations might otherwise cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that efficiently states the purpose and a critical limitation. It is front-loaded and avoids unnecessary details, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and an output schema, the description covers the essential context: what it does, the source, and its intended use. It could mention whether the quote is delayed or any specific freshness caveats, but the statement 'not an executable price feed' already implies a limitation. The presence of an output schema reduces the need to describe return values, so this is adequately complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides full coverage (100%) with a description for the ticker parameter, including examples. The tool description adds no additional parameter semantics beyond what the schema already states, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action ('Get the latest official-session quote'), the target (one BRVM ticker), and the source (brvm.org HTML). This differentiates it from sibling tools like get_ohlcv (which likely provides OHLCV data) and get_issuer (issuer info).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit context: it is for 'Research/alerts only' and explicitly states it is 'not an executable price feed,' which tells the agent when this tool is appropriate and when it isn't. However, it does not name alternative tools for other use cases, leaving the agent to infer from sibling names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

healthA

Liveness and adapter status. Confirms research-only mode and that quote/OHLCV adapters return data (fixtures or live).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
modeYes
nameYes
toolsYes
tradingYes
versionYes
adaptersYes
researchOnlyYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of behavioral disclosure. It discloses that this is a status check, that it confirms research-only mode, and that adapter data may be fixtures or live. This gives the agent an accurate model of what the tool does without overstating side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with no filler. The key noun phrase ('Liveness and adapter status') is front-loaded, and the second sentence adds the specific checks without repeating the tool name or the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter health check with an output schema present, the description is complete: it identifies the purpose, the mode being validated, the adapters involved, and the fixture/live distinction. Nothing an agent needs to decide whether to call this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so there is no parameter burden to document. The baseline of 4 applies because the description is not required to add meaning to nonexistent parameters; the only additional value would be describing the output, which the output schema already covers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource ('liveness and adapter status') and uses a concrete verb ('confirms') to state what the tool verifies. It is clearly distinct from the data-returning sibling tools like get_quote and get_ohlcv, which fetch market data rather than report system health.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a diagnostic use case—checking whether the service is alive and whether adapters are returning data—but it does not explicitly state when to prefer this over siblings or mention any preconditions. The role is clear enough, but the guidance is implicit rather than direct.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_equitiesA

List BRVM-listed equities from the official brvm.org quotes table (research-only). Optional query filters by ticker or name.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoOptional ticker or name substring

Output Schema

ParametersJSON Schema
NameRequiredDescription
asOfYes
modeYes
countYes
sourceYes
currencyYes
equitiesYes
sourceUrlYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so the description carries the full burden. It adds some transparency by naming the official brvm.org source and declaring the tool as 'research-only', which hints at a read-only, non-operational context. However, it does not disclose potential rate limits, authentication needs, data freshness, or response behavior beyond the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence of 15 words, leading with the core action and resource. Every clause earns its place: source, research-only constraint, and filter capability. There is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional parameter and an output schema, the description covers source, usage restriction, and filter behavior. It does not mention pagination or result limits, but the low complexity and presence of an output schema mean the description is sufficiently complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents the query parameter fully ('Optional ticker or name substring'), and the description's 'Optional query filters by ticker or name' largely duplicates that. No additional meaning like case sensitivity, matching rules, or wildcard behavior is provided. With 100% schema coverage, a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb and resource: 'List BRVM-listed equities from the official brvm.org quotes table'. The word 'List' distinguishes it from sibling tools like get_quote and get_ohlcv, which clearly target single-item data. The 'research-only' qualifier adds further specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through its 'research-only' qualifier and the optional filter, but it does not explicitly guide the agent on when to use this tool versus alternatives such as get_quote or get_ohlcv. There is no when-not-to-use or alternative routing, leaving the selection largely to inference.

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.

  1. 5 tool updatesv0.1.0
    • First observedget_issuer
    • First observedget_ohlcv
    • First observedget_quote
    • First observedhealth
    • First observedlist_equities

TDQS

A4.1/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct resource: listing equities, current quote, historical OHLCV, issuer profile, and system health. No overlap or ambiguity between tool purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (list_, get_, get_, get_, health). The single exception 'health' is a common and acceptable noun for a status check, maintaining overall predictability.

Tool Count5/5

With 5 tools, the set is well-scoped for a research-only BRVM equities server. Each tool serves a clear, non-redundant function, fitting the ideal 3-15 range.

Completeness4/5

The surface covers the core research workflows: enumeration, current quotes, historical data, and issuer profiles. Missing update/delete is appropriate for read-only research, though a market-wide summary or index tool could be a minor gap.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Provides AI agents with real-time financial market intelligence including stock quotes, crypto data, technical analysis, and portfolio insights. Enables natural language queries for current prices, technical indicators, asset comparisons, and portfolio analysis.
    17
    7
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to access live market data from the BRVM stock exchange, supporting queries on stock prices, indices, market summaries, and company information via the Model Context Protocol.
    7
    5
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides real-time stock quotes, historical data, and stock search via Yahoo Finance, enabling AI assistants to access and analyze financial market data.
    30 npm
    19
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server providing access to BRVM (West African regional stock exchange) public data, including real-time quotes, market summaries, dividends, fundamentals, volumes, and sector indices through 18 tools.
    1
    MIT