FHIR MCP Server について
FHIR MCP Server は、FHIR API を通じて医療データにAIツールからアクセスするための MCP サーバーです。臨床情報の検索、取得、分析を行う開発者や医療系システムの統合担当者を対象としています。
主な機能
- 01stdio、SSE、ストリーマブル HTTP のトランスポート対応
- 02SMART on FHIR に基づく OAuth 2.0 認可
- 03FHIRPath による read・search 結果のフィルタリング
- 04get_capabilities によるリソースの機能情報取得
活用シーン
- 01AI アシスタントから FHIR サーバーの患者データや観察データを照会
- 02VS Code、Claude Desktop、MCP Inspector での FHIR ツール呼び出しの検証
- 03FHIRPath で必要な項目のみを返し、ペイロードを削減
MCP 対応
本プロジェクトは MCP サーバーとして、FHIR 操作を MCP クライアントにツールとして公開します。get_capabilities では、リソースタイプのメタデータやサポートされる検索パラメータを取得できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Fast Healthcare Interoperability Resources(FHIR)API 用 Model Context Protocol(MCP)サーバー
目次
概要
FHIR MCP サーバーは、FHIR API とシームレスに統合する Model Context Protocol(MCP)サーバーです。開発者、インテグレーター、医療分野のイノベーター向けに設計されており、最新の AI/LLM ツールと医療データをつなぐ橋渡しとして機能します。臨床情報の検索、取得、分析を簡単に行えます。
デモ
HAPI FHIR サーバーでのデモ
この動画では、公開されているHAPI FHIR サーバーに接続した際の MCP サーバーの機能を紹介します。この例では、認証フローを必要としないオープンな FHIR サーバーと直接やり取りする様子を紹介しています。
https://github.com/user-attachments/assets/cc6ac87e-8329-4da4-a090-2d76564a3abf
EPIC Sandbox でのデモ
この動画では、Epic EHR エコシステムにおける MCP サーバーの機能を紹介します。OAuth 2.0 Authorization Code Grant フローの全体を示しています。
https://github.com/user-attachments/assets/96b433f1-3e53-4564-8466-65ab48d521de
主な機能
-
MCP 互換のトランスポート:stdio、SSE、または streamable HTTP を介して FHIR を提供します
-
SMART-on-FHIR ベースの認証サポート:FHIR サーバーおよびクライアントに対して安全に認証します
-
FHIRPath によるレスポンスフィルタリング:カスタムの FHIRPath 式を使用して、
readおよびsearch操作で返されるリソースやバンドルをフィルタリングし、タスクに必要なフィールドのみを取得することで、ペイロードサイズを削減します。 -
ツール統合:VS Code、Claude Desktop、MCP Inspector など、あらゆる MCP クライアントと統合できます
前提条件
- Python 3.8+
- 依存関係管理用のuv
- アクセス可能な FHIR API サーバー
インストール
Python パッケージをインストールするか、このリポジトリをクローンして FHIR MCP Server を使用できます。
PyPI パッケージを使用したインストール
-
環境変数を設定します:
サーバーを実行するには、
FHIR_SERVER_BASE_URLを設定する必要があります。- 認証を有効にする場合:
FHIR_SERVER_BASE_URL、FHIR_SERVER_CLIENT_ID、FHIR_SERVER_CLIENT_SECRET、およびFHIR_SERVER_SCOPESを設定します。認証はデフォルトで有効になっています。 - 認証を無効にする場合:
FHIR_SERVER_DISABLE_AUTHORIZATIONをTrueに設定します。
デフォルトでは、MCP サーバーは http://localhost:8000 で実行されます。
FHIR_MCP_HOSTとFHIR_MCP_PORTを使用してホストとポートをカスタマイズできます。以下のように環境変数としてエクスポートするか、
.envファイルを作成して設定できます(.env.exampleを参照してください)。export FHIR_SERVER_BASE_URL="" export FHIR_SERVER_CLIENT_ID="" export FHIR_SERVER_CLIENT_SECRET="" export FHIR_SERVER_SCOPES="" export FHIR_MCP_HOST="localhost" export FHIR_MCP_PORT="8000" - 認証を有効にする場合:
-
PyPI パッケージをインストールしてサーバーを実行します
uvx fhir-mcp-server
ソースからのインストール
-
リポジトリをクローンします:
git clone <repository_url> cd <repository_directory> -
仮想環境を作成し、依存関係をインストールします:
uv venv source .venv/bin/activate uv pip sync requirements.txtまたは pip を使用します:
python -m venv .venv source .venv/bin/activate pip install -r requirements.txt -
環境変数を設定します: サンプルファイルをコピーし、必要に応じてカスタマイズします:
cp .env.example .env -
サーバーを実行します:
uv run fhir-mcp-server
Docker を使用したインストール
Docker で MCP サーバーを実行する
一貫性のある分離された環境で MCP サーバーを実行するには、Docker を使用できます。
認証に関する注意: Docker または Docker Compose を使用して MCP サーバーをローカルで実行する場合は、環境変数
FHIR_SERVER_DISABLE_AUTHORIZATION=Trueを設定して認証を無効にしてください。この問題は今後のリリースで修正される予定です。
-
Docker イメージをビルドするか、コンテナーレジストリから Docker イメージをプルします:
- ソースからビルド:
docker build -t fhir-mcp-server . - GitHub Container Registry からプル:
docker pull wso2/fhir-mcp-server:latest
- ソースからビルド:
-
環境変数を設定します
サンプルの環境ファイルをコピーし、必要に応じて編集します:
cp .env.example .env # FHIR サーバーやクライアントの認証情報などを設定するため、.env を編集します。代わりに、
-eフラグを使用して環境変数を直接渡すか、機密情報には Docker secrets を使用できます。利用可能な環境変数の詳細については、設定セクションを参照してください。 -
コンテナーを実行します
docker run --env-file .env -p 8000:8000 fhir-mcp-serverこれによりサーバーが起動し、ポート 8000 で公開されます。必要に応じてポートマッピングを調整してください。
HAPI FHIR Server で Docker Compose を使用する
FHIR MCP サーバーと HAPI FHIR サーバー(PostgreSQL を使用)の両方をすばやくセットアップするには、付属の docker-compose.yml を使用してください。これにより、FHIR 操作のテストにすぐ使える開発環境が構築されます。
-
前提条件:
- Docker と Docker Compose がインストールされていること。
-
スタックを起動する:
docker-compose up -dこのコマンドを実行すると、次の処理が行われます。
- PostgreSQL データベースのコンテナを起動します。
- PostgreSQL に接続された HAPI FHIR サーバーを起動し、http://localhost:8080 でリッスンします。
- FHIR MCP サーバーのコンテナをビルドして実行し、
FHIR_SERVER_BASE_URLに http://hapi-r4-postgresql:8080/fhir を設定して、http://localhost:8000 でリッスンします。
-
サービスにアクセスする:
- FHIR MCP サーバー:http://localhost:8000
- HAPI FHIR サーバー:http://localhost:8080
- 停止するには
docker-compose downを実行します。
-
追加の環境変数を設定する:
OAuth やその他の設定をカスタマイズする必要がある場合は、
docker-compose.ymlの環境変数を調整してください。Compose ファイルには基本的な設定が含まれています。すべてのオプションについては、設定のセクションを参照してください。
MCP クライアントとの統合
FHIR MCP サーバーは、さまざまな MCP クライアントとシームレスに統合できるように設計されています。
VS Code
VS Code(> V1.104)の MCP 設定ファイルに、次の JSON ブロックを追加してください。Ctrl + Shift + P を押して MCP: Open User Configuration と入力することで追加できます。
| ストリーミング可能な HTTP | STDIO | SSE |
|---|---|---|
|
|
|
Claude Desktop
ローカルの MCP サーバーに接続するには、Claude Desktop の設定に次の JSON ブロックを追加してください。
- Claude Desktop アプリを起動し、上部のメニューバーにある Claude メニューをクリックして、「Settings…」を選択します。
- 設定パネルの左側のサイドバーで「Developer」をクリックし、「Edit Config」をクリックします。ファイルシステム上に設定ファイルが開きます。まだ存在しない場合は、Claude が次の場所に自動的に作成します。
- macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
- Windows: %APPDATA%\Claude\claude_desktop_config.json
- 任意のテキストエディターで claude_desktop_config.json ファイルを開きます。MCP サーバーを登録するには、内容を次の JSON ブロックに置き換えてください。
| ストリーミング可能な HTTP | STDIO | SSE |
|---|---|---|
|
|
|
MCP Inspector
MCP Inspector を起動して使用するには、次の手順に従ってください。
-
ターミナルを開き、次のコマンドを実行します。
npx -y @modelcontextprotocol/inspector -
MCP Inspector のインターフェイスで、次のように設定します。
| ストリーミング可能な HTTP | STDIO | SSE |
|---|---|---|
|
|
|
MCP サーバーがすでに起動しており、上記のエンドポイントでリッスンしていることを確認してください。
接続すると、MCP Inspector を使ってツールの呼び出しを可視化し、リクエストとレスポンスのペイロードを確認し、ツールの実装を簡単にデバッグできます。
設定
CLI オプション
次のコマンドラインフラグを使用して、MCP サーバーの動作をカスタマイズできます。
-
--transport
- 説明:MCP サーバーがクライアントとの通信に使用するトランスポートプロトコルを指定します。
- 使用可能な値:stdio、sse、streamable-http
- デフォルト:streamable-http
-
--log-level
- 説明:サーバーのログ出力レベルを設定します。
- 使用可能な値:DEBUG、INFO、WARN、ERROR(大文字と小文字は区別されません)
- デフォルト:INFO
-
--help
- 説明:使用可能なサーバーオプションを含むヘルプメッセージを表示して終了します。
- 使用方法:コマンドラインインターフェースによって自動的に提供されます。
使用例:
uv run fhir-mcp-server --transport streamable-http --log-level DEBUG
uv run fhir-mcp-server --help
環境変数
MCP サーバーの設定:
FHIR_MCP_HOST:MCP サーバーがバインドするホスト名または IP アドレスです(ローカルからのアクセスのみにする場合はlocalhost、すべてのインターフェースで待ち受ける場合は0.0.0.0など)。FHIR_MCP_PORT:MCP サーバーがクライアントからのリクエストを待ち受けるポートです(例:8000)。FHIR_MCP_SERVER_URL:設定されている場合、ホストとポートから URL を生成する代わりに、この値をサーバーのベース URL として使用します。カスタム URL を設定する場合や、プロキシの背後で使用する場合に便利です。FHIR_MCP_REQUEST_TIMEOUT:MCP サーバーから FHIR サーバーへのリクエストのタイムアウト時間(秒)です(デフォルト:30)。
FHIR サーバーとの MCP サーバー OAuth2 設定(MCP クライアント ↔ MCP サーバー): これらの変数は、FHIR サーバーを使用する OAuth2 認可コードグラントフローによる、MCP クライアントから MCP サーバーへの安全な接続を設定します。
FHIR_SERVER_CLIENT_ID:FHIR サーバーで MCP クライアントを認可するために使用する OAuth2 クライアント ID です。FHIR_SERVER_DISABLE_AUTHORIZATION:Trueに設定すると、MCP サーバーの認可チェックを無効にし、公開アクセス可能な FHIR サーバーへの接続を許可します。FHIR_SERVER_CLIENT_SECRET:FHIR クライアント ID に対応するクライアントシークレットです。トークン交換時に使用します。FHIR_SERVER_BASE_URL:FHIR サーバーのベース URL です(例:https://hapi.fhir.org/baseR4)。ツール URI の生成と FHIR リクエストのルーティングに使用します。FHIR_SERVER_SCOPES:FHIR 認可サーバーに要求する OAuth2 スコープをスペース区切りで指定します(例:user/Patient.read user/Observation.read)。get_userツールでユーザーコンテキストを取得できるようにするには、fhirUser openidを追加します。この 2 つのスコープが設定されていない場合、ID トークンにユーザーの FHIR リソースへの参照が含まれないため、get_userツールは空の結果を返します。FHIR_SERVER_ACCESS_TOKEN:FHIR サーバーへのリクエストの認証に使用するアクセストークンです。この変数が設定されている場合、サーバーは OAuth2 認可フローを省略し、すべてのリクエストにこのトークンを直接使用します。
メモ
FHIR_SERVER_ACCESS_TOKENは、対話型 OAuth 認証を省略するための便宜的な手段として、ローカルのstdioモードでデプロイする場合のみを対象としています。MCP サーバーをネットワークまたはパブリックインターネットに公開する場合は、この変数を使用しないでください。
ツール
-
get_capabilities:指定された FHIR リソースタイプに関するメタデータを取得します。対応している検索パラメーターやカスタム操作が含まれます。type:FHIR リソースタイプ名(例:「Patient」、「Observation」、「Encounter」)
-
search:指定されたリソースタイプに対して標準の FHIR 検索インタラクションを実行し、一致するリソースのバンドルまたはリストを返します。type:FHIR リソースタイプ名(例:「MedicationRequest」、「Condition」、「Procedure」)。searchParam:FHIR 検索パラメーター名と設定する値の対応付け(例:{"family":"Simpson","birthdate":"1956-05-12"})。response_filter_fhirpaths:(任意)レスポンスバンドル内のリソースに適用する FHIRPath 式の配列(例:["Patient.name", "Patient.birthDate", "Bundle.link.where(relation='next').url"])。
-
read:FHIR の「read」インタラクションを実行し、リソースタイプとリソース ID を指定して単一のリソースインスタンスを取得します。検索パラメーターまたはカスタム操作を指定して、レスポンスをさらに絞り込むこともできます。type:FHIR リソースタイプ名(例:「DiagnosticReport」、「AllergyIntolerance」、「Immunization」)。id:特定の FHIR リソースインスタンスの論理 ID。searchParam:FHIR 検索パラメーター名と設定する値の対応付け(例:{"device-name":"glucometer"})。operation:リソースに定義されたカスタム FHIR 操作または拡張クエリの名前(例:「$everything」)。response_filter_fhirpaths:(任意)返される単一のリソース(または$everythingなどのカスタム操作を使う場合はエントリー)をフィルタリングする FHIRPath 式の配列(例:["Patient.name", "Observation.valueQuantity"])。
-
create:指定したタイプの新しいリソースを保存するため、FHIR の「create」インタラクションを実行します。type:FHIR リソースタイプ名(例:「Device」、「CarePlan」、「Goal」)。payload:作成する FHIR リソースの全内容を表す JSON オブジェクト。searchParam:FHIR 検索パラメーター名と設定する値の対応付け(例:{"address-city":"Boston"})。operation:リソースに定義されたカスタム FHIR 操作または拡張クエリの名前(例:「$evaluate」)。
-
update:指定されたペイロードで既存のリソースインスタンスの内容を置き換え、FHIR の「update」インタラクションを実行します。type:FHIR リソースタイプ名(例:「Location」、「Organization」、「Coverage」)。id:特定の FHIR リソースインスタンスの論理 ID。payload:FHIR リソースの完全な JSON 表現。必須要素と任意のデータが含まれます。searchParam:FHIR 検索パラメーター名と設定する値の対応付け(例:{"patient":"Patient/54321","relationship":"father"})。operation:リソースに定義されたカスタム FHIR 操作または拡張クエリの名前(例:「$lastn」)。
-
delete:特定のリソースインスタンスに対して、FHIR の「delete」インタラクションを実行します。type:FHIR リソースタイプ名(例:「ServiceRequest」、「Appointment」、「HealthcareService」)。id:特定の FHIR リソースインスタンスの論理 ID。searchParam:FHIR 検索パラメーター名と設定する値の対応付け(例:{"category":"laboratory","issued:"2025-05-01"})。operation:リソースに定義されたカスタム FHIR 操作または拡張クエリの名前(例:「$expand」)。
-
get_user:現在認証されているユーザーの FHIR リソース(リンクされたPatientリソースなど)を取得し、id、name、birthDateなど、利用可能な人口統計情報を含む簡潔なプロフィールを返します。
開発とテスト
開発用依存関係のインストール
テストを実行し、開発に参加するには、テスト用の依存関係をインストールします。
pip を使用する場合:
# Install project in development mode with test dependencies
pip install -e '.[test]'
# Or install from requirements file
pip install -r requirements-dev.txt
uv を使用する場合:
# Install development dependencies
uv sync --dev
テストの実行
このプロジェクトには、主要な機能をすべて網羅する包括的なテストスイートが含まれています。
# Simple test runner
python run_tests.py
# Or direct pytest usage
PYTHONPATH=src python -m pytest tests/ -v --cov=src/fhir_mcp_server
pytest を使用する場合:
pytest tests/
これにより、tests/ ディレクトリ内のすべてのテストが検出され、実行されます。
テストの特長:
- 100 件以上のテストで包括的にカバー
- pytest-asyncio を使用した完全な async/await サポート
- HTTP リクエストと外部依存関係の完全なモック化
- ターミナル出力と HTML 出力によるカバレッジレポート
- 実際のネットワーク呼び出しがない高速な実行
テストスイートには、以下が含まれています。
- ユニットテスト:コア機能のテスト
- 統合テスト:コンポーネント間の連携を検証
- エッジケースのカバレッジ:エラー処理と検証のシナリオ
- モック化された OAuth フロー:現実的な認証テスト
詳細な分析のため、カバレッジレポートは htmlcov/index.html に生成されます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。