MCP と FHIR を備えた EHR ツール

https://youtu.be/K0t6MRyIqZU?si=Mz4d65DcAD3i2YbO
このプロジェクトは、大規模言語モデル(LLM)やその他のAIエージェントが電子医療記録(EHR)と連携するためのツールを提供する専用サーバーとして機能します。安全なデータアクセスを実現するSMART on FHIR標準と、ツールを公開するため**のモデルコンテキストプロトコル(MCP)**を活用しています。
これは、AI がさまざまな EHR システムから患者データに安全にアクセスして分析できるようにする、安全なゲートウェイおよびツールキットと考えてください。
核となるアイデア
このシステムは主に 3 つの段階で動作します。
**SMART on FHIR クライアント(本プロジェクト内で実装):**標準の SMART App Launch フレームワークを使用して EHR に安全に接続します。構造化データ(病状、投薬情報、検査結果など)と非構造化臨床記録や添付ファイルの両方を含む、幅広い患者情報を抽出します。
**MCPサーバー(本プロジェクト):**抽出されたEHRデータを取得し、モデルコンテキストプロトコル(MCP)を介してアクセスできる強力なツールセットを通じて利用できるようにします。これらのツールにより、AIモデルなどの外部システムは、EHR自体に直接アクセスすることなく、データのクエリと分析を行うことができます。
AI / LLM インターフェース (外部コンシューマー): AI エージェントまたは大規模言語モデルは MCP サーバーに接続し、提供されているツールを使用して患者の記録について「質問」したり、検索を実行したり、カスタム分析を実行したりします。
利用可能なツール
MCP サーバーは、ロードされた EHR データと対話するためのいくつかのツールを提供します。
grep_record: 取得したレコード(構造化FHIRデータ+メモ/添付ファイルのテキスト)の全部分を対象に、テキスト検索または正規表現検索を実行します。キーワードや特定の言及(例:「糖尿病」、「アスピリン」)を見つけるのに最適です。query_record: 構造化されたFHIRデータに対して、読み取り専用のSQLSELECTクエリを直接実行します。既知のFHIRリソース構造に基づく正確な検索(例:LOINCコードによる特定の検査結果の検索)に役立ちます。eval_record: 取得したデータ(FHIRリソースと添付ファイル)に対して、カスタムJavaScriptコードを直接実行します。複雑な計算、複数のソースからのデータの結合、カスタムフォーマットなど、最大限の柔軟性を提供します。
この設定により、AI ツールは標準化された安全なインターフェースを通じて包括的な EHR データを活用できるようになります。
(開発者向けのセットアップと使用方法の詳細は、コードベースと特定のモジュールのドキュメントに記載されています。)
コンポーネントと使用方法
このプロジェクトでは、EHR データを取得し、MCP ツールを介して公開するためのさまざまな方法を提供します。
1. スタンドアロンSMART on FHIR Webクライアント
このプロジェクトには、ユーザーが SMART on FHIR を介して EHR に接続し、データを取得できるようにする自己完結型の Web アプリケーションが含まれています。
**ホストバージョン:**次の場所で公開ホストバージョンを使用できます。
https://mcp.fhir.me/ehr-connect#deliver-to-opener:$origin
($originこのリンクを開くウィンドウの実際のオリジンに置き換えます)。ブランドのフィルタリング ( URL に
brandTagsクエリパラメータを追加することで、接続ページに表示される EHR プロバイダーのリストをフィルタリングできます。カンマ区切りのタグリストを指定してください。指定されたすべてのタグ(brandFilesの設定から)に一致するブランドのみが表示されます。OR (カンマ区切り) と AND (キャレット^区切り) の両方のロジックをサポートしており、AND が優先されます。?brandTags=epic,sandbox:epicまたはsandboxのタグが付けられたブランドを表示します。?brandTags=epic^dev:epicとdev両方のタグが付けられたブランドを表示します。?brandTags=epic^dev,sandbox^prod: (epicANDdev) OR (sandboxANDprod) のタグが付けられたブランドを表示します。パラメータを省略すると、デフォルトで
prodタグが付けられたブランドが表示されます。例:
.../ehr-connect?brandTags=hospital^us:hospitalとusのタグが付けられたブランドを表示します。
**動作原理:**このページを開くと、ユーザーはEHRプロバイダーを選択するよう求められます。その後、標準のSMART App Launchフローが開始され、ユーザーは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 クライアントなどのツールでよく使用されます。
2段階のプロセス:
**データベースへのデータ取得:**まず、コマンドラインインターフェースを
--create-dbおよび--dbフラグ付きで実行します。これにより一時的なウェブサーバーが起動し、上記と同じSMART on FHIR ウェブクライアントロジックを使用してデータを取得しpostMessage。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):**このプロセスは、利用可能なEHRブランド/エンドポイントをbrandFiles配列に定義する設定ファイル(例:config.epicsandbox.json)に依存します。この配列の各エントリは、ブランドの詳細(以下を含む)を指定します。url: ブランド定義ファイルへのパス/URL (static/brands/epic-sandbox.jsonなど)。tags: 分類やフィルタリングに使用される文字列の配列 (例:["epic", "sandbox"])。vendorConfig: SMART on FHIR クライアントの詳細 (clientId、scopes) が含まれます。
クライアント設定(例:カーソル):。
{ "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 )
このモードでは、複数のクライアントがネットワーク経由で接続するシナリオに適した永続サーバーを実行します。MCP通信チャネルにはServer-Sent Events(SSE)を使用します。
**認証:**クライアント認証は、モデルコンテキストプロトコルで規定されているOAuth 2.1に依存します。サーバーは標準エンドポイント(
/authorize、/token、/registerなど)を提供します。**データ取得:**クライアントが OAuth 接続を開始すると、サーバーは SMART on FHIR フロー自体を処理し、認証プロセス中に
ClientFullEHRデータを取得し、クライアントの接続期間中はそれをメモリ (または永続セッション) に保持します。ステータス: OAuth 2.1クライアントインタラクションのMCP仕様は機能的にはありますが、まだ進化を続けています。この認証方式に対するクライアントサポートは現時点では非常に限られており、専用の開発ツールやデバッグツール以外では、標準クライアントでこのモードをテストすることは困難です。このSSEモードは試験的なものとしてお考えください。
This server cannot be installed
Related Resources
Related MCP Servers
- AsecurityAlicenseAqualityA Model Context Protocol server that enables AI assistants to interact with the HackMD API for managing notes, including creating, reading, updating, and deleting notes.Last updated -123643MIT License
- AsecurityAlicenseAqualityA Model Context Protocol server providing AI assistants with access to healthcare data tools, including FDA drug information, PubMed research, health topics, clinical trials, and medical terminology lookup.Last updated -71150MIT License
- AsecurityAlicenseAqualityA Model Context Protocol server that enables standardized interaction with Azure Health Data Services FHIR servers, allowing healthcare data operations through MCP tools.Last updated -116MIT License