关于 SEC EDGAR
SEC EDGAR 是一个 Rust MCP 服务,可查询美国 SEC 的公司文件、财务数据和企业信息。它处理股票代码到 CIK 的解析、请求身份标识及响应整理,供 Claude Desktop 等客户端使用。
主要功能
- 01搜索公司及近期申报文件
- 02读取申报文件正文和附件
- 03查询 XBRL 财务概念
- 04查看内部人交易和机构持仓
- 05搜索申报文件全文
- 06将股票代码解析为 CIK
适用场景
- 01查看公司的最新 10-K 或 8-K
- 02比较多家公司的历史营收
- 03查找内部人交易或 13F 持仓
MCP 相关
向 MCP 客户端提供 SEC EDGAR 查询和申报文件工具。它缓存股票代码到 CIK 的映射,并将大型 SEC 响应整理为精简 JSON。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
sec-mcp
一个 Model Context Protocol 服务,让 Claude Desktop 能够访问 SEC EDGAR 数据——公司申报文件、财务报表和公司信息。无需 API 密钥。它以单个原生二进制文件运行,背后无需 Node、Python 或 Docker 运行时。
为什么需要 MCP?
EDGAR 提供一组公开的 REST 端点,无需 API 密钥,而且 sec.gov/search-filings/edgar-application-programming-interfaces 上的文档也相当清楚。所以严格来说,并不需要 MCP。这个封装带来的好处包括:
-
持久的 User-Agent 身份标识。 SEC 的公平访问政策要求在 User-Agent 标头中提供联系邮箱;否则,请求会被限流或拒绝。你肯定不想每次提示词都重新粘贴邮箱。MCP 会将邮箱保存在配置文件中,并在每个请求中附上。
-
Ticker → CIK 解析与缓存。 每个 EDGAR 端点都以补零至 10 位的 CIK 为键,而不是 ticker。没有工具的话,每次查询都要重新获取约 1 MB 的
company_tickers.json,并从头解析。MCP 会将其缓存一小时。 -
文档未详细说明的 URL 构造细节。 XBRL frames 端点中的
CY{period}前缀、瞬时概念末尾的I、补零的 CIK,以及存档 URL 中去掉连字符的 accession number。这些细节临时处理时很容易出错;工具中已将其编码好。 -
响应整形。
companyfacts响应有几十 MB,而filings.recent则以列优先的平行数组形式排列。两者都能用,但大模型会耗费大量上下文来重新整理它们。MCP 返回经过精简、按行组织的 JSON。 -
发现能力。 安装 MCP 后,工具列表本身就会告诉 Claude 它可以查询 SEC 申报文件,并提供常见概念名称。没有 MCP 的话,模型必须记得这些端点的存在。
如果你一年只查看一两份申报文件,就不需要这个工具——直接把 URL 发给 Claude 即可。使用量再高一些,封装就能物有所值:它将“每次对话都解释 URL 规则”变成“直接提出自然语言问题”。
安装
使用 Cargo 安装(Rust 1.88 或更高版本):
cargo install sec-mcp
这会编译 rustls 加密后端(ring),其中包含少量 C 代码,因此构建主机上需要有 C 编译器——但不需要 cmake 或汇编器。macOS(Xcode Command Line Tools)和大多数桌面 Linux 发行版都已包含编译器;精简版 Linux 镜像可能没有——请先安装,例如在 Debian/Ubuntu 上运行 apt install build-essential。
配置 Claude Desktop
编辑 ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"sec-edgar": {
"command": "sec-mcp",
"args": []
}
}
}
重启 Claude Desktop。
首次使用
首次提出与 SEC 相关的请求时,Claude 会说明 SEC EDGAR 公平访问政策要求提供联系邮箱,并在继续之前征求你的许可。你的邮箱会保存在本地的 ~/Library/Application Support/sec-mcp/config.toml 中,仅用于发送给 SEC 的 HTTP User-Agent 标头——不会分享给其他任何地方。
示例提示词
- "Apple 最近的 SEC 文件有哪些?"
- "列出 Tesla 过去 5 年的年度营收"
- "Microsoft 上个季度的净收入是多少?"
- "根据 SEC,NVDA 属于哪个行业?"
- "Bridgewater Associates 的 CIK 是多少?最近提交了哪些文件?"
- "谁持有 Sonos 超过 5% 的股份?其中有人提交过 13D 吗?"
- "SpaceX 上市前通过私募轮融资了多少?"
- "Bridgewater 上个季度持有的十大仓位是什么?"
- "过去一小时提交了哪些 8-K?其中报告了哪些事项?"
- "列出上周提交的所有 Schedule 13D"
- "显示 Amazon 最近提交的 10-K 文件"
- "NYSE 上有哪些名称包含“energy”的股票代码?"
- "Apple 向 SEC 报告哪些财务指标?"
- "Airbnb 在 2025 年第一季度业绩公告中给出了什么营收指引?"
- "总结 Tesla 最新 10-K 中的风险因素"
- "2024 年哪些公司的营收最高?"
可用工具
| 工具 | 描述 |
|---|---|
sec_configure | 首次设置——保存您的联系邮箱 |
sec_lookup_cik | 将股票代码解析为 SEC CIK 编号,或按名称搜索所有 EDGAR 申报方:基金经理、私人发行方,以及没有股票代码的个人 |
sec_company_info | SIC 代码、行业、注册成立州、财年结束日期、地址 |
sec_recent_filings | 近期申报文件(10-K、10-Q、8-K 等),附直接 URL——当表格类型筛选需要时,会自动翻查更早的记录。不指定股票代码时,按表格类型实时列出整个 EDGAR 的最新申报文件,并显示各申报文件的相关方及 8-K 的项目 |
sec_filing_text | 申报文件或附件(10-K、10-Q、8-K、财报新闻稿 EX-99.1、代理声明)的文本:章节索引、按项目查找任意章节、在文件中搜索,或从任意位置翻页。提供申报文件后,可按类型列出其文档 |
sec_full_text_search | 搜索 2001 年以来申报文件的正文,包括附件——这里唯一能根据公司所说的内容查找公司的工具,无需预先指定公司。可按表格类型、股票代码和日期筛选(修订文件默认排除,除非另有要求);每条命中结果都附有直接文档 URL。不指定查询时,则按表格类型和日期列出 2001 年以来任意时段的申报文件 |
sec_insider_transactions | 表格 3、4 和 5——谁在何时买入或卖出、股数及价格,并以通俗语言解释交易代码及脚注。也包括表格 144,即内部人士拟议出售的通知,以及任何 10b5-1 计划日期 |
sec_institutional_holdings | 表格 13F——机构管理人(Berkshire、Bridgewater、BlackRock)每季度持有哪些资产,以持仓形式列出,并附价值、占投资组合比例和投票权,可按发行方筛选。发行方名称与申报文件中一致,因为 13F 不含股票代码 |
sec_private_offerings | 表格 D——私人公司、基金和上市公司通过未注册发行筹集的资金:发行及售出金额、投资者、申报的豁免条款、支付给经纪人的费用,以及列出的高管、董事和推广人 |
sec_beneficial_ownership | 附表 13D 和 13G——持有公司超过 5% 股份的人,以及其投票权和处置权、所持股份类别占比;对于 13D,还包括持有人声明的目的。提供持有人的 CIK 后,可查询其持有的超过 5% 的股份 |
sec_financial_concept | 来自 XBRL 的历史财务数据(营收、净收入、每股收益、资产等)——默认显示最新 20 条事实,并可翻查更早的历史数据 |
sec_list_tickers | 搜索/列出所有在 SEC 注册的股票代码及交易所信息——每页 50 条,可翻页 |
sec_company_facts | 查找公司报告的所有 XBRL 概念(指标) |
sec_xbrl_frames | 对比不同公司的指定期间财务指标 |
凡是接受股票代码的工具,也接受 CIK(1163302、0001163302 或
CIK0001163302)。SEC 的股票代码列表仅包含当前代码,因此已被收购、退市
或更名的公司只能通过 CIK 查找。可用 sec_lookup_cik 配合
name 查找;全文搜索命中结果和 frames 行中也会包含 CIK。
修订文件(10-K/A 等)
以 /A 结尾的表单会修订之前提交的文件。10-K/A 通常不是完整的年度报告。第 12b-15 条规则只要求提供每项变更内容的全文,因此最常见的修订文件只有第三部分(董事、薪酬、所有权),通常是在委托书错过 120 天期限时提交。其他修订文件会补充或更正附件。其余修订文件则会重述数据,以取代原文件中的数字。例如,Apple 在 2010 年 1 月提交的 10-K/A,依据新的收入确认规则重新提交了 2009 财年报告。
因此,sec-mcp 默认排除修订文件,除非你主动请求:
sec_financial_concept的annual/quarterly期间筛选器只匹配基础表单。原始文件已涵盖修订后的期间,同时纳入两者会导致同一期间报告两条数据。若你需要重述后的数据,可传入include_amendments: true:Apple 2009 财年的收入在原始 10-K 中为 365 亿美元,在 10-K/A 中为 429 亿美元。amended_facts会统计这些数据。- 使用表单筛选器时,
sec_full_text_search会排除修订文件。但 EDGAR 本身不会:它会按文件的根表单筛选,因此forms=10-K也会返回10-K/A。若要获取修订文件,请直接请求该表单(10-K/A)、同时列出两者(10-K,10-K/A),或传入include_amendments: true。返回的任何修订文件都会标记为amendment: true。
由于搜索筛选发生在 EDGAR 筛选之后,响应中的两部分与普通搜索有所不同:
total仍是 EDGAR 返回的计数,其中包括被排除的修订文件。该值会标记为total_is_upper_bound;如果计数还已达到 10000,则会标记为total_is_approximate。每页都会报告amendments_excluded。- 分页必须使用
next_offset。由于跳过了修订文件,一页返回的结果可能少于limit,因此使用offset + returned会重复获取这些文件。
sec_financial_concept 的常见 XBRL 概念
| 概念 | 含义 |
|---|---|
Revenues | 总收入 |
NetIncomeLoss | 净利润 / 亏损 |
EarningsPerShareBasic | 基本每股收益 |
EarningsPerShareDiluted | 稀释每股收益 |
Assets | 总资产 |
Liabilities | 总负债 |
StockholdersEquity | 股东权益 |
OperatingIncomeLoss | 营业利润 / 亏损 |
CashAndCashEquivalentsAtCarryingValue | 现金及现金等价物 |
CommonStockSharesOutstanding | 流通股数 |
开发
cargo test # offline; hits no network
此外,还有一个可选择启用的实时测试套件,会通过标准输入/输出驱动已构建的服务,调用 真实 SEC EDGAR API,以测试离线测试无法发现的问题,例如 EDGAR 更改响应结构,或 URL 构造中的细微问题。只有设置了 SEC_MCP_LIVE_EMAIL 才会运行该套件;设置此变量既表示选择启用,也提供了 公平访问政策 要求的联系邮箱(地址从环境中读取,不会提交到代码库):
SEC_MCP_LIVE_EMAIL="[email protected]" cargo test --test live_smoke -- --nocapture
该测试套件会通过同一个服务进程依次运行,因此完全不会超出 EDGAR 的速率限制。
许可证
MIT — 详情请参阅 LICENSE.md。
MCP registry
MCP registry 的所有权验证令牌(从 crates.io 上此 crate 的渲染版 README 中读取):
Registry 所有权令牌:
mcp-name: io.github.brechanbech/sec-mcp
发布版本
版本一经发布便不可更改——crates.io 只能撤回,不能删除,而且版本号永不重复使用——因此顺序很重要:
-
确保
cargo test和cargo clippy --all-targets均通过。 -
在
Cargo.toml中提升version。 -
在
server.json中提升version——包括两个字段:顶层字段和packages[]下的字段。没有任何机制会强制执行这一步:没有脚本、没有 CI,也没有测试会读取该文件,因此这一步最容易被遗漏。清单本身一直是正确的,但注册表的条目却不是:0.5.0、0.5.1 和 0.5.2 都已发布到 crates.io,而注册表仍显示 0.4.4,因为第 6 步一直没有执行。 -
提交并推送;发布前先确保 CI 通过,而不是发布后再等 CI 通过。
-
运行
cargo publish --dry-run,它会从打包后的副本进行编译,因此能发现 crate 依赖了未随包发布的文件。然后运行cargo publish。两条命令都要加上--target-dir target/package-verify。如果不这样做,验证构建会与同一单元哈希下的常规构建共用target/debug,导致二进制文件的指纹跟踪的是打包后的src/main.rs,而不是你自己的文件。之后的编辑就不会再触发target/debug/sec-mcp重新构建,tests/live_smoke.rs中的离线 stdio 测试会悄无声息地运行已发布的代码。如果发生这种情况,运行cargo clean -p sec-mcp即可修复。 -
发布到 MCP 注册表,必须在 crates.io 发布之后,不能提前——注册表会读取该 crate 在 crates.io 上渲染后的 README 中的
mcp-name来验证命名空间,而server.json中指定的 cargo 版本必须已在 crates.io 上发布:mcp-publisher validate # checks server.json against the live registry mcp-publisher login github # interactive, for the io.github.brechanbech/* namespace mcp-publisher publish -
在 Codeberg 和 GitHub 镜像上分别为该标签创建发布版本,并将该版本对应的 CHANGELOG 章节作为说明。仅有标签不算发布版本:Glama 会读取 GitHub 镜像;尽管镜像包含了所有标签,却没有任何发布版本,因此 Glama 报告了“No stable releases found”。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。