Skip to content

Documentation / MCP

All 75 tools

Grouped by domain. Bold arguments are required. Every tool is marked with what it can do — read, write, delete, or reach outside HyperCRM — and with the role needed to call it.

Reads are one tool each; writes are grouped

Every read is its own tool, so a model picking one has an obvious choice. The create, update and delete surface of a resource collapses into a single write_* tool with a required action argument — which keeps the tool list small enough to reason about and each write coarse enough to carry a meaningful "can delete" warning.

How to read this

47 of the 75 tools are read-only and safe to call speculatively. 20 can delete or void data. Five reach outside HyperCRM and deserve a confirmation prompt in any client: sending an invitation email, publishing the website to the public internet, and minting a public form link.

practiceId is never an argument — it comes from the token. Where a tool takes an action, the action decides which other arguments are required; the description says which.

Patients

The patient record, its notes, its courses of treatment, and the sub-resources hanging off it.

ToolArgumentsAccessWhat it does
list_patientssearchqstatustagIdincludeInactivelimitoffsetRead-onlyAny memberList patients in the practice, with optional search, status and tag filters.
get_patientpatientIdRead-onlyAny memberRead a single patient by id.
list_patient_notespatientIdRead-onlyAny memberList every clinical note recorded against a patient.
list_patient_filespatientIdRead-onlyAny memberList files attached to a patient. Use get_file for a download URL.
list_patient_billing_entriespatientIdincludeVoidedlimitRead-onlyAny memberList the billing entries recorded against a patient, with balance: what the patient owes now, the same figure as the ledger on the patient's page. Quote it rather than adding entries up. A receipt entry is a payment, not a document.
list_patient_invoicespatientIdincludeVoidedRead-onlyAny memberList the invoices already issued for a patient.
get_patient_invoice_previewpatientIdRead-onlyAny memberCompute the draft invoice for a patient's unbilled entries without issuing it. Use write_invoice with action=issue to issue one.
write_patientactionpatientIdfirstNamelastNamedobgenderemailphoneMobileaddresspostcodecountrysocialSecurityNumbertaxIdtaxOfficestatusnotifyByEmailnotifyBySmsfileUseConsentdifferentPersonWritesCan deleteAny memberCreate, update or delete a patient. action=create requires firstName and lastName; update and delete require patientId. Deleting is permanent. A create for a name the practice already has is refused with patient_exists; differentPerson: true adds the record anyway, once the practice says it is somebody else. The server cannot check that the practice said so, and the activity log records it.
write_patient_noteactionpatientIdnoteIdtitlebodyWritesCan deleteAny memberCreate, update or delete a note on a patient. action=create requires body; update and delete require noteId.
toggle_patient_tagpatientIdtagIdWritesAny memberAdd the tag to the patient if absent, remove it if already present.
list_treatment_coursespatientIdRead-onlyAny memberList a patient's courses of treatment, open ones first: status, dates and duration, diagnosis and plan, the diagnosis and treatment types they are tagged with, the next step, and the visit log.
list_treatment_picklistskindincludeArchivedRead-onlyAny memberList the practice's diagnosis types and treatment types, the words a course is tagged with. Archived ones on request.
write_treatment_courseactionpatientIdcourseIdtitlestatusdiagnosisplandiagnosisTypeIdstreatmentTypeIdsstartDateplannedEndDatenextStepDatenextStepNoteexpectedUpdatedAtreasonWritesCan deleteAny memberStart, change or remove a course of treatment. action=create requires title; update and void require courseId and expectedUpdatedAt. A removed course keeps its row and its visits, out of the list.
write_treatment_visitactionpatientIdcourseIdvisitIdvisitDatebodyappointmentIdexpectedUpdatedAtreasonWritesCan deleteAny memberLog, change or remove a visit on a course. action=create requires body, and may link the patient's appointment it was logged from; update and void require visitId and expectedUpdatedAt.

Appointments

Bookings, chair-blocking entries, and derived availability.

ToolArgumentsAccessWhat it does
get_day_agendadatetopractitionerchairpatientservicetimelocationIdRead-onlyAny memberThe diary for a day or up to 7 days, by name: live bookings with patient, service, chair and practitioner, blocked time apart, counts, and whether the practice is closed.
find_booking_slotsdatetimepartOfDaydayspatientservicepractitionerchairlocationIdRead-onlyAny memberWhen a booking fits, by name: a verdict on a requested time, free times spread over the day with the chairs they are free on and a ready booking draft, and the patient's own bookings that day. An ambiguous name is answered with the candidates, never a guess.
list_appointmentsfromtochairIdpractitionerIdpatientIdRead-onlyAny memberList appointments in a time window. Pass chairId to restrict to one chair.
get_appointmentappointmentIdRead-onlyAny memberRead a single appointment by id.
get_appointment_availabilitydatetimepartOfDaychairIdpractitionerIdserviceIddurationMinutesRead-onlyAny memberFree times for one calendar day on every chair, or on one chair or for one person, honouring the practice's opening hours, timezone and existing bookings. Times that have passed are left out, and a requested time gets a verdict.
write_appointmentactionappointmentIdexpectedDatetypedatestartTimeendTimestartAtendAtchairIdpatientIdpractitionerIdtitlecolorserviceRefnoteslocationIdWritesCan deleteAny memberCreate, update or cancel an appointment. action=create requires chairId, startAt and endAt; update and cancel require appointmentId. type is appointment, reminder or unavailable; blocked time with no chair and no practitioner may name one locationId to close only that location. Overlapping bookings on the same chair are rejected.

Billing and invoices

The ledger of billable entries, and the invoices issued from it.

ToolArgumentsAccessWhat it does
get_outstanding_balancesolderThanDaysRead-onlyAny memberEvery patient who owes the practice money, with the date of their oldest unpaid charge and how many days old it is. Pass olderThanDays to answer "who owes money older than 30 days". Payments are applied to the oldest charges first, so the age is the debt still genuinely owed.
list_billing_entriesfromtoincludeVoidedlimitRead-onlyOwner onlyList billing entries across the whole practice, optionally bounded by a date range (the practice's own days, both included). Use list_patient_billing_entries for one patient, and for what a patient owes.
get_billing_entryentryIdRead-onlyAny memberRead a single billing entry by id.
get_invoiceinvoiceIdRead-onlyAny memberRead an issued invoice and its frozen line items. Use get_patient_invoice_preview for the unissued draft.
get_appointment_chargeappointmentIdRead-onlyAny memberRead what charging an appointment would take: whether it can be charged, and the catalog service matching it, with its id and price. Use it before charging an appointment with write_billing_entry.
write_billing_entryactionentryIdpatientIdtypeamountMinorserviceIdappointmentIdserviceDatenotespaymentMethodreasonWritesCan deleteAny memberCreate, update or void a billing entry. action=create requires patientId; update and void require entryId. Voiding is a reversal, not a delete — the entry stays on the ledger marked void. A receipt entry records a payment and gets a payment number (HCRM-0001); it is not a document. Receipts and tax invoices are issued with write_invoice.
write_invoiceactionpatientIdkindentryIdsinvoiceIdreasonWritesCan deleteAny memberIssue a document for a patient's unbilled entries (action=issue, requires patientId) or void an issued one (action=void, requires invoiceId). It issues a receipt unless kind=invoice, which needs the patient's tax id on their record. Issuing freezes the current line items.
send_invoiceinvoiceIdlocaleWritesReaches outsideAny memberSends a REAL EMAIL: an issued receipt or invoice, attached as a PDF, to the patient's email on file and nowhere else. Optional locale en or el. Refused for a voided document, a patient with no email, and after 3 sends of the same document within an hour.

Forms

Intake and consent forms. Reading a form, reading the answers and sending a form to a patient are open to any practice member. Building a form is the owner's.

ToolArgumentsAccessWhat it does
list_formsNoneRead-onlyAny memberList the practice's intake and consent forms.
get_formformIdRead-onlyAny memberRead one form with its field definitions.
list_form_submissionsformIdstatuspagepageSizeRead-onlyAny memberList one page of a form's submissions, newest first, with the total across all pages.
get_form_submissionformIdsubmissionIdRead-onlyAny memberRead a single submission and its answers.
write_formactionformIdpatientIdsendnamedescriptionisActivefieldsWritesCan deleteReaches outsideAny memberaction=create_link is open to any member; every other action is owner only. create_link mints a PUBLIC single-use link that expires in 3 days (optionally bound to a patient, whose record the answers then update: never their name, and an email or mobile only where the practice holds none), and with send=email|sms mails or texts it to that patient; create builds a form; update edits metadata; delete removes it; replace_fields swaps the whole field list; seed_defaults installs the pack's templates.

Files

Uploads are browser-to-storage and have no tool; these read and remove what is already stored.

ToolArgumentsAccessWhat it does
get_filefileIdRead-onlyAny memberRead a file's metadata with a signed download URL that lasts five minutes. Use list_patient_files to find ids. Using a patient's files for anything but their own care needs their file-use consent.
delete_filefileIdWritesCan deleteAny memberPermanently delete a file. A website image is a file too, and deleting one takes it off the published site; those and regulatory documents are the owner's alone to remove.

Aggregates and cross-entity search. The three reports and the audit log are owner-only.

ToolArgumentsAccessWhat it does
get_dashboard_kpisNoneRead-onlyAny memberHeadline figures — today's appointments, outstanding balances, recent activity counts.
get_appointments_reportfromtogroupByRead-onlyOwner onlyAppointment counts bucketed over a date range. groupBy is day, week or month.
get_revenue_reportfromtogroupByRead-onlyOwner onlyRevenue totals bucketed over a date range. groupBy is day, week or month.
get_patient_acquisition_reportfromtogroupByRead-onlyOwner onlyNew-patient counts bucketed over a date range. groupBy is day, week or month.
list_audit_logtypefromtolimitoffsetRead-onlyOwner onlyRead the practice audit trail, newest first. Filter by entity type and a date range.

Notifications

The calling user's own inbox. Not practice-wide.

ToolArgumentsAccessWhat it does
list_notificationsunreadOnlylimitoffsetRead-onlyAny memberList your notifications, newest first, with the unread count. Pass unreadOnly=true to skip read entries.
mark_notifications_readactionnotificationIdWritesAny memberMark one notification read (action=one, requires notificationId) or the whole inbox (action=all).

Practice and people

The practice profile, its members, and staff invitations.

ToolArgumentsAccessWhat it does
get_practiceNoneRead-onlyAny memberRead the practice profile and settings.
get_meNoneRead-onlyAny memberRead the calling user, their practice, their membership role and the practice's vertical pack.
list_practice_membersNoneRead-onlyAny memberList staff members and their roles.
list_invitationsNoneRead-onlyOwner onlyList pending staff invitations.
update_practicenameaddressphoneaddressStreetaddressCityaddressRegionaddressPostcodeemailwebsitecountrycurrencylegalNametaxIdtaxOfficepackIdworkTimeStartworkTimeEndopeningHourscalendarSlotMinutesreminderLeadMinutesbookingRequestExpiryWorkingHoursreminderChannelstaxPercentageincludeTaxInInvoicestaxExemptionNotetimezonemfaRequiredWritesOwner onlyUpdate the practice. Profile fields and settings fields may be mixed in one call; any unrecognized field is rejected.
update_melocaleWritesAny memberUpdate your own preferences. Only the UI locale is settable.
report_bugdescriptionexpectedpagePathWritesAny memberReport a bug in HyperCRM itself. The report is saved and emailed to the HyperCRM team, with who sent it attached. Up to 5 per user per hour. Leave out patient details.
write_practice_memberactionmembershipIdrolepublicDisplayNamepublicTitlecredentialsbiospecialtiespublicProfileEnabledWritesOwner onlyaction=update_role sets a membership to owner or staff (`assistant`); action=remove takes the member off the practice. Both are rejected if they would leave the practice with zero owners.
write_invitationactioninvitationIdemailroleWritesCan deleteReaches outsideOwner onlyaction=create SENDS A REAL EMAIL with a single-use join link that expires in 3 days; action=revoke deletes a pending invitation.

Website builder

The practice's public marketing site. Writes affect a draft until published; publishing is the one tool here that changes what the public sees.

ToolArgumentsAccessWhat it does
get_siteNoneRead-onlyAny memberRead the site with its pages, modules and FAQs. Returns null if no site has been created.
list_site_page_modulespageIdpageRead-onlyAny memberRead the content modules and FAQs of one page.
check_site_slug_availableslugRead-onlyOwner onlyCheck whether a slug is valid and free. Returns availability plus a reason when it is not.
write_siteactionsluglocaletemplateIdbrandColorfontPairinglogoFileIdheroFileIdmetaTitlemetaDescriptionshowServicePricesWritesCan deleteReaches outsideOwner onlyaction=create sets up the site; update edits settings; publish PUSHES THE CURRENT DRAFT LIVE to the public internet, immediately visible to anyone.
update_site_pagepageIdenablednavLabelnavOrdermetaTitlemetaDescriptionWritesOwner onlyEdit one page's metadata — title, slug, SEO.
write_site_moduleactionpageIdmoduleIdtypepositionenabledcontentWritesCan deleteOwner onlyaction=create adds a content module to a page (requires pageId); update and delete require moduleId. Changes affect the draft until the site is published. On update, `content` replaces the module's content whole rather than merging, so read it first and send it back complete.
write_site_faqactionpageIdfaqIdquestionanswerpositionWritesCan deleteOwner onlyaction=create adds an FAQ to a page (requires pageId); update and delete require faqId.
list_blog_postsNoneRead-onlyAny memberList the practice's blog posts — drafts and published alike — with their slugs, status and bodies.
list_blog_categoriesNoneRead-onlyAny memberList the categories a post can be filed under. Call this before writing a post if you intend to set one: the id must belong to this site.
write_blog_postactionpostIdtitleslugexcerptbodycategoryIdauthorMembershipIdstatusmetaTitlemetaDescriptionWritesCan deleteOwner onlyWrite, edit or remove a blog post. create needs title, slug and body; update and delete need postId. A post is created as a DRAFT. The blog is the one exception to publishing: on a site that is already published, setting a post to published puts it in front of patients at once, and deleting a published post takes it down at once. A practice may also have a weekly schedule that writes posts by itself, so posts you did not create can appear.

Catalogue

Chairs, locations, services and tags — the lists the rest of the product picks from.

ToolArgumentsAccessWhat it does
list_chairsNoneRead-onlyAny memberList the treatment chairs (bookable resources).
list_locationsNoneRead-onlyAny memberList the practice's locations (branches) with their names and addresses, and whether locations take effect.
list_servicesvisibilityRead-onlyAny memberList the service catalogue. Pass isPublic=true for services offered on the public booking page.
list_tagsNoneRead-onlyAny memberList all tags defined for the practice.
write_chairactionchairIdtitledoctorNamecolorisPublicpositionWritesCan deleteOwner onlyCreate, update or delete a treatment chair. update and delete require chairId. Deleting one cancels nothing: the bookings on it keep their time and their patient and are left with no chair.
write_serviceactionserviceIdnamepriceMinordurationMinutesisPublicWritesCan deleteOwner onlyCreate, update or delete a service, or seed the vertical pack's default catalogue with action=seed_defaults. update and delete require serviceId.
write_tagactiontagIdtitlecolorWritesCan deleteAny memberCreate, update or delete a patient tag. update and delete require tagId. Deleting a tag removes it from every patient carrying it.

Dental chart

The dental chart and gum chart exams. These tools exist only for a practice set up as a dental practice: any other practice is not offered them, and a call by name is refused.

ToolArgumentsAccessWhat it does
get_dental_chartpatientIdincludeVoidedRead-onlyAny memberRead a patient's dental chart: which teeth are missing, implanted or treated, the entries charted so far (removed ones on request), the chart note and tooth notes.
write_dental_chart_entryactionpatientIdentryIdteethkindbridgestatussurfacesmaterialrecordedOnexpectedUpdatedAtreasongroupWritesCan deleteAny memberChart a finding or treatment on one or more teeth, mark a planned one as done, or remove one. A removed entry stays in the tooth's history. An entry cannot be edited: to correct one, remove it and chart it again.
write_dental_chart_noteactionpatientIddentitionprimaryTeethchartNotetoothbodyexpectedUpdatedAtWritesCan deleteAny memberSet the chart's dentition and note, or write or delete one tooth's note.
list_perio_examspatientIdRead-onlyAny memberList a patient's gum chart exams, newest first, without their measurements.
get_perio_exampatientIdexamIdRead-onlyAny memberRead one gum chart exam: six probing sites per tooth, bleeding, mobility and furcation.
write_perio_examactionpatientIdexamIdexamDatecopyFromExamIdmeasurementsexpectedUpdatedAtreasonWritesCan deleteAny memberStart a gum chart exam, change its measurements (only what you send changes), or remove it.

Common questions

Patient records are encrypted, both where they are stored and on their way to your screen. Files are private, and a link to one stops working after a short time. Changes to patient records are recorded, with who made them and when. There is no shared practice password: everyone has their own account. On the Complete plan, the practice owner can also require two-step sign-in for the whole team.

They exist only for a practice set up as a dental practice. Any other practice is not offered them, in its own assistant or over MCP, and a call to one by name is refused. The tool counts on these pages include them.

So the tool list stays small enough for a model to reason about, and so each write tool is coarse enough to carry a meaningful warning. A client can tell that write_patient may delete something and prompt accordingly; twelve narrow tools would each need their own annotation and would crowd out the reads.

The five marked as reaching outside HyperCRM — creating an invitation sends a real email, publishing the website makes it public immediately, and creating a form link mints a URL anyone holding it can open. The twenty marked as able to delete are worth confirming too, particularly deleting a patient, which is permanent.

Yes. Form submissions carry clinical answers, so the whole domain sits behind the owner role rather than just its writes. That mirrors the REST API exactly — MCP is not a route around a permission the HTTP surface enforces.