带有 MCP 和 FHIR 的 EHR 工具

https://youtu.be/K0t6MRyIqZU?si=Mz4d65DcAD3i2YbO
该项目充当专用服务器,为大型语言模型 (LLM) 和其他 AI 代理提供与电子健康记录 (EHR) 交互的工具。它利用SMART on FHIR标准实现安全数据访问,并利用**模型上下文协议 (MCP)**公开相关工具。
可以将其视为一个安全网关和工具包,使 AI 能够安全地访问和分析来自不同 EHR 系统的患者数据。
核心思想
该系统主要分为三个阶段:
**SMART on FHIR 客户端(在本项目中实现):**使用标准 SMART 应用启动框架安全地连接到 EHR。它可以提取各种患者信息,包括结构化数据(例如病情、药物、实验室数据)和非结构化临床记录或附件。
**MCP 服务器(本项目):**获取提取的 EHR 数据,并通过一组可通过模型上下文协议访问的强大工具提供这些数据。这些工具允许外部系统(例如 AI 模型)查询和分析数据,而无需直接访问 EHR 本身。
AI/LLM 接口(外部消费者): AI 代理或大型语言模型连接到 MCP 服务器并使用提供的工具“询问”有关患者记录的问题、执行搜索或运行自定义分析。
Related MCP server: Healthcare MCP Server
可用工具
MCP 服务器提供了几种与加载的 EHR 数据交互的工具:
grep_record:对获取的记录(结构化 FHIR 数据 + 注释/附件中的文本)的所有部分执行文本或正则表达式搜索。非常适合查找关键词或特定提及(例如,“糖尿病”、“阿司匹林”)。query_record:直接针对结构化 FHIR 数据执行只读 SQLSELECT查询。适用于基于已知 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替换为打开此链接的窗口的实际原点)。**筛选品牌 (
?brandTags):**您可以通过在 URL 中添加brandTags查询参数来筛选连接页面上显示的 EHR 提供商列表。请提供以逗号分隔的标签列表。只有与所有提供的标签(来自其在brandFiles中的配置)匹配的品牌才会显示。它支持 OR(逗号分隔)和 AND(插入符号^分隔)逻辑,其中 AND 优先。?brandTags=epic,sandbox:显示带有epic或sandbox标签的品牌。?brandTags=epic^dev:显示带有epic和dev标签的品牌。?brandTags=epic^dev,sandbox^prod:显示带有 (epicANDdev) 或 (sandboxANDprod) 标签的品牌。如果省略该参数,则默认显示带有
prod标签的品牌。例如:
.../ehr-connect?brandTags=hospital^us:显示带有hospital和us标签的品牌。
**工作原理:**打开后,此页面会提示用户选择其 EHR 提供商。然后,它会启动标准的 SMART 应用启动流程,将用户重定向到其 EHR 的登录页面。身份验证和授权成功后,客户端会获取一整套 FHIR 资源(患者、病情、观察结果、药物、文档等),并尝试从任何相关附件(例如
DocumentReference中的 PDF、RTF 和 HTML)中提取纯文本。**数据输出 (
ClientFullEHR):**获取完成后,客户端会将所有数据收集到ClientFullEHRJSON 对象中。该对象包含: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 客户端等工具一起使用。
两步流程:
**将数据提取到数据库:**首先,使用
--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。
**运行 MCP 服务器:**创建数据库文件后,再次运行 CLI,仅指向数据库文件。这会将数据加载到内存中并启动 MCP 服务器,监听标准输入/输出上的命令。
# Example: Start the MCP server using the saved data 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 客户端详细信息(clientId、scopes)。
**客户端配置(例如 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数据,并在客户端连接期间将其保存在内存(或持久会话)中。状态:,因此很难使用非专业开发人员或调试工具的标准客户端来测试此模式。此 SSE 模式应被视为实验性的。
This server cannot be installed
Resources
Looking for Admin?
Admins can modify the Dockerfile, update the server description, and track usage metrics. If you are the server author, to access the admin panel.