电子健康记录AI接口服务

一个基于Model Context Protocol (MCP)和openEHR标准的智能桥梁服务,实现AI助手与电子健康记录系统的无缝交互。

  • by Ayush9284
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 Ayush9284/openehr_mcp

使用说明

🏥 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(开放式电子健康记录)是一种用于电子健康记录和健康数据管理的开源技术。它不仅仅是一个标准,它是一个构建面向未来的医疗信息系统的综合框架。

核心架构:

  1. 两级建模:

    • 参考模型(RM):稳定的信息结构(如“观察”、“组成”)
    • 原型:可重复使用的临床内容定义(如“血压”、“实验室结果”)
    • 模板:原型的具体用例组合
  2. 关键组件:

    • 电子健康记录:患者数据的电子健康记录容器
    • 构图:包含临床信息的文件(就诊记录、实验室结果等)
    • 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是一个高性能的向量数据库,专为相似性搜索和人工智能应用而设计。它将数据存储为高维向量(嵌入),并支持基于意义而不是精确关键字匹配的快速语义搜索。

矢量搜索的工作原理:

  1. 文本嵌入:将文本转换为数字向量(例如“胸痛”→ [0.23, -0.45, 0.67, ...])
  2. 语义相似性:相似的概念有相似的向量
  3. 快速检索:以毫秒为单位查找最近的邻居

例子:

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设置,可以自动配置:

  1. EHR数据库服务器 (localhost:8080)

    • 产品级openEHR REST API实现
    • 处理EHR记录、组成和模板
    • 为API探索提供Swagger UI
  2. PostgreSQL数据库 (localhost:5432)

    • EHRbase的数据库后端
    • 使用openEHR模式存储所有EHR数据
    • 预先配置了所需的扩展
  3. 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


📖 文档

综合指南

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功能
📝 数据录入 通过表单手动输入临床数据
🔍 询问 临时数据检索和探索

工作流示例

  1. 上传模板:使用“模板”选项卡上载 patient_visit_template.opt
  2. 创建EHR:使用EHR选项卡创建新的患者记录
  3. 输入数据:使用FORM选项卡输入生命体征(血压等)
  4. 查询数据:使用AQL选项卡检索和分析存储的数据
  5. 审查:查看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服务器

  1. 检查配置文件路径是否正确
  2. 验证配置中的Python路径
  3. 完全重新启动克劳德桌面
  4. 检查Claude Desktop控制台中的日志

获得帮助

  • 📖 检查 DOCS/MCP_TEST_GUIDE.md 故障排除指南
  • 🐛 在GitHub上打开一个问题
  • 💬 查阅EHR数据库文档:https://ehrbase.readthedocs.io/

🔐 安全注意事项

⚠️ 重要安全注意事项:

  1. API密钥:从不承诺 .env 带有真正API密钥的文件
  2. 生产使用:此设置用于开发-对生产使用适当的身份验证
  3. 数据隐私:确保符合医疗保健法规(HIPAA、GDPR)
  4. 网络安全:在没有适当安全措施的情况下,不要将EHRbase或Qdrant端口暴露给互联网
  5. AI模型选择:对于生产医疗保健数据,使用具有强大数据隐私保证的模型

🤝 贡献

欢迎投稿!拜托:

  1. 分叉存储库
  2. 创建要素分支(git checkout -b feature/amazing-feature)
  3. 提交您的更改(git commit -m 'Add amazing feature')
  4. 推到分支(git push origin feature/amazing-feature)
  5. 打开拉取请求

📄 许可证

此项目根据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

作者


内置于❤️ 实现更好的医疗数据互操作性