dicom-mcp
by: ChristianHinge
Model Context Protocol (MCP) for interacting with dicom servers (PACS etc.)
📌Overview
Purpose: To provide a Model Context Protocol server for interactions with DICOM servers, enabling access and analysis of medical imaging metadata by AI assistants.
Overview: dicom-mcp acts as an intermediary that facilitates queries to DICOM servers, allowing for the retrieval of patient information, studies, series, instances, and PDF content from DICOM files. The server is built with pynetdicom and adheres to the Model Context Protocol, streamlining the integration of medical imagery and AI models.
Key Features:
-
Querying DICOM Nodes: Users can list and switch between various configured DICOM nodes and calling AE titles, ensuring seamless connectivity.
-
Patient and Study Queries: Supports detailed search functionalities for patient information and medical studies based on various criteria, including patient names, IDs, study dates, modalities, and more.
-
Instance Retrieval: Provides the ability to retrieve specific DICOM instances and encapsulated PDF documents, facilitating text extraction and further analysis in clinical contexts.
dicom-mcp: A DICOM Model Context Protocol Server
This repository provides a Model Context Protocol server for DICOM (Digital Imaging and Communications in Medicine) interactions. It enables Large Language Models to access and analyze medical imaging metadata by querying and interacting with DICOM servers.
dicom-mcp allows AI assistants to query patient information, studies, series, and instances from DICOM servers using standard DICOM networking protocols. It also supports extracting text from encapsulated PDF documents stored in DICOM format, enabling analysis of clinical reports. The server is built on pynetdicom and follows the Model Context Protocol specification.
Features
Tools
-
list_dicom_nodes
Lists all configured DICOM nodes and calling AE titles. Returns the current node, available nodes, current calling AE title, and available calling AE titles. -
switch_dicom_node
Switches to a different configured DICOM node.
Input:node_name
(string) -
switch_calling_aet
Switches to a different calling AE title.
Input:aet_name
(string) -
verify_connection
Tests connectivity to the configured DICOM node using C-ECHO. -
query_patients
Search patients matching specified criteria.
Inputs:name_pattern
,patient_id
,birth_date
,attribute_preset
,additional_attributes
,exclude_attributes
-
query_studies
Search studies matching specified criteria.
Inputs:patient_id
,study_date
,modality_in_study
,study_description
,accession_number
,study_instance_uid
,attribute_preset
,additional_attributes
,exclude_attributes
-
query_series
Search series within a study.
Inputs:study_instance_uid
(required),modality
,series_number
,series_description
,series_instance_uid
,attribute_preset
,additional_attributes
,exclude_attributes
-
query_instances
Search instances within a series.
Inputs:series_instance_uid
(required),instance_number
,sop_instance_uid
,attribute_preset
,additional_attributes
,exclude_attributes
-
get_attribute_presets
Lists available attribute presets for queries. -
retrieve_instance
Retrieves a specific DICOM instance and saves it locally.
Inputs:study_instance_uid
,series_instance_uid
,sop_instance_uid
,output_directory
(optional) -
extract_pdf_text_from_dicom
Retrieves a DICOM instance containing an encapsulated PDF and extracts its text content.
Inputs:study_instance_uid
,series_instance_uid
,sop_instance_uid
Installation
Prerequisites
- Python 3.12 or higher
- A DICOM server (e.g., Orthanc, dcm4chee)
Installation via pip
pip install dicom-mcp
Configuration
Create a YAML configuration file defining DICOM nodes and calling AE titles. Example structure:
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"
calling_aets:
default:
ae_title: "MCPSCU"
description: "Default calling AE title"
modality:
ae_title: "MODALITY"
description: "Simulating a modality"
current_node: "orthanc"
current_calling_aet: "default"
Usage
Command Line
Run the server with:
dicom-mcp /path/to/configuration.yaml
Or using uv:
uv run dicom-mcp /path/to/configuration.yaml
Integration Examples
- Claude Desktop: Add to
claude_desktop_config.json
undermcpServers
. - Zed Editor: Add appropriate settings in
settings.json
forcontext_servers
.
Example Queries
# List nodes
list_dicom_nodes()
# Switch node
switch_dicom_node(node_name="clinical")
# Switch calling AE title
switch_calling_aet(aet_name="modality")
# Verify connection
verify_connection()
# Query patients by name or ID
patients = query_patients(name_pattern="SMITH*")
patients = query_patients(patient_id="12345678", attribute_preset="extended")
# Query studies
studies = query_studies(patient_id="12345678")
studies = query_studies(study_date="20230101-20231231")
studies = query_studies(modality_in_study="CT")
# Query series in study
series = query_series(study_instance_uid="1.2.840.10008.5.1.4.1.1.2.1.1")
series = query_series(study_instance_uid="1.2.840.10008.5.1.4.1.1.2.1.1", modality="CT", series_description="CHEST*")
# Query instances in series
instances = query_instances(series_instance_uid="1.2.840.10008.5.1.4.1.1.2.1.2")
instances = query_instances(series_instance_uid="1.2.840.10008.5.1.4.1.1.2.1.2", instance_number="1")
# Retrieve DICOM 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"
)
# Extract text from encapsulated PDF in DICOM
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"
)
Debugging
Use the MCP inspector to debug the server:
npx @modelcontextprotocol/inspector uv --directory /path/to/dicom-mcp run dicom-mcp /path/to/configuration.yaml
Development
Setup
- Clone the repo:
git clone https://github.com/yourusername/dicom-mcp.git
cd dicom-mcp
- Create a virtual environment and activate:
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
- Install dependencies in editable mode:
pip install -e .
Running Tests
Requires a running Orthanc server. Start with Docker:
cd tests
docker-compose up -d
Run tests with:
pytest tests/test_dicom_mcp.py
pytest tests/test_dicom_pdf.py # For PDF extraction tests
Project Structure
src/dicom_mcp/
: Main package__init__.py
: Package initialization__main__.py
: Entry pointserver.py
: MCP server implementationdicom_client.py
: DICOM client implementationattributes.py
: DICOM attribute presetsconfig.py
: Configuration management with Pydantic
License
This project is licensed under the MIT License.
Acknowledgments
- Built on pynetdicom
- Follows the Model Context Protocol specification
- Uses PyPDF2 for PDF text extraction