医疗-MCP工具包
已准备好投入生产 MCP风格 提供临床工具的服务器 IBM Watsonx Orchestrate 代理。
它是什么: 一个干净的MCP服务器,提供暴露(或“对外开放”)服务 12种医疗工具 通过两者: - 一 HTTP API (FastAPI) 用于快速测试和服务集成。 - MCP运输 (SSE/STDIO) 用于大型语言模型(LLM)多智能体协同调度。
______________________________________________________________________
✨ 特点
- 12个工具耐心(此处可能指对患者要有耐心,但直译为“耐心”在语境中略显生硬,实际应用中可根据上下文调整)、生命体征、病历资料、临床计算器、药物信息/药物相互作用/禁忌症/替代药物、症状分诊、知识库搜索、预约管理、患者360度视图。
- FastAPI HTTP 端点:
/health,/schema,/tools,/invoke。 - 承载令牌认证 (设置
BEARER_TOKEN)。 - 由UV管理 Python环境(
uv sync,.venv)。 - 集装箱化 (Dockerfile)。将结构化日志输出到标准输出。
- 邮递员 一键测试集合。
- 美人鱼建筑风格 (保持与以下提供内容完全一致)。
PostgreSQL 后端 具有与JSON Schema对齐的生产就绪模式,并附带预填充的演示数据, Dockerfile.db,和 Makefile 数据库助手(db-up, db-down, db-logs, db-reset)。
______________________________________________________________________
🧠 系统上下文
graph TD
%% === STYLES ===
classDef agent fill:#eefaf0,stroke:#1a7f37,stroke-width:2px
classDef tool fill:#f3e8fd,stroke:#8e44ad,stroke-width:1px
classDef external fill:#f8f9fa,stroke:#666,stroke-width:1px,stroke-dasharray: 5 5
%% === ORCHESTRATION AGENTS ===
subgraph WXO[IBM watsonx Orchestrate]
direction TB
Coordinator[Medical Coordinator Agent]:::agent
Triage[Emergency Triage Agent]:::agent
GenMed[General Medicine Agent]:::agent
subgraph Specialists
direction LR
Cardiology[Cardiology]:::agent
Pediatrics[Pediatrics]:::agent
Oncology[Oncology]:::agent
Endocrinology[Endocrinology]:::agent
end
%% Agent Handoffs
Coordinator -->|delegates| Triage
Coordinator -->|routes| GenMed
GenMed -->|refers| Specialists
end
%% === BACKEND SERVICES & TOOLS ===
subgraph BackendServices [Backend Services]
direction TB
subgraph MCPToolkit[Medical MCP Toolkit]
direction TB
T1[getPatient]:::tool
T2[getPatientVitals]:::tool
T3[getPatientMedicalProfile]:::tool
T4[calcClinicalScores]:::tool
T5[getDrugInfo]:::tool
T6[triageSymptoms]:::tool
T7[searchMedicalKB]:::tool
T8[scheduleAppointment]:::tool
end
subgraph ExternalRuntimes [External Runtimes]
MCPServer[Medical MCP Server
FastMCP/SSE]:::external
WatsonxAI[watsonx.ai Foundation Models]:::external
end
MCPToolkit -.->|runtime API calls| MCPServer
MCPServer -.->|LLM calls| WatsonxAI
end
%% === CONNECTIONS ===
WXO -->|All agents use| MCPToolkit伴侣多智能体仓库(Orchestrate) 这个仓库:
______________________________________________________________________
🚀 快速入门(uv)
# 1) Clone and enter the repo
git clone https://github.com/ruslanmv/medical-mcp-toolkit
cd medical-mcp-toolkit
# 2) Create your environment file
cp .env.example .env
# Edit .env and set BEARER_TOKEN, and (optionally) DATABASE_URL
# 3) (Optional) Start Postgres DB with schema + seed data
make db-up
# Verify: make db-logs or docker ps
# 4) Create venv and install deps (uv-managed)
make install # or: make uv-install
# 5) Run the HTTP server (FastAPI on port 9090)
make run-api # (equivalent to: uv run uvicorn server:app --host 0.0.0.0 --port 9090)典型的启动日志(示例):
2025-10-15 12:16:46,272 INFO [mcp_server] [registry] 12 tools registered: calcClinicalScores, getDrugAlternatives, getDrugContraindications, getDrugInfo, getDrugInteractions, getPatient, getPatient360, getPatientMedicalProfile, getPatientVitals, scheduleAppointment, searchMedicalKB, triageSymptoms
INFO: Started server process [23217]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:9090 (Press CTRL+C to quit)______________________________________________________________________
✅ 吸烟测试(bash)
健康是 纯文本 (ok),所以使用 jq -R .:
curl -sS http://localhost:9090/health | jq -R .
# "ok"调用一个工具:
curl -sS -X POST "http://localhost:9090/invoke" \
-H 'Authorization: Bearer dev-token' \
-H 'Content-Type: application/json' \
-d '{
"tool": "triageSymptoms",
"args": {
"age": 45,
"sex": "male",
"symptoms": ["chest pain","sweating"],
"duration_text": "2 hours"
}
}' | jq示例结果:
{
"ok": true,
"tool": "triageSymptoms",
"result": {
"acuity": "urgent",
"advice": "call emergency services",
"rulesMatched": ["chest pain", "diaphoresis"],
"nextSteps": ["ECG", "troponin", "aspirin if not contraindicated"]
}
}如果你看到jq解析错误,你可能是在传递非JSON数据。/health是文本/纯文本类型;/invoke是JSON。添加-i到curl查看HTTP状态码/头部信息。
______________________________________________________________________
🔌 HTTP API
GET /health→ 好的 (纯文本)
- JSON视图技巧: curl -sS /health | jq -R -r . → ok
GET /schema(auth) → 组件 JSON 架构(来自schemas/components.schema.json)
GET /tools(auth) →{"tools": ["..."]}
POST /invoke(认证) →{"ok": true, "tool": "", "result": ...}
认证: 设置 BEARER_TOKEN 在服务器环境中。如果未设置,则禁用认证(开发模式)。 发送: Authorization: Bearer for /schema, /tools, /invoke.
______________________________________________________________________
🧰 可用工具(12个)
- 患者:
getPatient,getPatientVitals,getPatientMedicalProfile - 计算器:
calcClinicalScores(体重指数,体表面积,肌酐清除率,估算肾小球滤过率) - 药物:
getDrugInfo,getDrugInteractions,getDrugContraindications,getDrugAlternatives - 分类与知识库(Triage & KB)
triageSymptoms,searchMedicalKB - 调度与P360:
scheduleAppointment,getPatient360
使用 GET /tools 列出名字,并且 GET /schema 用于类型化输入/输出。
______________________________________________________________________
🧪 更多示例
列出工具:
curl -sS "http://localhost:9090/tools" \
-H 'Authorization: Bearer dev-token' | jq获取模式:
curl -sS "http://localhost:9090/schema" \
-H 'Authorization: Bearer dev-token' | jq药品信息:
curl -sS -X POST "http://localhost:9090/invoke" \
-H 'Authorization: Bearer dev-token' \
-H 'Content-Type: application/json' \
-d '{"tool":"getDrugInfo","args":{"drug":"lisinopril"}}' | jq______________________________________________________________________
🧵 MCP 传输(SSE / STDIO)
对于LLM(大型语言模型)代理,相同的工具也通过MCP(可能是指某种中间件或控制平台)暴露出来。
SSE传输(端口9090):
uv run python -c "import asyncio; \
from medical_mcp_toolkit.mcp_server import run_mcp_async; \
asyncio.run(run_mcp_async('sse', host='0.0.0.0', port=9090))"STDIO传输:
uv run python -c "import asyncio; \
from medical_mcp_toolkit.mcp_server import run_mcp_async; \
asyncio.run(run_mcp_async('stdio'))"注:该 HTTP API 由……提供服务/由……负责uvicorn server:app. 那个 SSE/STDIO MCP 运行器是独立的(与……分开的)mcp_server.py)。 选择您需要的模式。
______________________________________________________________________
🗄️ 数据库(基于Docker的PostgreSQL)
你将获得:
Dockerfile.db— 生产级Postgres镜像构建器。db/10_init.sql— 完整架构(患者信息、生命体征、病情、过敏史、药物;药品、相互作用;预约;审核)。db/20_seed.sql— 演示数据(患者demo-001,demo-002以及基本药物KB。- Makefile 辅助工具:
db-up,db-down,db-logs,db-reset。
启动数据库:
make db-up
# or direct script:
scripts/create_db.sh管理数据库:
make db-logs # tail logs
make db-down # stop & remove container
make db-reset # recreate fresh DB (drops data)默认DSN(匹配 .env.example):
postgresql://mcp_user:mcp_password@localhost:5432/medical_db______________________________________________________________________
🔧 脚本
scripts/mcp_curl_demo.sh— 跨平台演示版用于 两者 HTTP 和 SSE JSON-RPC。
示例:
# HTTP mode (health, tools, invoke)
MODE=http TOKEN=dev-token ./scripts/mcp_curl_demo.sh
# SSE JSON-RPC mode (initialize, tools/list, tools/call triage)
MODE=sse TOKEN=dev-token CALL_TOOL=triageSymptoms ./scripts/mcp_curl_demo.sh______________________________________________________________________
🛠️ 开发
环境(由uv管理):
make install # or: make uv-install
make fmt # ruff format + black
make lint # ruff check
make test # pytest运行HTTP API(开发版):
export BEARER_TOKEN=dev-token
make run-api
# (equivalent to: uv run uvicorn server:app --host 0.0.0.0 --port 9090)运行MCP SSE(开发版):
uv run python -c "import asyncio; from medical_mcp_toolkit.mcp_server import run_mcp_async; asyncio.run(run_mcp_async('sse', host='0.0.0.0', port=9090))"______________________________________________________________________
🐳 Docker(注:Docker是一个用于开发、交付和运行应用程序的开源平台)
构建并运行:
make docker-build
BEARER_TOKEN=prod-secret make docker-run
# Server will listen on container port 9090 and be mapped to localhost:9090日志与停止:
make docker-logs
make docker-stop直接构建数据库镜像(可选):
docker build -t medical-db -f Dockerfile.db .
docker run -d --name medical-db-container \
-e POSTGRES_USER=mcp_user \
-e POSTGRES_PASSWORD=mcp_password \
-e POSTGRES_DB=medical_db \
-p 5432:5432 \
medical-db______________________________________________________________________
⚙️ 配置(环境)
BEARER_TOKEN— 在非开发环境中进行身份验证所需。
DATABASE_URL— PostgreSQL 数据源名称 (DSN)(可选;如果未设置,演示将使用内存中的数据)。
- 默认(参见 .env.example): postgresql://mcp_user:mcp_password@localhost:5432/medical_db
MCP_LOG_LEVEL— MCP部件的日志级别(INFO,DEBUG,……)。
UVICORN_LOG_LEVEL— Uvicorn 的日志级别(info,debug,……)。
- (适配器,在你连接实际系统时)
- DRUG_API_BASE, DRUG_API_KEY - KB_BASE - SCHED_BASE
______________________________________________________________________
📬 信使
进口 postman/medical-mcp-toolkit.postman_collection.json。 设置变量:
baseUrl→http://localhost:9090token→ 您的承载令牌(例如。,dev-token)
______________________________________________________________________
🧩 你可以用这个仓库做什么
- 即插即用的医疗工具 对于多智能体系统(如watsonx Orchestrate等)。
- 通过HTTP调用工具 用于快速原型制作、仪表板开发或RPA粘合工具。
- 运行MCP传输 因此,大型语言模型(LLM)代理可以原生地调用相同的函数。
- 交换演示适配器 在实际的电子健康记录(EHR)/药品数据库(Drug-DB)/知识库(KB)/调度系统中使用,同时保持类型化的合同(Pydantic模型 + JSON Schema)。
- “Ship to prod”可以翻译为“发运至生产环境”或“部署到生产环境”,具体取决于上下文,但通常指的是将软件、系统或产品从开发或测试环境转移到实际生产或运行环境中 采用Docker并具有轻量级的运行开销。
______________________________________________________________________
🧯 故障排除
jq: parse error ...on/health那条路线返回 纯文本(text/plain)用途:
curl -sS http://localhost:9090/health | jq -R -r .401 Unauthorized在/invoke使用以下命令启动服务器:BEARER_TOKEN并且将同样的(信息/内容)传递进去Authorization: Bearer ...。
- 你开始了 SSE MCP 运行器 但它们正在调用HTTP端点:SSE模式不适用
/invoke使用uvicorn server:app用于HTTP API。
- 检查端口绑定:
ss -ltnp | grep 9090 # or: sudo lsof -i :9090______________________________________________________________________
📜 许可证
Apache 2.0 —— 请参阅 LICENSE。
______________________________________________________________________
🤝 致谢
以❤️倾心打造,满足生产级别的临床AI原型开发需求。 针对……优化 IBM Watsonx Orchestrate 多智能体系统和兼容的大型语言模型(LLM)运行时环境。
