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
| Name | Required | Description | Default |
|---|---|---|---|
| query_level | No | Query level: 'STUDY' or 'SERIES'. Default: STUDY. | STUDY |
| patient_id | No | Filter by Patient ID. | |
| patient_name | No | Filter by patient name. Supports wildcards (* or ?). | |
| accession_number | No | Filter by accession number. | |
| study_date | No | Filter by study date. YYYYMMDD for exact, YYYYMMDD-YYYYMMDD for range. | |
| modality | No | Filter by modality (CT, MR, US, XR, MG, etc.). | |
| study_description | No | Filter by study description (partial match). | |
| study_instance_uid | No | Filter by Study Instance UID. Required for SERIES level queries. | |
| limit | No | Maximum 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, }, }, }, ),