DICOM医学影像分析工具
启用AI助手从DICOM服务器查询和分析医学影像元数据的功能,包括患者信息、研究、序列和实例,以及从封装的PDF文档中提取文本。
服务介绍
dicom-mcp: 一个 DICOM 模型上下文协议服务器
此仓库是博客文章的一部分:代理医疗 LLMs
概述
这是一个用于 DICOM(医学数字成像和通信)交互的模型上下文协议服务器。该服务器提供了查询和与 DICOM 服务器交互的工具,使大型语言模型能够访问和分析医学影像元数据。
dicom-mcp 允许 AI 助手使用标准的 DICOM 网络协议从 DICOM 服务器查询患者信息、研究、序列和实例。它还支持从存储在 DICOM 格式中的封装 PDF 文档中提取文本,从而可以分析临床报告。它是基于 pynetdicom 构建的,并遵循模型上下文协议规范。
工具
-
list_dicom_nodes- Lists all configured DICOM nodes and calling AE titles
- Inputs: None
- Returns: Current node, available nodes, current calling AE title, and available calling AE titles
-
switch_dicom_node- Switches to a different configured DICOM node
- Inputs:
node_name(string): Name of the node to switch to
- Returns: Success message
-
switch_calling_aet- Switches to a different configured calling AE title
- Inputs:
aet_name(string): Name of the calling AE title to switch to
- Returns: Success message
-
verify_connection- Tests connectivity to the configured DICOM node using C-ECHO
- Inputs: None
- Returns: Success or failure message with details
-
query_patients- Search for patients matching specified criteria
- Inputs:
name_pattern(string, optional): Patient name pattern (can include wildcards)patient_id(string, optional): Patient IDbirth_date(string, optional): Patient birth date (YYYYMMDD)attribute_preset(string, optional): Preset level of detail (minimal, standard, extended)additional_attributes(string[], optional): Additional DICOM attributes to includeexclude_attributes(string[], optional): DICOM attributes to exclude
- Returns: Array of matching patient records
-
query_studies- Search for studies matching specified criteria
- Inputs:
patient_id(string, optional): Patient IDstudy_date(string, optional): Study date or range (YYYYMMDD or YYYYMMDD-YYYYMMDD)modality_in_study(string, optional): Modalities in studystudy_description(string, optional): Study description (can include wildcards)accession_number(string, optional): Accession numberstudy_instance_uid(string, optional): Study Instance UIDattribute_preset(string, optional): Preset level of detailadditional_attributes(string[], optional): Additional DICOM attributes to includeexclude_attributes(string[], optional): DICOM attributes to exclude
- Returns: Array of matching study records
-
query_series- Search for series within a study
- Inputs:
study_instance_uid(string): Study Instance UID (required)modality(string, optional): Modality (e.g., "CT", "MR")series_number(string, optional): Series numberseries_description(string, optional): Series descriptionseries_instance_uid(string, optional): Series Instance UIDattribute_preset(string, optional): Preset level of detailadditional_attributes(string[], optional): Additional DICOM attributes to includeexclude_attributes(string[], optional): DICOM attributes to exclude
- Returns: Array of matching series records
-
query_instances- Search for instances within a series
- Inputs:
series_instance_uid(string): Series Instance UID (required)instance_number(string, optional): Instance numbersop_instance_uid(string, optional): SOP Instance UIDattribute_preset(string, optional): Preset level of detailadditional_attributes(string[], optional): Additional DICOM attributes to includeexclude_attributes(string[], optional): DICOM attributes to exclude
- Returns: Array of matching instance records
-
get_attribute_presets- Lists available attribute presets for queries
- Inputs: None
- Returns: Dictionary of available presets and their attributes by level
-
retrieve_instance- Retrieves a specific DICOM instance and saves it to the local filesystem
- Inputs:
study_instance_uid(string): Study Instance UIDseries_instance_uid(string): Series Instance UIDsop_instance_uid(string): SOP Instance UIDoutput_directory(string, optional): Directory to save the retrieved instance to (default: "./retrieved_files")
- Returns: Dictionary with information about the retrieval operation
-
extract_pdf_text_from_dicom- Retrieves a DICOM instance containing an encapsulated PDF and extracts its text content
- Inputs:
study_instance_uid(string): Study Instance UIDseries_instance_uid(string): Series Instance UIDsop_instance_uid(string): SOP Instance UID
- Returns: Dictionary with extracted text information and status
安装
前提条件
- 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
开发
设置开发环境
-
克隆仓库:
git clone https://github.com/yourusername/dicom-mcp.git cd dicom-mcp -
创建虚拟环境:
python -m venv .venv source .venv/bin/activate # 在 Windows 上:.venv\Scripts\activate -
安装依赖项:
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 文件。
致谢
- 基于 pynetdicom
- 遵循 Model Context Protocol 规范
- 使用 PyPDF2 进行 PDF 文本提取