公共健康数据集访问服务器

ARTPARK公共健康数据集MCP服务器,通过AI助手提供对8个公共卫生数据集的访问,包括登革热流行病学、牲畜普查和FMD疫苗接种数据。

  • by artvandelay
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 artvandelay/artpark-datasets-mcp

使用说明

ARTPARK公共数据MCP服务器

Devin供电 Deepwiki文档

MCP(模型上下文协议)服务器,用于通过人工智能助手访问ARTPARK的公共卫生数据集。基于FastMCP 3.0构建,遵循以下架构 esankhiyiki mcp.

8个数据集 涵盖登革热流行病学、牲畜普查、口蹄疫疫苗接种和监测,以及来自 DSIH艺术公园.


快速开始

# Clone with submodules
git clone --recurse-submodules <repo-url>
cd onehealth-artpark-mcp

# Create environment and install
uv venv .venv && source .venv/bin/activate
uv pip install -r requirements.txt

# Run
python artpark_server.py
# → MCP:    http://localhost:8000/mcp
# → Health: http://localhost:8000/health

或者使用Make:

make run          # Start MCP server
make test         # Run 40 tests (~2s)
make check        # Verify datasets + tools load
make docker-up    # Start server + Jaeger tracing
make help         # Show all commands

数据集

ID 名称 类别 行 表
0015 卡纳塔克邦登革热每日总结(2017-2024) 流行病学 76114 1
0034 地方政府目录区域ID 地理空间 147423 1
0041 第20次牲畜普查(2019年) 普查 每张表30+ 4(州一级+11)
0055 口蹄疫NADCP疫苗接种进展(第1-6轮) 流行病学 930-588/轮 6
0059 口蹄疫NADCP疫苗接种时间表(第3-6轮) 流行病学 各不相同 4
0086 FMD全国疫苗接种数据 流行病学 各不相同 1
0087 FMD全国血清监测数据 流行病学 238 1
0089 FMD全国血清监测数据 流行病学 各不相同 1

数据来源: dsih艺术公园/公共数据 |文件: publicdata.readthedocs.io


MCP工具(4步工作流程)

1_know_about_artpark_data  →  2_get_tables  →  3_get_metadata  →  4_get_data
步骤 工具 说明
1 1_know_about_artpark_data() 所有8个数据集的概述。从这里开始。
2 2_get_tables(dataset_id) 列出数据集中的表(CSV)
3 3_get_metadata(dataset_id, table_name) 列模式+可过滤值(步骤4之前为必填项)
4 4_get_data(dataset_id, table_name, filters) 使用可选筛选器获取数据

重要提示: 工具必须按顺序调用。跳过 3_get_metadata 意味着您将不知道有效的列名或筛选值。


AI能用它做什么?

这 examples/Complex/ 文件夹包含五项调查 完全由人工智能执行 使用这个MCP服务器——没有人类分析师,没有Jupyter笔记本,也没有编写代码。每个都展示了一种超越数据检索的能力:

调查 人工智能做了什么 关键发现
一个健康假说 结合17个地区的登革热+牲畜数据,计算斯皮尔曼相关性 牲畜不能预测登革热(r=0.01)
新冠肺炎损害法医鉴定 比较19个州新冠肺炎前后的免疫力,按车祸严重程度排序 全国平均32.8人的免疫力下降
大海捞针 扫描238行4个异常类别,加冕获胜者 Nagaland 2021:疫苗接种 减半 免疫力
神话揭穿者 使用2个数据集将所有35个州分为绿色/黄色/红色 只有4个州(11%)显示出明显的成功
FMD风险模型 构建了一个由三个部分组成的评分公式,对19个州进行了排名 美联社、比哈尔邦、古吉拉特邦的风险最高

阅读 完整系列README 因为叙事弧线连接了这五个人。

我们如何生成这些报告

此仓库中的每个示例都是通过让Cursor的AI代理访问此MCP服务器并提出有趣的问题而生成的。没有Jupyter笔记本。没有Python脚本。没有人为数据争论。人工智能自主使用4步MCP工作流程,提取真实数据,在上下文中进行分析,并编写降价报告。

以下是如何重现这一点,或者创建自己的调查:

步骤1:启动MCP服务器

make run
# or: python artpark_server.py

步骤2:将Cursor连接到MCP服务器

创建(或验证) .cursor/mcp.json 在项目根目录中:

{
  "mcpServers": {
    "artpark": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

重新启动Cursor,使其拾取MCP配置。你应该看看 artpark 在代理聊天中的MCP工具下列出。

第三步:向AI提问

打开Cursor的代理聊天,问一些有趣的问题。简单的例子(01-04)来自以下单个问题:

  • “印度的口蹄疫疫苗接种计划有效吗?” → 跨数据集推理
  • “告诉我卡纳塔克邦口蹄疫疫苗接种之旅的故事。” → 时间叙事
  • “不同牲畜类型的口蹄疫有什么令人惊讶的差异吗?” → 隐藏模式
  • “卡纳塔克邦应该在哪里优先接种下一次口蹄疫疫苗?” → 政策情报

第四步:扩大规模——要求进行雄心勃勃的调查

这 复杂的调查 是在多步骤对话中生成的:

  1. 头脑风暴: 我们问: “想想一些真正雄心勃勃的想法——我们能建立一个模型吗?大海捞针吗?揭穿一个普遍的神话吗?” AI生成 5调查思路 详细说明。

  2. 执行: 我们说: “构建它们中的每一个。您将与MCP服务器交互,并报告您发现的内容。” 然后,AI自主地:

    • 调用MCP工具从多个数据集中提取数据
    • 交叉引用的数据集(例如,将17个地区的登革热+牲畜数据合并)
    • 计算统计数据(斯皮尔曼相关性、免疫崩溃增量、风险评分)
    • 撰写完整的降价报告,包括数据表、方法和结论
  3. 优化: 我们提示 “继续” 和 “完善它” 几次——每次调查都需要多次特工轮换才能完成分析并完善报告。

  4. 验证: 我们要求人工智能根据实时MCP数据抽查自己的数字,以捕捉任何幻觉数字。

第五步:尝试自己的问题

一些让你开始的想法:

  • “卡纳塔克邦哪个地区的登革热与医疗保健比率最差?”
  • “将口蹄疫疫苗接种计划与实际进展进行比较——哪些轮次落后了?”
  • “找到尽管接种了疫苗,但自然口蹄疫感染仍在上升的州。”
  • “为卡纳塔克邦地区建立一个综合健康风险指数。”

AI将遵循 1_know → 2_get_tables → 3_get_metadata → 4_get_data 自动工作流。响应会有所不同(LLM是非确定性的),但跨数据集的推理和发现是可重复的。

提示: 对于长期调查,告诉AI “你可能需要长跑——不要在一个电话里跑完,可以要求更多时间。” 这让它能够自己调整节奏,而不是匆匆忙忙地进行肤浅的分析。


快速示例

卡纳塔克邦登革热疫情分析

“班加罗尔市区报告了多少登革热病例?”

# Step 1: Find the right dataset
overview = await client.call_tool("1_know_about_artpark_data", {})
# → Dataset 0015: "Karnataka Dengue Daily Summary (2017-2024)"

# Step 2: See what tables are available
tables = await client.call_tool("2_get_tables", {
    "dataset_id": "0015",
    "user_query": "dengue cases by district"
})
# → Table: ka-dengue-daily-summary (28 columns)

# Step 3: Get column schema and filter values
meta = await client.call_tool("3_get_metadata", {
    "dataset_id": "0015",
    "table_name": "ka-dengue-daily-summary"
})
# → 76,114 rows, columns include daily.suspected, daily.positive.total, daily.deaths

# Step 4: Fetch Bengaluru data
data = await client.call_tool("4_get_data", {
    "dataset_id": "0015",
    "table_name": "ka-dengue-daily-summary",
    "filters": {"location.admin2.name": "Bengaluru Urban"},
    "limit": 50
})
# → 4,942 records, positive cases: min=0, max=1070, mean=7.49

2.各区牲畜种群比较

“卡纳塔克邦哪些地区的牛最多?”

data = await client.call_tool("4_get_data", {
    "dataset_id": "0041",
    "table_name": "ka-district-livestock-pop-2019",
    "limit": 30
})
# Results (top 5 by cattle population):
#   BELAGAVI:   cattle=549,540  buffalo=844,171  sheep=757,679
#   HASSAN:     cattle=548,185  buffalo=107,971  sheep=199,387
#   SHIVAMOGGA: cattle=518,653  buffalo=120,563  sheep=42,526
#   MYSURU:     cattle=492,598  buffalo=21,682   sheep=203,463
#   TUMAKURU:   cattle=431,251  buffalo=142,047  sheep=1,290,008

3.FMD疫苗疗效跟踪

“多年来,卡纳塔克邦的口蹄疫血清监测发生了怎样的变化?”

data = await client.call_tool("4_get_data", {
    "dataset_id": "0087",
    "table_name": "seromonitoring",
    "filters": {"state.name": "KARNATAKA"},
    "limit": 20
})
# Results (antibody levels over time):
#   2011: PostVac A%=15.0, PostVac O%=56.0  (FMDCP)
#   2012: PostVac A%=27.0, PostVac O%=67.0  (FMDCP)
#   2013: PostVac A%=78.7, PostVac O%=62.1  (FMDCP)
#   → Shows improving seroconversion rates for type A

4.行政区域查找

“查找印度行政单位的LGD代码”

data = await client.call_tool("4_get_data", {
    "dataset_id": "0034",
    "table_name": "regionids",
    "filters": {"regionName": "PUNE"},
    "limit": 5
})
# → regionID: district_490, regionName: PUNE, parentID: state_27
# 147,423 total regions (states, districts, subdistricts, villages, ULBs)

5.口蹄疫疫苗接种进展

“向我展示卡纳塔克邦最新一轮口蹄疫疫苗接种进展”

data = await client.call_tool("4_get_data", {
    "dataset_id": "0055",
    "table_name": "round6",
    "filters": {"district.name": "Bengaluru Urban"},
    "limit": 10
})
# → 588 daily progress records for Round 6
# Sample: date=2024-11-28, cattle_vaccinated=9, buffalo_vaccinated=0

从代码连接

import asyncio
from fastmcp import Client

async def main():
    async with Client("http://localhost:8000/mcp") as client:
        # Step 1: Discover datasets
        overview = await client.call_tool("1_know_about_artpark_data", {})
        print(overview.content[0].text)

        # Step 2-4: Follow the workflow...

asyncio.run(main())

从克劳德桌面连接

添加到您的Claude Desktop MCP配置(~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "artpark": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

然后问克劳德: “卡纳塔克邦受登革热影响最大的地区是什么?”

从游标连接

增添 .cursor/mcp.json:

{
  "mcpServers": {
    "artpark-health": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

部署

码头工人

docker build -t artpark-mcp .
docker run -d -p 8000:8000 --name artpark-server artpark-mcp

Docker Compose(带Jaeger跟踪)

docker-compose up -d
# Server: http://localhost:8000/mcp
# Jaeger UI: http://localhost:16686

建筑

artpark_server.py          # FastMCP server — 4 tools, LLM-optimized docstrings
artpark/
  client.py                # Local data reader — reads CSV + metadata.yaml
observability/
  telemetry.py             # OpenTelemetry middleware (from esankhyiki-mcp)
publicdata/                # Cloned data repo (dsih-artpark/publicdata)
  data/
    0015/                  # Each dataset: CSV files + metadata.yaml
    0034/
    0041/
    ...

设计原则(继承自esankhiyiki mcp)

原理 实施
顺序工作流 编号工具前缀(1_, 2_, 3_, 4_)执行命令
LLM优化的文档字符串 RULES (MUST follow exactly) 块防止产生幻觉的查询
元数据.yaml作为真理的来源 来自YAML的列模式,不是硬编码的
响应指南 _next_step 和 _retry_hint 钥匙控制LLM
不区分大小写的过滤 “Mysuru”与数据中的“Mysuru”匹配

学分