MCP server that turns any MCP-compatible client into an AI receptionist for a small clinic. Handles appointment logistics: booking, rescheduling, cancelling, patient registration, intake forms, reminders and clinic FAQs.
Strong tool naming (verb_noun pattern throughout) and comprehensive descriptions with context and examples. All 12 tools have clear, actionable docstrings (avg ~180 chars, within baseline 194). Input schemas present for all tools with type definitions. However, output schemas are not explicitly documented in the visible code, responses are shaped via helper functions (_slot_dict, _appointment_dict, etc.) but the LLM cannot see these contracts. Parameter descriptions are solid but some lack format constraints (e.g., date strings, ISO format). Error handling is minimal, no recovery guidance or categorization visible. Missing tool annotations (readOnlyHint, destructiveHint) despite clear risk classifications in the spec.
Add a new FAQ entry so clinic staff can grow the FAQ through the agent.
Search the clinic's FAQ for answers to common questions.
Book an appointment for a patient with a doctor at a specific time slot.
Cancel an existing appointment.
Find open appointment slots for a doctor, in clinic-local time. Always call this before book_appointment so you offer times that are genuinely free. Slots already in the past are excluded automatically. If the requested date has nothing open, `next_available` holds the next three openings after it, so you can offer an alternative instead of a dead end. Args: doctor_id: From list_doctors. date: Clinic-local 'YYYY-MM-DD'. Defaults to today. days_ahead: How many days to scan, starting at `date`. Use 7 for "sometime next week". Example: check_availability(doctor_id=1, date="2027-01-25", days_ahead=3)
Search patients by partial name or phone number. Use this before booking for someone who says they have been here before. When `count` is greater than 1, ask the caller which record is theirs — do not guess. Two people share a surname far more often than you would like, and booking the wrong record is worse than asking one extra question. A `count` of 0 means they are new: use register_patient. Example: find_patient(query="Shah") or find_patient(query="9876543210")
Output schemas not documented. Helper functions (_slot_dict, _appointment_dict, _patient_dict) shape responses, but LLMs cannot see the contract. Agents cannot plan downstream calls or extract fields reliably.
Write/reversible tools (book_appointment, reschedule_appointment, cancel_appointment, register_patient, submit_intake_form, add_faq, send_reminder) lack descriptions explaining state changes and confirmation requirements. Descriptions under 60 chars violate baseline (194 avg).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications in spec. Agents cannot distinguish safe reads from destructive writes without parsing descriptions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | <=2025-11-25 | v2 |
List appointments, filtered by any combination of patient, doctor, date and status. Use this to answer "when is my appointment?", to find the appointment_id needed by reschedule_appointment or cancel_appointment, or to review a doctor's day. With no filters it returns everything, so pass at least one for a busy clinic. Args: patient_id: From find_patient. doctor_id: From list_doctors. date: Clinic-local 'YYYY-MM-DD'. status: One of booked, rescheduled, cancelled, completed, no_show.
List the clinic's doctors with their specialty and usual weekly hours. Use this first when the caller does not name a doctor, or asks who they can see for a particular problem. The returned `doctor_id` is what check_availability and book_appointment expect. The `availability_summary` is the regular weekly pattern, not live openings — call check_availability for actual free slots. Example: list_doctors()
Create a new patient record. Use this when find_patient returns count=0.
Move an existing appointment to a different time slot.
Send a reminder notification for an appointment.
Submit a patient intake form for an appointment.
Error handling absent. No recovery guidance, categorization (retryable vs user-fixable), or actionable error messages visible. Agents cannot self-correct on failures.
Date/time format constraints not enforced in parameter descriptions. 'YYYY-MM-DD' and 'ISO format' mentioned in docstrings but not in schema descriptions. LLMs may pass invalid formats.