Xona Dental Gateway
Server Details
Find Canadian dentists; send an appointment request or book with a connected practice.
- Status
- Healthy
- Uptime
- 100.0% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 20 tools
The set has two parallel booking paths (xona_* vs public_*), producing near-twin tools like list_xona_booking_slots/list_public_booking_slots and list_xona_booking_services/list_public_booking_services, plus several confirm/status tools (confirm_xona_booking, confirm_dental_request, get_dental_action_status). Descriptions do a decent job disambiguating via routing keys (completes_in_conversation, public_provider_booking), but the overlapping pairs and multi-step booking flows still invite misselection.
Every tool follows a consistent snake_case verb_noun pattern (list_*, get_*, confirm_*, start_*, hold_*, change_*, search_*), with predictable resource sub-naming like xona_/public_/dental_ prefixes. No camelCase or mixed conventions appear.
At 20 tools the surface is on the heavy side, but each tool maps to a distinct step (directory search, service/slot discovery, hold, book, confirm, abandon, reschedule, patient access). The near-duplicate xona/public pairs add bulk that could potentially be consolidated.
The lifecycle is broadly covered: discovery (search/get/answers), services and slots, hold/book/confirm/abandon, request flow, reschedule/change, and patient appointment access. Minor gaps remain (e.g. no standalone cancel of a booked appointment, limited explicit error/status surfaces), but core workflows are closed.
Available Tools
20 toolsabandon_xona_bookingGive up a booking that is not booked yetAIdempotentInspect
Release the held time and drop the patient's details when the patient no longer wants it, at any step before it is booked. It never cancels a booked appointment. Calling again returns the same result.
| Name | Required | Description | Default |
|---|---|---|---|
| action_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| outcome | Yes | |
| practice | Yes | |
| action_id | Yes | |
| next_step | Yes | |
| booking_url | No | |
| continue_url | No | |
| booking_steps | No | |
| consent_version | No | |
| link_expires_at | No | |
| confirmation_sms | No | |
| appointment_start | No | |
| appointment_start_local | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral detail beyond the annotations: it reveals that the tool releases a hold and drops patient details, and that it is safe to call repeatedly ('Calling again returns the same result'), which enriches the idempotentHint annotation. It also clarifies scope with 'never cancels a booked appointment', aligning with destructiveHint false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no filler. The primary action and scope are front-loaded, the exclusion is stated clearly, and the idempotency note is concise. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema and idempotency annotation, the description covers the main behavior, scope, and repeated-call behavior. However, it leaves out the crucial meaning of action_id and does not say it should be the identifier returned by a prior hold action, which an agent needs to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has a single required parameter, action_id, with 0% schema description coverage. The description never explains what action_id refers to, how to obtain it, or what format is expected beyond the schema constraints. Since the schema coverage is low, the description was responsible for compensating and it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs ('Release', 'drop') tied to a clear resource ('the held time', 'the patient's details') and states exactly when it applies ('at any step before it is booked'). It also distinguishes itself from cancellation by explicitly saying 'It never cancels a booked appointment', separating it from any cancellation sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when to use the tool: when the patient no longer wants the held time before it is booked. It also provides a strong exclusion: it is not for booked appointments. It does not name an explicit alternative tool, but the context and exclusion are enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
answer_dental_practice_questionAnswer from dental practice evidenceARead-onlyIdempotentInspect
Answer a bounded factual question from the selected practices' evidence. Unknown is returned explicitly; missing data is never inferred as no.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| practice_slugs | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| answers | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint, covering safety. The description adds valuable behavioral context: 'Unknown is returned explicitly; missing data is never inferred as no.' This clarifies handling of missing data, which is not in annotations, so it adds real value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The main purpose is front-loaded, and the behavioral caveat follows. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the input schema defines the topic enum, the description is fairly complete. It explains the unknown-handling behavior but does not elaborate on practice_slugs or topic categories, though those are largely covered by the schema. Minor gap on usage guidance, but not critical for a read-only QA tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% – the description does not mention the two parameters at all. The topic parameter has an enum but no descriptions, and practice_slugs is self-explanatory, yet the description provides no guidance on how to populate them. Since coverage is low, the description should compensate but only weakly implies a bounded question set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource: 'Answer a bounded factual question from the selected practices' evidence.' It differentiates from siblings like search_canadian_dentists and get_canadian_dental_practice by focusing on evidence-based QA. Not a tautology and not vague.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (answering factual questions about selected practices) but gives no explicit alternatives or exclusions. Among many booking/action siblings, this tool is clearly distinct, but the description does not name them or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
change_xona_appointmentAsk to move or cancel an appointmentAInspect
Move or cancel one of the patient's appointments. Xona texts the patient a link to a page that shows the exact change. When they press its button (or type the code from the text on book.xonark.com/code) the practice's schedule changes, or, at a practice that confirms changes itself, the practice receives the request. Calling again with the same arguments returns the result, read live from the practice's schedule.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | For a reschedule: the new time's date exactly as list_xona_reschedule_times returned it | |
| kind | Yes | ||
| action_id | Yes | ||
| appointment_ref | Yes | ||
| slot_fingerprint | No | For a reschedule: the new time's slot_fingerprint from list_xona_reschedule_times |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | |
| state | Yes | |
| practice | Yes | |
| action_id | Yes | |
| next_step | Yes | |
| appointment_ref | Yes | |
| link_expires_at | No | |
| requested_start_local | No | |
| appointment_start_local | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations state the safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=false), and the description adds real context beyond them: the change is asynchronous and patient-mediated (a texted link/button or code), the practice either updates automatically or receives a request, and re-calling returns a live result. That retry/status behavior also explains the non-idempotent annotation. Only auth/permission and failure behavior are left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the purpose and then the behavioral details, with essentially no filler. It is slightly dense but every sentence carries information an agent needs about how the change actually happens.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers the async, patient-driven workflow well for a genuinely complex tool. The gaps are the missing origin/prerequisites for action_id and any failure handling, which keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40% (date and slot_fingerprint are documented, with helpful cross-references to list_xona_reschedule_times), yet the description itself says nothing about any parameter. With three parameters (kind, action_id, appointment_ref) undocumented in both places, the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb pair and resource: 'Move or cancel one of the patient's appointments,' which maps cleanly to the cancel/reschedule enum. It is clear enough to act on, but it does not explicitly distinguish itself from adjacent siblings such as list_xona_reschedule_times or the booking-confirmation tools, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose (use it when a patient wants an appointment moved or cancelled) and the description sketches the downstream flow, but it never states prerequisites (e.g., where action_id/appointment_ref come from) or when to prefer a sibling tool. There is no explicit when/when-not guidance, so this is minimum-viable rather than strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
choose_public_booking_timeChoose a time to book at a clinicAInspect
For a public_provider_booking action: keeps one time from list_public_booking_slots (or a soonest search row's earliest) and returns continue_url, Xona's page where the patient enters their own details and presses Book. Xona then books that time in the clinic's own scheduler. It takes the action and the time (service_id, slot_id, starts_at) only, reads that time again and keeps it only if it is still open; the page collects the patient's details.
| Name | Required | Description | Default |
|---|---|---|---|
| slot_id | Yes | The chosen time's id from list_public_booking_slots (slot_id on a soonest row's earliest). | |
| action_id | Yes | ||
| starts_at | Yes | The chosen time's starts_at, exactly as returned. | |
| service_id | Yes | The chosen time's service_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| booking | Yes | |
| next_step | Yes | |
| continue_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotentHint=false), and the description adds genuinely useful behavior beyond that: it re-reads the slot and keeps it only if still open, and it discloses that Xona performs the actual booking while the patient enters details on the returned page. This is the kind of state/flow detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two long, clause-heavy sentences that are front-loaded with the flow but include redundancy ('the page collects the patient's details' is stated twice in substance) and a run-on structure that slows parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a step in a multi-tool booking workflow with an output schema present, the description covers the key context: input source, re-validation behavior, and what continue_url is for. Return-value details are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so most parameters are already documented, but the description adds meaning by grouping service_id/slot_id/starts_at as 'the time' and including action_id in the call shape, plus stressing starts_at must match the returned value exactly. It adds value over the schema without fully substituting for the undocumented action_id semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (keeps a chosen time) and resource (a public booking slot), and explicitly frames it as the step following list_public_booking_slots. It distinguishes itself from that sibling by noting it selects rather than lists, though the phrasing is dense enough that the core action takes a second read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly scopes usage to a 'public_provider_booking action' and names the upstream source of the time (list_public_booking_slots or a soonest search row's earliest). No explicit when-not or exclusions are given, but the sequencing context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_dental_requestSend a dental appointment requestAIdempotentInspect
Send the started request to the clinic. It takes the 6-digit code Xona emailed the patient and the consent_version of the consent_text the patient agreed to. The outcome is a delivered, held or failed request, never a confirmed booking. Calling again with the same action_id returns the same outcome.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| action_id | Yes | ||
| consent_version | Yes | ||
| preferred_window | Yes | When the patient is free, in their words | |
| service_category | Yes | ||
| verification_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| outcome | Yes | |
| next_step | Yes | |
| receipt_url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety and idempotency, but the description adds substantive context beyond them: the outcome is delivered/held/failed rather than a confirmed booking, and the consent_version/verification_code inputs encode an authorization step. The idempotency sentence largely restates idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and the outcome disclaimer before the retry rule. Only the final idempotency sentence is arguably redundant with the annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need minimal explanation, yet the description still summarizes the possible outcomes usefully. The main gap is not stating where action_id comes from (presumably start_dental_request), which an agent must infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17%, so the description must carry the load. It explains verification_code ('the 6-digit code Xona emailed the patient') and consent_version ('the consent_text the patient agreed to'), but action_id, service_category, and note are left undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (send) and resource (the started dental request to the clinic), and the phrase 'the started request' implies it operates on something created by start_dental_request, distinguishing it from that sibling. It is clear, though it does not name the sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'the started request' (i.e., call this after start_dental_request has produced an action_id), and the retry rule is stated. However, no alternative tool is named and there is no explicit when-not guidance versus confirm_xona_booking or hold_xona_booking_slot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_xona_bookingGet the booking's resultAIdempotentInspect
Get the result once the patient has tapped the text link and pressed Book this appointment. Until then it returns waiting_for_patient. Xona finds an existing patient itself; when it cannot tell, it returns the practice's booking page instead of guessing. If the booking stopped before it was written, the first call tries it once more. Calling again returns the same outcome.
| Name | Required | Description | Default |
|---|---|---|---|
| action_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| outcome | Yes | |
| practice | Yes | |
| action_id | Yes | |
| next_step | Yes | |
| booking_url | No | |
| continue_url | No | |
| booking_steps | No | |
| consent_version | No | |
| link_expires_at | No | |
| confirmation_sms | No | |
| appointment_start | No | |
| appointment_start_local | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: it explains the waiting_for_patient interim state, the fallback to the practice booking page when Xona cannot identify the patient, a one-time retry if the booking stopped before it was written, and idempotent repeated calls. These details are directly relevant to safely interpreting and retrying the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four focused sentences, front-loaded with the core action and followed by relevant edge-case behavior. It is informative without padding, though slightly long for a one-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed, and the description covers important behavioral edge cases well. However, for a required action_id with no schema description and no mention in the description, the definition is incomplete on how to supply or obtain that parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required action_id parameter with 0% schema description coverage, and the description never mentions it or explains its origin, format, or relationship to the booking. The parameter semantics are left entirely to the caller's inference from the parameter name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets the booking result and gives the triggering condition: the patient has tapped the text link and pressed Book this appointment. It distinguishes itself from generic status tools by focusing on the final booking outcome, but it does not explicitly name or rule out siblings like get_dental_action_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear condition for calling: after the patient acts, and notes that until then it returns waiting_for_patient. It does not state when not to use it or name alternatives such as get_dental_action_status, so it falls just short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_canadian_dental_practiceGet a Canadian dental practiceARead-onlyIdempotentInspect
Get one public dental practice profile, fact evidence, citations, and current public actions.
| Name | Required | Description | Default |
|---|---|---|---|
| practice_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| actions | Yes | |
| practice | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds that it returns fact evidence, citations, and current public actions, which is useful behavioral context beyond the annotations. No contradiction found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence that front-loads the core action ('Get one public dental practice profile') and then lists the included components. No unnecessary words; structure is optimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter, the presence of an output schema, and annotations that cover safety, the description provides adequate context. It enumerates the return content (profile, evidence, citations, actions) and implies the identifier. It does not explain error handling, but for a simple get operation with schema available, this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explicitly mention practice_slug. However, the single parameter is clearly the identifier implied by 'Get one public dental practice profile.' The description adds no explicit parameter guidance, but the parameter's purpose is self-evident from its name and the tool's purpose, so it is marginally sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'Get' with a resource 'public dental practice profile' and enumerates the content (fact evidence, citations, current public actions). This clearly distinguishes from sibling tools like search_canadian_dentists (search) and list_dental_practice_actions (list actions), so an agent knows exactly what this tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a single practice by slug, but does not explicitly state when to use it versus alternatives like search or list tools. It lacks exclusions or conditions, so an agent must infer from context. This is adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dental_action_statusGet dental action statusBRead-onlyIdempotentInspect
Read the exact outcome of an expiring dental action. Handoff, request, and confirmed booking outcomes remain distinct.
| Name | Required | Description | Default |
|---|---|---|---|
| action_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful behavioral nuance ('exact outcome', distinct outcome categories), but does not elaborate on lifecycle behavior or failure cases. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the primary verb and resource. Every phrase adds value, especially the second sentence clarifying that outcome types remain distinct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, read-only, idempotent tool with an output schema and strong annotations, the description is mostly complete. It could better define 'expiring dental action' or explicitly state that it applies only to such actions, but an agent can likely proceed with minimal ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to compensate by explaining action_id and how it relates to the outcome. It does not mention the parameter at all; only the schema's name and length constraints provide any meaning, leaving the parameter semantics mostly implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific verb ('Read') and resource ('outcome of an expiring dental action'), and adds useful scope by saying handoff, request, and confirmed booking outcomes remain distinct. It does not explicitly name a sibling alternative, but the purpose is unambiguous among the listed siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when the exact outcome of an expiring dental action is needed. However, it gives no explicit when-not-to-use guidance or alternatives, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hold_xona_booking_slotHold an open time and text the patient a linkBInspect
Hold one open time and text the patient a link to it. The page the link opens shows the time and the details above a Book this appointment button. When the patient presses it the appointment is booked, or, at a practice that confirms bookings itself, sent to the practice as a request.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The chosen slot's date exactly as list_xona_booking_slots returned it | |
| note | No | ||
| last_name | Yes | The patient's last name, as the patient gave it in this conversation | |
| first_name | Yes | The patient's first name, as the patient gave it in this conversation | |
| service_id | Yes | ||
| date_of_birth | Yes | The patient's date of birth, as the patient gave it in this conversation | |
| guardian_name | No | Required when the patient is under 16 | |
| patient_phone | Yes | The patient's own Canadian or US mobile number, as the patient gave it in this conversation; the booking link is texted there | |
| practice_slug | Yes | ||
| slot_fingerprint | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| outcome | No | |
| practice | Yes | |
| action_id | Yes | |
| next_step | Yes | |
| booking_url | No | |
| continue_url | No | |
| verification | No | |
| booking_steps | No | |
| hold_expires_at | No | |
| link_expires_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: it texts the patient, opens a page with a Book this appointment button, and either books directly or sends a request depending on the practice. It does not mention hold expiry, idempotency, or auth requirements, but the annotations already cover basic read/write and destructive hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and uses three sentences without obvious repetition. The middle sentence about the link page is somewhat detailed but useful for understanding the downstream flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with an output schema and 60% schema coverage, the description covers the patient-facing flow well but omits prerequisites, parameter sourcing, and operational constraints like hold expiry or idempotency. It is minimally adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 60%, with several important parameters such as service_id, practice_slug, slot_fingerprint, and note lacking schema descriptions. The tool description adds no parameter-level meaning at all, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: hold one open time and text the patient a link. It clearly implies a pre-booking hold step, but it does not explicitly distinguish itself from siblings such as confirm_xona_booking or abandon_xona_booking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what happens after the patient receives the link, but gives no explicit guidance on when to call this tool versus list_xona_booking_slots, confirm_xona_booking, or abandon_xona_booking. It also does not state prerequisites such as needing a slot_fingerprint from a prior list operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dental_practice_actionsList dental practice actionsARead-onlyIdempotentInspect
List current public booking, request, form, call, and website actions for a dental practice in preference order.
| Name | Required | Description | Default |
|---|---|---|---|
| practice_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| actions | Yes | |
| practice_slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds no extra behavioral context such as authentication needs, rate limits, or data freshness guarantees beyond the word 'current'. It does not contradict annotations, but it adds minimal value over the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the action ('List') and then specifies the resource and ordering. Every word contributes to understanding the tool's purpose. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is an output schema, return values are covered. The description states what is listed and the ordering, which is useful. However, it lacks any usage context, prerequisites (e.g., a valid practice_slug), or alternative guidance. For a simple list operation, the absence of these details is acceptable, but the parameter explanation gap makes it incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the sole parameter, practice_slug. However, the description does not mention or explain this parameter at all. While the parameter name is self-explanatory, there is no guidance on how to obtain or format the slug, nor any indication of required format beyond the schema constraints. The description fails to compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('List') and resource ('current public booking, request, form, call, and website actions for a dental practice'). It enumerates the action types and specifies the ordering ('preference order'), making it distinct from siblings that focus on services or slots. An agent can easily tell this from list_public_booking_services or list_xona_booking_slots.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly mention when to use this tool versus alternatives or provide exclusions. The purpose itself implies usage for listing actions, but no alternatives are named or conditions given. An agent must infer from the resource type, which is adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_public_booking_servicesList a clinic's public booking servicesRead-onlyIdempotentInspect
Read the services a clinic's own online scheduler offers, by practice_slug: a clinic whose search row is live_schedule, or whose action option has reads_times. The answer carries booking_url, the page where the patient books this clinic; a clinic whose scheduler can't be read answers readable false with that booking_url. Provider locators remain server-owned.
| Name | Required | Description | Default |
|---|---|---|---|
| practice_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| readable | Yes | |
| services | Yes | |
| use_tool | No | |
| next_step | Yes | |
| booking_url | No | |
| practice_slug | Yes |
list_public_booking_slotsList a clinic's public booking slotsRead-onlyIdempotentInspect
Read open times from a clinic's own online scheduler, by practice_slug, for one service_id between date_from and date_to (the clinic's dates, both included, at most 14 days). Each time carries starts_at, start_local (the time at the clinic), time_zone and booking_url, the page where the patient books that time (Xona's page on that service and day where Xona books the clinic's scheduler, else the clinic's own booking page); earliest is the first one; preferred_time puts the closest times first.
| Name | Required | Description | Default |
|---|---|---|---|
| date_to | Yes | Last day to read (inclusive), at most 13 days after date_from | |
| date_from | Yes | First day to read, in the clinic's time zone; today or later | |
| service_id | Yes | A service_id from list_public_booking_services, or from a soonest search row's services | |
| practice_slug | Yes | ||
| preferred_time | No | The patient's preferred local start time, 24-hour HH:MM; the closest times come first |
Output Schema
| Name | Required | Description |
|---|---|---|
| slots | Yes | |
| date_to | No | |
| earliest | No | |
| readable | Yes | |
| use_tool | No | |
| date_from | No | |
| next_step | Yes | |
| time_zone | No | |
| service_id | No | |
| booking_url | No | |
| practice_slug | Yes |
list_xona_appointmentsList the patient's upcoming appointmentsARead-onlyIdempotentInspect
Read the named patient's upcoming appointments at the practice, live from its schedule, after the patient tapped the text link. Works with the action_id of a booking made in this conversation (for 30 minutes after the tap, and for that appointment until its day) or of start_xona_appointment_access. Before the tap it says it is still waiting.
| Name | Required | Description | Default |
|---|---|---|---|
| action_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| changes | No | |
| practice | Yes | |
| action_id | Yes | |
| next_step | Yes | |
| time_zone | No | |
| appointments | No | |
| booked_until | No | |
| pending_requests | No | |
| access_expires_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering safety. The description adds valuable behavioral context beyond that: it is live from the schedule, has temporal validity (30 minutes after tap, and for the appointment until its day), and returns a waiting state if called before the tap. These details are not derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no fluff. It front-loads the core purpose ('Read the named patient's upcoming appointments...') followed by necessary context about the action_id and the waiting behavior. Every sentence earns its place, and the structure is logical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values are covered externally. The description covers the tool's purpose, input semantics, temporal constraints, and the waiting state, making it complete for an agent to decide when and how to call it. No critical information appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description explains that action_id must come from a booking made in this conversation or from start_xona_appointment_access. It also clarifies the context of the patient tapping the text link. This adds meaning beyond the schema's minimal type/length constraints, although it does not describe the exact format or value pattern beyond its origin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Read the named patient's upcoming appointments at the practice, live from its schedule.' It specifies the resource (appointments), the scope (named patient), and the source (live schedule). It also differentiates from siblings by mentioning the specific trigger condition ('after the patient tapped the text link') and the required action_id types, which are unique to this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context for when to use the tool: it works with the action_id of a booking made in this conversation (with time constraints) or of start_xona_appointment_access. It also warns that before the tap, the tool reports a waiting state, implying it should not be called prematurely. However, it does not explicitly mention alternative tools or state when not to use this tool, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xona_booking_servicesList a connected practice's booking servicesARead-onlyIdempotentInspect
List the services a practice that connected its schedule to Xona books online. Use it where list_dental_practice_actions marks the Xona booking route as completes_in_conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| practice_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| practice | Yes | |
| services | Yes | |
| next_step | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is established. The description adds useful behavioral context by defining a precondition: the practice must have connected its schedule to Xona, and the tool is tied to a specific route state from list_dental_practice_actions. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It fronts the core action and resource, then adds the precise triggering condition, making it immediately scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only list tool with an output schema and strong annotations, the description provides the essential trigger context and scope. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but there is only one parameter, practice_slug, whose meaning is implied by the title and description referencing 'a practice'. The description does not explicitly document the slug format or that it identifies the connected practice, so it provides only minimal compensation for the missing schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a specific resource ('the services a practice that connected its schedule to Xona books online'), and it distinguishes this tool from the sibling list_public_booking_services by scoping to connected practices. The title reinforces the same distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger: use this tool where list_dental_practice_actions marks the Xona booking route as completes_in_conversation. It does not explicitly name alternatives or exclusions, so it stops just short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xona_booking_slotsList a connected practice's open timesARead-onlyIdempotentInspect
List open times at a connected practice for one service between date_from and date_to (inclusive, at most 8 weeks out). Returns the closest ten to preferred_time (else a balanced spread) plus the earliest open time, with a reason when empty. Each slot has a slot_fingerprint and date for hold_xona_booking_slot.
| Name | Required | Description | Default |
|---|---|---|---|
| date_to | Yes | Last day to search (inclusive); at most 56 days after date_from and 8 weeks from today | |
| date_from | Yes | First day to search, in the practice's time zone | |
| doctor_id | No | Restrict to one provider, using a doctor_id a previous slot listing returned | |
| service_id | Yes | ||
| practice_slug | Yes | ||
| preferred_time | No | The patient's preferred local start time, 24-hour HH:MM; slots closest to it come first |
Output Schema
| Name | Required | Description |
|---|---|---|
| slots | Yes | |
| reason | No | |
| earliest | No | |
| practice | Yes | |
| next_step | Yes | |
| time_zone | Yes | |
| service_id | Yes | |
| booking_url | No | |
| effective_to | Yes | |
| instructions | No | |
| effective_from | Yes | |
| date_correction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real behavioral detail beyond that: how results are ranked (closest ten to preferred_time, else balanced spread, plus earliest open time) and that an empty result carries a reason.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what the tool returns and immediately followed by the range constraint and the handoff token (slot_fingerprint). Dense but every clause carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description usefully signals ranking behavior and the empty-case reason. Combined with annotation coverage of the safety profile, an agent has enough to call this correctly; the only gap is guidance on choosing it over the public slot listing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so the schema already documents date_to, date_from, doctor_id and preferred_time in detail. The description reinforces the date semantics ('inclusive, at most 8 weeks out') but says nothing about practice_slug, service_id or doctor_id, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List open times at a connected practice for one service') with an explicit date-range scope, which separates it from the service-listing and public-slot siblings. It stops short of naming an alternative tool the way a 5 would.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives boundary conditions (inclusive range, at most 8 weeks out, at most 56 days) and forward-routes to hold_xona_booking_slot, so usage is implied and partially guided. There is no explicit 'use this instead of list_public_booking_slots when...' statement, leaving the connected-vs-public choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_xona_reschedule_timesList times an appointment can move toARead-onlyIdempotentInspect
List open times one of the patient's appointments can move to, for its own service and provider, between date_from and date_to. appointment_ref comes from list_xona_appointments.
| Name | Required | Description | Default |
|---|---|---|---|
| date_to | Yes | Last day to search (inclusive); at most 56 days after date_from and 8 weeks from today | |
| action_id | Yes | ||
| date_from | Yes | First day to search, in the practice's time zone | |
| appointment_ref | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| slots | Yes | |
| practice | Yes | |
| action_id | Yes | |
| next_step | Yes | |
| time_zone | Yes | |
| appointment_ref | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/idempotentHint already declaring the safe-read profile, the description adds real behavioral context: results are restricted to the appointment's own service and provider, and the range is bounded by date_from/date_to. It omits pagination/result-size behavior, but the output schema covers return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and scope, followed by the one piece of provenance an agent needs. No filler or restated schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with an output schema, the description supplies the essential scoping rule, the date-range bound, and the source of appointment_ref; return values need not be explained. Only action_id is left implicit, a minor omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: date_from/date_to are already documented in the schema, and the description only re-frames them as a range. It does add provenance for appointment_ref, but the required action_id parameter remains unexplained in both schema and description, which is a meaningful gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus precise resource (open times an appointment can move to), with the scoping rule 'for its own service and provider' that separates it from generic slot-listing siblings like list_xona_booking_slots. An agent can tell what it returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use (finding reschedule options for an existing appointment) and even states where appointment_ref comes from (list_xona_appointments). It does not, however, name a contrasting sibling such as list_xona_booking_slots for brand-new bookings, nor state prerequisites about appointment status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_dental_practice_actionOpen one of a clinic's booking routesInspect
Creates a short-lived action for one capability the clinic's action options list (its scheduler page, a Xona request, a request form, a call or its website) and returns the URL of the page for it. A capability the clinic does not list is refused. A connected practice's time from list_xona_booking_slots is held with hold_xona_booking_slot, not through this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| capability | Yes | ||
| practice_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| next_step | Yes | |
| manual_review_required | Yes | |
| conversational_next_tool | No |
search_canadian_dentistsSearch Canadian dentistsRead-onlyIdempotentInspect
Search evidence-backed public profiles in the Canadian dental directory by name or place, and filter by a service, a language, published weekend or evening hours, a booking route you can use now, and a payment plan the clinic says it accepts (the Canadian Dental Care Plan). Each row says which published fact matched and when it was read. A search with order=soonest, the patient's postal code or city and the service returns live rows that already carry each clinic's earliest time, its services and booking_url, the page where the patient books that time; opening it starts the booking there, with no call in the conversation. The tool a row's next_step names reads more times. No login or clinic membership is required.
| Name | Required | Description | Default |
|---|---|---|---|
| open | No | Published hours: open that day, or closing at/after 18:00 on some day | |
| page | No | Page of results, from 1; each page holds limit rows | |
| limit | No | ||
| order | No | route (default) orders by booking route; soonest orders one place's practices by when they can be seen, and needs that place: its locality (and province when the name is in more than one), or a postal_code such as M5V or M5V 1B3. Practices whose live schedule Xona reads come first, each page's read now and ordered by their earliest open time for the search's service (cleaning, exam or emergency; cleaning when none is given), then open now, then by when each opens by its own website's hours. Each row then carries when: state (live_schedule, open_now, opens_today, opens_later, unknown), text, time_zone and, for live_schedule, next_step naming the tools that read more times. Every row carries booking_url, the page where the patient books that clinic. A live row the search read also carries earliest (the time, its service_id, start_local, the id that books it and its own booking_url; [] when none in the next 7 days), services (the clinic's own list) and read (outcome time, none or not_read). live_unread counts the live clinics on later pages. Opening hours are not appointment times. | |
| query | No | ||
| booking | No | A route the agent can use now: the clinic's online booking page, its request form, an appointment request Xona delivers, a phone number, or any of these | |
| service | No | A service the clinic's own site lists: cleaning, implants, invisalign, emergency, kids, root canal, whitening … | |
| coverage | No | A payment plan the clinic says it accepts, on its own website or in a correction its owner made: cdcp is the Canadian Dental Care Plan. Each row quotes the clinic's own words and the day they were read | |
| language | No | A language the clinic's own site lists | |
| locality | No | ||
| province | No | ||
| postal_code | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| results | Yes | |
| next_step | No | |
| projection | No | |
| live_unread | No |
start_dental_requestStart a dental appointment requestAInspect
Start an appointment request that Xona sends to the selected clinic (by email, or through the clinic's own website form), without leaving the conversation. Xona first emails the patient a code that confirms their address; confirm_dental_request then sends the request. Use it where list_dental_practice_actions marks xona_email_appointment_request as completes_in_conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| patient_name | Yes | The patient's name as they typed it | |
| patient_email | Yes | The patient's own email; the code goes there | |
| practice_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| practice | Yes | |
| next_step | Yes | |
| consent_text | Yes | |
| verification | Yes | |
| consent_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is not read-only, not destructive, not idempotent and closed-world, so the safety profile is already covered. The description adds genuinely new behavior: a verification code is emailed to the patient first and the request is only sent after confirmation, and the request may go out by email or the clinic's web form. It stops short of stating failure modes (e.g., invalid code, repeat invocation).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler, front-loading what the tool does before the two-step flow and the routing condition. The parenthetical delivery detail is somewhat heavy but earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. For a non-idempotent mutation that triggers email sends, the description covers the side-effect sequence and the routing rule well; only edge-case behavior and re-invocation semantics are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so most parameters are already documented; the description reinforces that patient_email is where the code goes and implies practice_slug is 'the selected clinic'. It adds no format or constraint detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start an appointment request') and clarifies the delivery mechanism (email or the clinic's own website form). It also distinguishes itself from the sibling confirm_dental_request by describing the two-step flow, so an agent can tell the two apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit activation condition ('Use it where list_dental_practice_actions marks xona_email_appointment_request as completes_in_conversation') and names the follow-up tool confirm_dental_request. The when-to-use rule and the next step are both stated rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_xona_appointment_accessText the patient a link to show their appointmentsAInspect
Text a patient one link to see, move or cancel the appointments they already have at a practice connected to Xona, for a conversation with no booking action_id that still works. If the mobile number, name and date of birth match a patient there, Xona texts them the link; after they tap it and press Show my appointments, list_xona_appointments reads their appointments. The answer is the same whether or not the details match.
| Name | Required | Description | Default |
|---|---|---|---|
| last_name | Yes | ||
| first_name | Yes | ||
| date_of_birth | Yes | ||
| patient_phone | Yes | The patient's own Canadian or US mobile number, as the practice has it on file | |
| practice_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| practice | Yes | |
| action_id | Yes | |
| next_step | Yes | |
| link_expires_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so the description earns credit by adding real behavior: the SMS delivery, the identity-match requirement, and the enumeration-safety disclosure that 'the answer is the same whether or not the details match.' It could go further on error/rate-limit behavior, but the match-invariance note is genuinely useful beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the first sentence is tangled ('for a conversation with no booking action_id that still works') and the valuable enumeration-safety point is buried at the end. Roughly the right length, but not optimally structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations cover the safety profile. The description supplies the matching logic, the SMS flow, and the match-invariance behavior, leaving only minor gaps like practice_slug meaning and failure modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% (only patient_phone is documented), so the description carries more burden. It does map the matching inputs ('the mobile number, name and date of birth') to parameters and implies all must match, but practice_slug is never explained and format expectations aren't clarified. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource ('Text a patient one link to see, move or cancel the appointments they already have') and names the sibling it hands off to (list_xona_appointments). An agent can identify this as the SMS-link entry point distinct from list/change tools. The phrase 'for a conversation with no booking action_id that still works' is murky, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear triggering condition ('a conversation with no booking action_id') and describes the downstream sequence (patient taps link, presses Show my appointments, then list_xona_appointments reads). It does not state when NOT to use it versus siblings, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Changed
list_public_booking_services1 field changed- added
Output schema / properties / booking_urlAdded value: +{ + "type": "string" +}
- Changed
list_public_booking_slots3 fields changed- added
Output schema / properties / booking_urlAdded value: +{ + "type": "string" +} - added
Output schema / properties / earliest / properties / booking_urlAdded value: +{ + "type": "string" +} - added
Output schema / properties / slots / items / properties / booking_urlAdded value: +{ + "type": "string" +}
- Changed
search_canadian_dentists1 field changed- changed
Input schema / properties / order / descriptionPrevious value: -"route (default) orders by booking route; soonest orders one place's practices by when they can be seen, and needs that place: its locality (and province when the name is in more than one), or a postal_code such as M5V or M5V 1B3. Practices whose live schedule Xona reads come first, each page's read now and ordered by their earliest open time for the search's service (cleaning, exam or emergency; cleaning when none is given), then open now, then by when each opens by its own website's hours. Each row then carries when: state (live_schedule, open_now, opens_today, opens_later, unknown), text, time_zone and, for live_schedule, next_step naming the tools that read more times and book one. A live row the search read also carries earliest (the time, its service_id, start_local and the id that books it; [] when none in the next 7 days), services (the clinic's own list) and read (outcome time, none or not_read). live_unread counts the live clinics on later pages. Opening hours are not appointment times."New value: +"route (default) orders by booking route; soonest orders one place's practices by when they can be seen, and needs that place: its locality (and province when the name is in more than one), or a postal_code such as M5V or M5V 1B3. Practices whose live schedule Xona reads come first, each page's read now and ordered by their earliest open time for the search's service (cleaning, exam or emergency; cleaning when none is given), then open now, then by when each opens by its own website's hours. Each row then carries when: state (live_schedule, open_now, opens_today, opens_later, unknown), text, time_zone and, for live_schedule, next_step naming the tools that read more times. Every row carries booking_url, the page where the patient books that clinic. A live row the search read also carries earliest (the time, its service_id, start_local, the id that books it and its own booking_url; [] when none in the next 7 days), services (the clinic's own list) and read (outcome time, none or not_read). live_unread counts the live clinics on later pages. Opening hours are not appointment times."
4 tool updates
- Changed
choose_public_booking_time5 fields changed- added
Input schema / properties / service_idAdded value: +{ + "description": "The chosen time's service_id.", + "maxLength": 160, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / slot_id / descriptionPrevious value: -"The id of one time from this action's latest list_public_booking_slots result."New value: +"The chosen time's id from list_public_booking_slots (slot_id on a soonest row's earliest)." - changed
Input schema / properties / slot_id / maxLengthPrevious value: -160New value: +256 - added
Input schema / properties / starts_atAdded value: +{ + "description": "The chosen time's starts_at, exactly as returned.", + "format": "date-time", + "maxLength": 64, + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "action_id", - "slot_id" -]New value: +[ + "action_id", + "service_id", + "slot_id", + "starts_at" +]
- Changed
list_public_booking_services8 fields changed- removed
Input schema / properties / action_idRemoved value: -{ - "maxLength": 128, - "minLength": 16, - "type": "string" -} - added
Input schema / properties / practice_slugAdded value: +{ + "maxLength": 140, + "minLength": 1, + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "action_id" -]New value: +[ + "practice_slug" +] - added
Output schema / properties / next_stepAdded value: +{ + "type": "string" +} - added
Output schema / properties / practice_slugAdded value: +{ + "type": "string" +} - added
Output schema / properties / readableAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / use_toolAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "services" -]New value: +[ + "practice_slug", + "readable", + "services", + "next_step" +]
- Changed
list_public_booking_slots18 fields changed- removed
Input schema / properties / action_idRemoved value: -{ - "maxLength": 128, - "minLength": 16, - "type": "string" -} - added
Input schema / properties / date_fromAdded value: +{ + "description": "First day to read, in the clinic's time zone; today or later", + "format": "date", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / date_toAdded value: +{ + "description": "Last day to read (inclusive), at most 13 days after date_from", + "format": "date", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - removed
Input schema / properties / endRemoved value: -{ - "format": "date-time", - "maxLength": 64, - "type": "string" -} - added
Input schema / properties / practice_slugAdded value: +{ + "maxLength": 140, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / preferred_timeAdded value: +{ + "description": "The patient's preferred local start time, 24-hour HH:MM; the closest times come first", + "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$", + "type": "string" +} - added
Input schema / properties / service_id / descriptionAdded value: +"A service_id from list_public_booking_services, or from a soonest search row's services" - removed
Input schema / properties / startRemoved value: -{ - "format": "date-time", - "maxLength": 64, - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "action_id", - "service_id", - "start", - "end" -]New value: +[ + "practice_slug", + "service_id", + "date_from", + "date_to" +] - removed
Output schema / properties / action_idRemoved value: -{ - "type": "string" -} - added
Output schema / properties / date_fromAdded value: +{ + "type": "string" +} - added
Output schema / properties / date_toAdded value: +{ + "type": "string" +} - added
Output schema / properties / earliestAdded value: +{ + "properties": { + "ends_at": { + "format": "date-time", + "type": "string" + }, + "id": { + "type": "string" + }, + "provider_id": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "service_id": { + "type": "string" + }, + "start_local": { + "type": "string" + }, + "starts_at": { + "format": "date-time", + "type": "string" + }, + "time_zone": { + "type": "string" + } + }, + "required": [ + "id", + "service_id", + "starts_at", + "ends_at" + ], + "type": "object" +} - added
Output schema / properties / next_stepAdded value: +{ + "type": "string" +} - added
Output schema / properties / readableAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / service_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / time_zoneAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "slots" -]New value: +[ + "practice_slug", + "readable", + "slots", + "next_step" +]
- Changed
search_canadian_dentists4 fields changed- changed
Input schema / properties / order / descriptionPrevious value: -"route (default) orders by booking route; soonest orders one place's practices by when they can be seen, and needs that place: its locality and province, or a postal_code forward sortation area such as M5V: practices whose live schedule Xona reads first, then open now, then by when each opens by its own website's hours. Each row then carries when: state (live_schedule, open_now, opens_today, opens_later, unknown), text, time_zone and, for live_schedule, next_step naming the tools that give real times. Opening hours are not appointment times."New value: +"route (default) orders by booking route; soonest orders one place's practices by when they can be seen, and needs that place: its locality (and province when the name is in more than one), or a postal_code such as M5V or M5V 1B3. Practices whose live schedule Xona reads come first, each page's read now and ordered by their earliest open time for the search's service (cleaning, exam or emergency; cleaning when none is given), then open now, then by when each opens by its own website's hours. Each row then carries when: state (live_schedule, open_now, opens_today, opens_later, unknown), text, time_zone and, for live_schedule, next_step naming the tools that read more times and book one. A live row the search read also carries earliest (the time, its service_id, start_local and the id that books it; [] when none in the next 7 days), services (the clinic's own list) and read (outcome time, none or not_read). live_unread counts the live clinics on later pages. Opening hours are not appointment times." - added
Input schema / properties / pageAdded value: +{ + "description": "Page of results, from 1; each page holds limit rows", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - added
Output schema / properties / live_unreadAdded value: +{ + "type": "integer" +} - added
Output schema / properties / next_stepAdded value: +{ + "type": "string" +}
1 tool update
- Changed
search_canadian_dentists1 field changed- changed
Input schema / properties / order / descriptionPrevious value: -"route (default) orders by booking route; soonest orders one place's practices by when they can be seen, and needs that place's locality and province: practices whose live schedule Xona reads first, then open now, then by when each opens by its own website's hours. Each row then carries when: state (live_schedule, open_now, opens_today, opens_later, unknown), text and time_zone. Opening hours are not appointment times; for a live_schedule practice, list_xona_booking_slots gives real times."New value: +"route (default) orders by booking route; soonest orders one place's practices by when they can be seen, and needs that place: its locality and province, or a postal_code forward sortation area such as M5V: practices whose live schedule Xona reads first, then open now, then by when each opens by its own website's hours. Each row then carries when: state (live_schedule, open_now, opens_today, opens_later, unknown), text, time_zone and, for live_schedule, next_step naming the tools that give real times. Opening hours are not appointment times."
2 tool updates
- Added
choose_public_booking_time - Changed
list_public_booking_slots3 fields changed- added
Output schema / properties / slots / items / properties / provider_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / slots / items / properties / start_localAdded value: +{ + "type": "string" +} - added
Output schema / properties / slots / items / properties / time_zoneAdded value: +{ + "type": "string" +}
2 tool updates
- Changed
hold_xona_booking_slot4 fields changed- added
Input schema / properties / date_of_birth / descriptionAdded value: +"The patient's date of birth, as the patient gave it in this conversation" - added
Input schema / properties / first_name / descriptionAdded value: +"The patient's first name, as the patient gave it in this conversation" - added
Input schema / properties / last_name / descriptionAdded value: +"The patient's last name, as the patient gave it in this conversation" - changed
Input schema / properties / patient_phone / descriptionPrevious value: -"The patient's own Canadian or US mobile number; the booking link is texted there"New value: +"The patient's own Canadian or US mobile number, as the patient gave it in this conversation; the booking link is texted there"
- Changed
search_canadian_dentists2 fields changed- added
Input schema / properties / coverageAdded value: +{ + "description": "A payment plan the clinic says it accepts, on its own website or in a correction its owner made: cdcp is the Canadian Dental Care Plan. Each row quotes the clinic's own words and the day they were read", + "enum": [ + "cdcp" + ], + "type": "string" +} - added
Input schema / properties / orderAdded value: +{ + "description": "route (default) orders by booking route; soonest orders one place's practices by when they can be seen, and needs that place's locality and province: practices whose live schedule Xona reads first, then open now, then by when each opens by its own website's hours. Each row then carries when: state (live_schedule, open_now, opens_today, opens_later, unknown), text and time_zone. Opening hours are not appointment times; for a live_schedule practice, list_xona_booking_slots gives real times.", + "enum": [ + "route", + "soonest" + ], + "type": "string" +}
4 tool updates
- Added
change_xona_appointment - Added
list_xona_appointments - Added
list_xona_reschedule_times - Added
start_xona_appointment_access
3 tool updates
- Changed
abandon_xona_booking4 fields changed- added
Output schema / properties / booking_stepsAdded value: +{ + "items": { + "properties": { + "patient_does": { + "type": "string" + }, + "patient_provides": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "enum": [ + "done", + "waiting_for_patient", + "not_started" + ], + "type": "string" + }, + "step": { + "type": "integer" + }, + "tool": { + "type": "string" + }, + "xona_sends": { + "properties": { + "channel": { + "type": "string" + }, + "contains": { + "type": "string" + }, + "link_expires_at": { + "format": "date-time", + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "channel" + ], + "type": "object" + } + }, + "required": [ + "step", + "status" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / consent_versionAdded value: +{ + "type": "string" +} - added
Output schema / properties / link_expires_atAdded value: +{ + "format": "date-time", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "action_id", - "practice", - "next_step" -]New value: +[ + "action_id", + "practice", + "outcome", + "next_step" +]
- Changed
confirm_xona_booking4 fields changed- removed
Input schema / properties / consent_versionRemoved value: -{ - "enum": [ - "gateway-booking-2026-09-14" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "action_id", - "consent_version" -]New value: +[ + "action_id" +] - added
Output schema / properties / consent_versionAdded value: +{ + "type": "string" +} - added
Output schema / properties / link_expires_atAdded value: +{ + "format": "date-time", + "type": "string" +}
- Changed
hold_xona_booking_slot10 fields changed- removed
Input schema / properties / patient_emailRemoved value: -{ - "description": "The patient's own email; the first link goes there", - "format": "email", - "maxLength": 254, - "minLength": 3, - "type": "string" -} - changed
Input schema / properties / patient_phone / descriptionPrevious value: -"The patient's mobile number; the second link is texted there once the email link is tapped"New value: +"The patient's own Canadian or US mobile number; the booking link is texted there" - changed
Input schema / requiredPrevious value: -[ - "practice_slug", - "service_id", - "slot_fingerprint", - "date", - "patient_email", - "patient_phone", - "first_name", - "last_name", - "date_of_birth" -]New value: +[ + "practice_slug", + "service_id", + "slot_fingerprint", + "date", + "patient_phone", + "first_name", + "last_name", + "date_of_birth" +] - added
Output schema / properties / booking_urlAdded value: +{ + "type": "string" +} - removed
Output schema / properties / consent_textRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / consent_versionRemoved value: -{ - "type": "string" -} - added
Output schema / properties / link_expires_atAdded value: +{ + "format": "date-time", + "type": "string" +} - added
Output schema / properties / outcomeAdded value: +{ + "type": "string" +} - added
Output schema / properties / reasonAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "action_id", - "practice", - "hold_expires_at", - "verification", - "consent_version", - "consent_text", - "booking_steps", - "next_step" -]New value: +[ + "action_id", + "practice", + "next_step" +]
15 tool updates
- First observed
abandon_xona_booking - First observed
answer_dental_practice_question - First observed
confirm_dental_request - First observed
confirm_xona_booking - First observed
get_canadian_dental_practice - First observed
get_dental_action_status - First observed
hold_xona_booking_slot - First observed
list_dental_practice_actions - First observed
list_public_booking_services - First observed
list_public_booking_slots - First observed
list_xona_booking_services - First observed
list_xona_booking_slots - First observed
prepare_dental_practice_action - First observed
search_canadian_dentists - First observed
start_dental_request
Related MCP Connectors
Find and book doctor, dentist & nurse appointments. 2M+ providers by insurance & cost in the US.
See your dental clinic's free slots, dentists, treatment prices and how busy each day is.
Find local services, check live availability, and book real appointments with consent.
Discover local services and availability, then create, track, reschedule, or cancel bookings.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables management of dental appointments through Google Calendar integration. Supports booking, canceling, rescheduling appointments, checking availability, and finding next available slots through natural language.-
- AlicenseNot gradedqualityCmaintenanceAllows users to query the dental registry of the Regional Council of Dentistry of São Paulo from official sources.MIT
- AlicenseNot gradedqualityCmaintenanceEnables sovereign, offline-capable dental practice management with Ed25519-signed transactions, running on your own infrastructure.MIT
- FlicenseAqualityDmaintenanceConnects AI assistants like Claude to Ravira's dental practice AI receptionist. Provides tools for patient queries, feature overviews, sample conversations, dental topic searches, and demo requests.5-
Glama MCP Gateway
Add one secure layer between your agents and this server.