Smart EHR MCP Server

by jmandel
Verified

hybrid server

The server is able to function both locally and remotely, depending on the configuration or use case.

Integrations

  • Enables complex data analysis on EHR records through JavaScript code evaluation with Lodash utilities.

  • Connects to EHR systems using SMART on FHIR protocol, enabling secure access to patient data from Electronic Health Records. Fetches structured FHIR data and clinical documents.

  • Stores and queries fetched EHR data in a SQLite database, allowing read-only SQL operations against structured FHIR resources.

带有 MCP 和 FHIR 的 EHR 工具

该项目充当专用服务器,为大型语言模型 (LLM) 和其他 AI 代理提供与电子健康记录 (EHR) 交互的工具。它利用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. FHIR Web客户端上的独立SMART

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

  • **托管版本:**您可以使用公开托管版本:
    https://mcp.fhir.me/ehr-connect#deliver-to-opener:$origin
    (将$origin替换为打开此链接的窗口的实际原点)。
  • **工作原理:**打开后,此页面会提示用户选择其 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 数据库文件中。
      # Example: Fetch data and save to data/my_record.sqlite bun run src/cli.ts --create-db --db ./data/my_record.sqlite
      按照提示(在浏览器中打开链接)连接到您的 EHR。
    2. **运行 MCP 服务器:**创建数据库文件后,再次运行 CLI,仅指向数据库文件。这会将数据加载到内存中并启动 MCP 服务器,监听标准输入/输出上的命令。
      # Example: Start the MCP server using the saved data bun run src/cli.ts --db ./data/my_record.sqlite
  • **客户端配置(例如 Cursor):**配置您的 MCP 客户端以执行此命令。务必确保src/cli.ts和数据库文件都使用绝对路径。
    { "mcpServers": { "local-ehr": { "name": "Local EHR Search", "command": "bun", // Or the absolute path to bun "args": [ "/home/user/projects/smart-mcp/src/cli.ts", // Absolute path to cli.ts "--db", "/home/user/projects/smart-mcp/data/my_record.sqlite" // Absolute path to DB file ] } } }

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

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

  • **身份验证:**客户端身份验证依赖于模型上下文协议 (MCP) 指定的 OAuth 2.1。服务器提供标准端点( /authorize/token/register等)。
  • **数据提取:**当客户端启动 OAuth 连接时,服务器会自行处理 SMART on FHIR 流,在授权过程提取ClientFullEHR数据,并在客户端连接期间将其保存在内存(或持久会话)中。
  • 状态:尽管 OAuth 2.1 客户端交互的 MCP 规范已实现功能,但仍在不断发展。目前,客户端对此身份验证方法的支持极其有限,因此很难使用非专业开发人员或调试工具的标准客户端来测试此模式。此 SSE 模式应被视为实验性的
-
security - not tested
F
license - not found
-
quality - not tested

模型上下文协议服务器使用 FHIR 上的 SMART 将 AI 工具连接到电子健康记录,从而允许从兼容的 EHR 中安全地搜索、查询和分析患者数据。

  1. The Core Idea
    1. Available Tools
      1. Components & Usage
        1. 1. Standalone SMART on FHIR Web Client
        2. 2. Local MCP Server via Stdio (src/cli.ts)
        3. 3. Full MCP Server via SSE (src/sse.ts / index.ts)
      ID: fpxg7o4xk3