关于 cdc-health-mcp-server
面向研究人员和分析人员的 MCP 服务,用于探索 CDC 公共卫生数据。它结合可搜索的 Socrata 数据集与可查询的 CDC WONDER 死亡统计数据,并提供目录和模式工具。
主要功能
- 01搜索 CDC 数据集目录
- 02查看数据集模式和元数据
- 03使用 SoQL 查询数据集
- 04获取 CDC WONDER 死亡统计
- 05访问目录资源和分析提示词
适用场景
- 01查找疫苗接种或监测数据集
- 02按年份和人口特征分析死亡率
- 03筛选并汇总 CDC 数据集记录
MCP 相关
向 MCP 客户端提供五个工具、两个资源和一个分析提示词。支持 STDIO 和 Streamable HTTP,并提供公共托管端点。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://cdc.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-cdc-health https://cdc.caseyjhand.com/mcp{"mcpServers":{"cyanheads-cdc-health":{"type":"http","url":"https://cdc.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-cdc-health":{"type":"http","url":"https://cdc.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-cdc-health":{"type":"http","url":"https://cdc.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-cdc-health":{"serverUrl":"https://cdc.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
5| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| tags | array | 否 | 按领域标签筛选(例如,["covid19", "surveillance"])。标签会扩大搜索范围,而不是缩小范围:数据集只要带有其中任一标签就会匹配,因此每添加一个标签都会返回更多结果;无法识别的标签不会匹配任何内容,也不会改变结果集。值与目录自身的标签词汇表进行不区分大小写的匹配;调用 cdc_list_catalog_vocabulary 可查看正在使用的值及其条目数,也可读取任一结果中的 tags 字段。若要缩小范围,请将标签与 query 或 category 结合使用,这些条件会与标签集取交集。 |
| limit | integer | 否 | 要返回的结果数(默认值为 10)。单次调用最多返回 100 条:limit 较大时(最高 10,000)会被限制为 100;如果仍有匹配的数据集,响应会说明这一点并提供用于继续获取的 offset。limit 被限制后,offset 加 limit 不得超过 10000。 |
| order | enum | 否 | 结果排序方式。"dataset_id"(默认值)按每个数据集唯一的目录 ID 确定性排序,这是稳定进行 offset 分页的必要条件,因为连续页面可以无遗漏、无重复地遍历结果。"relevance" 按关键字搜索的最佳匹配度排序,但无法跨页面稳定分页,因此遍历 offset 时可能会跳过或重复数据集。dataset_id | relevance |
| query | string | 否 | 跨数据集名称和描述进行全文搜索(例如,“diabetes mortality”“lead exposure children”)。 |
| domain | enum | 否 | 要搜索的 CDC Socrata 主机。"data.cdc.gov"(默认值)和 "chronicdata.cdc.gov" 指向同一目录并返回相同条目,因此切换主机既不会扩大也不会缩小搜索范围;PLACES、Heart Disease & Stroke Atlas 和 Environmental Public Health Tracking 等慢性病和小区域数据集可从任一主机找到。data.cdc.gov | chronicdata.cdc.gov |
| offset | integer | 否 | 用于浏览第一页之后内容的分页偏移量(最大 9999)。limit 被限制后,offset 加 limit 不得超过 10000;两个 CDC 门户的条目都远少于两千个,因此接近该上限的 offset 会翻到目录末尾之后。 |
| category | string | 否 | 按领域类别筛选(例如,“NNDSS”“Vaccinations”“Behavioral Risk Factors”)。值来自目录自身的词汇表,并进行区分大小写的精确匹配:“Vaccinations”匹配 89 个条目,而“Vaccination”一个也不匹配。调用 cdc_list_catalog_vocabulary 查看每个值及其条目数,不要猜测值。 |
详细介绍
@cyanheads/cdc-health-mcp-server
通过 MCP 搜索和查询 CDC 公共卫生数据——死亡率、疫苗接种、监测、行为风险(Socrata SODA API)。支持 STDIO 或 Streamable HTTP。
公共托管服务: https://cdc.caseyjhand.com/mcp
概述
CDC 公共卫生数据来自 CDC Open Data 门户和 CDC WONDER。搜索有关疫苗接种、监测和行为风险的 1,000 多个数据集,查看其架构并使用 SoQL 查询,或按年份、年龄、性别和种族获取全国死亡统计数据。
工具
| 工具 | 描述 |
|---|---|
cdc_discover_datasets | 按关键词、类别或标签搜索 CDC 数据集目录 |
cdc_get_dataset_schema | 获取数据集的列架构、行数和元数据 |
cdc_list_catalog_vocabulary | 列出目录的类别和标签值及其条目数 |
cdc_query_dataset | 执行 SoQL 查询——筛选、聚合、排序、全文搜索、选择字段 |
cdc_query_wonder | 查询 CDC WONDER,获取五个数据库中的全国死亡率、人口和死亡率数据 |
资源
| 资源 | 描述 |
|---|---|
cdc://datasets | 浏览量最高的前 50 个目录条目,供参考 |
cdc://datasets/{datasetId} | 特定数据集的元数据和前 100 列 |
这两项资源与通过 cdc_discover_datasets 和 cdc_get_dataset_schema 也可获取的数据相同,适用于支持资源但不支持工具的客户端。
提示词
| 提示词 | 描述 |
|---|---|
analyze_health_trend | 引导式工作流,用于跨 CDC 数据调查公共卫生问题 |
功能参考
cdc_discover_datasets 工具
- 筛选条件:
query、category和tags。每页最多返回 100 条结果(默认 10 条);offset + limit上限为 10,000(超过后会返回page_out_of_range)。order可设为dataset_id(默认值,分页稳定)或relevance - 结果包含
assetType、columnCount(值为 0 表示图表、地图或其他非表格资源)、包含 8 个名称的columnSample,以及截断至 300 个字符的描述;此外还包含totalCount和appliedFilters - 当
category或tags的值没有匹配项时,notice会列出最接近的目录值及其条目数,例如:Vaccination→"Vaccinations" (89 datasets)
cdc_get_dataset_schema 工具
- 接受四乘四格式的
datasetId(例如bi63-dtpu)。column_limit(默认 100)和column_offset用于分页查看宽表结构,并返回totalCount、truncated和nextOffset - 数据集的
description默认上限为 4,000 个字符(截断时会设置descriptionTruncated和descriptionLength);full_description: true会返回完整文本 - 列包含
fieldName、dataType和description。rowCountSource说明rowCount是实时值(live)还是 Socrata 的缓存值(cached)。非表格资源会返回not_queryable错误
cdc_list_catalog_vocabulary 工具
- 每个类别都会完整返回;约 1,600 个标签按条目数排序,并通过
tag_limit(默认 50)和tag_offset分页。filter(至少 3 个字符)会按词语匹配进行筛选,不进行模糊匹配 - 每个值都包含
datasetCount;响应还会报告vocabularySize、categoryCount、tagCount、truncated、nextOffset和truncationCeiling(页面之后标签数量的上限)
cdc_query_dataset 工具
- 查询子句:
select、where、group、having、order和全文搜索search。每次调用最多返回 5,000 行(默认 100 行),offset最大为 1,000,000 - 如需稳定地按偏移量分页,请将唯一的决胜字段放在
order末尾(未分组行使用:id,分组查询使用分组列);缺少该字段时,notice会提示 effectiveQuery会原样回显发送的 SoQL 子句;truncated和nextOffset会报告分页信息,不提供totalCount。图表或地图 ID 会返回not_queryable错误
cdc_query_wonder 工具
database | CDC 数据库 | 年份 | 种族组 | mcd_icd10 |
|---|---|---|---|---|
underlying_1999_2020 (默认) | D76 — 根本死因 | 1999–2020 | 4 个衔接组 | — |
provisional | D176 — 临时死亡统计 | 2018 年至当前年份 | 6 个单一种族组 | 是 |
underlying_2018_2024 | D158 — 根本死因,单一种族 | 2018–2024 | 6 个单一种族组 | — |
multiple_1999_2020 | D77 — 多重死因 | 1999–2020 | 4 个衔接组 | 是 |
multiple_2018_2024 | D157 — 多重死因,单一种族 | 2018–2024 | 6 个单一种族组 | 是 |
group_by接受year、age_group、sex、race中的 1–4 项(仅限全国数据)。cause_icd10和mcd_icd10接受 ICD-10 代码、范围(X40-X49)或最多包含 50 项的列表。age_groups接受单独的NS(未注明年龄),或与全部 11 个已知年龄组一起使用。使用limit和offset(最大 10,000)对表格分页- 行包含
deaths、population、crude_rate,以及在可进行年龄标准化时提供的age_adjusted_rate。CDC 返回为Suppressed、Unreliable或Not Applicable的单元格会显示为null,并列在cellNotes中;messages会报告 CDC 隐藏的行,totalCount为准确值 - CDC 要求请求间隔至少 15 秒,因此调用会逐个排队,间隔 16 秒
cdc://datasets 资源
- 按受欢迎程度排列的前 50 个目录条目,每项包含
id、name、assetType、category、columnCount和updatedAt,另附目录的totalCount columnCount: 0表示非表格条目;cdc_discover_datasets可搜索完整目录并进行分页
cdc://datasets/{datasetId} 资源
- 数据集元数据以及前 100 列,格式为
application/json,包含columnCount和truncated;描述最多 4,000 个字符 - 如需查看更多列或完整描述,请使用
cdc_get_dataset_schema,并设置column_offset或full_description: true
analyze_health_trend 提示词
- 参数:必填
topic;可选timeRange和geography - 返回一条用户消息,将问题路由到
cdc_query_wonder(全国死亡率)或 Socrata 工具(其他所有情况),随后依次进行发现 → 检查 → 建立基线 → 比较 → 综合分析
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可替换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及带可选 OpenTelemetry 跟踪的结构化日志记录。
CDC 特有功能:
- 通过 CDC Open Data 门户访问 Socrata SODA API v2.1(约 1,080 个数据集);无需身份验证,可选应用令牌可提高速率限制
- 通过 XML 请求 API 访问 CDC WONDER 死亡率数据,涵盖 1999 年至当前年份的五个数据库
- 三个 Socrata 工具均接受
domain输入,仅限data.cdc.gov(默认)和chronicdata.cdc.gov;两者提供相同的目录 category和tags必须与目录自身的取值匹配(类别区分大小写,标签不区分大小写);cdc_list_catalog_vocabulary可列出这些取值- Socrata 会将所有值作为字符串返回,而
year之类的列在某些数据集中是数字,在另一些数据集中则是文本。请根据列的dataType匹配 WHERE 字面量:数字不加引号,字符串使用单引号
便于 Agent 使用的输出:
- 明确报告分页信息:
totalCount、truncated、nextOffset和shown/cap。两个查询工具的每页上限均为 200,000 个字符,因此较宽的页面可能会在达到limit前结束 - 每个已声明原因均提供带恢复提示的类型化错误,例如
not_queryable、page_out_of_range和invalid_query - 上游数据缺失会明确显示:
cellNotes中的 WONDER 状态标记、messages中的隐藏行提示,以及架构行数中的rowCountSource effectiveQuery会回显 SoQL 子句或 WONDER 查询摘要,以便复现结果
开始使用
公共托管实例
公共实例已部署在 https://cdc.caseyjhand.com/mcp,无需安装。通过 Streamable HTTP 将任意 MCP 客户端指向该实例:
{
"mcpServers": {
"cdc-health-mcp-server": {
"type": "streamable-http",
"url": "https://cdc.caseyjhand.com/mcp"
}
}
}
自托管 / 本地部署
将以下内容添加到 MCP 客户端配置文件中。
{
"mcpServers": {
"cdc-health-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/cdc-health-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或使用 npx(无需 Bun):
{
"mcpServers": {
"cdc-health-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/cdc-health-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或使用 Docker:
{
"mcpServers": {
"cdc-health-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/cdc-health-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+)。
- 可选:使用 Socrata 应用令牌提高速率限制。
安装
- 克隆仓库:
git clone https://github.com/cyanheads/cdc-health-mcp-server.git
- 进入目录:
cd cdc-health-mcp-server
- 安装依赖:
bun install
- 配置环境:
cp .env.example .env
# optionally set CDC_APP_TOKEN
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
CDC_APP_TOKEN | Socrata 应用令牌;可提高速率限制。 | 无 |
CDC_BASE_URL | 未指定 domain 时请求所用的 SODA 主机(cdc://datasets/{datasetId} 资源)。 | https://data.cdc.gov |
CDC_CATALOG_URL | Socrata Discovery API 基础 URL。 | https://api.us.socrata.com/api/catalog/v1 |
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_PORT | HTTP 服务端口。 | 3010 |
MCP_SESSION_MODE | HTTP 会话模式:stateless、stateful 或 auto。 | stateless |
MCP_AUTH_MODE | 身份验证方式:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(debug、info、warning、error 等)。 | info |
OTEL_ENABLED | 启用 OpenTelemetry。 | false |
完整的可选覆盖项列表请参阅 .env.example。
运行服务
本地开发
-
构建并运行生产版本:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
运行检查和测试:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Docker
docker build -t cdc-health-mcp-server .
docker run --rm -p 3010:3010 cdc-health-mcp-server
Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/cdc-health-mcp-server。默认会安装 OpenTelemetry 对等依赖;构建时使用 --build-arg OTEL_ENABLED=false 可省略这些依赖。
项目结构
| 目录 | 用途 |
|---|---|
src/index.ts | createApp() 入口点——注册工具/资源/提示词并初始化服务。 |
src/config | 解析并验证服务专用环境变量,使用 Zod。 |
src/mcp-server/tools | 工具定义(*.tool.ts)。包含四个 Socrata 工具和一个 WONDER 工具。 |
src/mcp-server/resources | 资源定义。目录概览和数据集详情。 |
src/mcp-server/prompts | 提示词定义。健康趋势分析工作流。 |
src/services/socrata | Socrata 服务——目录搜索、词汇表、元数据和 SoQL 查询。 |
src/services/wonder | CDC WONDER 服务——XML 请求构建器、响应解析器和请求间隔控制。 |
src/utils | 共享辅助工具——HTML 转文本、表格单元格转义、词汇匹配和响应预算。 |
tests/ | 单元测试和集成测试,结构与 src/ 对应。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md。简要来说:
- 处理程序抛出异常,由框架捕获——工具逻辑中不要使用
try/catch - 使用
ctx.log记录日志,使用ctx.state存储数据 - 在
src/index.ts中的createApp()数组里注册新工具和资源 - 封装外部 API 调用:验证原始数据 → 规范化为领域类型 → 返回输出架构;绝不伪造缺失字段
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
Apache-2.0——详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。