Skip to main content
Glama
NyxToolsDev

DICOM/HL7/FHIR Interoperability MCP Server

pacs_query

Search PACS for medical imaging studies or series using filters like patient ID, date, modality, and description. Supports DICOM protocols C-FIND and QIDO-RS.

Instructions

[Premium] Search PACS for studies or series. Supports filtering by patient ID, patient name, accession number, study date (YYYYMMDD or range), modality, and study description. Returns up to 50 results. Uses C-FIND (DIMSE) or QIDO-RS (DICOMweb).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
query_levelNoQuery level: 'STUDY' or 'SERIES'. Default: STUDY.STUDY
patient_idNoFilter by Patient ID.
patient_nameNoFilter by patient name. Supports wildcards (* or ?).
accession_numberNoFilter by accession number.
study_dateNoFilter by study date. YYYYMMDD for exact, YYYYMMDD-YYYYMMDD for range.
modalityNoFilter by modality (CT, MR, US, XR, MG, etc.).
study_descriptionNoFilter by study description (partial match).
study_instance_uidNoFilter by Study Instance UID. Required for SERIES level queries.
limitNoMaximum results to return (1-50). Default: 10.

Implementation Reference

  • Handler function for 'pacs_query' tool, which prepares filters and calls pacs_find to interact with the PACS.
    def _handle_query(arguments: dict) -> str:
        """Handle pacs_query tool call."""
        filters = QueryFilters(
            query_level=arguments.get("query_level", "STUDY"),
            patient_id=arguments.get("patient_id", ""),
            patient_name=arguments.get("patient_name", ""),
            accession_number=arguments.get("accession_number", ""),
            study_date=arguments.get("study_date", ""),
            modality=arguments.get("modality", ""),
            study_description=arguments.get("study_description", ""),
            study_instance_uid=arguments.get("study_instance_uid", ""),
            limit=arguments.get("limit", 10),
        )
    
        results = pacs_find(filters)
    
        if not results:
            return format_pacs_result("No results found matching the query filters.")
    
        lines = [f"Found {len(results)} {filters.query_level.lower()}(s):", "=" * 70]
    
        for i, r in enumerate(results, 1):
            lines.append(f"\n--- Result {i} ---")
            data = r.model_dump()
            for key, value in data.items():
                if value:  # Only show non-empty fields
                    label = key.replace("_", " ").title()
                    lines.append(f"  {label}: {value}")
    
        return format_pacs_result("\n".join(lines))
  • Tool registration and schema definition for 'pacs_query'.
    Tool(
        name="pacs_query",
        description=(
            "[Premium] Search PACS for studies or series. Supports filtering by patient ID, "
            "patient name, accession number, study date (YYYYMMDD or range), modality, and "
            "study description. Returns up to 50 results. Uses C-FIND (DIMSE) or QIDO-RS (DICOMweb)."
        ),
        inputSchema={
            "type": "object",
            "properties": {
                "query_level": {
                    "type": "string",
                    "description": "Query level: 'STUDY' or 'SERIES'. Default: STUDY.",
                    "default": "STUDY",
                    "enum": ["STUDY", "SERIES"],
                },
                "patient_id": {
                    "type": "string",
                    "description": "Filter by Patient ID.",
                    "default": "",
                },
                "patient_name": {
                    "type": "string",
                    "description": "Filter by patient name. Supports wildcards (* or ?).",
                    "default": "",
                },
                "accession_number": {
                    "type": "string",
                    "description": "Filter by accession number.",
                    "default": "",
                },
                "study_date": {
                    "type": "string",
                    "description": "Filter by study date. YYYYMMDD for exact, YYYYMMDD-YYYYMMDD for range.",
                    "default": "",
                },
                "modality": {
                    "type": "string",
                    "description": "Filter by modality (CT, MR, US, XR, MG, etc.).",
                    "default": "",
                },
                "study_description": {
                    "type": "string",
                    "description": "Filter by study description (partial match).",
                    "default": "",
                },
                "study_instance_uid": {
                    "type": "string",
                    "description": "Filter by Study Instance UID. Required for SERIES level queries.",
                    "default": "",
                },
                "limit": {
                    "type": "integer",
                    "description": "Maximum results to return (1-50). Default: 10.",
                    "default": 10,
                    "minimum": 1,
                    "maximum": 50,
                },
            },
        },
    ),

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/NyxToolsDev/dicom-hl7-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server