This repo is part of a blog post: Agentic Healthcare LLMs
A Model Context Protocol server for DICOM (Digital Imaging and Communications in Medicine) interactions. This server provides tools to query and interact with DICOM servers, enabling Large Language Models to access and analyze medical imaging metadata.
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, making it possible to analyze clinical reports. It's built on pynetdicom and follows the Model Context Protocol specification.
list_dicom_nodes
switch_dicom_node
node_name
(string): Name of the node to switch toswitch_calling_aet
aet_name
(string): Name of the calling AE title to switch toverify_connection
query_patients
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 excludequery_studies
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 excludequery_series
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 excludequery_instances
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 excludeget_attribute_presets
retrieve_instance
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")extract_pdf_text_from_dicom
study_instance_uid
(string): Study Instance UIDseries_instance_uid
(string): Series Instance UIDsop_instance_uid
(string): SOP Instance UIDInstall via pip:
pip install dicom-mcp
dicom-mcp requires a YAML configuration file that defines the DICOM nodes and calling AE titles. Create a configuration file with the following structure:
# 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"
Run the server using the script entry point:
dicom-mcp /path/to/configuration.yaml
If using uv:
uv run dicom-mcp /path/to/configuration.yaml
Add this to your claude_desktop_config.json
:
"mcpServers": {
"dicom": {
"command": "uv",
"args": ["--directory", "/path/to/dicom-mcp", "run", "dicom-mcp", "/path/to/configuration.yaml"]
}
}
Add to your Zed settings.json:
"context_servers": [
"dicom-mcp": {
"command": {
"path": "uv",
"args": ["--directory", "/path/to/dicom-mcp", "run", "dicom-mcp", "/path/to/configuration.yaml"]
}
}
],
list_dicom_nodes()
switch_dicom_node(node_name="clinical")
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"
)
# 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"
)
# 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"
)
You can use the MCP inspector to debug the server:
npx @modelcontextprotocol/inspector uv --directory /path/to/dicom-mcp run dicom-mcp /path/to/configuration.yaml
Clone the repository:
git clone https://github.com/yourusername/dicom-mcp.git
cd dicom-mcp
Create a virtual environment:
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
Install dependencies:
pip install -e .
The tests require a running Orthanc server. You can start one using Docker:
cd tests
docker-compose up -d
Then run the tests:
pytest tests/test_dicom_mcp.py
To test PDF extraction functionality:
pytest tests/test_dicom_pdf.py
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 PydanticThis project is licensed under the MIT License - see the LICENSE file for details.
{
"mcpServers": {
"dicom": {
"env": {},
"args": [
"--directory",
"/path/to/dicom-mcp",
"run",
"dicom-mcp",
"/path/to/configuration.yaml"
],
"command": "uv"
}
}
}
Seamless access to top MCP servers powering the future of AI integration.