fhir-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fhir-mcp-serverfind patients with hypertension"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fhir-mcp-server
FHIR R4 サーバー(JP-Core 準拠の fhir-server や HAPI FHIR 等)に接続する MCP(Model Context Protocol)サーバーです。Claude Desktop / Claude Code などの MCP クライアントから、FHIR データを自然言語で検索・参照・(オプトインで)書き込みできます。
fhir-server とはリポジトリ分離(接点は HTTP + Bearer トークンのみ)
SMART Backend Services(OAuth2
client_credentials+system/*スコープ)のクライアントとして動作FHIR_BASE_URLとクレデンシャルの差し替えで任意の FHIR R4 サーバーに接続可能
セットアップ
Node.js 20+ が必要です。
npm install
npm run buildRelated MCP server: MCP FHIR Server
Docker / docker compose で動かす
Node.js をホストに入れずに動かす場合は Docker イメージを使います。MCP の stdio サーバーなので常駐(up)は不要で、クライアントが必要なときに docker compose run で起動します。
docker compose build動作確認(手動で JSON-RPC を流す代わりに、後述のクライアント登録をしてもよい):
docker compose run --rm -T fhir-mcp既定の接続先は
http://host.docker.internal:3000(= ホストのlocalhost:3000)。fhir-server をホストで直接動かしていても、docker compose(ポート 3000 公開)で動かしていてもそのままつながります接続先やクレデンシャルは環境変数で上書きできます:
FHIR_BASE_URL=... FHIR_CLIENT_ID=... docker compose run --rm -T fhir-mcpfhir-server(Rails)側は HostAuthorization で
host.docker.internalを許可している必要があります(development.rb のconfig.hosts << "host.docker.internal")
Docker 経由で Claude Code に登録する場合:
claude mcp add fhir -- docker compose -f /path/to/fhir-mcp-server/compose.yaml run --rm -T fhir-mcpClaude Desktop の場合:
{
"mcpServers": {
"fhir": {
"command": "docker",
"args": [
"compose", "-f", "/path/to/fhir-mcp-server/compose.yaml",
"run", "--rm", "-T", "fhir-mcp"
]
}
}
}Claude クライアントへの接続
Claude Code
claude mcp add fhir -- node /path/to/fhir-mcp-server/dist/index.js環境変数を渡す場合:
claude mcp add fhir \
-e FHIR_BASE_URL=http://localhost:3000 \
-e FHIR_CLIENT_ID=... \
-e FHIR_CLIENT_SECRET=... \
-- node /path/to/fhir-mcp-server/dist/index.jsClaude Desktop(claude_desktop_config.json)
{
"mcpServers": {
"fhir": {
"command": "node",
"args": ["/path/to/fhir-mcp-server/dist/index.js"],
"env": {
"FHIR_BASE_URL": "http://localhost:3000",
"FHIR_CLIENT_ID": "...",
"FHIR_CLIENT_SECRET": "..."
}
}
}
}Web版(リモート HTTP MCP / スマホ Claude アプリ向け)
Claude Desktop / Code は stdio でローカル起動しますが、スマホの Claude アプリは
ローカルプロセスを起動できず、公開 HTTPS に常駐するリモート MCP サーバー
(カスタムコネクタ)+ OAuth にしか接続できません。そのための HTTP エントリポイント
dist/http.js を用意しています(stdio 版 dist/index.js はそのまま併存)。
トランスポート: MCP Streamable HTTP(
/mcpに POST/GET/DELETE)認可: 外部 IdP(Auth0 等)へ委譲する OAuth。
/.well-known/oauth-*メタデータと authorize/token/register の proxy を自動提供し、/mcpは Bearer トークンで保護このフェーズでは OAuth は「接続の入口」を守るだけ。認証ユーザー単位の FHIR アクセス制御(SMART on FHIR
user/*/patient/*相当)は本番データ移行時に対応予定。 FHIR への接続は従来通り固定の SMART Backend Services クレデンシャルを使います (デモ・評価データ前提)。
起動
npm run build
PUBLIC_URL=https://your-host \
OAUTH_ISSUER_URL=https://YOUR_TENANT.auth0.com/ \
OAUTH_AUTHORIZATION_URL=https://YOUR_TENANT.auth0.com/authorize \
OAUTH_TOKEN_URL=https://YOUR_TENANT.auth0.com/oauth/token \
OAUTH_JWKS_URL=https://YOUR_TENANT.auth0.com/.well-known/jwks.json \
OAUTH_AUDIENCE=https://your-host/api \
FHIR_BASE_URL=http://localhost:3000 \
node dist/http.jsdocker compose で常駐起動する場合(.env に上記を書いておく):
docker compose up fhir-mcp-http # http://localhost:8080/mcp で待受環境変数はローカルでは .env(サンプル: .env.example)にまとめ、
Node 20+ の --env-file で読み込めます:
npm run build && node --env-file=.env dist/http.js外部 IdP(Auth0)の設定
詳細手順は docs/auth0-setup.md を参照。要点:
API を作成し Identifier を
OAUTH_AUDIENCEに設定。テナントの Default Audience をその Identifier に設定(これをしないと Auth0 が JWT ではなく opaque トークンを発行し検証に失敗する — MCP × Auth0 の典型的な落とし穴)。
Dynamic Client Registration を有効化し、ログイン接続を domain level に昇格 (Claude アプリがクライアント自己登録するため)。
OAUTH_REGISTRATION_URLも設定。.well-known/openid-configurationの値をOAUTH_ISSUER_URL等に写す。 IdP は Google / Cognito 等にも差し替え可能。
スマホの前に、M2M トークンで /mcp の Bearer 検証が通ることを確認できます
(手順は上記ドキュメント参照)。
Cloud Run へのデプロイ(想定)
gcloud run deploy fhir-mcp-server \
--source . --command node,dist/http.js \
--set-env-vars PUBLIC_URL=https://SERVICE_URL,OAUTH_ISSUER_URL=...,OAUTH_AUDIENCE=...,FHIR_BASE_URL=...PORT は Cloud Run が注入します(HTTP_PORT 未設定時のフォールバックとして利用)。
scale-to-zero でデモのコストを最小化できます。
Render へのデプロイ(Blueprint / Docker)
render.yaml(Blueprint)を同梱しています。既存 Dockerfile を使い、起動コマンドを
http 版に上書きする構成です。
リポジトリを Render に接続し、Blueprint から
render.yamlを読み込む。sync: falseの環境変数(OAUTH_*/FHIR_*/PUBLIC_URL)を Render ダッシュボードで設定。初回デプロイで
https://<service>.onrender.comが発行されるので、それをPUBLIC_URL(メタデータ用)に設定して再デプロイ。IdP 側の Allowed Callback にもこの URL を登録。スマホ Claude アプリのカスタムコネクタに
https://<service>.onrender.com/mcpを登録。
注意点(Free プラン):
15分無アクセスでスリープし、次アクセスでコールドスタート(数十秒)。初回接続が 遅延/タイムアウトすることがある。安定させたい場合は
render.yamlのplanをstarterに変更(常時起動)。セッションはメモリ保持のため、インスタンス再起動で切断される(低トラフィックのデモは問題なし)。
PORTは Render が注入(HTTP_PORT未設定時のフォールバックで対応済み)。
スマホ Claude アプリへの登録
Claude アプリの「カスタムコネクタ」に PUBLIC_URL(= https://SERVICE_URL/mcp)を登録し、
OAuth ログインを済ませると、get_capabilities / search_fhir 等が実機で使えます。
設定(環境変数)
変数 | 既定 | 説明 |
|
| 接続先 FHIR サーバー |
| なし | SMART Backend Services のクレデンシャル。両方未設定なら無認証モード(Authorization ヘッダーを送らない。fhir-server の |
|
|
|
|
| 検索 |
Web版(HTTP)の追加設定
変数 | 既定 | 説明 |
|
| HTTP 待受ポート( |
| (必須) | このサーバーの公開 URL。OAuth メタデータ・リソース識別子に使用 |
| (必須) | 外部 IdP の issuer |
| (必須) | IdP の authorization エンドポイント |
| (必須) | IdP の token エンドポイント |
| (必須) | アクセストークン検証用の JWKS |
| (必須) | アクセストークンに期待する |
| なし | IdP の Dynamic Client Registration エンドポイント(任意) |
認証(SMART Backend Services)
FHIR_CLIENT_ID / FHIR_CLIENT_SECRET を設定すると、POST {FHIR_BASE_URL}/oauth/token に grant_type=client_credentials でアクセストークンを取得します。
トークンは
expires_inの 90% 経過で先回り再取得API が 401 を返した場合は 1 回だけトークンを再取得してリトライ
トークン・シークレットはログに出力しません
fhir-server 側のクライアント登録例:
bin/rails "fhir:register_client[fhir-mcp-server,system/*.read]"
# 書き込みも許可する場合は system/*.write スコープを付与ツール一覧
参照系(常時登録)
ツール | 対応エンドポイント | 説明 |
|
| 対応リソース・検索パラメータ・オペレーションの要約。使い方の自己発見の起点 |
|
| 検索。チェーン検索・ |
|
| 単一リソース取得 |
|
| 患者コンパートメント一括取得( |
|
| インスタンス/タイプ/システムレベルの履歴 |
|
| 保存せずにリソースを検証 |
書き込み系(FHIR_MCP_ALLOW_WRITES=true のときのみ登録)
ツール | 対応エンドポイント | 説明 |
|
| 作成( |
|
| 全置換更新( |
|
| JSON Patch(RFC 6902)による部分更新 |
delete はツールとして提供しません(AI からの破壊的操作は初期スコープ外)。
トークン消費を抑えるコツ
検索結果の Bundle はそのまま返さず、{ total, returned, hasNextPage, resources } に整形して返します。それでも大きい場合は件数を切り詰め、絞り込みのガイダンスを付けます。以下を活用してください:
_elements=id,name,birthDate— 必要なフィールドだけ取得_summary=true— サマリー要素のみ取得_count— ページサイズを絞る(既定 20)patient_everythingではtypes/sinceで範囲を限定
開発
npm run dev # tsx で直接実行
npm test # unit テスト(fetch モック)
npm run lint # biome
npm run build # tsc → dist/integration テスト
実サーバー相手の e2e は FHIR_INTEGRATION_BASE_URL を設定したときだけ実行されます:
# fhir-server を docker compose 等で起動しておく
FHIR_INTEGRATION_BASE_URL=http://localhost:3000 npm test
# 認証ありモードを試す場合
FHIR_INTEGRATION_BASE_URL=http://localhost:3000 \
FHIR_INTEGRATION_CLIENT_ID=... \
FHIR_INTEGRATION_CLIENT_SECRET=... \
npm testアーキテクチャ
MCP クライアント(Claude 等)
│ stdio
▼
fhir-mcp-server
├── src/index.ts エントリポイント(stdio transport)
├── src/http.ts エントリポイント(Streamable HTTP transport + OAuth)
├── src/auth.ts 外部 IdP へ委譲する OAuth プロバイダ・JWT 検証
├── src/server.ts McpServer 構築・ツール登録(トランスポート非依存)
├── src/config.ts 環境変数の読み込み・検証
├── src/fhir-client.ts FHIR REST 呼び出し(fhir+json、OperationOutcome 整形、401 リトライ)
├── src/token-manager.ts SMART トークン管理(先回り更新)
├── src/format.ts Bundle / CapabilityStatement の要約整形
└── src/tools/*.ts ツール実装(薄い層)
│ HTTP(S) + Authorization: Bearer
▼
FHIR R4 サーバー(fhir-server / HAPI など)設計の背景・rationale は docs/DESIGN.md を参照してください。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ysnr-dev/fhir-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server