ARTPARK公共数据MCP服务器
Devin供电 Deepwiki文档
MCP(模型上下文协议)服务器,用于通过人工智能助手访问ARTPARK的公共卫生数据集。基于FastMCP 3.0构建,遵循以下架构 esankhiyiki mcp.
8个数据集 涵盖登革热流行病学、牲畜普查、口蹄疫疫苗接种和监测,以及来自 DSIH艺术公园.
______________________________________________________________________
快速开始
# Clone with submodules
git clone --recurse-submodules
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 |
______________________________________________________________________
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)来自以下单个问题:
- *“印度的口蹄疫疫苗接种计划有效吗?”* → 跨数据集推理
- *“告诉我卡纳塔克邦口蹄疫疫苗接种之旅的故事。”* → 时间叙事
- *“不同牲畜类型的口蹄疫有什么令人惊讶的差异吗?”* → 隐藏模式
- *“卡纳塔克邦应该在哪里优先接种下一次口蹄疫疫苗?”* → 政策情报
第四步:扩大规模——要求进行雄心勃勃的调查
这 复杂的调查 是在多步骤对话中生成的:
- 头脑风暴: 我们问: *“想想一些真正雄心勃勃的想法——我们能建立一个模型吗?大海捞针吗?揭穿一个普遍的神话吗?”* AI生成 5调查思路 详细说明。
- 执行: 我们说: *“构建它们中的每一个。您将与MCP服务器交互,并报告您发现的内容。”* 然后,AI自主地:
- 调用MCP工具从多个数据集中提取数据 - 交叉引用的数据集(例如,将17个地区的登革热+牲畜数据合并) - 计算统计数据(斯皮尔曼相关性、免疫崩溃增量、风险评分) - 撰写完整的降价报告,包括数据表、方法和结论
- 优化: 我们提示 *“继续”* 和 *“完善它”* 几次——每次调查都需要多次特工轮换才能完成分析并完善报告。
- 验证: 我们要求人工智能根据实时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.492.各区牲畜种群比较
“卡纳塔克邦哪些地区的牛最多?”
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,0083.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 A4.行政区域查找
“查找印度行政单位的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-mcpDocker 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”匹配 |
______________________________________________________________________
学分
- 数据: ARTPARK数据科学创新中心(DSIH)班加罗尔IISc
- 建筑:改编自 nso印度/esankhiyiki mcp (MoSPI MCP服务器)
- 框架: FastMCP 3.0
- 协议: 模型上下文协议
