datavidence-financials
OfficialThis MCP server lets an AI agent pull normalized, point-in-time US-GAAP financial statements for any SEC XBRL filer.
get_financials— income statement, balance sheet, and cash flow for one company and fiscal year; optionalas_offor as-originally-reported figures,include_provenancefor SEC accession/filed date/EDGAR citations, andinclude_ratiosfor margins, ROA/ROE, leverage.get_financials_batch— the same statements for up to 25 tickers/CIKs in one call, each with its own result or error, counted as a single quota unit.list_filings— a company's recent SEC filings, newest first, filterable by form (e.g.10-K) and limit, to discover available fiscal years.get_revisions— restatement history: how a fiscal year's figures changed across filings, with filing dates, forms, accessions, EDGAR links, and restatement amounts.search_companies— look up a ticker and CIK by company name or ticker (e.g. "berkshire" → BRK-B), needed before the other tools.get_usage— check the key's monthly quota (tier, limit, used, remaining, reset) without consuming quota.
Provides live SEC financial data through the RapidAPI gateway: the server can be pointed at the Datavidence Financials API's RapidAPI endpoint, sending your RapidAPI key in the X-RapidAPI-Key header so calls are metered against your RapidAPI plan (Free/Pro/Business tiers).
Click on "Deploy 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., "@datavidence-financialsGet AAPL's FY2023 financials with ratios."
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.
Datavidence Financials — MCP Server
Normalized US-GAAP financial statements for every SEC XBRL filer — point-in-time, as originally reported — as MCP tools for your AI agent (or a plain REST API).
Language models are good at reasoning about financial statements and bad at getting them. SEC EDGAR has the data, but its XBRL is a thicket of inconsistent tags, renamed concepts, and per-filer quirks — so agents either hallucinate the numbers or you spend weeks building a normalization layer. This is that layer: your agent asks for a company's financials and gets a clean, consistent answer — over the Model Context Protocol, or as a plain REST API.
⭐ If this is useful, please star the repo. It's a solo, early project, and stars are how other developers find it.

This is the open-source, AI-native layer for the Datavidence Financials API — a standalone stdio server that forwards over HTTPS to the REST API (bring your own key). The connector is MIT-licensed; the underlying API is a commercial service.
Try it in 30 seconds (no signup)
Run it with no clone using uv — it installs into a throwaway environment:
FL_API_KEY=sandbox_demo_key uvx datavidence-financialssandbox_demo_key returns sample data with no signup — good for a first run. Set FL_API_KEY to your real key for live SEC data. The server speaks MCP over stdio, so an MCP client (e.g. Claude Desktop, below) launches it.
Or install it as a persistent tool with pipx:
pipx install datavidence-financials
FL_API_KEY=sandbox_demo_key datavidence-financialsRelated MCP server: filingrail-mcp
Connect by URL (no install)
Clients that support remote MCP servers (streamable HTTP) can connect without installing anything:
URL | Key | Data |
| none | sample (AAPL FY2023) |
| your RapidAPI key, as | live SEC data, metered by RapidAPI against your plan |
Claude Code:
claude mcp add --transport http datavidence-financials \
https://mcp.financials.datavidence.ai/rapidapi/mcp \
--header "X-API-Key: YOUR_RAPIDAPI_KEY"For the sample data, use the /mcp URL and leave out the header.
claude.ai: add https://mcp.financials.datavidence.ai/mcp as a custom connector with no sign-in. claude.ai can't send an API key for most accounts yet, so it gets the sample data for now.
Why it's different
Point-in-time, as originally reported. Pass an
as_ofdate and you get the figures as they stood then — no look-ahead bias from later restatements. The thing backtests quietly get burned without.Normalized to one schema. EDGAR's XBRL tags drift between filers and change over the years. We map them to a single US-GAAP income statement, balance sheet, and cash flow — including the awkward cases (noncontrolling interest, mezzanine/temporary equity, non-calendar fiscal years) — so you never parse a filing.
Every SEC XBRL filer. Coverage is the whole SEC XBRL universe (~2009 to present), fetched and normalized on demand — any CIK with XBRL facts, not a curated subset.
Source-linked, too. Turn on provenance and every value carries its SEC accession, filed date, and a direct EDGAR URL — so the model cites the filing instead of inventing a number.
Honest scope: US-GAAP only (IFRS filers return a clear "unsupported" signal rather than wrong numbers); XBRL-era history (~2009 onward). And when a company reorganizes under a new holding entity, SEC's ticker map points only at the successor CIK — the earlier years stay under the predecessor, so the error tells you and you pass cik= directly.
Tools
get_financials— normalized income statement + balance sheet + cash flow for one company and fiscal year, from SEC EDGAR XBRL. Supportsas_of(point-in-time, as originally reported),include_provenance(per-value SEC accession, filed date, and direct EDGAR source URL), andinclude_ratios(margins, ROA/ROE, leverage).get_financials_batch— the same, for up to 25 companies in one call (comma-separated tickers/CIKs). Per-symbol results; counts as a single quota unit, so one bad symbol never fails the batch.list_filings— a company's recent SEC filings (newest first) from the EDGAR submissions index; filter by form (e.g.10-K). Use it to discover which fiscal years are available before callingget_financials.get_revisions— how a fiscal year's figures CHANGED across filings: every reported value with its filing date, form, SEC accession and EDGAR link, plus whether it was restated and by how much. Pfizer's FY2019 revenue was filed at $51.75B in 2020 and restated to $40.9B by 2022 — this is how you see that.search_companies— find a ticker and CIK by ticker or company name, for when you have "Berkshire" and needBRK-B. Use it before the tools above, which all require an identifier.get_usage— the key's monthly quota (tier, used, remaining, reset). Free to call; consumes no quota.
Errors surface the API's recovery_action hint, so agents self-correct.
Claude Desktop
Add to claude_desktop_config.json, then fully quit (Cmd+Q) and reopen Claude
Desktop — the tools appear:
{
"mcpServers": {
"datavidence-financials": {
"command": "uvx",
"args": ["datavidence-financials"],
"env": { "FL_API_KEY": "sandbox_demo_key" }
}
}
}Then ask, e.g., "Get AAPL's FY2023 income statement, balance sheet, and cash flow with ratios." Swap in your real key for live data.
Codex
Add to ~/.codex/config.toml, then start codex — the tools appear:
[mcp_servers.datavidence-financials]
command = "uvx"
args = ["datavidence-financials"]
env = { FL_API_KEY = "sandbox_demo_key" }
# uvx downloads the package on first run; allow more than Codex's 10 s default.
startup_timeout_sec = 30Swap in your real key for live data.
Or connect by URL instead (nothing to install; set DATAVIDENCE_API_KEY to your RapidAPI key):
[mcp_servers.datavidence-financials]
url = "https://mcp.financials.datavidence.ai/rapidapi/mcp"
bearer_token_env_var = "DATAVIDENCE_API_KEY"Leave out bearer_token_env_var and use https://mcp.financials.datavidence.ai/mcp for the sample data.
Configuration (environment variables)
Variable | Default | Notes |
| (none) | Your API key. |
|
| Point at a marketplace gateway for metered BYOK access. |
|
| Header to send the key in (e.g. |
|
| Per-request timeout, in seconds. |
Getting live data
The demo key returns sample data. For live figures, grab a key on RapidAPI: Free (1,500 calls/mo), Pro ($29 / 50k), Business ($99 / 300k). Full feature parity across tiers — they differ only by monthly call volume.
To use your RapidAPI key, set these three variables (in the env block of the Claude Desktop config, or the env table in Codex's config.toml):
FL_API_BASE_URL=https://datavidence-financials-api.p.rapidapi.com
FL_API_KEY_HEADER=X-RapidAPI-Key
FL_API_KEY=<your RapidAPI key>Your key is on RapidAPI under your app's Authorization page, or in any code snippet on the API's page. Calls are metered by RapidAPI against your plan. With a RapidAPI key, get_usage shows your RapidAPI plan and its monthly limit; RapidAPI meters your calls, so check how many you've used in your RapidAPI dashboard.
Run from source
pip install -e .
FL_API_KEY=sandbox_demo_key python -m mcp_server.server # stdio transportTests
pip install -e ".[dev]"
pytest29 tests, no network and no API key needed. They call every tool through the MCP SDK with the HTTP layer stubbed, check that an API error reaches the model with its recovery hint, and check that each tool declares all four behaviour hints (read-only, non-destructive, idempotent, open-world).
Privacy Policy
The connector runs on your machine, has no telemetry and stores nothing. When a tool is called it sends two things to the Datavidence Financials API: the tool's arguments (for example a ticker, a CIK, a fiscal year or a company-name search) and your API key, in a request header. It does not see your files or the rest of your conversation.
Where it goes:
https://api.financials.datavidence.aiby default. If you setFL_API_BASE_URLto the RapidAPI gateway, requests go through RapidAPI, under its own privacy policy.What the API records: for each request, the endpoint, HTTP status, response time, timestamp and IP address, tied to a hash of the API key (never the key itself).
Retention: usage logs are kept for 12 months.
Sharing: not sold; shared only with the marketplace gateway you subscribed through and the infrastructure provider that hosts the service.
Contact: admin@datavidence.ai
Full policy: https://financials.datavidence.ai/privacy
Feedback
Found a company where the numbers come back wrong, or a field/tool you need? Open an issue — the normalization edge cases are exactly the feedback that makes this better, and I read every one.
Links
Site & docs: https://financials.datavidence.ai
MCP quickstart: https://financials.datavidence.ai/mcp
MCP registry:
ai.datavidence/datavidence-financialsGet a key (RapidAPI): https://rapidapi.com/datavidence-ykNLbvGmT/api/datavidence-financials-api
Privacy policy: https://financials.datavidence.ai/privacy
Terms of service: https://financials.datavidence.ai/terms
Security: see
SECURITY.mdto report a vulnerability privately.
License
MIT © 2026 Datavidence LLC — see LICENSE. The connector is open-source; the underlying Datavidence Financials API is a commercial service.
Available Tools
6 toolsget_financialsGet financial statementsARead-onlyIdempotent
Retrieve normalized US-GAAP financial statements (income statement, balance sheet, cash flow) for one company and fiscal year, from SEC EDGAR XBRL.
Identify the company by ticker OR cik. Use as_of (ISO YYYY-MM-DD) to get
the figures as originally reported on that date — no look-ahead bias — for
backtests. Set include_provenance=true to attach, for every value, the SEC
accession, filed date, and a direct EDGAR source URL for citation. Set
include_ratios=true for margins, ROA/ROE, and leverage derived from the same
statements. Returns the normalized data object.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | No | SEC Central Index Key, e.g. "0000320193". Give this or `ticker`. | |
| year | Yes | Fiscal year, e.g. 2023. | |
| as_of | No | ISO date YYYY-MM-DD. Return figures as originally reported on that date (no look-ahead). Omit for the latest reported figures. | |
| ticker | No | Stock ticker, e.g. "AAPL". Give this or `cik`. | |
| include_ratios | No | Add margins, ROA/ROE and leverage computed from the same statements. | |
| include_provenance | No | Attach the SEC accession, filed date and EDGAR URL behind every value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds valuable behavioral context beyond those: 'no look-ahead bias' for as_of, the exact provenance details (accession, filed date, URL), and the fact that ratios are 'derived from the same statements'. This gives agents a deeper understanding of the tool's behavior without contradicting the 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?
The description is a single, well-structured paragraph that front-loads the core purpose before diving into parameter guidance. It covers all necessary details in about four sentences without redundancy. It is concise for a tool with six parameters, though slightly longer than minimal; still, every sentence earns its place.
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 moderate complexity (6 parameters, no output schema) and the annotations covering safety, the description is quite complete. It explains the return object type ('normalized data object') and lists the included statements (income statement, balance sheet, cash flow), which gives agents a sense of the output structure. It doesn't detail every possible return field, but with no output schema, this is acceptable. The absence of error conditions or rate limits is a minor gap, but not critical for a 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 description coverage is 100%, so the baseline is 3. The description adds significant meaning beyond the schema: it clarifies that ticker and cik are alternatives ('OR'), explains as_of as 'no look-ahead bias' for backtests, and specifies what include_provenance attaches (SEC accession, filed date, EDGAR URL). These enrich the parameter semantics beyond the schema's brief 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 states a specific verb ('Retrieve'), a clear resource ('normalized US-GAAP financial statements'), and a precise scope ('for one company and fiscal year'). This clearly distinguishes it from siblings like get_financials_batch (which implies batch/multiple) and get_revisions (which implies changes over time). The mention of SEC EDGAR XBRL adds a definitive source context, leaving no ambiguity about what this tool does.
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 gives clear contextual guidance: as_of is recommended for backtests (explicit use case) and include_provenance for citation. It also states 'Identify the company by ticker OR cik', clarifying the identifier options. However, it does not explicitly mention when to use alternatives like get_financials_batch or get_revisions, though the single-company/year scope implies those. The lack of explicit exclusions keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_financials_batchGet financial statements for many companiesARead-onlyIdempotent
Retrieve normalized US-GAAP financials for MANY companies in one call — use this to compare peers or scan a set for a single fiscal year.
Pass companies as comma-separated tickers (e.g. "AAPL,MSFT,GOOGL") and/or
ciks; up to 25 symbols total, all for the same year. as_of,
include_provenance, and include_ratios behave as in get_financials and
apply to every symbol. Each company returns its own result — either data or
an error with a recovery hint — so one bad symbol never fails the batch. The
whole call counts as a SINGLE request against your monthly quota, so prefer it
over many get_financials calls when you need several companies.
| Name | Required | Description | Default |
|---|---|---|---|
| ciks | No | Comma-separated SEC CIKs (25 symbols max, with `tickers`). | |
| year | Yes | Fiscal year, e.g. 2023. | |
| as_of | No | ISO date YYYY-MM-DD. Return figures as originally reported on that date (no look-ahead). Omit for the latest reported figures. | |
| tickers | No | Comma-separated tickers, e.g. "AAPL,MSFT,GOOGL" (25 symbols max, with `ciks`). | |
| include_ratios | No | Add margins, ROA/ROE and leverage computed from the same statements. | |
| include_provenance | No | Attach the SEC accession, filed date and EDGAR URL behind every value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already show read-only, open-world, and idempotent behaviortin less detail. The description adds significant behavioral context: per-company data-or-error responses with recovery hints, batch failure isolation, no-look-ahead as_of semantics, and single-request quota accounting. This exceeds what annotations provide.
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 compact and well-structured: it leads with the primary purpose, then covers input constraints, parameter behavior, error handling, and quota implications in a logical order. Every sentence contributes actionable information 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?
For a batch tool with no output schema, the description covers the key operational aspects: input format, limits, shared year constraint, per-symbol error handling, and quota implications. It also routes to get_financials for single-company needs. Nothing critical is missing for correct invocation.
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 all parameters are documented in the schema. The description adds value by explaining aggregate semantics not visible in the schema: the combined 25-symbol limit across tickers and ciks, all symbols sharing one year, and that shared parameters behave identically to get_financials.
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 states a specific verb and resource: 'Retrieve normalized US-GAAP financials for MANY companies in one call.' It clearly distinguishes itself from the sibling get_financials by emphasizing batch retrieval and peer comparison/scans.
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 tells when to use the tool: 'compare peers or scan a set for a single fiscal year,' and directly names the alternative get_financials while giving a concrete condition ('prefer it over many get_financials calls when you need several companies').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_revisionsGet restatement historyARead-onlyIdempotent
Show how a company's reported figures for a fiscal year CHANGED across filings — as originally reported, then each restatement.
A company re-reports every fiscal year as a comparative in later filings, and when a number changes, that is a restatement. This returns the full series for each metric: every reported value with the date it was filed, the form (10-K/10-Q), the SEC accession and a direct EDGAR link, plus whether it was restated and by how much.
Use it to answer "has this been restated?", to show a figure's history, or to
explain why a backtest on today's data would not match what an investor could
have known at the time. Identify the company by ticker OR cik; narrow with
metrics (comma-separated, e.g. "total_revenue,net_income") or omit for all.
get_financials returns the LATEST reported figure; its as_of parameter
returns the value as known on a date; this shows the whole series at once.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | No | SEC Central Index Key, e.g. "0000320193". Give this or `ticker`. | |
| year | Yes | Fiscal year, e.g. 2023. | |
| ticker | No | Stock ticker, e.g. "AAPL". Give this or `cik`. | |
| metrics | No | Comma-separated metric names, e.g. "total_revenue,net_income". Omit for all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond readOnly/idempotent annotations by detailing the exact returned content: every reported value with filing date, form, SEC accession, EDGAR link, restated flag, and magnitude. It also explains the restatement concept, which helps the agent interpret results correctly.
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 front-loaded with the core behavior, then returned fields, then use cases and parameters. Every sentence carries unique information, including the sibling contrast.
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?
Even without an output schema, the description enumerates the returned fields and fully covers parameter behavior. It addresses the closest alternative tool and typical use cases, so an agent has everything needed to select and invoke it correctly.
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 description coverage is 100%, so the schema already documents ticker/cik and metrics. The description reinforces the ticker-OR-cik requirement and provides a metrics example, but adds no substantive semantics beyond the schema.
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?
States a specific verb-resource pair: show how reported figures for a fiscal year changed across filings. It distinguishes itself from the closest sibling, get_financials, by contrasting the whole series with the latest figure.
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 lists when to use it: answering whether a figure was restated, showing a figure's history, and explaining backtest mismatches. It also names the alternative (get_financials and its as_of parameter) and explains why this tool is chosen instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageCheck API usageARead-onlyIdempotent
Report the calling API key's current monthly quota: tier, monthly limit, requests used and remaining this billing month, and when it resets.
Free to call — it does NOT consume quota. Check it before a large batch or a long run so you can pace requests and avoid a hard rate-limit (429).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering safety and idempotency. The description adds that it does not consume quota, which is a valuable behavioral detail beyond the annotations. However, it doesn't describe the exact format of the response (e.g., whether it's JSON, field names), relying on the output schema, which is not provided.
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 two concise sentences that front-load the key information (what it reports and that it's free), then adds usage guidance. No wasted words, every sentence earns its place.
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?
For a zero-parameter tool with strong annotations, the description is nearly complete. It explains the return content and the non-consuming nature. The only minor gap is the lack of an explicit mention of the response format, but since there's no output schema and the tool is simple, this is a small omission.
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 the description correctly focuses on what the tool returns and its side effects. With no parameters to describe, the description fully covers the input semantics, making it complete.
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 reports the calling API key's monthly quota details (tier, limit, usage, reset), which is specific and distinct from siblings like get_financials or list_filings. It uses a clear verb ('report') and resource ('calling API key's current monthly quota'), making it unambiguous.
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 says it is free to call and does not consume quota, and it recommends checking it before large batches to avoid rate limits. This provides clear context for when to use it, though it doesn't mention alternatives—but given this is a unique monitoring tool, that's acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filingsList SEC filingsARead-onlyIdempotent
List a company's recent SEC filings (newest first) from the EDGAR submissions index — a lean company header plus filing rows.
Identify the company by ticker OR cik. Optionally filter by form (e.g.
"10-K", prefix-matched so it includes amendments like "10-K/A") and cap the
number of rows with limit (1-100). Use this to discover which fiscal years
or filings are available before calling get_financials.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | No | SEC Central Index Key, e.g. "0000320193". Give this or `ticker`. | |
| form | No | Form type filter, prefix-matched, e.g. "10-K" (includes 10-K/A). | |
| limit | No | Maximum rows to return (1-100). | |
| ticker | No | Stock ticker, e.g. "AAPL". Give this or `cik`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds valuable behavioral context: newest-first ordering, prefix-matching for form types (e.g., includes 10-K/A), and output shape (a lean company header plus filing rows).
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 sentences, action-first, and includes all key details (identification, filters, limit, order, use case) without filler. Every sentence earns its place.
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?
For a 4-parameter filtered list tool with no output schema, the description explains input, filtering, ordering, and intended use before get_financials. It stops short of listing specific filing row fields, but the mention of discovering fiscal years/filings gives sufficient context for an agent to use it correctly.
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 description coverage is 100%, so the baseline is 3. The description repeats the ticker-or-cik relationship and prefix-matching behavior already present in the schema, adding minimal new semantics beyond the schema.
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?
States a specific verb ('List'), resource (SEC filings from the EDGAR submissions index), and order (newest first). It also names the sibling get_financials as the follow-up, clearly distinguishing this tool's role as a discovery step.
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 says 'Use this to discover which fiscal years or filings are available before calling get_financials,' providing a concrete use case and naming the alternative for actual financial data. The ticker-or-CIK identification and filter options further clarify when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_companiesSearch companiesARead-onlyIdempotent
Find a company's ticker and CIK by ticker or company name.
Use this FIRST whenever you have a company name but not its ticker or CIK — every other tool needs one of those. Searches SEC's master list: "berkshire" returns BRK-B with its CIK, "mobil" returns XOM.
Ranked so the obvious answer wins (an exact ticker beats a company whose name
merely contains the text). limit caps the number of matches (1-25).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum matches to return (1-25). | |
| query | Yes | Company name or ticker, e.g. "berkshire" or "XOM". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds useful behavioral context beyond the annotations: it searches SEC's master list, ranks exact ticker matches above name-contains matches, and caps results via limit. This is meaningful but not exhaustive (e.g., no mention of response structure or error cases).
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?
Four compact sentences, each earning its place: purpose, usage mandate, source/examples, and ranking/limit behavior. The structure front-loads the key instruction and uses line breaks to separate distinct ideas 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?
For a simple 2-parameter, read-only tool with no output schema, the description covers what, when, how, and expected output examples. It even explains ranking behavior and limit constraints, so an agent has everything needed to invoke it correctly and interpret results at a practical level.
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 description coverage is 100%, so the baseline is 3. The description adds functional meaning beyond the schema: query accepts either a name or ticker with real examples ('berkshire' returns BRK-B), and limit's purpose is reinforced ('caps the number of matches'). This elevates the parameter understanding beyond the basic schema definitions.
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?
States a specific verb and resource: finds a company's ticker and CIK by ticker or company name. It clearly positions itself as the prerequisite lookup tool that other sibling tools implicitly depend on, distinguishing it from get_financials, list_filings, etc.
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 instructs 'Use this FIRST whenever you have a company name but not its ticker or CIK' and notes 'every other tool needs one of those.' This gives an unambiguous when-to-use rule and implies when-not-to-use (when identifiers are already known), with concrete examples.
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.
5 tool updates
- Changed
get_financials6 fields changed- added
Input schema / properties / as_of / descriptionAdded value: +"ISO date YYYY-MM-DD. Return figures as originally reported on that date (no look-ahead). Omit for the latest reported figures." - added
Input schema / properties / cik / descriptionAdded value: +"SEC Central Index Key, e.g. \"0000320193\". Give this or `ticker`." - added
Input schema / properties / include_provenance / descriptionAdded value: +"Attach the SEC accession, filed date and EDGAR URL behind every value." - added
Input schema / properties / include_ratios / descriptionAdded value: +"Add margins, ROA/ROE and leverage computed from the same statements." - added
Input schema / properties / ticker / descriptionAdded value: +"Stock ticker, e.g. \"AAPL\". Give this or `cik`." - added
Input schema / properties / year / descriptionAdded value: +"Fiscal year, e.g. 2023."
- Changed
get_financials_batch6 fields changed- added
Input schema / properties / as_of / descriptionAdded value: +"ISO date YYYY-MM-DD. Return figures as originally reported on that date (no look-ahead). Omit for the latest reported figures." - added
Input schema / properties / ciks / descriptionAdded value: +"Comma-separated SEC CIKs (25 symbols max, with `tickers`)." - added
Input schema / properties / include_provenance / descriptionAdded value: +"Attach the SEC accession, filed date and EDGAR URL behind every value." - added
Input schema / properties / include_ratios / descriptionAdded value: +"Add margins, ROA/ROE and leverage computed from the same statements." - added
Input schema / properties / tickers / descriptionAdded value: +"Comma-separated tickers, e.g. \"AAPL,MSFT,GOOGL\" (25 symbols max, with `ciks`)." - added
Input schema / properties / year / descriptionAdded value: +"Fiscal year, e.g. 2023."
- Changed
get_revisions4 fields changed- added
Input schema / properties / cik / descriptionAdded value: +"SEC Central Index Key, e.g. \"0000320193\". Give this or `ticker`." - added
Input schema / properties / metrics / descriptionAdded value: +"Comma-separated metric names, e.g. \"total_revenue,net_income\". Omit for all." - added
Input schema / properties / ticker / descriptionAdded value: +"Stock ticker, e.g. \"AAPL\". Give this or `cik`." - added
Input schema / properties / year / descriptionAdded value: +"Fiscal year, e.g. 2023."
- Changed
list_filings4 fields changed- added
Input schema / properties / cik / descriptionAdded value: +"SEC Central Index Key, e.g. \"0000320193\". Give this or `ticker`." - added
Input schema / properties / form / descriptionAdded value: +"Form type filter, prefix-matched, e.g. \"10-K\" (includes 10-K/A)." - added
Input schema / properties / limit / descriptionAdded value: +"Maximum rows to return (1-100)." - added
Input schema / properties / ticker / descriptionAdded value: +"Stock ticker, e.g. \"AAPL\". Give this or `cik`."
- Changed
search_companies2 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum matches to return (1-25)." - added
Input schema / properties / query / descriptionAdded value: +"Company name or ticker, e.g. \"berkshire\" or \"XOM\"."
2 tool updates
- Added
get_revisions - Added
search_companies
4 tool updates
v0.1.2- First observed
get_financials - First observed
get_financials_batch - First observed
get_usage - First observed
list_filings
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose: company lookup, filing discovery, single financials, batch financials, restatement history, and quota monitoring. The descriptions explicitly disambiguate the most similar tools, such as get_financials versus get_revisions.
All tool names follow a consistent verb_noun snake_case pattern: get_financials, list_filings, get_financials_batch, get_revisions, search_companies, get_usage. The batch variant is clearly a modifier of get_financials rather than a breaking convention.
Six tools is well-scoped for a financial data server. Each tool earns its place: lookup, filing discovery, single retrieval, batch retrieval, revision history, and usage monitoring, with no meaningful redundancy.
The toolset covers the full natural workflow: resolve identifiers with search_companies, discover available filings with list_filings, retrieve financials individually or in batch, inspect restatements with get_revisions, and track quota with get_usage. No critical dead ends exist within the stated SEC EDGAR normalized-financials domain.
Maintenance
Related MCP Connectors
SEC EDGAR financials, insider trading, and economic data for AI agents. US GAAP + IFRS.
Primary-source SEC filing intelligence and financial/disclosure reconciliation for AI agents.
Certified SEC EDGAR fact memory for AI agents with zero hallucination and filing provenance.
Normalized SEC EDGAR data for AI agents: XBRL financials, 10-K risk diffs, Form 4 insider trades.
Related MCP Servers
- AlicenseAqualityBmaintenanceProvides access to SEC EDGAR financial data, enabling AI agents to fetch company filings, financial metrics, and narrative sections. It supports natural-language metric searching and extracts structured data from 10-K, 10-Q, and 8-K reports.650 PyPIMIT
- AlicenseNot gradedqualityCmaintenanceGive your AI agent live SEC EDGAR data: company financials, insider trades, 8-K events, 13F holdings, and the raw filings stream — all normalized to clean JSON, every number traceable back to its sec.gov source filing.30 PyPIMIT
- FlicenseNot gradedqualityDmaintenanceProvides AI assistants direct access to SEC EDGAR filing data — financials, filings, and filing text — with no API key required.-

hub-equity-mcpofficial
AlicenseNot gradedqualityDmaintenanceStandardizes XBRL financial data from US SEC and European ESEF filings for LLM agents, enabling querying normalized financial facts like revenue and total assets across issuers and taxonomies.Apache 2.0