
https://youtu.be/K0t6MRyIqZU?si=Mz4d65DcAD3i2YbO
该项目充当一个专用服务器,提供工具使大型语言模型(LLMs)和其他AI代理能够与电子健康记录(EHRs)进行交互。它利用SMART on FHIR标准实现安全数据访问,并通过**模型上下文协议(MCP)**公开这些工具。
可以将其视为一个安全网关和工具包,使AI能够安全地访问和分析来自不同EHR系统的患者数据。
该系统分为三个主要阶段工作:
MCP服务器提供了几种工具来与加载的EHR数据进行交互:
grep_record:在获取的所有记录部分(结构化FHIR数据+注释/附件中的文本)上执行文本或正则表达式搜索。适用于查找关键词或特定提及(例如,“糖尿病”,“阿司匹林”)。query_record:直接针对结构化FHIR数据执行只读SQL SELECT查询。适用于基于已知FHIR资源结构的精确查找(例如,通过LOINC代码查找特定的实验室结果)。eval_record:直接在获取的数据(FHIR资源+附件)上执行自定义JavaScript代码。为复杂计算、结合多个来源的数据或自定义格式提供了最大的灵活性。这种设置允许AI工具通过标准化和安全的接口利用全面的EHR数据。
(开发者设置和使用详情可以在代码库和特定模块文档中找到。)
本项目提供了不同的方式来获取EHR数据并通过MCP工具公开:
本项目包含一个独立的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:显示标记为epic或sandbox的品牌。?brandTags=epic^dev:显示同时标记为epic和dev的品牌。?brandTags=epic^dev,sandbox^prod:显示(epic和dev)或(sandbox和prod)的品牌。prod的品牌。.../ehr-connect?brandTags=hospital^us:显示标记为hospital和us的品牌。DocumentReference中发现的PDF、RTF、HTML)中提取纯文本。ClientFullEHR): 获取完成后,客户端将所有数据收集到一个ClientFullEHR JSON对象中。该对象包含:
fhir:键是FHIR资源类型(如“患者”),值是相应FHIR资源数组的字典。attachments:处理过的附件对象数组,每个对象包括元数据(源资源、路径、内容类型)和内容本身(contentBase64用于原始数据,contentPlaintext用于提取的文本)。#deliver-to-opener:$origin哈希打开,客户端会提示用户确认,然后使用window.opener.postMessage(data, targetOrigin)将ClientFullEHR对象发送回打开它的窗口。src/cli.ts)此模式适合在本地运行MCP服务器,通常与Cursor或其他命令行AI客户端一起使用。
--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。# 示例:使用保存的数据启动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客户端详细信息(clientId,scopes)。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" // 数据库文件的绝对路径
]
}
}
}
src/sse.ts / index.ts)此模式运行一个持久服务器,适用于多个客户端可能通过网络连接的情况。它使用服务器发送事件(SSE)作为MCP通信通道。
/authorize,/token,/register等)。ClientFullEHR数据,并在整个客户端连接期间将其保留在内存中(或持久会话中)。