DICOM MCP Server
by ChristianHinge
Verified
- dicom-mcp
- tests
# test_dicom_client.py
from dicom_mcp.dicom_client import DicomClient
from dicom_mcp.config import load_config
import sys
def main():
# Load the configuration
try:
config = load_config("configuration.yaml")
except Exception as e:
print(f"Error loading configuration: {e}")
return
# Get the current node and calling AE title
node = config.nodes[config.current_node]
aet = config.calling_aets[config.current_calling_aet]
# Create client
client = DicomClient(
host=node.host,
port=node.port,
calling_aet=aet.ae_title,
called_aet=node.ae_title
)
print(f"Created DICOM client for {node.host}:{node.port}")
print(f"Called AE: {node.ae_title}, Calling AE: {aet.ae_title}")
# Test connection
success, message = client.verify_connection()
if not success:
print(f"Connection failed: {message}")
return
print(f"Connection successful: {message}")
# Query for patients
print("\nQuerying patients...")
patients = client.query_patient()
if not patients:
print("No patients found")
return
print(f"Found {len(patients)} patients")
patient_id = patients[0]["PatientID"]
print(f"Using patient ID: {patient_id}")
# Query for studies
print("\nQuerying studies...")
studies = client.query_study(patient_id=patient_id)
if not studies:
print(f"No studies found for patient {patient_id}")
return
print(f"Found {len(studies)} studies")
study_uid = studies[0]["StudyInstanceUID"]
print(f"Using study UID: {study_uid}")
# Query for series
print("\nQuerying series...")
series = client.query_series(study_instance_uid=study_uid)
if not series:
print(f"No series found for study {study_uid}")
return
print(f"Found {len(series)} series")
series_uid = series[0]["SeriesInstanceUID"]
print(f"Using series UID: {series_uid}")
# Query for instances
print("\nQuerying instances...")
instances = client.query_instance(series_instance_uid=series_uid)
if not instances:
print(f"No instances found for series {series_uid}")
return
print(f"Found {len(instances)} instances")
instance_uid = instances[0]["SOPInstanceUID"]
print(f"Using instance UID: {instance_uid}")
# # Add the retrieve_instance method to DicomClient
# # (Copy the method provided above to dicom_client.py first)
# # Retrieve the instance
# # test_dicom_client.py
# # ... (keep everything else the same, just replace the retrieve_instance call)
# Retrieve the instance using C-MOVE
print("\nRetrieving instance using C-MOVE...")
output_dir = "./dicom_test_download"
result = client.retrieve_instance_move(
study_instance_uid=study_uid,
series_instance_uid=series_uid,
sop_instance_uid=instance_uid,
output_dir=output_dir
)
print(f"Retrieval success: {result['success']}")
print(f"Message: {result['message']}")
if result['success']:
print(f"File saved to: {result['file_path']}")
# print(f"Retrieval success: {result['success']}")
# print(f"Message: {result['message']}")
# if result['success']:
# print(f"File saved to: {result['file_path']}")
# # After the C-MOVE test, add:
# print("\nRetrying with movescu...")
# result = client.retrieve_using_movescu(
# study_instance_uid=study_uid,
# series_instance_uid=series_uid,
# sop_instance_uid=instance_uid,
# output_dir="./dicom_movescu_download"
# )
# print(f"Retrieval success: {result['success']}")
# print(f"Message: {result['message']}")
# if result['success']:
# print(f"File saved to: {result['file_path']}")
# else:
# print(f"Command output: {result.get('stdout', '')}")
# print(f"Command errors: {result.get('stderr', '')}")
# # Retrieve the instance
# print("\nRetrieving instance...")
# output_dir = "./dicom_test_download"
# result = client.retrieve_instance(
# study_instance_uid=study_uid,
# series_instance_uid=series_uid,
# sop_instance_uid=instance_uid,
# output_dir=output_dir
# )
# print(f"Retrieval success: {result['success']}")
# print(f"Message: {result['message']}")
# if result['success']:
# print(f"File saved to: {result['file_path']}")
if __name__ == "__main__":
main()