Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@DICOM MCP Serverfind recent CT scans for patient John Doe born 1985-03-15"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
DICOM MCP Server for Medical Imaging Systems π₯
The dicom-mcp server enables AI assistants to query, read, and move data on DICOM servers (PACS, VNA, etc.).
π€ Contribute β’ π Report Bug β’
---------------------------------------------------------------------
π§ββοΈ User: "Any significant findings in John Doe's previous CT report?"
π§ LLM β βοΈ Tools:
query_patients β query_studies β query_series β extract_pdf_text_from_dicom
π¬ LLM Response: "The report from 2025-03-26 mentions a history of splenomegaly (enlarged spleen)"
π§ββοΈ User: "What's the volume of his spleen at the last scan and the scan today?"
π§ LLM β βοΈ Tools:
(query_studies β query_series β move_series β query_series β extract_pdf_text_from_dicom) x2
(The move_series tool sends the latest CT to a DICOM segmentation node, which returns volume PDF report)
π¬ LLM Response: "last year 2024-03-26: 412cmΒ³, today 2025-04-10: 350cmΒ³"
---------------------------------------------------------------------β¨ Core Capabilities
dicom-mcp provides tools to:
π Query Metadata: Search for patients, studies, series, and instances using various criteria.
π Read DICOM Reports (PDF): Retrieve DICOM instances containing encapsulated PDFs (e.g., clinical reports) and extract the text content.
π₯ Download DICOM Files: Download DICOM instances from the server to a local directory using C-GET. Retrieve entire series or specific instances for local analysis and processing.
β‘οΈ Send DICOM Images: Send series or studies to other DICOM destinations, e.g. AI endpoints for image segmentation, classification, etc.
βοΈ Utilities: Manage connections and understand query options.
π Quick Start
π₯ Installation
Install using uv or pip:
uv tool install dicom-mcpOr by cloning the repository:
# Clone and set up development environment
git clone https://github.com/Y5ive9ine/dicom-mcp
cd dicom mcp
# Create and activate virtual environment
uv venv
source .venv/bin/activate
# Install with test dependencies
uv pip install -e ".[dev]"βοΈ Configuration
dicom-mcp requires a YAML configuration file (config.yaml or similar) defining DICOM nodes and calling AE titles. Adapt the configuration or keep as is for compatibility with the sample ORTHANC Server.
nodes:
main:
host: "localhost"
port: 4242
ae_title: "ORTHANC"
description: "Local Orthanc DICOM server"
current_node: "main"
calling_aet: "MCPSCU" DICOM-MCP is not meant for clinical use, and should not be connected with live hospital databases or databases with patient-sensitive data. Doing so could lead to both loss of patient data, and leakage of patient data onto the internet. DICOM-MCP can be used with locally hosted open-weight LLMs for complete data privacy.
(Optional) Sample ORTHANC server
If you don't have a DICOM server available, you can run a local ORTHANC server using Docker:
Clone the repository and install test dependencies pip install -e ".[dev]
cd tests
docker ocmpose up -d
cd ..
pytest # uploads dummy pdf data to ORTHANC serverUI at http://localhost:8042
π MCP Integration
Add to your client configuration (e.g. claude_desktop_config.json):
{
"mcpServers": {
"dicom": {
"command": "uv",
"args": ["tool","dicom-mcp", "/path/to/your_config.yaml"]
}
}
}For development:
{
"mcpServers": {
"arxiv-mcp-server": {
"command": "uv",
"args": [
"--directory",
"path/to/cloned/dicom-mcp",
"run",
"dicom-mcp",
"/path/to/your_config.yaml"
]
}
}
}π οΈ Tools Overview
dicom-mcp provides four categories of tools for interaction with DICOM servers and DICOM data.
π Query Metadata
query_patients: Search for patients based on criteria like name, ID, or birth date.query_studies: Find studies using patient ID, date, modality, description, accession number, or Study UID.query_series: Locate series within a specific study using modality, series number/description, or Series UID.query_instances: Find individual instances (images/objects) within a series using instance number or SOP Instance UID
π Read DICOM Reports (PDF)
extract_pdf_text_from_dicom: Retrieve a specific DICOM instance containing an encapsulated PDF and extract its text content.
π₯ Download DICOM Files
retrieve_dicom_instances: Download DICOM instances from the server to a local directory using C-GET. Retrieve entire series or specific instances for local analysis and processing.
β‘οΈ Send DICOM Images
move_series: Send a specific DICOM series to another configured DICOM node using C-MOVE.move_study: Send an entire DICOM study to another configured DICOM node using C-MOVE.
βοΈ Utilities
list_dicom_nodes: Show the currently active DICOM node and list all configured nodes.switch_dicom_node: Change the active DICOM node for subsequent operations.verify_connection: Test the DICOM network connection to the currently active node using C-ECHO.get_attribute_presets: List the available levels of detail (minimal, standard, extended) for metadata query results.
Example interaction
The tools can be chained together to answer complex questions:
π Contributing
Running Tests
Tests require a running Orthanc DICOM server. You can use Docker:
# Navigate to the directory containing docker-compose.yml (e.g., tests/)
cd tests
docker-compose up -dRun tests using pytest:
# From the project root directory
pytestStop the Orthanc container:
cd tests
docker-compose downDebugging
Use the MCP Inspector for debugging the server communication:
npx @modelcontextprotocol/inspector uv run dicom-mcp /path/to/your_config.yaml --transport stdioπ Acknowledgments
Built using pynetdicom
Uses PyPDF2 for PDF text extraction
Usage Examples
Basic Patient Query
# Find all patients with name starting with "SMITH"
patients = query_patients(name_pattern="SMITH*")Study Query with Date Range
# Find CT studies from January 2023
studies = query_studies(
modality_in_study="CT",
study_date="20230101-20230131"
)Download DICOM Files
# Download entire series to local directory
result = retrieve_dicom_instances(
series_instance_uid="1.2.840.113619.2.1.1.322.1600364094.412.2005",
output_directory="/path/to/local/dicom/files"
)
# Download specific instance only
result = retrieve_dicom_instances(
series_instance_uid="1.2.840.113619.2.1.1.322.1600364094.412.2005",
sop_instance_uid="1.2.840.113619.2.1.1.322.1600364094.412.3001",
output_directory="/path/to/local/dicom/files"
)
print(f"Downloaded {result['total_files']} files ({result['total_size_mb']} MB)")
print(f"Files saved to: {result['output_directory']}")
# Files will be named with meaningful information like:
# "12345_SMITH_20230215_CT_CHEST_AXIAL_Inst001.dcm"
# "12345_SMITH_20230215_CT_CHEST_AXIAL_Inst002.dcm"Extract PDF Reports
# Extract text from a DICOM PDF report
result = extract_pdf_text_from_dicom(
study_instance_uid="1.2.840.113619.2.1.1.322.1600364094.412.1009",
series_instance_uid="1.2.840.113619.2.1.1.322.1600364094.412.2005",
sop_instance_uid="1.2.840.113619.2.1.1.322.1600364094.412.3001"
)
if result["success"]:
print("Report text:", result["text_content"])