DICOM MCP Server

by ChristianHinge
Verified

hybrid server

The server is able to function both locally and remotely, depending on the configuration or use case.

Integrations

  • Supports integration with Docker for running Orthanc server in development and testing environments.

  • Uses Pydantic for configuration management, providing type validation and settings management for the DICOM MCP server.

  • Provides test suite integration for validating DICOM MCP functionality.

dicom-mcp:DICOM 模型上下文协议服务器

此 repo 是博客文章的一部分: Agentic Healthcare LLMs

概述

用于 DICOM(医学数字成像与通信)交互的模型上下文协议服务器。该服务器提供查询和与 DICOM 服务器交互的工具,使大型语言模型能够访问和分析医学成像元数据。

dicom-mcp 允许 AI 助手使用标准 DICOM 网络协议从 DICOM 服务器查询患者信息、研究、系列和实例。它还支持从以 DICOM 格式存储的封装 PDF 文档中提取文本,从而可以分析临床报告。它基于 pynetdicom 构建,并遵循模型上下文协议 (MCP) 规范。

工具

  1. list_dicom_nodes
    • 列出所有配置的 DICOM 节点和调用 AE 标题
    • 输入:无
    • 返回:当前节点、可用节点、当前调用 AE 标题和可用调用 AE 标题
  2. switch_dicom_node
    • 切换到不同的配置 DICOM 节点
    • 输入:
      • node_name (字符串):要切换到的节点的名称
    • 返回:成功消息
  3. switch_calling_aet
    • 切换到不同的配置调用 AE 标题
    • 输入:
      • aet_name (字符串):要切换到的调用 AE 标题的名称
    • 返回:成功消息
  4. verify_connection
    • 使用 C-ECHO 测试与配置的 DICOM 节点的连接
    • 输入:无
    • 返回:成功或失败的详细信息
  5. query_patients
    • 搜索符合指定条件的患者
    • 输入:
      • name_pattern (字符串,可选):患者姓名模式(可以包含通配符)
      • patient_id (字符串,可选):患者 ID
      • birth_date (字符串,可选):患者出生日期(YYYYMMDD)
      • attribute_preset (字符串,可选):预设细节级别(最低、标准、扩展)
      • additional_attributes (string[],可选):要包含的其他 DICOM 属性
      • exclude_attributes (string[],可选):要排除的 DICOM 属性
    • 返回:匹配的患者记录数组
  6. query_studies
    • 搜索符合指定条件的研究
    • 输入:
      • patient_id (字符串,可选):患者 ID
      • study_date (字符串,可选):学习日期或范围(YYYYMMDD 或 YYYYMMDD-YYYYMMDD)
      • modality_in_study (字符串,可选):研究中的模式
      • study_description (字符串,可选):研究描述(可以包含通配符)
      • accession_number (字符串,可选):接入号
      • study_instance_uid (字符串,可选):研究实例 UID
      • attribute_preset (字符串,可选):预设详细程度
      • additional_attributes (string[],可选):要包含的其他 DICOM 属性
      • exclude_attributes (string[],可选):要排除的 DICOM 属性
    • 返回:匹配的学习记录数组
  7. query_series
    • 在研究中搜索系列
    • 输入:
      • study_instance_uid (字符串):研究实例 UID(必需)
      • modality (字符串,可选):模态(例如,“CT”,“MR”)
      • series_number (字符串,可选):系列号
      • series_description (字符串,可选):系列描述
      • series_instance_uid (字符串,可选):系列实例 UID
      • attribute_preset (字符串,可选):预设详细程度
      • additional_attributes (string[],可选):要包含的其他 DICOM 属性
      • exclude_attributes (string[],可选):要排除的 DICOM 属性
    • 返回:匹配系列记录的数组
  8. query_instances
    • 搜索系列中的实例
    • 输入:
      • series_instance_uid (字符串):系列实例 UID(必需)
      • instance_number (字符串,可选):实例编号
      • sop_instance_uid (字符串,可选):SOP 实例 UID
      • attribute_preset (字符串,可选):预设详细程度
      • additional_attributes (string[],可选):要包含的其他 DICOM 属性
      • exclude_attributes (string[],可选):要排除的 DICOM 属性
    • 返回:匹配实例记录的数组
  9. get_attribute_presets
    • 列出查询可用的属性预设
    • 输入:无
    • 返回:按级别列出的可用预设及其属性的词典
  10. retrieve_instance
  • 检索特定的 DICOM 实例并将其保存到本地文件系统
  • 输入:
    • study_instance_uid (字符串):研究实例 UID
    • series_instance_uid (字符串):系列实例 UID
    • sop_instance_uid (字符串):SOP 实例 UID
    • output_directory (字符串,可选):保存检索到的实例的目录(默认值:“./retrieved_files”)
  • 返回:包含有关检索操作的信息的字典
  1. extract_pdf_text_from_dicom
  • 检索包含封装 PDF 的 DICOM 实例并提取其文本内容
  • 输入:
    • study_instance_uid (字符串):研究实例 UID
    • series_instance_uid (字符串):系列实例 UID
    • sop_instance_uid (字符串):SOP 实例 UID
  • 返回:包含提取的文本信息和状态的字典

安装

先决条件

  • Python 3.12 或更高版本
  • 要连接的 DICOM 服务器(例如 Orthanc、dcm4chee 等)

使用 pip

通过 pip 安装:

pip install dicom-mcp

配置

dicom-mcp 需要一个 YAML 配置文件,用于定义 DICOM 节点和调用 AE 标题。请创建一个具有以下结构的配置文件:

# DICOM nodes configuration nodes: orthanc: host: "localhost" port: 4242 ae_title: "ORTHANC" description: "Local Orthanc DICOM server" clinical: host: "pacs.hospital.org" port: 11112 ae_title: "CLIN_PACS" description: "Clinical PACS server" # Local calling AE titles calling_aets: default: ae_title: "MCPSCU" description: "Default calling AE title" modality: ae_title: "MODALITY" description: "Simulating a modality" # Currently selected node current_node: "orthanc" # Currently selected calling AE title current_calling_aet: "default"

用法

命令行

使用脚本入口点运行服务器:

dicom-mcp /path/to/configuration.yaml

如果使用 uv:

uv run dicom-mcp /path/to/configuration.yaml

使用 Claude Desktop 进行配置

将其添加到您的claude_desktop_config.json中:

"mcpServers": { "dicom": { "command": "uv", "args": ["--directory", "/path/to/dicom-mcp", "run", "dicom-mcp", "/path/to/configuration.yaml"] } }

与 Zed 一起使用

添加到您的 Zed settings.json:

"context_servers": [ "dicom-mcp": { "command": { "path": "uv", "args": ["--directory", "/path/to/dicom-mcp", "run", "dicom-mcp", "/path/to/configuration.yaml"] } } ],

示例查询

列出可用的 DICOM 节点

list_dicom_nodes()

切换到不同的节点

switch_dicom_node(node_name="clinical")

切换到不同的调用 AE 标题

switch_calling_aet(aet_name="modality")

验证连接

verify_connection()

搜索患者

# Search by name pattern (using wildcard) patients = query_patients(name_pattern="SMITH*") # Search by patient ID patients = query_patients(patient_id="12345678") # Get detailed information patients = query_patients(patient_id="12345678", attribute_preset="extended")

搜索研究

# Find all studies for a patient studies = query_studies(patient_id="12345678") # Find studies within a date range studies = query_studies(study_date="20230101-20231231") # Find studies by modality studies = query_studies(modality_in_study="CT")

搜索研究中的系列

# Find all series in a study series = query_series(study_instance_uid="1.2.840.10008.5.1.4.1.1.2.1.1") # Find series by modality and description series = query_series( study_instance_uid="1.2.840.10008.5.1.4.1.1.2.1.1", modality="CT", series_description="CHEST*" )

搜索系列中的实例

# Find all instances in a series instances = query_instances(series_instance_uid="1.2.840.10008.5.1.4.1.1.2.1.2") # Find a specific instance by number instances = query_instances( series_instance_uid="1.2.840.10008.5.1.4.1.1.2.1.2", instance_number="1" )

检索 DICOM 实例

# Retrieve a specific instance result = retrieve_instance( study_instance_uid="1.2.840.10008.5.1.4.1.1.2.1.1", series_instance_uid="1.2.840.10008.5.1.4.1.1.2.1.2", sop_instance_uid="1.2.840.10008.5.1.4.1.1.2.1.3", output_directory="./dicom_files" )

从 DICOM 封装的 PDF 中提取文本

# Extract text from an encapsulated PDF result = extract_pdf_text_from_dicom( study_instance_uid="1.2.840.10008.5.1.4.1.1.104.1.1", series_instance_uid="1.2.840.10008.5.1.4.1.1.104.1.2", sop_instance_uid="1.2.840.10008.5.1.4.1.1.104.1.3" )

调试

您可以使用 MCP 检查器来调试服务器:

npx @modelcontextprotocol/inspector uv --directory /path/to/dicom-mcp run dicom-mcp /path/to/configuration.yaml

发展

设置开发环境

  1. 克隆存储库:
    git clone https://github.com/yourusername/dicom-mcp.git cd dicom-mcp
  2. 创建虚拟环境:
    python -m venv .venv source .venv/bin/activate # On Windows: .venv\Scripts\activate
  3. 安装依赖项:
    pip install -e .

运行测试

测试需要运行 Orthanc 服务器。你可以使用 Docker 启动一个:

cd tests docker-compose up -d

然后运行测试:

pytest tests/test_dicom_mcp.py

要测试 PDF 提取功能:

pytest tests/test_dicom_pdf.py

项目结构

  • src/dicom_mcp/ :主包
    • __init__.py :包初始化
    • __main__.py :入口点
    • server.py :MCP 服务器实现
    • dicom_client.py :DICOM客户端实现
    • attributes.py :DICOM 属性预设
    • config.py :使用 Pydantic 进行配置管理

执照

该项目根据 MIT 许可证获得许可 - 有关详细信息,请参阅 LICENSE 文件。

致谢

ID: h5p8xkjx92