返回市场
健康记录MCP

健康记录MCP

作者:jmandel67 星标更新:2025-08-15

项目介绍

使用MCP和FHIR的电子健康记录工具

EHR工具概述

https://youtu.be/K0t6MRyIqZU?si=Mz4d65DcAD3i2YbO

该项目充当一个专用服务器,提供工具使大型语言模型(LLMs)和其他AI代理能够与电子健康记录(EHRs)进行交互。它利用SMART on FHIR标准实现安全数据访问,并通过**模型上下文协议(MCP)**公开这些工具。

可以将其视为一个安全网关和工具包,使AI能够安全地访问和分析来自不同EHR系统的患者数据。

核心理念

该系统分为三个主要阶段工作:

  1. SMART on FHIR客户端(在此项目中实现): 使用标准的SMART应用启动框架安全连接到EHR。它提取广泛的患者信息,包括结构化数据(如病情、药物、实验室结果)和非结构化的临床笔记或附件。
  2. MCP服务器(此项目): 将提取的EHR数据通过一组强大的工具暴露出来,这些工具可以通过模型上下文协议访问。这些工具允许外部系统(如AI模型)查询和分析数据,而无需直接访问EHR本身。
  3. AI/LLM接口(外部消费者): AI代理或大型语言模型连接到MCP服务器并使用提供的工具对患者的记录“提问”,执行搜索或运行自定义分析。

可用工具

MCP服务器提供了几种工具来与加载的EHR数据进行交互:

  • grep_record:在获取的所有记录部分(结构化FHIR数据+注释/附件中的文本)上执行文本或正则表达式搜索。适用于查找关键词或特定提及(例如,“糖尿病”,“阿司匹林”)。
  • query_record:直接针对结构化FHIR数据执行只读SQL SELECT查询。适用于基于已知FHIR资源结构的精确查找(例如,通过LOINC代码查找特定的实验室结果)。
  • eval_record:直接在获取的数据(FHIR资源+附件)上执行自定义JavaScript代码。为复杂计算、结合多个来源的数据或自定义格式提供了最大的灵活性。

这种设置允许AI工具通过标准化和安全的接口利用全面的EHR数据。

(开发者设置和使用详情可以在代码库和特定模块文档中找到。)


组件及使用

本项目提供了不同的方式来获取EHR数据并通过MCP工具公开:

1. 独立的SMART on FHIR Web客户端

本项目包含一个独立的Web应用程序,允许用户通过SMART on FHIR连接到他们的EHR并获取数据。

  • 托管版本: 您可以使用公开托管的版本:
    https://mcp.fhir.me/ehr-connect#deliver-to-opener:$origin
    (将$origin替换为打开此链接的窗口的实际源)。
  • 过滤品牌(?brandTags): 您可以通过向URL添加brandTags查询参数来过滤连接页面上显示的EHR提供商列表。提供逗号分隔的标签列表。仅显示匹配所有提供的标签的品牌(从它们在brandFiles中的配置)。它支持OR(逗号分隔)和AND(插入符^分隔)逻辑,其中AND优先级更高。
    • ?brandTags=epic,sandbox:显示标记为epicsandbox的品牌。
    • ?brandTags=epic^dev:显示同时标记为epicdev的品牌。
    • ?brandTags=epic^dev,sandbox^prod:显示(epicdev)或(sandboxprod)的品牌。
    • 如果省略参数,默认显示标记为prod的品牌。
    • 示例:.../ehr-connect?brandTags=hospital^us:显示标记为hospitalus的品牌。
  • 工作原理: 打开后,此页面提示用户选择其EHR提供商。然后启动标准的SMART应用启动流程,将用户重定向到其EHR的登录页面。成功认证和授权后,客户端获取一系列全面的FHIR资源(患者、病情、观察、药物、文档等),并尝试从任何相关附件(如在DocumentReference中发现的PDF、RTF、HTML)中提取纯文本。
  • 数据输出(ClientFullEHR): 获取完成后,客户端将所有数据收集到一个ClientFullEHR JSON对象中。该对象包含:
    • fhir:键是FHIR资源类型(如“患者”),值是相应FHIR资源数组的字典。
    • attachments:处理过的附件对象数组,每个对象包括元数据(源资源、路径、内容类型)和内容本身(contentBase64用于原始数据,contentPlaintext用于提取的文本)。
  • 数据交付: 如果使用#deliver-to-opener:$origin哈希打开,客户端会提示用户确认,然后使用window.opener.postMessage(data, targetOrigin)ClientFullEHR对象发送回打开它的窗口。

2. 通过Stdio的本地MCP服务器(src/cli.ts

此模式适合在本地运行MCP服务器,通常与Cursor或其他命令行AI客户端一起使用。

  • 两步过程:
    1. 将数据保存到数据库: 首先,使用--create-db--db标志运行命令行界面。这启动了一个临时的Web服务器,并使用上述描述的SMART on FHIR Web客户端逻辑获取数据。而不是通过postMessage发送数据,它将ClientFullEHR数据保存到本地SQLite数据库文件中。
      # 示例:获取数据并保存到data/my_record.sqlite
      bun run src/cli.ts --create-db --db ./data/my_record.sqlite
      
      按照提示(在浏览器中打开链接)连接到您的EHR。
    2. 运行MCP服务器: 创建数据库文件后,再次运行CLI,仅指向数据库文件。这将数据加载到内存中并启动MCP服务器,监听标准输入/输出上的命令。
      # 示例:使用保存的数据启动MCP服务器
      bun run src/cli.ts --db ./data/my_record.sqlite
      
    • 配置(config.*.json): 此过程依赖于配置文件(如config.epicsandbox.json),该文件定义了brandFiles数组中的可用EHR品牌/端点。数组中的每个条目指定品牌的详细信息,包括:
      • url:品牌定义文件的路径/URL(如static/brands/epic-sandbox.json)。
      • tags:用于分类或过滤的字符串数组(如["epic", "sandbox"])。
      • vendorConfig:包含SMART on FHIR客户端详细信息(clientIdscopes)。
    • 客户端配置(例如,Cursor): 配置您的MCP客户端以执行此命令。重要的是使用绝对路径,对于src/cli.ts和数据库文件。
      {
        "mcpServers": {
          "local-ehr": {
            "name": "本地EHR搜索",
            "command": "bun", // 或bun的绝对路径
            "args": [
                "/home/user/projects/smart-mcp/src/cli.ts", // cli.ts的绝对路径
                "--db",
                "/home/user/projects/smart-mcp/data/my_record.sqlite" // 数据库文件的绝对路径
              ]
          }
        }
      }
      

3. 通过SSE的完整MCP服务器(src/sse.ts / index.ts

此模式运行一个持久服务器,适用于多个客户端可能通过网络连接的情况。它使用服务器发送事件(SSE)作为MCP通信通道。

  • 身份验证: 客户端身份验证依赖于模型上下文协议规定的OAuth 2.1。服务器提供标准端点(如/authorize/token/register等)。
  • 数据获取: 当客户端发起OAuth连接时,服务器自行处理SMART on FHIR流程,在授权过程中获取ClientFullEHR数据,并在整个客户端连接期间将其保留在内存中(或持久会话中)。
  • 状态: 虽然功能正常,但MCP规范中关于OAuth 2.1客户端交互的部分仍在发展。目前对此身份验证方法的支持非常有限,使得很难使用标准客户端测试此模式,除非是专门的开发或调试工具。此SSE模式应被视为实验性