Regulatory filings, XBRL financials and company data from securities regulators worldwide
One address for any MCP client. You sign in at mcp.financialfilings.com once, after adding it.
At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
| Access to | Read | Change |
|---|---|---|
| Your identity | ||
| Email address | ||
| Profile |
From the sign-in at mcp.financialfilings.com, as the endpoint publishes it. You approve it there.
Odel could not list its tools without signing in.
Official Model Context Protocol (MCP) server for the FinancialFilings API. Direct access from Claude (and any MCP-compatible client) to regulatory filings, financial data, and corporate information from listed companies worldwide. 16 curated tools by default (set
MCP_FULL_SURFACE=1for the full 46-tool surface). Free for any FinancialFilings account. Sourced from official regulators.
If you're an analyst, researcher, or anyone who wants to ask Claude about public-company filings:
https://mcp.financialfilings.com/mcpclaude mcp add --transport http financialreports https://mcp.financialfilings.com/mcpFull setup walkthrough with screenshots: financialfilings.com/integrations/claude/.
This is a remote MCP server — Streamable HTTP with OAuth (PKCE + Dynamic Client Registration). There is no API key to copy and no secret to store: connecting opens a browser sign-in with your FinancialFilings account.
Endpoint: https://mcp.financialfilings.com/mcp
Find your client below. If it isn't listed, use the Generic block at the end — the endpoint and OAuth flow are identical everywhere; only the config file differs.
Settings → Connectors → Add custom connector → URL: https://mcp.financialfilings.com/mcp. Sign in when prompted.
claude mcp add --transport http financialreports https://mcp.financialfilings.com/mcp
Run /mcp in-session to complete the browser sign-in.
Codex uses TOML. Add to ~/.codex/config.toml (or a project .codex/config.toml):
[mcp_servers.financialreports]
url = "https://mcp.financialfilings.com/mcp"
Then authenticate — Codex runs the OAuth browser flow for servers that support it:
codex mcp login financialreports
~/.cursor/mcp.json (global) or .cursor/mcp.json (per project):
{
"mcpServers": {
"financialreports": { "url": "https://mcp.financialfilings.com/mcp" }
}
}
OAuth runs in the browser on first use.
Project .kilocode/mcp.json (or the global MCP settings file):
{
"mcpServers": {
"financialreports": {
"type": "remote",
"url": "https://mcp.financialfilings.com/mcp"
}
}
}
opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"financialreports": {
"type": "remote",
"url": "https://mcp.financialfilings.com/mcp",
"enabled": true
}
}
}
~/.gemini/settings.json:
{
"mcpServers": {
"financialreports": { "httpUrl": "https://mcp.financialfilings.com/mcp" }
}
}
mcp_servers in your Hermes config (YAML):
mcp_servers:
financialreports:
url: "https://mcp.financialfilings.com/mcp"
auth: oauth
Most MCP-aware harnesses accept a mcpServers object. Point it at the endpoint over Streamable HTTP:
{
"mcpServers": {
"financialreports": {
"type": "streamable-http",
"url": "https://mcp.financialfilings.com/mcp"
}
}
}
Clients with native remote-MCP OAuth (Claude, Cursor, Windsurf, VS Code, opencode, Codex via codex mcp login) run the sign-in in a browser automatically. For OpenClaw and other MCP-aware harnesses, use this block with the connector URL and complete OAuth when prompted — see your client's own MCP configuration docs for the exact file location.
If signing in sends you to a page titled Client Not Registered — "The client ID … was not found in the server's client registry" — your client is presenting a registration this server no longer has.
Remove the connector and add it again. That is the only thing that resolves it, and it takes a few seconds:
| Client | What to do |
|---|---|
| ChatGPT / OpenAI | Settings → Connectors → remove FinancialFilings (listed as FinancialReports if you connected before the rename) → add it back with https://mcp.financialfilings.com/mcp and sign in again. |
| Claude.ai / Claude Desktop | Settings → Connectors → remove FinancialFilings (listed as FinancialReports if you connected before the rename) → re-add and sign in again. |
| Claude Code / Codex / Cursor / opencode | Remove and re-add the server (e.g. claude mcp remove financialreports, then re-add), or run the client's login command again (codex mcp login financialreports). |
Two things the error page itself doesn't tell you:
If you were affected on or after 14 July 2026: a cache failover dropped stored client registrations. Sign-ins have worked normally since — only connectors added before that date need the remove-and-re-add above.
16 LLM-callable tools by default — the curated surface analysts actually use:
| Domain | Tools | Use cases |
|---|---|---|
| Companies | 5 | Search by name/ticker/ISIN, retrieve full company profiles, get normalized financials, predict next annual report, batch-resolve a list of identifiers to company IDs |
| Filings | 4 | List, retrieve, fetch markdown content (capped at 150K chars), keyword-search inside a single filing |
| ISINs | 2 | Lookup by ISIN, list dual-listings |
| Reference taxonomy | 2 | Filing categories and filing types |
| Guides | 3 | Filing-type taxonomy, ISIC industry classification, and markdown-fetch strategy — callable references for tool-only clients that can't read MCP resources |
Set MCP_FULL_SURFACE=1 to restore the full 46-tool surface: the ISIC section/division/group/class hierarchy, the rest of the reference data (countries, languages, sources, line-item definitions, filing history), per-user watchlists, webhook subscriptions, the company-merge audit feed, and per-exchange security listings.
The shipped surface is generated from a committed, reviewed snapshot of the FinancialFilings OpenAPI schema (scripts/openapi.snapshot.json, pinned via FR_PIN_SCHEMA=1 in CI and the Docker build), so it's deterministic and never drifts silently on a rebuild.
The repository ships an Agent Skill — financial-filings-research — that teaches Claude how to compose these tools into the workflows analysts actually run: company lookup, filing summarization, multi-company financial comparison, ISIC industry screening, and filings monitoring. It activates automatically when the user mentions a company name, ticker, ISIN, filing type, or financial metric.
┌──────────────────┐ OAuth (PKCE + DCR) ┌──────────────────┐
│ Claude / MCP │ ───────────────────────► │ AWS Cognito │
│ client │ │ (user pool) │
└────────┬─────────┘ └────────┬─────────┘
│ Streamable HTTP /mcp │
│ + bearer token │
▼ │
┌──────────────────┐ verify subscription tier │
│ This server │ ───────────────────────────────────► │
│ (FastAPI + │ ▼
│ FastMCP) │ proxy bearer token ┌──────────────────┐
│ │ ─────────────────────────► │ api. │
│ 16 tools │ │ financial- │
│ generated from │ │ reports.eu │
│ OpenAPI schema │ │ (first-party) │
└──────────────────┘ └──────────────────┘
Key design decisions:
scripts/generate_mcp_tools.py reads the OpenAPI schema — pinned to a committed snapshot via FR_PIN_SCHEMA=1 in CI and the Docker build — and emits src/financial_reports_mcp.py. The default surface is curated to a focused 16-tool set; MCP_FULL_SURFACE=1 emits the full surface. Note that _PRUNED_EXCLUDE in the generator is a denylist, so a new upstream endpoint joins the curated surface unless the snapshot-refresh PR explicitly excludes it.sub → tier mappings to avoid hammering the FR API on every tool call./favicon.ico, /icon.png, /icon-{32,192,512}.png are served from this origin (proxied + cached from CDN) so connector UIs and the /consent page render without cross-origin CSP friction.Compliant with the MCP 2025-11-25 specification:
POST /mcp with MCP-Protocol-Version echo, 400 on unsupported versions/.well-known/oauth-protected-resource and /.well-known/oauth-protected-resource/mcptitle plus readOnlyHint or destructiveHintoutputSchema — six structured-content tools (companies_list, companies_retrieve, companies_financials_retrieve, filings_list, filings_retrieve, isins_list)WWW-Authenticate header for unauthenticated requestsinitialize responseCI verifies all of the above on every PR.
The list below is regenerated by scripts/generate_mcp_tools.py on every build. Do not hand-edit between the markers.
companies_financials_retrieve — Retrieve Company Financialscompanies_list — List Companiescompanies_next_annual_report_retrieve — Predict Next Annual Reportcompanies_resolve_create — Resolve Companies by Identifier (Batch)companies_retrieve — Retrieve Company Detailsfiling_categories_list — List Filing Categoriesfiling_types_list — List Filing Typesfilings_list — List Filingsfilings_markdown_retrieve — Retrieve Filing Markdownfilings_retrieve — Retrieve Filing Detailsisins_list — List ISINsisins_retrieve — Retrieve ISINOnce connected, try:
Self-hosting requires standing up your own AWS Cognito user pool and is primarily useful for forking + adapting to a different upstream API. For the FinancialFilings API specifically, the hosted server at mcp.financialfilings.com is the supported path.
Detailed self-hosting docs (Docker, Cognito setup, env vars, CDN/icon configuration): docs/SELF-HOSTING.md.
One-shot bootstrap (venv → deps → env check → generate → run):
cp .env.example .env # fill in Cognito values first; see docs/SELF-HOSTING.md
make dev # creates .venv, installs, validates env, regenerates, serves on :8000
# MCP endpoint: http://localhost:8000/mcp
Or step by step:
# 1. Setup
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt -r requirements-test.txt
# 2. Configure
cp .env.example .env # then fill in Cognito values; see docs/SELF-HOSTING.md
# 3. Generate the MCP module from the OpenAPI schema
python scripts/generate_mcp_tools.py
# 4. Run tests
pytest
# 5. Run locally
python -m uvicorn src.financial_reports_mcp:app --host 0.0.0.0 --port 8000
# MCP endpoint: http://localhost:8000/mcp
CI runs the full unit suite plus a Docker-Compose end-to-end test (with Redis) on every PR. See .github/workflows/ci.yml.
For iterating on the generator, tools, or prompts against a real backend without going through the Cognito OAuth dance every restart, the server supports a dev-only DEV_MODE_API_KEY env var. When set, JWT validation is skipped on the existing /mcp endpoint (both the subscription_required and _authorize_or_raise paths) and the key is forwarded as X-API-Key to API_BASE_URL.
This is a maintainer convenience, not a production auth path. The module refuses to import if MCP_BASE_URL contains a production hostname (mcp.financialfilings.com).
.env:
DEV_MODE_API_KEY=fr_pat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
MCP_BASE_URL=http://localhost:8000
make regen
python -m uvicorn src.financial_reports_mcp:app --host 0.0.0.0 --port 8000 --reload
claude mcp add --transport http financialreports-local http://localhost:8000/mcp
Production headless / API-key auth (parallel /mcp/apikey endpoint with per-request X-API-Key) is tracked in #28 and is a separate feature from this dev-mode shortcut.
# Regenerate tools after the OpenAPI schema changes
python scripts/generate_mcp_tools.py
# Run only fast unit tests
pytest tests/test_*.py
# Run end-to-end tests with Redis (requires Docker)
make e2e
This server is benchmarked by financial-reports/mcp-evals (private). Cross-model scorecards (task success, tool-selection accuracy, path consistency, tokens/turns/latency) live there, not here. Before merging changes to tool descriptions, Prompts, or the generator, run the harness against either prod or a local dev MCP and compare the scorecard.
What lives in this repo: deterministic prompt-registration tests at tests/eval/ — fast, no API keys, run on every PR. See tests/eval/README.md for the cross-repo workflow.
This server handles OAuth flows and bearer tokens. Found a vulnerability? Please don't open a public issue. See SECURITY.md for the responsible-disclosure process.
Server-side guarantees:
default-src 'none', only same-origin assets allowed).Contributions welcome. See CONTRIBUTING.md for development setup, the regenerate→test→PR workflow, and what kinds of changes are welcome (tests, docs, generator improvements, hand-tuned tool descriptions in scripts/generate_mcp_tools.py) versus what gets rejected (hand-edited src/financial_reports_mcp.py — it's auto-generated and overwritten on every build).
https://mcp.financialfilings.com/mcpMIT — © FinancialReports.
Special thanks to @itisaevalex for the original community-built MCP server, which served as the proof-of-concept that motivated this official version.
Built on FastMCP, FastAPI, and the Model Context Protocol.