MCP server for clean, normalized SEC EDGAR, FRED, ETF and index data
Project description
EdgarMCP
An MCP server that gives AI agents clean, normalized access to financial data: company fundamentals and insider trades from SEC EDGAR, macro series from FRED, real-time quotes via the Tradernet WebSocket feed, ETF/fund holdings from SEC NPORT-P, look-through analytics, and index snapshots.
Raw sources (XBRL, bulky filing HTML, ownership XML) are expensive and error-prone for agents — they burn tokens and trip up on parsing. EdgarMCP returns agent-ready JSON.
Installation
pip install mcp-edgar
This installs the edgarmcp console script (a stdio MCP server).
Quick start
Add it to an MCP client. For Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"edgarmcp": {
"command": "edgarmcp",
"env": {
"FRED_API_KEY": "your-free-fred-key",
"OPENFIGI_API_KEY": "optional-openfigi-key"
}
}
}
}
Both keys are optional: without FRED_API_KEY the FRED-backed tools degrade gracefully;
without OPENFIGI_API_KEY holding resolution runs in anonymous mode.
Tools
| Tool | Purpose |
|---|---|
get_company_facts(ticker) |
Normalized fundamentals (revenue, EPS, margins, debt) |
get_financial_statement(ticker, statement, period) |
Income/balance/cashflow as structured JSON |
get_filings(ticker, form_type, limit) |
Recent SEC filings (10-K/10-Q/8-K) with metadata and document URLs |
parse_filing_section(url, section) |
Extract a 10-K section (Risk Factors, MD&A) as clean text |
get_insider_trades(ticker, limit) |
Form 3/4/5 insider transactions (who, role, buy/sell, volume) |
get_macro_series(series_id, start, end) |
FRED macro series (rates, inflation, unemployment) with metadata |
get_quote(ticker) |
Real-time L1 quote (last/bid/ask/volume) via the Tradernet WebSocket feed |
get_etf_holdings(ticker, limit) |
ETF/fund holdings (top by weight) + AUM, NAV, asset/country mix from SEC NPORT-P |
get_holdings_analysis(symbol, limit) |
Look-through of an ETF/index: sector breakdown + weighted net-margin/ROE with coverage |
get_index(index) |
Index snapshot (S&P 500, NASDAQ-100, Dow, NASDAQ Composite): level from FRED, tracking ETF, holdings preview |
Configuration
| Variable | Description | Default |
|---|---|---|
EDGAR_USER_AGENT |
User-Agent for SEC requests | EdgarMCP/0.1 (contact: info+sec@birthday.tools) |
EDGAR_RATE_LIMIT |
Requests per second | 10 |
EDGAR_CACHE_DIR |
File cache directory | edgar_cache |
FRED_API_KEY |
Free FRED key for get_macro_series / index levels |
— |
OPENFIGI_API_KEY |
Optional OpenFIGI key for higher CUSIP/ISIN rate limit | — |
Variables are read from the environment; locally you can put them in a .env file.
Architecture
Three isolated layers: a platform-independent data layer (HTTP client with a host allowlist, ticker/name/CUSIP/ISIN resolution, XBRL normalizers, filing/ownership/NPORT-P parsers, FRED, the Tradernet WebSocket client, OpenFIGI identifier mapping, look-through and index analytics); a cache layer (aggressive caching of immutable filings and FIGI mappings; mutable FRED series are not cached); and a thin MCP layer. The data layer knows nothing about MCP and ports unchanged between a marketplace and self-hosting.
Security
- Outbound requests are restricted to an HTTPS host allowlist (SSRF defense), centralized across all sources (SEC, FRED, OpenFIGI).
- Ownership and NPORT XML is parsed with
defusedxml(XXE / billion-laughs defense). - Secrets (FRED / OpenFIGI keys) are redacted from error messages and never placed in URLs or cache keys.
- Real-time quotes come from Tradernet's public anonymous WebSocket feed
(
wss://wss.tradernet.com/); a dedicated client with a hardcoded URL. - CUSIP/ISIN holding resolution goes through OpenFIGI (
api.openfigi.com, allowlisted); on failure it falls back to name matching.
Data licenses
SEC EDGAR data is public domain, used with a descriptive User-Agent and the 10 req/s
limit. FRED data is provided by the Federal Reserve Bank of St. Louis under its
terms of use. Real-time quotes come from Tradernet's
public anonymous WebSocket feed. CUSIP/ISIN → ticker mapping uses
OpenFIGI (Bloomberg; free tier, 25 req/min anonymous,
250 req/min with a key).
License
MIT © 2026 birthday.tools
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcp_edgar-0.1.1.tar.gz.
File metadata
- Download URL: mcp_edgar-0.1.1.tar.gz
- Upload date:
- Size: 40.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
83785756c4af97e9fc55d18d29ebb722c6fa3358d046ddff13eaaaa5bad2f892
|
|
| MD5 |
2ad19e9165bffaf0c5f7ee58258a02a1
|
|
| BLAKE2b-256 |
02097b06e4ffc4207f2df77d45507d792d4fcb3eeab6f32100ed931828a2248a
|
Provenance
The following attestation bundles were made for mcp_edgar-0.1.1.tar.gz:
Publisher:
publish.yml on birthday-tools/edgarmcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_edgar-0.1.1.tar.gz -
Subject digest:
83785756c4af97e9fc55d18d29ebb722c6fa3358d046ddff13eaaaa5bad2f892 - Sigstore transparency entry: 1895327039
- Sigstore integration time:
-
Permalink:
birthday-tools/edgarmcp@942b4f20dd1db192822e927ccfc0ce1400caa293 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/birthday-tools
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@942b4f20dd1db192822e927ccfc0ce1400caa293 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mcp_edgar-0.1.1-py3-none-any.whl.
File metadata
- Download URL: mcp_edgar-0.1.1-py3-none-any.whl
- Upload date:
- Size: 25.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a3e6d7ccb093192f32cfc07290b9cdf96dfe9e80d6596e3db579d4ddcc231d3
|
|
| MD5 |
2b552379f4b6fde06beaacf345be91e5
|
|
| BLAKE2b-256 |
7c28cf0be76d964aa8b2d5027cf74917e3746059dd8fea2dc631eb447543b5c1
|
Provenance
The following attestation bundles were made for mcp_edgar-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on birthday-tools/edgarmcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_edgar-0.1.1-py3-none-any.whl -
Subject digest:
9a3e6d7ccb093192f32cfc07290b9cdf96dfe9e80d6596e3db579d4ddcc231d3 - Sigstore transparency entry: 1895327191
- Sigstore integration time:
-
Permalink:
birthday-tools/edgarmcp@942b4f20dd1db192822e927ccfc0ce1400caa293 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/birthday-tools
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@942b4f20dd1db192822e927ccfc0ce1400caa293 -
Trigger Event:
push
-
Statement type: