这是一个全面的FHIR(快速医疗互操作性资源)服务器和工具包,专为医疗数据集成、患者护理规划和临床决策支持而设计。该项目提供了一个通用接口,可连接多个FHIR服务器,并具备先进的人工智能临床分析能力。
本项目主要包含两个核心组件:
fhir_server.py) - 一个模型上下文协议(MCP)服务器,用于为多个FHIR服务器提供标准化访问。fhir_tools.py) - 一个全面的Python库,用于FHIR数据的操作、分析以及基于人工智能的临床洞察。克隆仓库
git clone https://github.com/Kushagra-Dutta/Fhir-MCP.git
cd FHIR-MCP
安装依赖项
pip install -r requirements.txt
# 或者使用uv
uv sync
配置环境变量
# 创建.env文件
echo "OPENAI_API_KEY=your_openai_api_key" > .env
运行FHIR MCP服务器
python fhir_server.py
获取Firely服务器许可证密钥
firelyserver-license.json使用Docker进行设置
# 拉取Firely服务器镜像
docker pull firely/server
# 运行容器
# 对于Windows CMD:
docker run -d -p 9090:4080 --name firely.server -v %CD%/firelyserver-license.json:/app/firelyserver-license.json firely/server
# 对于PowerShell或macOS/Linux:
docker run -d -p 9090:4080 --name firely.server -v ${PWD}/firelyserver-license.json:/app/firelyserver-license.json firely/server
# 验证容器是否正在运行
docker ps
加载测试数据
完成这些步骤后,您将拥有一个可在 http://localhost:9090 访问的测试数据库。
您可以通过分叉仓库或使用Docker来设置MCP聊天机器人客户端。该聊天机器人将作为与FHIR服务器交互的前端界面。
获取聊天机器人设置
# 克隆仓库
git clone https://github.com/cgoinglove/mcp-client-chatbot.git
cd mcp-client-chatbot
安装PNPM(如果未安装)
npm install -g pnpm
选择设置方法
# 安装依赖项
pnpm i
# 配置环境变量
# 编辑.env文件,添加您的API密钥(在pnpm i后自动创建)
# 启动所有服务,包括PostgreSQL
pnpm docker-compose:up
# 安装依赖项
pnpm i
# 设置环境变量
pnpm initial:env
# 启动PostgreSQL(如果已经运行则跳过)
pnpm docker:pg
# 运行数据库迁移
pnpm db:migrate
# 启动开发服务器
pnpm dev
# 可选:构建并启动以进行类似生产环境的测试
pnpm build:local && pnpm start
配置环境变量
创建或编辑 .env 文件,添加所需的API密钥:
# LLM提供商API密钥(添加您计划使用的密钥)
OPENAI_API_KEY=****
GOOGLE_GENERATIVE_AI_API_KEY=****
ANTHROPIC_API_KEY=****
XAI_API_KEY=****
OPENROUTER_API_KEY=****
OLLAMA_BASE_URL=http://localhost:11434/api
# 身份验证配置
BETTER_AUTH_SECRET=**** # 使用:npx @better-auth/cli@latest secret生成
BETTER_AUTH_URL= # 可选:您访问应用的URL
# 数据库配置
POSTGRES_URL=postgres://your_username:your_password@localhost:5432/your_database_name
# MCP配置
FILE_BASED_MCP_CONFIG=false
# 可选的OAuth设置(用于Google/GitHub登录)
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
将MCP服务器连接到聊天机器人
.chatbot-config.json 配置配置系统提示
src/app/prompts.tssystem_prompt.txt 中的自定义提示替换默认系统提示export const defaultSystemPrompt = `您是一个强大的智能AI编码助手。
您可以使用一组工具来回答用户的问题。
1. 保持对话风格,但要专业。
2. 用第二人称称呼用户,用第一人称称呼自己。
3. 以Markdown格式格式化您的回复。
4. 绝不撒谎或编造信息。
遵循以下关于工具调用的规则:
1. 始终严格按照工具调用模式进行操作。
2. 绝不调用未明确提供的工具。
3. 仅在必要时调用工具。
4. 在调用每个工具之前,先向用户解释调用原因。
进行代码更改时:
1. 添加所有必要的导入语句和依赖项。
2. 除非用户要求,否则绝不向用户输出代码。
3. 使用适当的代码编辑工具进行实现。
`;
:定义AI的交互方式:指定使用工具的规则:设置代码修改的准则完成这些步骤后,您的聊天机器人将连接到MCP服务器,并准备好与FHIR数据库进行交互。
from fhir_tools import UniversalFhirMcpServer
# 初始化服务器
fhir_server = UniversalFhirMcpServer()
await fhir_server.initialize()
# 测试服务器连接
result = await fhir_server.test_server_connectivity("firely_local")
print(result)
# 切换到不同的服务器
await fhir_server.switch_server("hapi_r4")
# 搜索患者
search_criteria = {
"family": "Smith",
"given": "John",
"birthdate": "1990-01-01"
}
patients = await fhir_server.find_patient(search_criteria)
# 获取全面的患者信息
patient_info = await fhir_server.get_comprehensive_patient_info("patient-123")
# 获取特定类型的数据
conditions = await fhir_server.get_patient_conditions("patient-123")
medications = await fhir_server.get_patient_medications("patient-123")
vital_signs = await fhir_server.get_vital_signs("patient-123")
lab_results = await fhir_server.get_lab_results("patient-123")
# 从自由文本中提取临床关键词
clinical_note = "45岁女性,患有HER2阳性浸润性导管癌,III期A"
keywords = await fhir_server.extract_clinical_keywords(clinical_note)
# 将临床术语映射到FHIR代码
clinical_data = {
"conditions": ["乳腺癌", "糖尿病"],
"age": 45,
"gender": "女性"
}
fhir_codes = await fhir_server.map_to_fhir_codes_fast(clinical_data)
# 查找具有相似临床特征的患者
criteria = {
"age": 45,
"gender": "女性",
"conditions": ["乳腺癌"]
}
similar_patients = await fhir_server.find_similar_patients_simple(criteria)
FHIR服务器可以用作MCP服务器,以与AI助手集成:
{
"mcpServers": {
"fhir-server": {
"command": "python",
"args": ["fhir_server.py"],
"env": {
"OPENAI_API_KEY": "your-key-here"
}
}
}
}
graph TD
A[FHIR Server] --> B[Universal FHIR MCP Server]
B --> C[FHIR Tools Library]
C --> D[Multiple FHIR Servers]
C --> E[OpenAI Integration]
C --> F[Caching Layer]
D --> G[Firely Local]
D --> H[HAPI R4]
D --> I[Epic Systems]
D --> J[Cerner]
E --> K[Clinical Text Analysis]
E --> L[Code Mapping]
E --> M[Patient Matching]
系统维护了一个全面的FHIR服务器注册表:
http://localhost:9090) - 本地开发服务器http://hapi.fhir.org/baseR4) - 公共测试服务器系统支持在 fhir_tools.py 中配置多个FHIR服务器:
servers = {
"firely_local": {
"name": "Firely Server Local",
"base_url": "http://localhost:9090",
"version": "R4",
"vendor": "Firely",
"auth_type": "none"
},
"hapi_r4": {
"name": "HAPI FHIR R4 Public",
"base_url": "http://hapi.fhir.org/baseR4",
"version": "R4",
"vendor": "HAPI",
"auth_type": "none"
}
}
# 必需
OPENAI_API_KEY=your_openai_api_key
# 可选
FHIR_SERVER_URL=http://localhost:9090
FHIR_SERVER_AUTH_TOKEN=your_auth_token
switch_server(server_name) - 在FHIR服务器之间切换test_server_connectivity(server_name) - 测试服务器连接find_patient(search_criteria) - 搜索患者get_comprehensive_patient_info(patient_id) - 获取完整的患者数据get_patient_observations(patient_id) - 获取患者观察数据get_patient_conditions(patient_id) - 获取患者病情信息get_patient_medications(patient_id) - 获取患者用药信息get_vital_signs(patient_id) - 获取生命体征数据get_lab_results(patient_id) - 获取实验室检查结果get_patient_encounters(patient_id) - 获取患者就诊记录get_patient_allergies(patient_id) - 获取患者过敏史get_patient_procedures(patient_id) - 获取患者手术记录extract_clinical_keywords(text) - 从文本中提取临床信息map_to_fhir_codes_fast(clinical_data) - 将术语映射到FHIR代码find_similar_patients_simple(criteria) - 查找相似患者extract_condition_codes_from_fhir() - 提取所有病情代码list_available_servers() - 列出所有配置的服务器get_server_registry() - 获取完整的服务器注册表diagnose_fhir_server(server_name) - 诊断服务器功能clear_condition_cache() - 清除病情代码缓存get_condition_cache_stats() - 获取缓存性能统计信息MCP(模型上下文协议)检查器是一个强大的开发和测试工具,可帮助调试和验证FHIR服务器交互。它提供对服务器行为和API响应的实时检查。
# 在特定文件上运行MCP检查器
mcp dev fhir_server.py
# 这将:
# 1. 以开发模式启动检查器
# 2. 监控所有FHIR服务器交互
# 3. 将详细信息记录到logs/mcp_dev_inspector.log
检查器将详细日志写入:
logs/mcp_dev_inspector.log
该工具包可支持自动化医院参与平台:
患者护理协调
临床决策支持
资源优化
质量改进
FHIR时间线代理 (fhir_timeline_agent.py) 是一个专门的代理,用于根据患者查询,使用真实的FHIR数据生成详细的临床治疗时间线。它专门配置为与Firely本地FHIR服务器配合使用。
# 以交互式聊天界面模式运行
python fhir_timeline_agent.py
# 以演示模式运行,使用示例查询
python fhir_timeline_agent.py --demo
• "45岁男性,患有胰腺癌"
• "62岁女性,患有HER2阳性乳腺癌"
• "58岁男性,患有IIIA期肺腺癌"
查询处理
FHIR代码映射
相似患者搜索
数据聚合
时间线生成
代理生成丰富的格式化输出,包括:
该代理硬编码使用:
http://localhost:9090).env 文件中设置)openai>=1.86.0
rich>=13.7.0
python-dotenv>=1.0.0
aiohttp>=3.8.0
代理包含强大的错误处理机制,用于处理:
每个错误都会显示有用的解决建议。
# 运行基本连接测试
python -c "
import asyncio
from fhir_tools import UniversalFhirMcpServer
async def test():
server = UniversalFhirMcpServer()
await server.initialize()
result = await server.test_server_connectivity('firely_local')
print(result)
asyncio.run(test())
"
# 全面的服务器诊断
diagnostics = await fhir_server.diagnose_fhir_server("firely_local")
print(diagnostics)
系统提供全面的日志记录:
import logging
# 配置日志记录
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 日志自动写入logs/mcp_dev_inspector.log
本项目采用MIT许可证 - 详情请参阅 LICENSE 文件。
如有支持需求或问题:
怀着对医疗互操作性和患者护理改善的热爱而构建