The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Financial Hub MCP listing page.
A TypeScript MCP server for financial data aggregation. Connects any MCP-compatible AI assistant to SEC EDGAR filings, XBRL financial statements, FRED economic indicators, and real-time market data — with built-in XBRL normalization, fact deduplication, computed analytics, stock screening, and rate-limit protection.
All SEC EDGAR data comes directly from the SEC's free public APIs at data.sec.gov. No API key is required. The server automatically handles:
revenue resolves to Revenues, RevenueFromContractWithCustomerExcludingAssessedTax, SalesRevenueNet, and 11 other variants).FRED (Federal Reserve Economic Data) provides 800,000+ time series from 100+ sources. Requires a free API key from fred.stlouisfed.org. Rate limited to 120 requests/minute (enforced via 2 req/s token bucket). Includes a curated catalog of ~50 essential economic indicators across 9 categories for zero-API-call browsing.
Real-time stock quotes, company profiles, market news, insider transactions, and financial metrics via the Finnhub API. Free tier provides 30 API calls/second with no credit card required. The server rate-limits to 25 req/s to stay safely under the threshold. Quotes are never cached (stale prices are worse than no cache), while profiles (24h), news (5min), and financial metrics (1h) use appropriate TTLs.
In-memory LRU cache with TTL expiry reduces redundant API calls:
| Cache | TTL | Max Entries | Payload Size |
|---|---|---|---|
| Company facts | 1 hour | 10 | 20-50 MB each |
| Company submissions | 1 hour | 30 | ~50 KB each |
| Company tickers | 24 hours | 1 | ~3 MB |
| FRED series metadata | 6 hours | 100 | ~1 KB each |
| FRED observations | 1 hour | 50 | ~5 KB each |
| Market profiles | 24 hours | 50 | ~1 KB each |
| Market news | 5 minutes | 10 | ~5 KB each |
| Insider transactions | 1 hour | 30 | ~3 KB each |
| Basic financials | 1 hour | 30 | ~2 KB each |
Eviction is LRU — frequently accessed entries are promoted on read, so the least recently used entry is evicted when capacity is full. Expired entries are proactively swept on every write.
search_companies
query (string)get_company_filings
cik (string): SEC's unique company identifierformType (string, optional): Filter by form type (10-K, 10-Q, 8-K, DEF 14A)get_financial_metric
cik (string): Company CIK numberconcept (string): Friendly name or raw XBRL tagtaxonomy (string, optional): XBRL taxonomy (default: us-gaap)annualOnly (boolean, optional): Return only annual data pointsrevenue, net_income, gross_profit, operating_income, eps, total_assets, total_liabilities, stockholders_equity, cash, long_term_debt, current_assets, current_liabilities, operating_cash_flow, capex, shares_outstandingRevenues, NetIncomeLoss, Assets, etc.get_financial_summary
cik (string)get_company_facts_summary
cik (string): Company CIK numberlimit (number, optional): Max concepts to return (default 40, max 100)analyze_financials
cik (string)Promise.allSettled internally — individual metric failures don't crash the analysiscompare_companies
ciks (string[], 2-5 CIK numbers)search_filings
query (string): Search termsforms (string, optional): Comma-separated form typesstartDate (string, optional): YYYY-MM-DDendDate (string, optional): YYYY-MM-DDlimit (number, optional): Results per page (default 20, max 50)offset (number, optional): Skip N results for paginationscreen_stocks
exchange (string, optional): Filter by exchange (e.g. NYSE, Nasdaq)industry (string, optional): SIC industry group (technology, finance, healthcare, energy, manufacturing, retail, transportation, utilities, services, public_admin)nameContains (string, optional): Case-insensitive substring match on company nameminHealthScore (number, optional): Minimum health grade (0-100) from financial analysislimit (number, optional): Max results (default 20, max 50)get_corporate_events
cik (string): Company CIK numbersignificance (string, optional): Filter by high, medium, or low significancelimit (number, optional): Max events (default 15, max 50)search_economic_data
query (string)get_economic_dataget_economic_data
seriesId (string): FRED series IDstartDate (string, optional): YYYY-MM-DDendDate (string, optional): YYYY-MM-DDGDP, CPIAUCSL (CPI), UNRATE (unemployment), FEDFUNDS, DGS10 (10-year treasury), SP500, MORTGAGE30USget_stock_quote
symbol (string): Stock ticker (e.g. AAPL, MSFT, GOOGL)get_market_news
symbol (string, optional): Stock ticker for company-specific news. Omit for general market newscategory (string, optional): general, forex, crypto, merger (only for general news)get_insider_transactions
symbol (string): Stock ticker (e.g. AAPL, TSLA)get_company_overview
symbol (string): Stock ticker (e.g. AAPL, MSFT)sec://company/{ticker}
fred://catalog/{category}
fred://indicator/{seriesId}
financial_analysis
ticker (string)peer_comparison
ticker1 (string), ticker2 (string)economic_overview
All tools set MCP ToolAnnotations for safe agent composition:
| Hint | Value | Reason |
|---|---|---|
readOnlyHint | true | All tools are read-only — no data is modified |
destructiveHint | false | No data destruction |
idempotentHint | true | Same inputs produce same outputs |
openWorldHint | true | All tools make external API calls |
All tools return MCP-compliant error envelopes with isError: true on failure:
This allows the LLM to receive semantic error messages, correct parameters, and retry — rather than receiving opaque transport-level JSON-RPC errors that break the agent loop.
Add this to your claude_desktop_config.json:
For manual installation, add the configuration to your user-level MCP configuration file. Open the Command Palette (Ctrl + Shift + P) and run MCP: Open User Configuration, then add:
For more details about MCP configuration in VS Code, see the official VS Code MCP documentation.
| Variable | Required | Description |
|---|---|---|
SEC_USER_AGENT_EMAIL | Yes | Your email address for SEC EDGAR API compliance. The server will exit immediately if this is not set — SEC EDGAR bans requests with missing or generic User-Agent headers. |
FRED_API_KEY | For FRED tools | Free 32-character key from fred.stlouisfed.org. The server starts without it but FRED tools will fail at runtime with a clear error message. |
FINNHUB_API_KEY | For market tools | Free API key from finnhub.io. Required for stock quotes, market news, insider transactions, and company overviews. The server starts without it but market tools will fail at runtime. |
Raw XBRL data from SEC EDGAR goes through several processing stages:
revenue are mapped to all known XBRL tag variants across the us-gaap taxonomy.Run locally:
Pull requests welcome. See CONTRIBUTING.md for the development loop, commit style, and PR checklist. By participating you agree to the Code of Conduct.
Please report security issues privately — see SECURITY.md. Do not file public issues for vulnerabilities or credential leaks.
See CHANGELOG.md for release notes.
MIT — see LICENSE.