关于 nonprofit-explorer-mcp-server
这是一个通过 ProPublica Nonprofit Explorer 搜索美国免税组织并查看 IRS Form 990 记录的 MCP 服务,适用于非营利组织研究和财务审阅。它提供组织档案、申报历史及来源 PDF 链接。
主要功能
- 01搜索 180 多万家非营利组织
- 02按 EIN 查询组织档案
- 03Form 990 财务摘要
- 04申报历史与收入明细
- 05来源 PDF 链接及财政年度说明
适用场景
- 01按名称、地点或领域查找非营利组织
- 02查看组织最近申报的财务状况
- 03比较不同申报年度的财务数据
- 04查找原始 Form 990 申报 PDF
MCP 相关
通过 MCP 提供非营利组织搜索、组织档案和 Form 990 申报数据三种工具。支持 STDIO 与 Streamable HTTP;ProPublica 公共 API 无需 API 密钥。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://nonprofit-explorer.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-nonprofit-explorer https://nonprofit-explorer.caseyjhand.com/mcp{"mcpServers":{"cyanheads-nonprofit-explorer":{"type":"http","url":"https://nonprofit-explorer.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-nonprofit-explorer":{"type":"http","url":"https://nonprofit-explorer.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-nonprofit-explorer":{"type":"http","url":"https://nonprofit-explorer.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-nonprofit-explorer":{"serverUrl":"https://nonprofit-explorer.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
3| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| page | integer | 否 | 从 0 开始计数的页码。每页 25 条结果。总页数见 num_pages。递增页码以翻阅大型结果集。 |
| query | string | 是 | 关键词搜索字符串。按相关性顺序搜索组织名称、次要名称行和城市。支持:带引号的短语("Red Cross")、必含词(+evanston)和排除词(-dental)。空字符串会返回当前筛选条件下的所有组织。 |
| state | string | 否 | 两个字母的美国州、领地或军事邮政代码(例如,"WA"、"NY"、"PR")。不区分大小写,筛选前会转换为大写。不在该集合中的代码会被拒绝,而不会静默返回全国结果。仅返回总部位于该州的组织。接受 "ZZ"(外国地址),但当前索引中没有组织使用此代码。 |
| ntee_category | enum | 否 | NTEE(免税实体国家分类体系)主要类别整数(1–10)。1=艺术/文化/人文,2=教育,3=环境/动物,4=健康,5=人类服务,6=国际/外交事务,7=公共/社会福利,8=宗教相关,9=互助/会员福利,10=未知/未分类。1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| subsection_code | enum | 否 | 501(c) 子章节代码。"3" = 慈善/宗教/教育组织(最常见,包含公共慈善机构和私人基金会;nonprofit_get_organization 返回 foundation_type 以区分两者),"4" = 社会福利组织,"6" = 商业联盟/行业协会,"92" = 4947(a)(1) 非免税慈善信托。按税务身份而非领域筛选。2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 22 | 23 | 25 | 26 | 27 | 28 | 92 |
详细介绍
@cyanheads/nonprofit-explorer-mcp-server
通过 MCP 搜索并探索 180 多万个美国非营利组织,获取 Form 990 财务数据并查看 IRS 申报历史。支持 STDIO 或 Streamable HTTP。
概览
通过 ProPublica Nonprofit Explorer API 获取 180 多万个免税组织的 IRS Form 990 数据。按名称搜索、获取组织的财务概况,并查看其完整申报历史。
工具
| 工具 | 描述 |
|---|---|
nonprofit_search_organizations | 按名称、关键词、城市或短语搜索 180 多万个获 IRS 认可的免税组织;可选按州、NTEE 行业类别和 501(c) 筛选 |
nonprofit_get_organization | 按 EIN 获取单个组织的完整档案:法定身份、IRS 分类、裁定日期,以及来自最新 Form 990 的财务概况 |
nonprofit_get_filings | 按 EIN 获取某组织的所有 Form 990 申报记录:逐年财务数据、收入明细、高管薪酬和源 PDF 链接 |
功能参考
nonprofit_search_organizations 工具
- 全文查询——支持带引号的短语(
"Red Cross")、必需词项(+evanston)和排除词项(-dental) - 可选筛选条件:美国州/领地或军事邮政编码(外国实体使用
ZZ;不在该集合中的代码会被拒绝,而不会悄悄返回全国范围的结果)、NTEE 主要类别(1–10)、501(c) 子条款代码(3同时涵盖公共慈善机构和私人基金会——可通过nonprofit_get_organization中的foundation_type区分) - 支持分页,每页 25 条(
page从 0 开始);num_pages、per_page和page_offset用于跟踪位置 - API 将结果总数限制为 10,000——
total_results === 10000表示实际数量可能更多;若某页的偏移量达到上限,则会被拒绝(pagination_ceiling) - 无匹配结果和请求页码超出最后一页都会成功返回空的
organizations数组,并通过notice说明具体情况 - 返回 EIN——可将其传给
nonprofit_get_organization或nonprofit_get_filings获取详情
nonprofit_get_organization 工具
- 接受整数形式的 EIN(
530196605),或带连字符/不带连字符的字符串("53-0196605");如果只有组织名称,请先使用nonprofit_search_organizations - 返回法定身份、地址、NTEE 代码、501(c) 类型和 IRS 裁定日期
- IRS Business Master File 状态:可抵扣性(包括根据条约可抵扣的情况)、免税状态,以及公共慈善机构与私人基金会的分类——各项均根据 IRS 代码解码,同时保留原始代码
- 最近一期 Form 990 的财务概况:收入、支出、资产、负债、净资产,以及来源 PDF 链接
filing_count统计已提取数据的申报记录;filing_count_pdf_only单独统计没有财务数据提取结果的 PDF。请使用nonprofit_get_filings获取这些链接;仅有 PDF 的历史记录没有财务概况- 数据有 1–2 年延迟——概况中的
tax_prd_yr是申报的财政年度,而非当前年份
nonprofit_get_filings 工具
- 返回所有已提取数据的 Form 990 申报记录,按时间从新到旧排序——每份申报包括:收入、支出、资产、负债、净资产、收入明细(捐款、项目服务收入、投资收入)和来源 PDF 链接
- 财务字段因各申报表类型而异。对于 990-PF,投资收入为储蓄利息加股息和证券利息(Part I 第 (a) 列,第 3–4 行);必须提取这两个组成部分。不包括资本利得、租金和净投资收入
- 990-PF 申报记录包含
grants_paid、distributable_amount、fair_market_value_assets和net_investment_income。可分配金额是支出要求,并不代表实际付款或合规情况 program_expense_ratio始终为null——ProPublica 不会返回 Form 990 Part IX 中项目服务支出总额,因此项目/管理/筹款支出明细仅见于来源 PDF- 高管薪酬摘要会明确说明字段名称,并注明可在 Schedule J 中查看各位高管的详细信息
filings_pdf_only列出较早的申报记录,这些记录有 PDF,但没有提取数据- 如果 EIN 对应的是真实组织,但没有 990 申报记录,则返回空的
filings数组及notice,而非错误 - 数据有 1–2 年延迟——展示数值时务必注明
tax_prd_yr(财政年度)
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔的身份验证(none / jwt / oauth)、可切换的存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及支持可选 OpenTelemetry 跟踪的结构化日志记录。
ProPublica Nonprofit Explorer / IRS 专属功能:
- 免密钥访问 — ProPublica Nonprofit Explorer API 无需 API 密钥
- 覆盖 180 多万家获 IRS 认可的免税组织
- IRS Form 990 数据:涵盖公共慈善机构(990)、小型组织(990-EZ)和私人基金会(990-PF)的年度申报
- 每条申报记录均包含原始申报 PDF 链接;但 IRS PDF 处理可能滞后于数据提取,此时
pdf_url仍为 null - 数据来源于 ProPublica Nonprofit Explorer,基于 IRS Form 990 申报;数据滞后 1–2 年
适合 Agent 使用的输出:
- 每个响应均注明来源 — 所有工具输出均包含
data_source归属信息,以及可直接核验的 ProPublica URL - 明确标注申报年度 —
tax_prd_yr显著标注为财年,并在每个财务响应中明确提示数据滞后 - 显示 null 值,不予省略 — 格式化文本会说明值缺失的原因(IRS 从未记录、未从申报中提取,或该表格类型不包含此项);
structuredContent会保留明确的null,而非省略该键 - 薪酬字段透明可查 — 提供
field_name和form_type,让 Agent 清楚了解读取的是哪个 IRS 字段
开始使用
公共托管实例
可通过 https://nonprofit-explorer.caseyjhand.com/mcp 使用公共实例 — 无需安装。将任意 MCP 客户端配置为通过 Streamable HTTP 连接,并使用以下客户端配置:
{
"mcpServers": {
"nonprofit-explorer-mcp-server": {
"type": "streamable-http",
"url": "https://nonprofit-explorer.caseyjhand.com/mcp"
}
}
}
自托管 / 本地使用
将以下内容添加到 MCP 客户端配置文件中。
{
"mcpServers": {
"nonprofit-explorer-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/nonprofit-explorer-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
也可通过 npx 运行(无需 Bun):
{
"mcpServers": {
"nonprofit-explorer-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/nonprofit-explorer-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或通过 Docker 运行:
{
"mcpServers": {
"nonprofit-explorer-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/nonprofit-explorer-mcp-server:latest"
]
}
}
}
如需使用 Streamable HTTP,请设置传输方式并启动服务:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 或更高版本(或 Node.js v24+)。
- 无需 API 密钥 — ProPublica Nonprofit Explorer 是免密钥公共 API。
安装
- 克隆仓库:
git clone https://github.com/cyanheads/nonprofit-explorer-mcp-server.git
- 进入目录:
cd nonprofit-explorer-mcp-server
- 安装依赖:
bun install
- 配置环境:
cp .env.example .env
# edit .env as needed (no required vars — server works out of the box)
配置
所有配置都会在启动时进行验证。主要环境变量:
| 变量 | 说明 | 默认值 |
|---|---|---|
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http | stdio |
MCP_HTTP_PORT | HTTP 服务端口 | 3010 |
MCP_HTTP_HOST | HTTP 服务主机名 | 127.0.0.1 |
MCP_HTTP_ENDPOINT_PATH | HTTP 端点路径 | /mcp |
MCP_PUBLIC_URL | TLS 终止反向代理部署的公共源覆盖值 | — |
MCP_AUTH_MODE | 身份验证:none、jwt 或 oauth | none |
MCP_LOG_LEVEL | 日志级别(debug、info、warning、error 等) | info |
LOGS_DIR | 日志文件目录(仅限 Node.js) | <project-root>/logs |
LOG_TOOL_FAILURE_PAYLOADS | 记录每次失败的工具调用参数和结果,按键名进行脱敏,并限制在 LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES 字节以内(默认 16384)。自由格式值中的密钥不会被脱敏。 | false |
STORAGE_PROVIDER_TYPE | 存储后端:in-memory、filesystem、supabase、cloudflare-kv/r2/d1 | in-memory |
OTEL_ENABLED | 启用 OpenTelemetry 插桩 | false |
没有服务专属的必需变量。ProPublica Nonprofit Explorer 是免密钥公共 API。
完整的可选覆盖项列表请参阅 .env.example。
运行服务
本地开发
-
构建并运行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
运行检查和测试:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t nonprofit-explorer-mcp-server .
docker run --rm -p 3010:3010 nonprofit-explorer-mcp-server
Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/nonprofit-explorer-mcp-server。默认安装 OpenTelemetry 对等依赖;构建时使用 --build-arg OTEL_ENABLED=false 可省略这些依赖。
项目结构
| 目录 | 用途 |
|---|---|
src/index.ts | createApp() 入口点 — 注册工具并初始化服务。 |
src/mcp-server/tools | 工具定义(*.tool.ts)。提供用于搜索和财务数据的 3 个工具。 |
src/services/nonprofit-explorer | ProPublica Nonprofit Explorer API 客户端和领域类型。 |
tests/ | 与 src/ 结构对应的单元测试和集成测试。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md/AGENTS.md。简要概括如下:
- 处理程序负责抛出异常,框架负责捕获 — 工具逻辑中不要使用
try/catch - 使用
ctx.log进行请求级日志记录,使用ctx.state进行租户级存储 - 在
src/index.ts的createApp()中,通过数组注册新工具 - 封装外部 API 调用:校验原始数据 → 规范化为领域类型 → 返回输出架构;绝不编造缺失字段
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
Apache-2.0 — 详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。