For dental practices

A patient asks their assistant what a check-up costs. Your fee guide answers. The assistant cannot reliably read it.

UK dental practices publish their fees. That is unusual, and it should be an advantage the moment someone asks an AI assistant to find a dentist and a price. It is not, because the fees are published for human eyes only. Ajar serves the same fees in a shape a machine parses exactly, and gives assistants an address to send the patient's request to, held for your approval.

What we measured, before writing this page

Ten UK dental practice sites, ten cities, checked 31 July 2026. Found by searching the vertical and city only, no price words, so the sample is not biased toward practices that publish fees.

Publish a visible price for at least one treatment10 of 10
Publish a full fee schedule, not just examples9 of 10
Publish any price in structured data a machine reads reliably0 of 10
Have anywhere an assistant can send a request0 of 10
Serve a real llms.txt3 of 10

The gap has texture. One fee table carries its pound sign once, in the column header, so every number below it is a bare figure to a text extractor. Four of the ten quote headline fees as From-prices. One practice marks up its whole treatment catalogue in schema.org Offer terms and leaves every price field empty. And one fee schedule runs to 103 priced lines that no machine can do anything with. Two chain sites hit during sampling refused a non-browser fetch outright and had to be substituted out; the bigger the operator, the less readable the site. The full survey — method, all 20 rows across dental and physio, and the six extraction traps — is published at the UK practice price survey. We then ran five recorded assistant sessions against sites from it, asking what a check-up costs and whether it could be booked: two prices read cleanly, three did not, none could be booked — written up at can an AI assistant book you a dentist appointment?

Five questions an assistant asks before it names a dentist

These decide whether your practice is recommended or skipped. Four are answered with no model in the path, so a fee is never invented. Nothing here gives clinical advice, and no symptom has to be typed into a request.

What does a new-patient examination cost?

list_services

Every treatment comes back as a price object: model, amount, currency, VAT flag and a display string. A From-price is a first-class model, not an error, because that is how half the fee guides we read actually price. The assistant repeats your number instead of saying "fees on application" and moving to the next practice.

Are you taking on new patients, private or on a plan?

get_faq

Your own wording, returned verbatim and filterable by substring. Whether you take new patients, how your membership plan works, what a deposit covers: sentences you write once and correct in one place, not something a model infers from a news post.

Can they see me tomorrow evening?

check_hours

Pass an ISO 8601 datetime, get back whether the practice is open at that instant and when it next opens. A closed Saturday is an answer with a next opening attached, not a dead end that sends the patient elsewhere.

What exactly does that treatment include?

get_service

One treatment by id: its price, duration, whether it can be booked, any published deposit terms, and the address of its own page. Each service you list gets a stable URL with structured data on it, so "scale and polish" is a thing an assistant can cite, not a row in a PDF.

Can you book me in for a check-up?

request_booking

The request is validated against the intake fields you defined, then held. The response tells the assistant, in plain language, that nothing is booked or bound until the practice confirms. It carries a name and a contact, never a symptom, and it does not become an appointment until your front desk says so.

The same thing, on the wire

Nine MCP tools over JSON-RPC. Seven deterministic reads, two gated writes. Captured from the live UK demo practice on 4 August 2026, read-only calls, responses verbatim.

# Wrenfield Dental Practice, our own demonstration tenant. Descriptions shortened. $ curl -sS https://agents.ajarhq.com/t/ajar-demo-dental/mcp \ -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' {"jsonrpc":"2.0","id":1,"result":{"tools":[ {"name":"get_business_info","description":"Business profile: name, category ..."}, {"name":"list_services", "description":"All services with prices ..."}, {"name":"get_service", "description":"One service by id: its price ..."}, {"name":"check_hours", "description":"Whether the business is open ..."}, {"name":"check_availability","description":"Candidate start times, not a confirmed diary ..."}, {"name":"request_quote", "description":"Submit a quote request. Gated ..."}, {"name":"request_booking", "description":"Submit a booking request ... Gated ..."}, {"name":"get_request_status","description":"What happened to a request already submitted ..."}, {"name":"get_faq", "description":"FAQ entries, optionally filtered ..."}]}} # tools/call list_services -> result.content[0].text, decoded. Four of five, descriptions cut. [{"id":"new-patient-examination","name":"New patient examination", "price":{"model":"fixed","amount":95,"currency":"GBP","display":"£95"}, "duration_min":30,"bookable":true}, {"id":"routine-examination","name":"Routine examination", "price":{"model":"fixed","amount":65,"currency":"GBP","display":"£65"}, "duration_min":20,"bookable":true}, {"id":"white-filling","name":"White filling", "price":{"model":"from","amount":167,"currency":"GBP","display":"from £167"}, "duration_min":45,"bookable":false}, {"id":"dental-implant","name":"Dental implant", "price":{"model":"quote","amount":null,"currency":"GBP","display":"quote on request"}, "duration_min":null,"bookable":false}] # tools/call check_hours {"datetime":"2026-08-04T18:30:00+01:00"} { "open": false, "hours_published": true, "timezone": "Europe/London", "day": "tue", "next_open": { "day": "wed", "time": "09:00" } }

Wrenfield Dental Practice is ours and it is fictional — its own page says so, its number is one of the ranges Ofcom reserves for drama, and its address is a street that does not exist. Everything else about it is real: the fees are the levels the survey measured, a From price and a quote-only line sit next to the fixed ones, and "Monday to Friday 9am – 5pm" was typed in the way a practice site writes it and read into five days, answered in London time. Open the page or point your own assistant at it.

An honest note about the numbers. The ten-site survey says machines cannot read dental fees today; it does not say patients are currently lost over it, and we will not pretend to know that. Agent fetches are discovery evidence, not proven demand. Being readable means an assistant can find your examination fee and your new-patient status. It does not mean a patient sat in the chair. We count what we can and report it as what it is: sampled, best-effort, a lower bound with unknown error bars.

Open a page for your practice

Or read the demonstration practice first, then who is already answering: the public directory.