mcpField
N
nonprofit-explorer-mcp-server

nonprofit-explorer-mcp-server

远程服务
github.com/cyanheads商业与营销21 周前更新
代码仓库

关于 nonprofit-explorer-mcp-server

这是一个通过 ProPublica Nonprofit Explorer 搜索美国免税组织并查看 IRS Form 990 记录的 MCP 服务,适用于非营利组织研究和财务审阅。它提供组织档案、申报历史及来源 PDF 链接。

主要功能

  1. 01搜索 180 多万家非营利组织
  2. 02按 EIN 查询组织档案
  3. 03Form 990 财务摘要
  4. 04申报历史与收入明细
  5. 05来源 PDF 链接及财政年度说明

适用场景

  1. 01按名称、地点或领域查找非营利组织
  2. 02查看组织最近申报的财务状况
  3. 03比较不同申报年度的财务数据
  4. 04查找原始 Form 990 申报 PDF

MCP 相关

通过 MCP 提供非营利组织搜索、组织档案和 Form 990 申报数据三种工具。支持 STDIO 与 Streamable HTTP;ProPublica 公共 API 无需 API 密钥。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://nonprofit-explorer.caseyjhand.com/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

安装包
npm@cyanheads/nonprofit-explorer-mcp-server0.2.0

工具

3
参数类型必填说明
pageinteger否从 0 开始计数的页码。每页 25 条结果。总页数见 num_pages。递增页码以翻阅大型结果集。
querystring是关键词搜索字符串。按相关性顺序搜索组织名称、次要名称行和城市。支持:带引号的短语("Red Cross")、必含词(+evanston)和排除词(-dental)。空字符串会返回当前筛选条件下的所有组织。
statestring否两个字母的美国州、领地或军事邮政代码(例如,"WA"、"NY"、"PR")。不区分大小写,筛选前会转换为大写。不在该集合中的代码会被拒绝,而不会静默返回全国结果。仅返回总部位于该州的组织。接受 "ZZ"(外国地址),但当前索引中没有组织使用此代码。
ntee_categoryenum否NTEE(免税实体国家分类体系)主要类别整数(1–10)。1=艺术/文化/人文,2=教育,3=环境/动物,4=健康,5=人类服务,6=国际/外交事务,7=公共/社会福利,8=宗教相关,9=互助/会员福利,10=未知/未分类。1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
subsection_codeenum否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。

3 个工具

版本 许可证 Docker MCP SDK npm TypeScript Bun

安装到 Claude Desktop 安装到 Cursor 安装到 VS Code

框架


概览

通过 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。
安装
  1. 克隆仓库:
git clone https://github.com/cyanheads/nonprofit-explorer-mcp-server.git
  1. 进入目录:
cd nonprofit-explorer-mcp-server
  1. 安装依赖:
bun install
  1. 配置环境:
cp .env.example .env
# edit .env as needed (no required vars — server works out of the box)

配置

所有配置都会在启动时进行验证。主要环境变量:

变量说明默认值
MCP_TRANSPORT_TYPE传输方式:stdio 或 httpstdio
MCP_HTTP_PORTHTTP 服务端口3010
MCP_HTTP_HOSTHTTP 服务主机名127.0.0.1
MCP_HTTP_ENDPOINT_PATHHTTP 端点路径/mcp
MCP_PUBLIC_URLTLS 终止反向代理部署的公共源覆盖值—
MCP_AUTH_MODE身份验证:none、jwt 或 oauthnone
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/d1in-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.tscreateApp() 入口点 — 注册工具并初始化服务。
src/mcp-server/tools工具定义(*.tool.ts)。提供用于搜索和财务数据的 3 个工具。
src/services/nonprofit-explorerProPublica 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。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。