Model Context Protocol server for CharmHealth EHR system providing tools for patient management, appointments, clinical data, billing, referrals, and more
Two tools with moderately detailed parameter schemas and extended descriptions using inline documentation patterns. Tool naming is action-oriented (findPatients, manageAppointments). Descriptions are substantive (450-500 chars) with usecase/instructions sections. However, parameter descriptions are inconsistent in detail, output schemas are not explicitly documented, and error handling lacks recovery guidance. The server accepts parameters with no explicit type validation visible in source. Parameter dependencies (e.g., action determines required params) are documented inline but not enforced at schema level. No evidence of tool annotations (readOnlyHint, destructiveHint, idempotentHint) in the definition. The second tool (manageAppointments) has WRITE risk but no explicit confirmation or dry-run pattern.
Find patients. <usecase> Find patients quickly using natural search terms or specific criteria. Handles everything from "find John Smith" to complex searches like "elderly diabetes patients in California". Essential first step for any patient-related task. </usecase> <instructions> Quick searches: Use search_type="name" with query="John Smith" for basic name searches Phone lookups: Use search_type="phone" with query="555-1234" (handles any format) Medical record: Use search_type="record_id" with query="MR123456" Complex searches: Use search_type="advanced" with multiple criteria: - Age ranges: age_min=65, age_max=80 for elderly patients - Location: state="CA", city="Los Angeles" for geographic filtering - Medical: blood_group="O+", language="Spanish" for clinical needs Always returns patient_id needed for other tools. Start here before any patient operations. When required parameters are missing, ask the user to provide the specific values rather than proceeding with defaults or auto-generated values. </instructions>
Manage appointments. <usecase> Complete appointment lifecycle management - schedule new appointments, reschedule existing ones, cancel appointments, and list appointments with flexible filtering. Handles the full appointment workflow. </usecase> <instructions> Actions: - "schedule": Create new appointment (requires patient_id, provider_id, facility_id, appointment_date, appointment_time). Check the provider's availability with manageAppointments(action='list') and provider_id, and across all facilities for the provider before suggesting a time. - "reschedule": Change existing appointment time (requires appointment_id + new scheduling details) - "cancel": Cancel appointment (requires appointment_id + cancel_reason) - "list": Show appointments with filtering (requires start_date, end_date_range, facility_ids; optionally filter by status/provider/mode) Time format: Use 12-hour format like "09:30 AM" or "02:15 PM" For recurring: Set repetition to "Weekly" or "Daily" and provide frequency + end_date For double booking: Use provider_double_booking="allow" or resource_double_booking="allow" to override checks For cancellation: Use delete_type "Current" for single appointment or "Entire" for recurring series List filters (applied after fetching all appointments in the date range): - status_filter: e.g., status_filter="Confirmed" - provider_filter: provider_id or provider_name substring (e.g., provider_filter="12345" or provider_filter="Smith") - mode_filter: e.g., mode_filter="Video Consult" - limit: e.g., limit=25 When required parameters are missing, ask the user to provide the specific values rather than proceeding with defaults or auto-generated values. </instructions>
Missing output/response schemas. Tools define detailed input parameters but provide no documented structure for return values. LLMs cannot predict what fields to extract or plan downstream chains without seeing response schemas.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). manageAppointments is marked WRITE risk but lacks annotations to signal destructive actions (cancel, reschedule) to the agent. This prevents agents from understanding retry safety and confirmation requirements.
Parameter dependencies documented informally in description text only. manageAppointments requires different parameter sets depending on 'action' (schedule vs cancel vs list), but schema does not declare conditional requirements. LLMs may pass wrong params and hit runtime errors.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 64 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 14 | - | v1 |
No explicit error handling or recovery guidance in descriptions. Error responses are not documented. LLMs will not know how to interpret failures (e.g., 'provider not available' → retry vs ask user) or what corrective action to take.
Inconsistent parameter descriptions. Some params (e.g., query, search_type) have detailed guidance; others (e.g., postal_code, receipt_id) have trivial descriptions (2-4 words). Baseline: 100% of A+ tools have ≥50-char descriptions per param.
No confirmation/dry-run pattern for destructive operations. manageAppointments cancel and reschedule actions modify patient state but lack a safety mechanism (e.g., dry_run=true or require_confirmation=true) to prevent accidental execution.
Pagination support is incomplete. findPatients accepts 'limit' and 'page' but does not document total_count or next_cursor in response, and response structure is not shown. Large result sets risk context window overflow without explicit pagination behavior.