🚀 DICOM MCPサーバー - 医用画像AI統合 🏥
このサーバーは、標準的なモデルコンテキストプロトコル(MCP)を使用して、AIアシスタントがPACS上のデータを照会、読み取り、移動できるようにします。また、FHIRとミニRISデータベースとも統合されています。

元々は https://github.com/ChristianHinge/dicom-mcp からクローンされましたが、現在は独立して拡張およびメンテナンスされています(フォークではありません)。
このバージョンは、開発、テスト、およびLLM統合に専用に MCP Jam を使用しています。Cursor IDEなどを使用している場合、場合によってはIDEを設定してサーバーにアクセスすることもできます。例えば、˜/.cursor/mcp.json などです。https://cursor.com/docs/context/mcp#what-is-mcp
🚀 クイックスタート
📥 インストール
リポジトリをクローンし、pipを使用してインストールします。
gh repo clone sscotti/dicom-mcp
cd dicom-mcp
python3 -m venv venv
source venv/bin/activate
pip install -e ".[dev]"
⚙️ 設定
dicom-mcp は、DICOMノードと呼び出しAEタイトルを定義するYAML設定ファイル(configuration.yaml など)が必要です。サンプルのORTHANCサーバーとの互換性を保つために、設定をそのまま使用することもできます。
nodes:
main:
host: "localhost"
port: 4242
ae_title: "ORTHANC"
description: "ローカルのOrthanc DICOMサーバー (主要)"
secondary:
host: "localhost"
port: 4243
ae_title: "ORTHANC2"
description: "ローカルのOrthanc DICOMサーバー (セカンダリ)"
current_node: "main"
calling_aet: "MCPSCU"
fhir_servers:
firely:
base_url: "https://server.fire.ly"
description: "Firely FHIRテストサーバー (公開、APIキー不要)"
siim:
base_url: "https://hackathon.siim.org/fhir"
api_key: "${SIIM_API_KEY}"
description: "SIIMハッカソンFHIRサーバー"
hapi_local:
base_url: "http://localhost:8080/fhir"
description: "ローカルのHAPI FHIRサーバー"
current_fhir: "hapi_local"
mini_ris:
host: "localhost"
port: 3306
user: "orthanc_ris_app"
password: "${MINI_RIS_DB_PASSWORD}"
database: "orthanc_ris"
pool_size: 5
⚠️ 重要提示
DICOM-MCPは臨床用途を意図したものではなく、実稼働の病院データベースや患者の機密データが含まれるデータベースに接続しないでください。そうすると、患者データの喪失やインターネット上への漏洩につながる可能性があります。DICOM-MCPは、完全なデータプライバシーのために、ローカルホストされたオープンウェイトLLMとともに使用できます。
💡 使用建议
このプロジェクトは、開発、テスト、およびLLM統合のニーズに MCP Jam を使用しています。mcp-config.example.json ファイルは、相対パスを含むテンプレートとして提供されており、あなたの設定に合わせて調整できます。これをJSONとしてMCPJAMにインポートして、インターフェースを設定することができます。
Dockerコンテナのセットアップ (Orthancs, FHIR, PostGres, MySQL)
docker-compose up -d
dotenv run -- pytest
UIは https://localhost:8042 と https://localhost:8043 で利用できます。リポジトリはTLS証明書で構成されているため、httpsを使用します。
HAPI FHIRは http://localhost:8080/fhir で利用できます。
詳細な設定オプション(FirelyテストサーバーやSIIM統合を含む)については、FHIR Servers Guide を参照してください。
🔌 MCP Jamとの連携
MCP Jam は、DICOM MCPサーバーをテストおよび探索するための推奨ツールです。セットアップ不要ですぐにテストできる ゲストモード のインターフェースを提供します。ただし、設定後にCursor IDEなどを使用することもできます。
MCP Jamを起動する:
cd /path/to/dicom-mcp
source venv/bin/activate
npx -y @mcpjam/inspector@latest or npx -y @mcpjam/inspector@beta
MCP Jamでサーバーを設定する:
- MCP Jamインターフェースの 「ゲストモード」 をクリックします(アカウント不要)
- 次の設定でサーバーを手動で追加するか、
mcp-config.example.json をテンプレートとしてインポートします。
- サーバー名:
DICOM MCP
- コマンド:
{path_to_venv}/bin/python (例: venv/bin/python または絶対パス)
- 引数:
-m dicom_mcp configuration.yaml --transport stdio
- 環境変数:
- 名前:
PYTHONPATH
- 値:
src (相対) または src ディレクトリの絶対パス
- 作業ディレクトリ: dicom-mcpプロジェクトのルートパス
設定例 (macOS/Linux):
- コマンド:
/absolute/path/to/dicom-mcp/venv/bin/python
- 引数:
-m dicom_mcp configuration.yaml --transport stdio
- 環境変数:
PYTHONPATH = /absolute/path/to/dicom-mcp/src
MCP Jamインターフェース:
MCP JamでLLMを設定する:
- 設定 タブに移動します
- LLMプロバイダーのAPIキーを追加します。
- OpenAI - GPT-4、GPT-4o、o1など
- Anthropic - Claude 3.5 Sonnet、Claude Opusなど
- Google Gemini - Gemini 2.5 Pro、Flashなど
- Deepseek - Deepseek Chat、Reasoner
- Ollama - ローカルモデルを自動検出します(APIキー不要)
- プレイグラウンド タブに移動して、DICOMサーバーとのチャットを開始します
システムプロンプト:
より良いLLMとの対話のために、MCP Jamのプレイグラウンドタブでシステムプロンプトを設定することができます。テンプレートは system_prompt.txt にあります - 新しいセッションを開始するときに、システムプロンプトフィールドにコピーして貼り付けてください。
注意: MCP Jamのゲストモードでは、セッション間でシステムプロンプトが保持されない場合があります。必要に応じて system_prompt.txt を手元に保管して、コピー&ペーストできるようにしておいてください。
MCP Jamの機能:
- ✅ ゲストモード: アカウント不要 - すぐにテストを開始できます
- ✅ 美しいUI: AIプロバイダーのロゴがあるモダンなインターフェース
- ✅ 簡単なセットアップ: 明確なフォームで簡単にサーバーを設定できます
- ✅ リアルタイムテスト: 即座に結果が得られるインタラクティブなツール実行
- ✅ 完全な機能: すべての11個のDICOMツールにアクセスできます
- ✅ LLMプレイグラウンド: さまざまなLLMでDICOMサーバーをテストできます
- ✅ コミュニティ駆動: 定期的な更新があるアクティブな開発
MCP Jamのタブ:
- サーバータブ: DICOM MCPサーバーの管理と接続
- ツールタブ: すべての11個のDICOMツールをインタラクティブにブラウズしてテストできます
- プレイグラウンドタブ: 設定されたLLMを使用してDICOMサーバーとチャットできます
- 設定タブ: APIキーとLLMプロバイダーの設定
利用可能なDICOMツール:
verify_connection - DICOM接続のテスト
list_dicom_nodes - 設定されたサーバーの表示
query_patients - 患者の検索
query_studies - 条件による検査の検索
query_series - 検査内のシリーズの検索
query_instances - 個々のDICOM画像の検索
extract_pdf_text_from_dicom - DICOM PDFからテキストの抽出
move_series / move_study - DICOMデータの転送
switch_dicom_node - アクティブなサーバーの切り替え
get_attribute_presets - クエリの詳細レベルの表示
利用可能なFHIRツール (FHIRが設定されている場合):
verify_fhir_connection - FHIRサーバー接続のテスト
list_fhir_servers - 設定されたFHIRサーバーの一覧表示
fhir_search_patient - 患者リソースの検索
fhir_search_imaging_study - 画像検査リソースの検索
fhir_read_resource - タイプとIDによる任意のFHIRリソースの読み取り
fhir_create_resource - 新しいFHIRリソースの作成 (患者、画像検査、サービスリクエストなど)
fhir_update_resource - 既存のFHIRリソースの更新
設定の詳細については、FHIR_SERVERS.mdを参照してください。
ミニRISツール (MySQLが設定されている場合):
list_mini_ris_patients - ミニRISスキーマに保存された患者の人口統計情報を閲覧する(MRNまたは名前でフィルタリング)
create_mwl_from_order - 既存のミニRIS注文からDICOMモダリティワークリストエントリを作成する
create_synthetic_cr_study - 合成CR DICOM画像を生成してPACSに送信する(仮想モダリティ)
放射線科レポートツール (MySQLが設定されている場合):
get_study_for_report - 放射線科レポート用の完全な検査情報を取得する
list_radiologists - 資格を持った放射線科医の一覧を表示する
create_radiology_report - 所見と印象を含む構造化された放射線科レポートを作成する
generate_report_pdf - レポートから専門的なPDFを生成する(base64エンコード)
attach_report_to_pacs - レポートPDFをDICOMエンカプセレートPDFとしてPACSにアップロードする
ミニRISデータベーススキーマ:
mini_ris.sql スキーマは、完全な放射線情報システムを提供します。
- コアエンティティ: 患者、提供者、診療、注文、画像検査、レポート
- 参照テーブル:
dicom_tags - MWL/MPPS検証用の50の重要なDICOMタグ定義
procedures - 14のCR/XR手順コードと典型的なビューおよび画像数
modalities - 標準的なDICOMモダリティコード
body_parts - 画像検査用の解剖学的領域
- MWL/MPPSサポート: モダリティワークリストとモダリティ実行手順ステップの追跡用のテーブル
セットアップ:
-
MySQLサービスを起動します。
docker compose up -d mysql
-
データベースを初期化します(初回起動時に自動、または手動)。
docker exec -i dicom-mcp-mysql-1 mysql -uorthanc_ris_app -porthanc_ris_app orthanc_ris < mysql/mini_ris.sql
-
.env で環境変数を設定します。
MINI_RIS_DB_PASSWORD=orthanc_ris_app
-
configuration.yaml に mini_ris ブロックが含まれていることを確認します。
含まれるCR手順:
データベースには、単一画像検査ワークフローに最適化された14の一般的なコンピュータ放射線撮影(CR)手順が含まれています。
- 胸部(1または2ビュー)
- 腹部(1または2ビュー)
- 骨盤、頸椎/腰椎
- 上肢: 手、手首、肩
- 下肢: 膝、足首、足
- 頭蓋骨
各手順には、典型的なビュー投影(AP、PA、側面、斜位)と現実的なテストデータ生成のための予想される画像数が含まれています。
MWL/MPPSサービス:
このプロジェクトには、画像ワークフローを管理するための統合されたモダリティワークリスト(MWL)とモダリティ実行手順ステップ(MPPS)サービスが含まれています。
- mwl-mpps (ポート4104) - MWLクエリとMPPS N-CREATE/N-SET操作のDICOM SCP
- mwl-api (ポート8000) - ミニRIS注文からMWLエントリを作成および管理するためのFastAPI RESTインターフェース
環境変数:
両方のサービスは、同じMySQLデータベース設定を共有します。
MINI_RIS_DB_PASSWORD=orthanc_ris_app
使用方法:
-
MWL/MPPSサービスを起動します。
docker compose up -d mwl-mpps mwl-api
-
DICOM C-FINDを介してワークリストをクエリします。
findscu -v -W -k 0008,0050="" -k 0010,0020="" localhost 4104
findscu -v -W -k 0008,0050="ACC-2025-0001" localhost 4104
-
REST APIを介してMWLエントリを作成します。
curl -X POST http://localhost:8000/mwl/create_from_json \
-H "Content-Type: application/json" \
-d @mwl_payload.json
-
ウェブダッシュボードでMWLレコードを表示します。
open http://localhost:8000/mwl
ミニRISデータベースのMWL/MPPSテーブル(mwl, mpps, mwl_tasks)には、すべてのワークリストアイテムと手順ステータスが保存されており、注文から完了した検査までの完全なトレーサビリティを可能にします。
注文からMWLを作成する (MCPツールを介して):
create_mwl_from_order ツールは、ミニRIS注文からMWLの作成を自動化します。
create_mwl_from_order(
order_id=1,
scheduled_station_aet="ORTHANC"
)
{
"success": true,
"message": "注文1のMWLが正常に作成されました",
"accession_number": "ACC-2025-0001",
"patient_name": "Alex Johnson",
"patient_id": "MRN1001",
"procedure": "胸部X線2ビュー",
"modality": "CR",
"scheduled_time": "2025-06-01 09:15:00",
"mwl_id": 42
}
これにより、次のようなLLM駆動のワークフローが可能になります。
- "注文1のワークリストエントリを作成してください"
- "患者MRN1001が到着しました。胸部X線をセットアップしてください"
- "すべての予定注文をリストし、今日の患者のMWLを作成してください"
仮想CRデバイス 🆕
このプロジェクトには、完全なワークフローのデモンストレーションのために合成DICOM画像を生成する仮想CR(コンピュータ放射線撮影)デバイスが含まれています。
create_mwl_from_order(order_id=1)
create_synthetic_cr_study(
accession_number="ACC-2025-0001",
image_mode="simple",
send_to_pacs=True
)
画像生成モード:
simple (APIキー不要) - 解剖学的な輪郭を持つ基本的な合成画像
ai ( OPENAI_API_KEY が必要) - OpenAIの gpt-image-1 モデルを使用したリアルなAI生成画像
auto (デフォルト) - キーが利用可能な場合はAIを使用し、そうでない場合はsimpleにフォールバック
sample - ライブラリからの事前作成されたサンプル画像を使用
⚠️ 重要:
- 合成画像は開発/テスト/トレーニングのみを目的としています。臨床用途には使用しないでください。
- AIモードはOpenAIの
gpt-image-1 モデルを使用します(画像ごとに約30 - 40秒)
- 複数ビューの検査(2枚以上の画像)は、MCPクライアントでタイムアウトする場合がありますが、依然として正常に完了します
- タイムアウトエラーが表示されても、画像は作成されてPACSに送信されます
- 画像が到着したことを確認するには、Orthancを確認してください
- より高速な生成または信頼性の高いテストのために、"auto" ではなく
image_mode="simple" を使用してください
設定:
.env に追加します(AIモードの場合はオプション)。
OPENAI_API_KEY=sk-proj-xxxxx
LLM駆動のワークフロー例:
ユーザー: "患者Johnsonが胸部X線を完了しました。検査を作成してください"
LLM: create_synthetic_cr_study(accession_number="ACC-2025-0001", image_mode="simple") を呼び出します
結果: 2ビューの胸部検査がすぐにOrthancに表示されます!
ユーザー: "右肺に肺炎を示すリアルな胸部X線を生成してください"
LLM: image_mode="ai" で呼び出し、image_description="pneumonia right lower lobe" を指定します
結果: gpt-image-1が写真のようにリアルな肺炎の外観を生成します(約40秒)
注意: タイムアウトエラーが表示される場合がありますが、画像は依然としてPACSに到着します
これにより、完全なRIS/PACSワークフローが完了します。
注文 → MWL → 仮想デバイス → DICOM画像 → PACSストレージ → 閲覧 → レポート
放射線科レポート 🆕
専門的な放射線科レポートを作成し、DICOMエンカプセレートPDFとしてPACS内の検査に添付します。
study_info = get_study_for_report(accession_number="ACC-2025-0001")
radiologists = list_radiologists()
report = create_radiology_report(
accession_number="ACC-2025-0001",
findings="""
心臓の大きさは正常です。縦隔は異常なしです。
両肺は清浄で、局所的な浸潤、胸水、または気胸はありません。
急性の骨の異常は認められません。
""",
impression="正常な胸部X線。急性の心肺疾患はありません。",
author_provider_id=3,
report_status="Final"
)
pdf_data = generate_report_pdf(report_id=report['report_id'])
result = attach_report_to_pacs(report_id=report['report_id'])
レポートワークフローの機能:
- データベースストレージ: レポートはミニRISの
reports テーブルに保存され、完全な監査トレイルがあります
- 専門的なPDF: ReportLab(デフォルト)で生成されます - 施設のヘッダー、人口統計、所見、印象、署名
- 代替PDFライブラリ: WeasyPrintもHTML/CSSベースのPDF生成のオプションとしてインストールされています(ウェブベースのレポートテンプレートに便利)
- DICOM標準: エンカプセレートPDF(SOPクラス:
1.2.840.10008.5.1.4.1.1.104.1)
- PACS統合: PDFは元の検査に新しいシリーズとして添付されます(モダリティ: DOC、シリーズ番号9999)
- ステータス追跡: 予備 → 最終 → 修正 → キャンセル
- 提供者の帰属: ミニRISの提供者テーブル内の放射線科医にリンクされます
LLM駆動のレポート例:
ユーザー: "アクセッションACC-2025-0001の最終レポートを作成してください。正常な胸部X線です。"
LLM: → get_study_for_report() を呼び出して患者/検査データを取得する
→ list_radiologists() を呼び出して利用可能な放射線科医を取得する
→ create_radiology_report() を呼び出して構造化された所見/印象を作成する
→ attach_report_to_pacs() を呼び出してPDFをPACSに送信する
結果: データベースに完全なレポート + PACSにPDFが保存されます!
ユーザー: "脛骨骨折を示す膝の検査の予備レポートを生成してください"
LLM: → report_status="Preliminary" でレポートを作成する
→ 骨折を説明する所見を構造化する
→ PDFを生成してPACSに添付する
結果: 予備レポートがレビュー用に利用可能になります
ユーザー: "レポートID 5のPDFを表示してください"
LLM: → generate_report_pdf(report_id=5) を呼び出す
→ 表示/ダウンロード用のbase64 PDFを返す
レポートステータスワークフロー:
予備 → 最終 → [修正] → [キャンセル]
各ステータス変更は、タイムスタンプ付きの新しい監査トレイルエントリを作成します。
データベーススキーマ:
reports:
- report_id (PK)
- imaging_study_id (FK to imaging_studies)
- report_number (unique, e.g., "RPT-ACC-2025-0001-20250601120000")
- author_provider_id (FK to providers - radiologist)
- report_status (enum: Preliminary, Final, Amended, Cancelled)
- report_datetime (timestamp)
- report_text (LONGTEXT - findings)
- impression (TEXT - clinical impression)
- dicom_sop_instance_uid (populated after PACS attachment)
- dicom_series_instance_uid (populated after PACS attachment)
完全な画像 + レポートワークフロー:
┌─────────────────────────────────────────────────────────┐
│ 1. 注文管理 (ミニRIS) │
│ create_mwl_from_order(order_id=1) │
└────────────────┬────────────────────────────────────────┘
│
┌────────────────▼────────────────────────────────────────┐
│ 2. 画像取得 (仮想CRデバイス) │
│ create_synthetic_cr_study(accession="ACC-2025-0001") │
└────────────────┬────────────────────────────────────────┘
│
┌────────────────▼────────────────────────────────────────┐
│ 3. PACSストレージ (Orthanc) │
│ 画像は http://localhost:8042 で閲覧可能 │
└────────────────┬────────────────────────────────────────┘
│
┌────────────────▼────────────────────────────────────────┐
│ 4. 放射線科レポート │
│ create_radiology_report(...) │
│ attach_report_to_pacs(report_id=1) │
└────────────────┬────────────────────────────────────────┘
│
┌────────────────▼────────────────────────────────────────┐
│ 5. PACS内の完全な検査 │
│ - CR画像 (シリーズ1, 2) │
│ - レポートPDF (シリーズ9999, モダリティDOC) │
└─────────────────────────────────────────────────────────┘
🧪 テスト用の合成データ
オーケストレーションワークフローをテストするために、ローカルのHAPI FHIRサーバーに合成データを入力します。
python tests/populate_synthetic_fhir_data.py
これにより、次のものが作成されます。
- 現実的な人口統計情報を持つ5人のテスト患者
- 画像検査のサービスリクエスト(注文)
- 患者にリンクされた画像検査
- 所見を含む診断レポート
🔄 オーケストレーションワークフロー
MCPサーバーは、FHIRとDICOMを組み合わせたエンドツーエンドの放射線科ワークフローを可能にします。
- 注文エントリ: FHIRでサービスリクエストを作成する
- 検査取得: DICOM検査をFHIR画像検査にリンクする
- レポート作成: DICOM PDFから診断レポートを生成する
- ワークフロー管理: 注文の完了まで追跡する
🔧 開発とデバッグ
MCP Jam は、DICOM MCPサーバーの開発、テスト、およびデバッグに推奨されるツールです。
開発ワークフロー:
- Dockerを起動する:
docker-compose up -d
- テストデータをロードする:
dotenv run -- pytest (サンプルDICOMデータをアップロード)
- MCP Jamを起動する:
npx -y @mcpjam/inspector@latest または npx -y @mcpjam/inspector@beta
- ツールをテストする: ツールタブを使用して、すべてのDICOM操作をインタラクティブにテストする
- LLMでテストする: プレイグラウンドタブを使用して、自然言語対話をテストする
- 問題をデバッグする: サーバー通知を確認して、エラーと詳細なログを確認する
MCP Jamの開発における利点:
- ✅ ゲストモード - アカウント不要ですぐに動作します
- ✅ すべてのDICOMツールのリアルタイムテスト 即座のフィードバックが得られます
- ✅ インタラクティブなインターフェース DICOMデータと応答を探索するために便利です
- ✅ LLM統合 AIアシスタントがサーバーとどのように対話するかをテストできます
- ✅ デバッグログ 詳細なサーバー通知とエラーを表示します
- ✅ ツールブラウザ すべての利用可能なツールを簡単に見つけてテストできます
✨ 主な機能
dicom-mcp は、以下のツールを提供します。
- 🔍 Orthancのクエリ: さまざまな基準を使用して、患者、検査、シリーズ、およびインスタンスを検索します。
- 📄 DICOMレポート (PDF) の読み取り: カプセル化されたPDF(例: 臨床レポート)を含むDICOMインスタンスを取得し、テキスト内容を抽出します。
- 📄 RISおよびDICOMレポート (PDF) の作成: PDF形式のサンプルレポートを作成します。
- ➡️ DICOM画像の送信: シリーズまたは検査を他のDICOM宛先(例: 画像セグメンテーション、分類などのAIエンドポイント)に送信します。
- ⚙️ ユーティリティ: 接続の管理とクエリオプションの理解を支援します。
- ⚙️ FHIRメソッド:
- ⚙️ ミニRIS:
- ⚙️ MWLサーバー:
📄 ライセンス
このプロジェクトは、MITライセンスの下でライセンスされています。 https://opensource.org/licenses/MIT
🙏 謝辞