Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "answer_dental_practice_question", "list_public_booking_services", "list_public_booking_slots" and 1 more
⟨25 unchanged words⟩ ,"coverage","accessibility","emergency","booking","patient_mentions"],"type":"string"}},"required": ⟨4 unchanged words⟩
⟨41 unchanged words⟩ be read answers readable false with that booking_url. An answer may be up to 5 minutes old: read_at says when the clinic's scheduler was read and age_seconds how long ago; fresh: true reads this clinic again (twice a minute per clinic; past that the answer says when it next can). Provider locators remain server-owned.
{"additionalProperties":false,"properties":{"fresh":{"description":"Read this clinic's scheduler now rather than from a read up to 5 minutes old","type":"boolean"},"practice_slug":{"maxLength":140,"minLength":1, ⟨6 unchanged words⟩
{"properties":{"age_seconds":{"type":"integer"},"booking_url":{"type":"string"},"fresh_note":{"type":"string"},"next_step":{"type":"string"},"practice_slug":{"type":"string"},"read_at":{"format":"date-time","type":"string"},"readable":{"type ⟨30 unchanged words⟩
⟨72 unchanged words⟩ first one; preferred_time puts the closest times first. An answer may be up to 5 minutes old: read_at says when the clinic's scheduler was read and age_seconds how long ago; fresh: true reads this clinic again (twice a minute per clinic; past that the answer says when it next can).
⟨65 unchanged words⟩ {2}$","type":"string"},"fresh":{"description":"Read this clinic's scheduler now rather than from a read up to 5 minutes old","type":"boolean"},"practice_slug":{"maxLength":140,"minLength":1, ⟨55 unchanged words⟩
{"properties":{"age_seconds":{"type":"integer"},"booking_url":{"type":"string"},"date_from" ⟨42 unchanged words⟩ ,"ends_at"],"type":"object"},"fresh_note":{"type":"string"},"next_step":{"type":"string"},"practice_slug":{"type":"string"},"read_at":{"format":"date-time","type":"string"},"readable":{"type
⟨99 unchanged words⟩ there, with no call in the conversation. A row's read.read_at says when its times were read, at most 5 minutes before. The tool a row's next_step names reads more ⟨8 unchanged words⟩
Changed the definition of "list_public_booking_services", "list_public_booking_slots", "prepare_dental_practice_action" and 1 more
⟨17 unchanged words⟩ live_schedule, or whose action option has reads_times.AThe answer carries booking_url, the page where the patient books this clinic; a clinic whose scheduler can't be read answers readable false withthe booking link to give thethatpatient.booking_url. Provider locators remain server-owned.
{"properties":{"booking_url":{"type":"string"},"next_step":{"type":"string"},"practice_slug" ⟨34 unchanged words⟩
Changed the definition of "choose_public_booking_time", "list_public_booking_services", "list_public_booking_slots" and 1 more
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 ⟨16 unchanged words⟩ scheduler. It takes the action and the timeonly;(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.
⟨6 unchanged words⟩ "minLength":16,"type":"string"},"slot_idservice_id":{"description":"Theidchosenof
Changed the definition of "search_canadian_dentists" and "start_dental_request"
⟨147 unchanged words⟩ they can be seen, and needs thatplace'splace: its locality and province, or a postal_code forward sortation area such as M5V: practices whose live schedule Xona reads first, ⟨20 unchanged words⟩ , open_now, opens_today, opens_later, unknown), text, time_zone and,time_zone.forOpeninglive_schedule,hoursnext_steparenaming
Added "choose_public_booking_time"; changed the definition of "list_public_booking_services" and "list_public_booking_slots" (19 tools before, 20 now)
Readservicesthefromservices a clinic'salready-preparedownsupportedonlinepublicschedulerbookingoffers,widget.for an action prepared at that clinic whose option has reads_times. Provider locators remain server-owned.
Changed the definition of "change_xona_appointment", "confirm_dental_request", "confirm_xona_booking" and 8 more
Move or cancel one of the patient's appointments.Read the exact change back to the patient and get a yes first.Xona texts the patient a link to a page that shows thechange; the change happensexactonlychange.whenWhen they press its button (or type the code from the text on book.xonark.com/code).Nothingthe practice's schedule changes,onor,thisat
Added "change_xona_appointment", "list_xona_appointments", "list_xona_reschedule_times" and 1 more (15 tools before, 19 now)
Ask to move or cancel an appointment — Move or cancel one of the patient's appointments. Read the exact change back to the patient and get a yes first. Xona texts the patient a link to a page that shows the change; the change happens only when they press its button (or type the code from the text on book.xonark.com/code). Nothing changes on this call. Call it again with the same arguments for the result, which is read live from the practice's schedule.
List the patient's upcoming appointments — 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.
List times an appointment can move to — 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. Nothing is held or changed.
Changed the definition of "abandon_xona_booking", "confirm_xona_booking" and "hold_xona_booking_slot"
⟨9 unchanged words⟩ ,"appointment_start_local":{"type":"string"},"booking_steps":{"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"},"booking_url":{"type":"string"},"confirmation_sms":{"type":"string"},"consent_version":{"type":"string"},"continue_url":{"type":"string"},"link_expires_at":{"format":"date-time","type":"string"},"next_step":{"type":"string"},"outcome" ⟨17 unchanged words⟩ string"}},"required":["action_id","practice","outcome","next_step"],"type":"object"}
Certificate recorded, valid to 2026-11-25
Authorization not required
Unknown → Live
First tool surface recorded: 15 tools (server version 0.1.0)
https://book.xonark.com/mcp (mcp_streamable_http) — from mcp_registry, with the record
Showing the latest 13 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨31 unchanged words⟩ starts_at, start_local (the time at the clinic)and, time_zone,andearliest isbooking_url, thefirst one; preferred_timepageputswhere theclosest times first. Where Xonapatient booksthe clinic'sthatschedulertime (an optionXona'spublic_provider_booking),pageaonchosenthattimeservicegoesandtodaychoose_public_booking_timewherewithXonaitsbooksidtheasclinic'sslot_idscheduler,its service_id and starts_at; otherwiseelse thepatientclinic'sbooksownitbookingonpage);theearliestclinic'sisownthepage,firsttheone;linkpreferred_timeprepare_dental_practice_actionputsgivesthewithclosestcapabilitytimespublic_booking_handoff.first.
{"properties":{"booking_url":{"type":"string"},"date_from":{"type":"string"},"date_to":{"type":"string"},"earliest":{"properties":{"booking_url":{"type":"string"},"ends_at":{"format":"date-time","type": ⟨43 unchanged words⟩ ,"slots":{"items":{"properties":{"booking_url":{"type":"string"},"ends_at":{"format":"date-time","type" ⟨46 unchanged words⟩
Openaonedentalofactionaforclinic'sreviewbooking routes
PrepareCreatesanaexpiring,short-livedattributedactiondentalfor one capability the clinic's actionandoptionsreturnlistthe(itspatientschedulerreviewpage, a Xona request, a request form, a call or its website) and returns the URLwhereof thepatientpageseesfor it. A capability theactionclinicanddoescontinues.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.
⟨51 unchanged words⟩ published fact matched and when it was read.For the soonest visit,A search with order=soonest, the patient's postal code or city,and theservice.serviceEachreturns liverowrows that alreadyhascarryitseach clinic's earliest time, its services and booking_url, theclinic'spageservices;wherereadthemorepatienttimesbookswiththat time; opening it starts thetoolbookingitsthere,next_stepwithnames;nogivecall in thepatientconversation.theTheclinic'stoolbookingalinkrow'swithnext_stepprepare_dental_practice_actionnameswhenreadstheymorechoose.times. No login or clinic membership is required.
⟨237 unchanged words⟩ , next_step naming the tools that read moretimestimes.andEverybookrowone.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_localand, the id that booksit;it and its own booking_url; [] when none in the next 7 ⟨90 unchanged words⟩
Read the services a clinic's own online scheduler offers,forbyanpractice_slug:actionapreparedclinicatwhosethatsearchclinicrow is live_schedule, or whose action option has reads_times. A clinic whose scheduler can't be read answers readable false with the booking link to give the patient. Provider locators remain server-owned.
{"additionalProperties":false,"properties":{"action_idpractice_slug":{"maxLength":128140,"minLength":161,"type":"string"}},"required":["action_idpractice_slug"],"type":"object"}
{"properties":{"next_step":{"type":"string"},"practice_slug":{"type":"string"},"readable":{"type":"boolean"},"services":{"items":{"properties":{"duration_minutes ⟨11 unchanged words⟩ type":"object"},"type":"array"},"use_tool":{"type":"string"}},"required":["practice_slug","readable","services","next_step"],"type":"object"}
Read open times from a clinic's own online scheduler, by practice_slug, for oneserviceservice_id between date_from andadate_toUTC(thewindowclinic'sofdates, both included, at most 14days.days). Each time carriesstart_localstarts_at, start_local (the time at the clinic) and time_zone, anditsearliesttime_zone.isFortheafirstpublic_provider_bookingone;action,preferred_timegiveputs thepatient'sclosest times first. Where Xona books the clinic's scheduler (an option public_provider_booking), a chosen time goes tochoose_public_booking_time;choose_public_booking_time with its id as slot_id, its service_id and starts_at; otherwise the patient books it on the clinic's own page, theaction'slinkbrowser_action_url.prepare_dental_practice_action gives with capability public_booking_handoff.
⟨13 unchanged words⟩ than 180 days ahead.","properties":{"action_iddate_from":{"maxLengthdescription":128"First day to read, in the clinic's time zone; today or later"minLength,"format":16"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},"enddate_to":{"description":"Last day to read (inclusive), at most 13 days after date_from","format":"date-timedate","maxLengthpattern":64"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},"service_idpractice_slug":{"maxLength":160140
{"properties":{"action_iddate_from":{"type":"string"},"date_to":{"type":"string"},"earliest":{"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"},"next_step":{"type":"string"},"practice_slug":{"type":"string"},"readable":{"type":"boolean"},"service_id":{"type":"string"},"slots":{"items":{"properties":{"ends_at ⟨33 unchanged words⟩ :"object"},"type":"array"},"time_zone":{"type":"string"},"use_tool":{"type":"string"}},"required":["practice_slug","readable","slots","next_step"],"type":"object"}
⟨51 unchanged words⟩ published fact matched and when it was read. For the soonest visit, search with order=soonest, the patient's postal code or city, and the service. Each live row already has its earliest time and the clinic's services; read more times with the tool its next_step names; give the patient the clinic's booking link with prepare_dental_practice_action when they choose. No login or clinic membership is required.
⟨150 unchanged words⟩ seen, and needs that place: its locality (and province when the name is in more than one), or a postal_codeforward sortation areasuch as M5V:practicesor 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 ⟨19 unchanged words⟩ for live_schedule, next_step naming the tools thatgivereadrealmoretimes.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.","enum":["route","soonest"],"type":"string"},"page":{"description":"Page of results, from 1; each page holds limit rows","maximum":200,"minimum":1,"type":"integer"},"postal_code":{"maxLength":12,"type ⟨35 unchanged words⟩
{"properties":{"count":{"type":"integer"},"live_unread":{"type":"integer"},"next_step":{"type":"string"},"projection":{"enum":["row"],"type ⟨12 unchanged words⟩
Start an appointment request that Xonaemailssends to the selected clinic (by email, or through the clinic's own website form), without leaving the conversation. Xona first emails ⟨21 unchanged words⟩
Readpublicopenavailabilitytimes from asupportedclinic'sclinicownwidgetonline scheduler for one service and a UTCwindow.window of at most 14 days. Each time carries start_local, the time at the clinic, and its time_zone. For a public_provider_booking action, give the patient's chosen time to choose_public_booking_time; otherwise the patient books it on the clinic's own page, the action's browser_action_url.
⟨15 unchanged words⟩ ,"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":[" ⟨15 unchanged words⟩
Choose a time to book at a clinic — For a public_provider_booking action: keeps one time from list_public_booking_slots 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 only; the page collects the patient's details.
Send the started request to theclinicclinic.afterIt takes thepatient6-digitreadscodebackXonatheiremailedcodethe patient andagreesthetoconsent_versionconsent_text.of the consent_text the patient agreed to. The outcome is a delivered, held or failed ⟨6 unchanged words⟩ again with the same action_id returns the sameoutcome and sends nothing.outcome.
⟨8 unchanged words⟩ the text link and pressed Book this appointment.BeforeUntilthatthen it returnswaiting_for_patient and books nothing.waiting_for_patient. Xona finds an existing patient itself; when it ⟨32 unchanged words⟩
Hold one open time and text the patient a link to it.Before calling,Theaskpage thepatientlinkforopenseveryshowsdetailtheintimethisandconversationthe(neverdetailsfromabovememoryaorBookanotherthischat),appointmentreadbutton. When thetimepatientandpresses it thedetailsappointmentbackis booked,andor,getat ayes. The patientpracticebooksthatbyconfirmstappingbookingstheitself,linksentinto thetext and pressing Book this appointment; thispracticecallasbooksanothing.request.
⟨27 unchanged words⟩ ,"type":"string"},"date_of_birth":{"description":"The patient's date of birth, as the patient gave it in this conversation","format":"date","pattern":"^[0-9] ⟨8 unchanged words⟩ ,"type":"string"},"first_name":{"description":"The patient's first name, as the patient gave it in this conversation","maxLength":60,"minLength":1,"type":" ⟨12 unchanged words⟩ ,"type":"string"},"last_name":{"description":"The patient's last name, as the patient gave it in this conversation","maxLength":60,"minLength":1,"type":" ⟨8 unchanged words⟩ :"The patient's own Canadian or US mobilenumber;number, as the patient gave it in this conversation; the booking link is texted there","maxLength ⟨38 unchanged words⟩
⟨6 unchanged words⟩ clinic widget for one service and UTC window.This does not hold or book a slot.
⟨42 unchanged words⟩ slot has a slot_fingerprint and date for hold_xona_booking_slot.Nothing is held.
⟨17 unchanged words⟩ between date_from and date_to. appointment_ref comes from list_xona_appointments.Nothing is held or changed.
Prepare an expiring, attributed dental action and returna visiblethe patient reviewURL. This doesURLnotwheresubmitthe patientdataseesortheclaimactionaandbooking.continues.
⟨18 unchanged words⟩ a language, published weekend or evening hours,anda booking route you can usenow.now, and a payment plan the clinic says it accepts (the Canadian Dental Care Plan). Each row says which published fact matched and ⟨11 unchanged words⟩
⟨37 unchanged words⟩ ,"any"],"type":"string"},"coverage":{"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"},"language":{"description":"A language the clinic's ⟨35 unchanged words⟩ :["saturday","sunday","weekend","evening"],"type":"string"},"order":{"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"},"postal_code": ⟨38 unchanged words⟩
⟨9 unchanged words⟩ selected clinic, without leaving the conversation. Xona first emails the patient a codetothatconfirmconfirms their address;nothingconfirm_dental_requestreachesthenthesendsclinictheyet.request. Use it where list_dental_practice_actions marks xona_email_appointment_request as completes_in_conversation.
StartTextcheckinga patient one link to see,movingmove orcancellingcancelappointmentstheaappointmentspatientthey alreadyhashave at a practice connected to Xona,whenforthisa conversationhaswith no booking action_id that still works.AskIf thepatient in this conversation for theirmobile number,firstname,last nameand date of birth,read them back and get a yes. If the detailsmatch a patient there, Xona texts themonethe link; after they tap it and press Show myappointments.appointments,Thenlist_xona_appointmentscallreadslist_xona_appointments.their appointments. The answer is the same whether or not the details match.
Text the patient a link to show their appointments — Start checking, moving or cancelling appointments a patient already has at a practice connected to Xona, when this conversation has no booking action_id that still works. Ask the patient in this conversation for their mobile number, first name, last name and date of birth, read them back and get a yes. If the details match a patient there, Xona texts them one link; they tap it and press Show my appointments. Then call list_xona_appointments. The answer is the same whether or not the details match.
BookGet theheldbooking'stimeresult
Step 2 of 2. Book the held time withGet thedetails from step 1,result once the patient has tapped theemail link and thetext link andagrees to consent_text. IfpressedaBooklinkthisisappointment.stillBeforeuntappedthat itbooksreturnsnothingwaiting_for_patient andsaysbookswhich.nothing. 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.
⟨5 unchanged words⟩ 128,"minLength":16,"type":"string"},"consent_version":{"enum":["gateway-booking-2026-09-14"],"type":"string"}},"required":["action_id","consent_version"],"type":"object"}
⟨67 unchanged words⟩ ,"confirmation_sms":{"type":"string"},"consent_version":{"type":"string"},"continue_url":{"type":"string"},"link_expires_at":{"format":"date-time","type":"string"},"next_step":{"type ⟨27 unchanged words⟩
Hold an open time and text the patient a linkStep 1 of 2.Hold one open timewith allandoftext thepatient'spatientdetailsaandlinkaforlinkeverytodetailtap;intappingthisitconversationtexts(neverthemfrom memory or another chat), read the time and the details back, and get asecondyes.link.TheAskpatientforbookseverybydetailtappingbeforethecalling.linkNothinginisthebookedtextyet.and pressing Book this appointment; this call books nothing.
⟨73 unchanged words⟩ "maxLength":500,"type":"string"},"patient_emailpatient_phone":{"description":"The patient's ownemail; the first link goesCanadianthere","format":"email","maxLength":254,"minLength":3,"type":"string"},"patient_phone":{"description":"Theorpatient'sUS mobile number; thesecondbooking link is texted thereonce the email link is tapped","maxLength":32,"minLength":7,"type ⟨24 unchanged words⟩ :["practice_slug","service_id","slot_fingerprint","date","patient_email","patient_phone","first_name","last_name","date_of_birth ⟨2 unchanged words⟩
⟨53 unchanged words⟩ :"object"},"type":"array"},"consent_textbooking_url":{"type":"string"},"consent_versioncontinue_url":{"type":"string"},"continue_urlhold_expires_at":{"format":"date-time","type":"string"},"hold_expires_atlink_expires_at":{"format":"date-time","type":"string"},"next_step":{"type":"string"},"outcome":{"type":"string"},"practice":{"properties":{"name":{"type ⟨6 unchanged words⟩ ,"name"],"type":"object"},"verificationreason":{"type":"string"}},"requiredverification":["action_id","practice",{"hold_expires_attype",:"verificationstring"}}