使用说明
🏥 openEHR MCP服务器
使用模型上下文协议(MCP)和openEHR标准将AI助手连接到电子健康记录(EHR)系统的智能桥梁。
该服务器使像Claude这样的人工智能助手能够与符合openEHR标准的EHR系统无缝交互,提供对医疗数据的自然语言访问,同时保持临床标准和数据隐私。
📚 目录
🔬 技术概述
模型上下文协议(MCP)
什么是MCP?
模型上下文协议(MCP)是由Anthropic开发的一种开放协议,它规范了人工智能应用程序如何与外部数据源和工具进行通信。它充当通用适配器,允许大型语言模型(LLM)以安全、受控的方式访问来自各种系统的上下文。
关键概念:
- 基于协议的通信:MCP为AI模型请求和接收信息定义了一种标准方式
- 工具执行:AI可以执行预定义的函数(工具)来执行数据库查询、API调用或文件操作等操作
- 资源管理:通过适当的身份验证和权限提供对数据源的结构化访问
- 提示系统:预定义的对话模板,用于指导人工智能交互
为什么MCP很重要:
传统的人工智能集成需要为每个数据源定制代码。MCP通过提供以下功能消除了这种情况:
- 🔒 安全:通过适当的身份验证对敏感系统进行受控访问
- 🔄 标准化:一个协议适用于所有集成
- 🚀 可扩展性:易于添加新工具和数据源
- 🛡️ 安全:内置AI行动护栏
了解更多:
- 官方文件:https://modelcontextprotocol.io/
- 协议规范:https://spec.modelcontextprotocol.io/
openEHR
什么是openEHR?
openEHR(开放式电子健康记录)是一种用于电子健康记录和健康数据管理的开源技术。它不仅仅是一个标准,它是一个构建面向未来的医疗信息系统的综合框架。
核心架构:
-
两级建模:
- 参考模型(RM):稳定的信息结构(如“观察”、“组成”)
- 原型:可重复使用的临床内容定义(如“血压”、“实验室结果”)
- 模板:原型的具体用例组合
-
关键组件:
- 电子健康记录:患者数据的电子健康记录容器
- 构图:包含临床信息的文件(就诊记录、实验室结果等)
- AQL(原型查询语言):用于查询健康数据的类SQL语言
为什么选择openEHR?
- 📊 语义互操作性:数据在不同系统中的含义相同
- 🔄 未来考验:临床知识与技术实施分离
- 🌍 国际标准:符合ISO 13606标准
- 🔓 供应商独立性:开放式规格防止锁定
真实世界示例:
Blood Pressure (Archetype)
├── Systolic: 120 mmHg
├── Diastolic: 80 mmHg
├── Position: Sitting
└── Time: 2025-12-14 10:30:00
了解更多:
- 官方网站:https://www.openehr.org/
- 临床知识经理:https://ckm.openehr.org/
- 规格:https://specifications.openehr.org/
Qdrant矢量数据库
Qdrant是什么?
Qdrant是一个高性能的向量数据库,专为相似性搜索和人工智能应用而设计。它将数据存储为高维向量(嵌入),并支持基于意义而不是精确关键字匹配的快速语义搜索。
矢量搜索的工作原理:
- 文本嵌入:将文本转换为数字向量(例如“胸痛”→ [0.23, -0.45, 0.67, ...])
- 语义相似性:相似的概念有相似的向量
- 快速检索:以毫秒为单位查找最近的邻居
例子:
Query: "patient has persistent cough and fever"
Embedding: [0.12, 0.45, -0.23, ...]
Qdrant finds similar vectors:
✓ R05 - Cough (similarity: 91.2%)
✓ R50.9 - Fever, unspecified (similarity: 88.7%)
✓ J00 - Acute nasopharyngitis (similarity: 85.3%)
为什么选择Qdrant?
- ⚡ 演出:用Rust编写,针对速度进行了优化
- 🎯 准确度:高级过滤和评分功能
- 🔧 易于集成:REST API和Python客户端
- 💾 可扩展性:高效处理数百万矢量
- 🐳 Docker就绪:部署简单
了解更多:
- 官方文件:https://qdrant.tech/documentation/
- GitHub存储库:https://github.com/qdrant/qdrant
🏗️ 本项目如何使用这些技术
1.️⃣ FastMCP集成
FastMCP 是一个简化构建MCP服务器的Python框架。我们使用它来:
from fastmcp import FastMCP
mcp = FastMCP("openEHR")
@mcp.tool()
def openehr_ehr_create(subject_id: str) -> dict:
"""Create a new Electronic Health Record"""
# Implementation connects to EHRbase API
return {"ehr_id": "...", "subject_id": subject_id}
我们的实施:
- 🔧 13 MCP工具:EHR、组合、模板和查询的CRUD操作
- 💬 1 MCP提示:预先配置的生命体征采集工作流程
- 🤖 AI驱动的医疗编码:使用语义搜索的ICD-10代码建议
2.️⃣ openEHR和EHR数据库集成
EHR酶 是我们连接到的生产级openEHR REST API实现。
我们的工作流程:
AI Request → MCP Server → EHRbase API → PostgreSQL Database
↓
Validates against
openEHR Templates
我们处理的事项:
- ✅ 模板验证和管理
- ✅ EHR生命周期(创建、检索、查询)
- ✅ 组合CRUD操作
- ✅ AQL查询执行
- ✅ 多种JSON格式(平面、规范、结构化)
3.️⃣ Qdrant医学编码矢量数据库
人工智能ICD-10编码建议:
我们使用Qdrant存储9444+ICD-10代码作为向量嵌入,实现智能医疗编码:
Clinical Text: "Patient with chronic cough and fever"
↓
Sentence Transformer (all-mpnet-base-v2)
↓
Vector Embedding [768 dimensions]
↓
Qdrant Semantic Search
↓
Results:
• R05 - Cough (91.2% match)
• R50.9 - Fever (88.7% match)
可选增强功能:
- 🤖 针对复杂多条件查询的Gemini AI优化
- 📊 多种条件下的批处理
✨ 特性和功能
核心MCP工具
| 工具 | 描述 | 用例 |
|---|---|---|
openehr_template_list |
列出所有可用的openEHR模板 | 发现可用的临床文档类型 |
openehr_template_get |
检索特定模板定义 | 了解模板结构 |
openehr_template_example_composition |
生成示例组合 | 参见示例数据格式 |
openehr_ehr_create |
创建新的电子健康记录 | 注册新患者 |
openehr_ehr_get |
按ID检索EHR | 访问患者记录 |
openehr_ehr_list |
列出所有EHR | 浏览患者记录 |
openehr_ehr_get_by_subject |
按患者标识符查找EHR | 按病历号查找 |
openehr_composition_create |
创建临床文件 | 记录生命体征、实验室结果、笔记 |
openehr_composition_get |
检索临床文档 | 查看历史数据 |
openehr_composition_update |
更新临床文件 | 更正或修改记录 |
openehr_composition_delete |
删除临床文档 | 删除错误条目 |
openehr_query_adhoc |
执行AQL查询 | 复杂数据检索 |
suggest_icd_codes |
基于人工智能的ICD-10建议 | 自动化医疗编码 |
MCP提示
vital_signs_capture:记录生命体征并进行适当验证的指导性工作流程
🏛️ 建筑
┌─────────────────────────────────────────────────────────────┐
│ Claude / AI Assistant │
└────────────────────────┬────────────────────────────────────┘
│ MCP Protocol
│
┌────────────────────────▼────────────────────────────────────┐
│ openEHR MCP Server (FastMCP) │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ EHR Tools │ │ Query Tools │ │Medical Coding │ │
│ └──────┬───────┘ └───────┬──────┘ └─────────┬─────┘ │
└─────────┼──────────────────┼──────────────────┼─────────────┘
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌──────────────┐
│ EHRbase │ │ PostgreSQL │ │ Qdrant │
│ (openEHR API) │ │ Database │ │ Vector DB │
└───────────────┘ └───────────────┘ └──────────────┘
🚀 入门指南
先决条件
软件需求
在开始之前,请确保您已经:
- Python 3.12+ -用于运行MCP服务器
- Git -用于克隆存储库
- Docker&Docker编写 -用于运行后端服务
- 克劳德桌面 (或另一个兼容MCP的客户端)-用于AI助手集成
后端服务(全部包含在Docker Compose中)
该项目包括一个完整的Docker Compose设置,可以自动配置:
-
EHR数据库服务器 (
localhost:8080)- 产品级openEHR REST API实现
- 处理EHR记录、组成和模板
- 为API探索提供Swagger UI
-
PostgreSQL数据库 (
localhost:5432)- EHRbase的数据库后端
- 使用openEHR模式存储所有EHR数据
- 预先配置了所需的扩展
-
Qdrant矢量数据库 (
localhost:6333)- 存储ICD-10代码嵌入(9444+代码)
- 启用医疗编码的语义搜索
- 端口6333上的REST API,端口6334上的gRPC
- ⚠️ 使用前需要加载ICD-10嵌入文件
suggest_icd_codes工具
💡 一切都是预先配置好的! 这
docker-compose.yml文件在docker-compose/目录包括所有三个服务,并带有适当的网络和初始化脚本。
快速设置(3步)
步骤1:克隆并安装
# Clone the repository
git clone https://github.com/yourusername/openehr-mcp-server.git
cd openehr-mcp-server
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
步骤2:配置环境
# Copy example environment file
cp .env.example .env
# Edit .env and add your API key
# GEMINI_API_KEY=your_actual_api_key_here
📖 有关详细的设置说明,请参阅 设置.md
步骤3:启动服务
# Start EHRbase and Qdrant
cd docker-compose
docker compose up -d
# Verify services are running
docker compose ps
配置Claude桌面
1.找到您的Claude Desktop配置文件:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - 视窗:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
2.复制并自定义您的MCP配置:
# Copy the example config
cp mcp-config.example.json mcp-config.json
# Edit with your actual project paths
# Replace /path/to/your/project with your installation directory
3.添加到Claude桌面配置:
{
"mcpServers": {
"openEHR": {
"command": "/path/to/your/project/venv/bin/python",
"args": ["/path/to/your/project/src/openehr_mcp_server.py"],
"env": {
"EHRBASE_URL": "http://localhost:8080/ehrbase/rest",
"EHRBASE_JSON_FORMAT": "wt_flat",
"PYTHONPATH": "/path/to/your/project/src"
}
}
}
}
4.重新启动克劳德桌面
📖 有关详细的Claude Desktop设置和测试,请参阅 DOCS/MCP_TEST_GUIDE.md
🔧 详细设置和配置
初始设置步骤
1.上传openEHR模板
模板定义临床文档的结构。上传附带的生命体征模板:
# Upload the default template
python scripts/upload_template.py
# Or specify a custom template
python scripts/upload_template.py --template ehr-templates/patient_visit_template.opt
验证模板上传:
访问http://localhost:8080/ehrbase/rest/openehr/v1/definition/template/adl1.4
2.创建电子健康记录(EHR)
在存储临床数据之前,您需要一个EHR容器:
# Create EHR with random subject ID
python scripts/create_ehr.py
# Or create with specific patient identifier
python scripts/create_ehr.py --subject-id "MRN-12345"
该脚本将输出EHR ID-保存以备将来使用。
3.建立ICD-10矢量数据库(医学编码所需)
⚠️ 重要:The suggest_icd_codes MCP工具 需要 ICD-10嵌入要在Qdrant中加载,然后才能执行语义搜索。
加载嵌入的步骤:
# 1. Ensure Qdrant is running
curl http://localhost:6333/healthz
# 2. Prepare ICD-10 dataset (diagnosis.csv)
# Place your CSV file in the project root directory or specify path with --csv
# Required columns: code, short, long
# Example sources: WHO ICD-10 catalog, CMS, or other medical coding databases
# 3. Load embeddings into Qdrant (from project root)
python scripts/embedding.py
# Or specify custom CSV location
python scripts/embedding.py --csv /path/to/your/diagnosis.csv
# Use a different embedding model
python scripts/embedding.py --model sentence-transformers/all-MiniLM-L6-v2
这有什么作用:
- 使用以下函数将9444+ICD-10代码转换为向量嵌入
all-mpnet-base-v2模型 - 将嵌入件存储在Qdrant系列中
icd_mpnet_basev2 - 启用语义相似性搜索(例如,“胸痛”→ ICD代码)
验证:
# Check if collection exists
curl http://localhost:6333/collections
# Check collection size
curl http://localhost:6333/collections/icd_mpnet_basev2
📝 备注:
- 嵌入生成需要ICD-10数据集CSV文件,需要10-15分钟
- 这
suggest_icd_codes没有加载的嵌入,工具将无法工作- 如果你不需要医疗编码,你可以跳过这一步
JSON格式配置
MCP服务器支持多种JSON序列化格式:
| 格式 | 描述 | 用例 |
|---|---|---|
wt_flat (默认) |
简化的平面结构 | AI更容易理解 |
canonical |
标准openEHR JSON | 最大兼容性 |
wt_structured |
结构化web模板 | 复杂嵌套数据 |
通过环境变量配置:
⚠️ 先决条件:ICD-10嵌入必须加载到Qdrant中(见设置步骤3)
# Test ICD-10 code suggestion
python tests/test_icd_coding.py
# Test with MCP protocol
python tests/test_mcp_cholera.py
# If embeddings are not loaded, these tests will fail with:
# "Collection not found" or "No results returned"
## 🧪 Testing & Validation
### Run Integration Tests
```bash
# Install test dependencies
pip install -r requirements-test.txt
# Run all tests
pytest tests/ -v
# Run specific test file
pytest tests/test_ehr_client.py -v
# Run with coverage
pytest tests/ --cov=src --cov-report=html
测试医疗编码功能
# Test ICD-10 code suggestion
python tests/test_icd_coding.py
# Test with MCP protocol
python tests/test_mcp_cholera.py
验证服务
# Check Docker services
docker compose ps
# Test EHRbase
curl http://localhost:8080/ehrbase/rest/openehr/v1/definition/template/adl1.4
# Test Qdrant
curl http://localhost:6333/healthz
# View service logs
docker compose logs -f ehrbase
docker compose logs -f qdrant
可选:启动Streamlit Web UI
对于与EHRbase交互的图形界面:
# Install streamlit if not already installed
pip install streamlit
# Launch the web UI
streamlit run app.py
Streamlit UI提供了一个基于浏览器的界面,用于:
- 📋 列出并管理openEHR模板
- 🏥 创建和检索EHR
- 📝 创建、更新和删除作品
- 🔍 执行AQL查询
- 📊 以用户友好的格式查看JSON数据
访问地址:http://localhost:8501
📖 文档
综合指南
- 设置.md -完整的设置指南,包括环境配置
- DOCS/MCP_TEST_GUIDE.md -Claude Desktop测试和故障排除
- 需求.txt -Python依赖关系
- docker-compose.yml -服务编排
API参考资料
- EHR酶API: http://localhost:8080/ehrbase/swagger-ui/index.html
- API质量标准: https://qdrant.tech/documentation/
- MCP协议: https://spec.modelcontextprotocol.io/
项目结构
openehr-mcp-server/
├── src/ # Source code
│ ├── openehr_mcp_server.py # Main MCP server
│ ├── medical_coding.py # ICD-10 coding logic
│ ├── mcp_prompts.py # MCP prompt definitions
│ └── ehrbase/ # EHRbase API clients
├── scripts/ # Utility scripts
│ ├── create_ehr.py # EHR creation
│ ├── upload_template.py # Template upload
│ ├── embedding.py # ICD-10 embedding generator
│ └── vector_search.py # Vector search utilities
├── tests/ # Test suite
├── docker-compose/ # Docker services configuration
│ └── docker-compose.yml # EHRbase + PostgreSQL + Qdrant
├── ehr-templates/ # openEHR templates (.opt files)
├── DOCS/ # Documentation
│ ├── SETUP.md # Detailed setup guide
│ └── MCP_TEST_GUIDE.md # Testing guide
├── app.py # Streamlit Web UI for EHRbase (optional)
├── diagnosis.csv # ICD-10 dataset (place here or specify path)
├── .env.example # Environment template
├── mcp-config.example.json # MCP configuration template
├── requirements.txt # Python dependencies
└── README.md # This file
🖥️ 流线型Web UI(可选)
app.py 提供a 基于浏览器的管理界面 用于与EHRbase直接交互,补充用于AI助手的MCP服务器。
app.py是做什么的?
Streamlit应用程序(app.py)是一个全面的web界面,有5个主要部分:
1. 模板选项卡 📋
- 列表模板:查看EHRbase中所有可用的openEHR模板
- 获取示例:为任何模板生成示例FLAT JSON
- 上传模板:上传新
.opt(操作模板)文件 - 预览:查看模板结构和必填字段
2. EHR选项卡 🏥
- 创建EHR:生成新的电子健康记录
- 获取EHR:按ID检索EHR详细信息
- 列出EHR:浏览所有带分页的EHR
- 视图元数据:查看EHR状态、创建时间和主题详细信息
3. 组合选项卡 📝
- 创作构图:使用FLAT JSON格式提交临床数据
- 直接粘贴JSON或使用生成的示例
- 指定EHR ID和模板ID
- 自动验证和错误处理
- 提取构图:检索现有临床文件
- 按组成UID搜索
- 查看所有数据点的完整组合
4. AQL查询选项卡 🔍
- 执行AQL查询:运行原型查询语言查询
- 查询生成器:
- 预构建的查询模板
- 自定义查询输入
- 参数支持
- 结果显示:打印精美的JSON结果,语法突出显示
- 例子:常见查询,如“列出所有生命体征”或“查找患者”
5. 表格选项卡 🩺
- 交互式血压表:用户友好的生命体征输入表单
- 可视化输入字段(无需JSON)
- 收缩压/舒张压读数
- 平均动脉压计算
- 位置、袖带尺寸和测量方法
- 临床解释说明
- 自动生成JSON:将表单数据转换为openEHR FLAT格式
- 直接提交:一键将文章发布到EHRbase
主要特点
✨ 用户友好界面
- 无需编码-点击操作
- 常见用例的基于表单的数据输入
- 实时验证和错误消息
📊 JSON管理
- 打印精美的JSON,语法突出显示
- 复制/粘贴支持快速测试
- 预期和实际格式之间的视觉差异
⚙️ 连接设置 (侧边栏)
- 配置EHR基础URL
- 添加自定义标头(身份验证、审核详细信息)
- 测试连接状态
🔧 开发工具
- 检查API请求和响应
- HTTP状态代码和错误消息
- 测试数据生成示例
启动用户界面
# Ensure EHRbase is running
cd docker-compose && docker compose up -d
# Launch Streamlit
streamlit run app.py
打开浏览器: http://localhost:8501
用例
| 用例 | 描述 |
|---|---|
| 🧪 测试 | 无需编写代码即可快速测试EHRbase操作 |
| 📚 学习 | 通过即时反馈直观地探索openEHR概念 |
| 🔧 发展 | 在自动化之前调试和验证组合 |
| 👥 演示 | 向利益相关者展示EHRbase功能 |
| 📝 数据录入 | 通过表单手动输入临床数据 |
| 🔍 询问 | 临时数据检索和探索 |
工作流示例
- 上传模板:使用“模板”选项卡上载
patient_visit_template.opt - 创建EHR:使用EHR选项卡创建新的患者记录
- 输入数据:使用FORM选项卡输入生命体征(血压等)
- 查询数据:使用AQL选项卡检索和分析存储的数据
- 审查:查看JSON格式的组合以验证结构
💡 小贴士Streamlit UI和MCP服务器可以同时运行,它们是同一EHRbase实例的独立接口。使用UI进行测试,使用MCP服务器进行AI驱动的自动化。
🎯 使用示例
示例1:创建包含生命体征的患者记录
在克劳德桌面中:
I need to record vital signs for patient EHR ID: abc-123-xyz
Blood Pressure: 120/80 mmHg
Heart Rate: 72 bpm
Temperature: 98.6°F
Respiratory Rate: 16 breaths/min
克劳德将使用 openehr_composition_create 该工具以openEHR格式存储此数据。
示例2:查询患者数据
在克劳德桌面中:
Show me all vital signs recordings for the last 7 days
for EHR ID: abc-123-xyz
⚠️ 先决条件:ICD-10嵌入必须加载到Qdrant中
在克劳德桌面中:
Suggest ICD-10 codes for: "Patient presents with persistent
dry cough, mild fever, and shortness of breath"
预期响应:
Found 3 ICD-10 codes:
1. R05 - Cough (91.2% match)
2. R50.9 - Fever, unspecified (88.7% match)
3. R06.02 - Shortness of breath (86.4% match)
**In Claude Desktop:**
Suggest ICD-10 codes for: "Patient presents with persistent
dry cough, mild fever, and shortness of breath"
克劳德将使用 suggest_icd_codes 返回具有相似性评分的相关ICD-10代码。
🛠️ 故障排除
常见问题
问题:访问EHRbase时“连接被拒绝”
# Check if services are running
docker compose ps
重新启动服务或“找不到集合”
这意味着ICD-10嵌入未加载到Qdrant中。
# 1. Ensure Qdrant is running
curl http://localhost:6333/healthz
# 2. Check if collection exists
curl http://localhost:6333/collections
# 3. If collection is missing, load embeddings
python scripts/embedding.py
# 4. Verify collection was created
curl http://localhost:6333/collections/icd_all_mpnet_base_v2
这
suggest_icd_codes该工具需要预加载嵌入!
# Upload the template
python scripts/upload_template.py
# Verify upload
curl http://localhost:8080/ehrbase/rest/openehr/v1/definition/template/adl1.4
问题:“未找到ICD-10代码”
# Ensure Qdrant is running
curl http://localhost:6333/healthz
# Check if collection exists
curl http://localhost:6333/collections
问题:Claude Desktop看不到MCP服务器
- 检查配置文件路径是否正确
- 验证配置中的Python路径
- 完全重新启动克劳德桌面
- 检查Claude Desktop控制台中的日志
获得帮助
- 📖 检查 DOCS/MCP_TEST_GUIDE.md 故障排除指南
- 🐛 在GitHub上打开一个问题
- 💬 查阅EHR数据库文档:https://ehrbase.readthedocs.io/
🔐 安全注意事项
⚠️ 重要安全注意事项:
- API密钥:从不承诺
.env带有真正API密钥的文件 - 生产使用:此设置用于开发-对生产使用适当的身份验证
- 数据隐私:确保符合医疗保健法规(HIPAA、GDPR)
- 网络安全:在没有适当安全措施的情况下,不要将EHRbase或Qdrant端口暴露给互联网
- AI模型选择:对于生产医疗保健数据,使用具有强大数据隐私保证的模型
🤝 贡献
欢迎投稿!拜托:
- 分叉存储库
- 创建要素分支(
git checkout -b feature/amazing-feature) - 提交您的更改(
git commit -m 'Add amazing feature') - 推到分支(
git push origin feature/amazing-feature) - 打开拉取请求
📄 许可证
此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。
🙏 致谢
- Anthropic -对于模型上下文协议
- EHR酶 -用于openEHR的实施
- Qdrant -对于矢量数据库
- openEHR基金会 -对于医疗保健数据标准
- FastMCP -对于Python MCP框架
📞 支持
- 📖 文件:见 设置.md 和 DOCS/MCP_TEST_GUIDE.md
- 🌐 openEHR社区:https://discourse.openehr.org/
- 💬 MCP社区:https://github.com/modelcontextprotocol
作者
内置于❤️ 实现更好的医疗数据互操作性