Front-desk revenue loss calculator and website AI-search check for health clinics, by HeyCAi
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Facts about HeyCAi, the publisher of these tools, from its own website: what its AI receptionist does for clinics, the practice software it books into, its languages, how it introduces itself to patients, and links to its pricing calculator, demo and contact pages. Use it only when the user asks about HeyCAi. lang: en (default) or es.
Language of the answer: en (default) or es.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http clinic-tools https://www.heycai.ai/mcp
Facts about HeyCAi, the publisher of these tools, from its own website: what its AI receptionist does for clinics, the practice software it books into, its languages, how it introduces itself to patients, and links to its pricing calculator, demo and contact pages. Use it only when the user asks about HeyCAi. lang: en (default) or es.
| Argument | Type | Description |
|---|---|---|
| lang | string | Language of the answer: en (default) or es. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"lang": {
"enum": [
"en",
"es"
],
"type": "string",
"default": "en",
"description": "Language of the answer: en (default) or es."
}
}
}Checks a health clinic's public website for what lets Google and AI search engines read and cite it. Fetches only the home page, /robots.txt, /llms.txt and /sitemap.xml of the address given, and returns structured findings: which AI crawlers robots.txt lets read the home page (GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended, Bingbot), llms.txt and sitemap presence, HTTPS, title and meta description, noindex, clinic schema.org JSON-LD (type, name, address, telephone, opening hours), hreflang, and one-tap call, WhatsApp and booking links, with a prioritised list of fixes. Reads public pages only and returns no page text beyond the title and meta description.
| Argument | Type | Description |
|---|---|---|
| url* | string | The clinic website, for example https://www.example-clinic.com (http or https; a bare domain works). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"minLength": 4,
"description": "The clinic website, for example https://www.example-clinic.com (http or https; a bare domain works)."
}
}
}Estimates how much revenue a health clinic loses each month to unanswered phone calls, WhatsApp conversations that wait for a reply, and no-shows, from figures the clinic provides (a single value or a low–high range for each). A leak without its figures comes back as pending with the figures it needs; nothing is filled with averages or benchmarks. Returns monthly and yearly amounts per leak with the arithmetic, a check against the clinic's free appointment slots, and categories of fixes. Counts and percentages only: never send patient names or records.
| Argument | Type | Description |
|---|---|---|
| currency | string | ISO 4217 code of the clinic's currency, such as EUR, GBP or USD: money in the result then carries its symbol. |
| feePerVisit | any | F: Average fee per visit (the clinic's currency). A number, or {"low", "high"} for a range. |
| noShowPercent | any | R: No-shows: the patient does not come and gives no notice (% of booked appointments). A number, or {"low", "high"} for a range. 0–100: 30 means 30%. |
| newPatientValue | any | V: Revenue from one new patient (the clinic's currency). A number, or {"low", "high"} for a range. |
| callDaysPerMonth | any | D: Days a month the calls in `C` come in (days per month). A number, or {"low", "high"} for a range. |
| freeSlotsPerMonth |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 14, 2026.
| any |
| K: Free appointment slots: appointments the clinic could still book in a month with its current team and hours (appointments per month). A number, or {"low", "high"} for a range. |
| inboundCallsPerDay | any | C: Inbound calls (calls per day). A number, or {"low", "high"} for a range. |
| appointmentsPerWeek | any | A: Appointments booked (appointments per week). A number, or {"low", "high"} for a range. |
| visitsPerNewPatient | any | T: Visits per new patient, on average (visits). A number, or {"low", "high"} for a range. |
| appointmentsPerMonth | any | A: Appointments booked (appointments per month). A number, or {"low", "high"} for a range. |
| inboundCallsPerMonth | any | C×D: Inbound calls (calls per month). A number, or {"low", "high"} for a range. |
| whatsappDaysPerMonth | any | Dw: Days a month messages come in (messages can arrive on closed days too: ask) (days per month). A number, or {"low", "high"} for a range. |
| refilledNoShowPercent | any | S: Of the no-show slots, the share filled again by another patient (% of no-shows). A number, or {"low", "high"} for a range. 0–100: 30 means 30%. |
| repeatAttemptsPercent | any | X: If `Mu` is not available: of the unanswered calls, the share that are repeat attempts by a caller already counted (% of unanswered calls). A number, or {"low", "high"} for a range. 0–100: 30 means 30%. |
| newPatientCallsPercent | any | N: Calls that come from new patients (% of inbound calls). A number, or {"low", "high"} for a range. 0–100: 30 means 30%. |
| newPatientsLostPercent | any | L: New patients not reached who never call back or book (% of new patients not reached). A number, or {"low", "high"} for a range. 0–100: 30 means 30%. |
| unansweredCallsPercent | any | U: Calls not answered (missed, abandoned or sent to voicemail) (% of inbound calls). A number, or {"low", "high"} for a range. 0–100: 30 means 30%. |
| whatsappWaitingPercent | any | O: Conversations that wait for a reply: sent outside opening hours, or left unanswered (% of conversations). A number, or {"low", "high"} for a range. 0–100: 30 means 30%. |
| afterHoursMissedPercent | any | Uout: Optional: of the unanswered calls, the share made outside opening hours (% of unanswered calls). A number, or {"low", "high"} for a range. 0–100: 30 means 30%. |
| whatsappNewPatientPercent | any | Nw: Conversations from new patients (% of conversations). A number, or {"low", "high"} for a range. 0–100: 30 means 30%. |
| uniqueMissedCallersPerMonth | any | Mu: Best, if the report gives it: unique numbers among the unanswered calls, each caller counted once however many times they called (numbers per month). A number, or {"low", "high"} for a range. |
| whatsappConversationsPerDay | any | W: WhatsApp conversations started by patients (count people, not individual messages) (conversations per day). A number, or {"low", "high"} for a range. |
| whatsappConversationsPerMonth | any | W×Dw: WhatsApp conversations started by patients (count people, not individual messages) (conversations per month). A number, or {"low", "high"} for a range. |
| whatsappNewPatientsLostPercent | any | Lw: Of the new patients who waited, the share who never booked (% of those who waited). A number, or {"low", "high"} for a range. 0–100: 30 means 30%. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "ISO 4217 code of the clinic's currency, such as EUR, GBP or USD: money in the result then carries its symbol."
},
"feePerVisit": {
"anyOf": [
{
"type": "number",
"maximum": 1000000,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 1000000,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 1000000,
"minimum": 0
}
}
}
],
"description": "F: Average fee per visit (the clinic's currency). A number, or {\"low\", \"high\"} for a range."
},
"noShowPercent": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
}
],
"description": "R: No-shows: the patient does not come and gives no notice (% of booked appointments). A number, or {\"low\", \"high\"} for a range. 0–100: 30 means 30%."
},
"newPatientValue": {
"anyOf": [
{
"type": "number",
"maximum": 1000000,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 1000000,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 1000000,
"minimum": 0
}
}
}
],
"description": "V: Revenue from one new patient (the clinic's currency). A number, or {\"low\", \"high\"} for a range."
},
"callDaysPerMonth": {
"anyOf": [
{
"type": "number",
"maximum": 31,
"minimum": 1
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 31,
"minimum": 1
},
"high": {
"type": "number",
"maximum": 31,
"minimum": 1
}
}
}
],
"description": "D: Days a month the calls in `C` come in (days per month). A number, or {\"low\", \"high\"} for a range."
},
"freeSlotsPerMonth": {
"anyOf": [
{
"type": "number",
"maximum": 400000,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 400000,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 400000,
"minimum": 0
}
}
}
],
"description": "K: Free appointment slots: appointments the clinic could still book in a month with its current team and hours (appointments per month). A number, or {\"low\", \"high\"} for a range."
},
"inboundCallsPerDay": {
"anyOf": [
{
"type": "number",
"maximum": 10000,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 10000,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 10000,
"minimum": 0
}
}
}
],
"description": "C: Inbound calls (calls per day). A number, or {\"low\", \"high\"} for a range."
},
"appointmentsPerWeek": {
"anyOf": [
{
"type": "number",
"maximum": 100000,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 100000,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 100000,
"minimum": 0
}
}
}
],
"description": "A: Appointments booked (appointments per week). A number, or {\"low\", \"high\"} for a range."
},
"visitsPerNewPatient": {
"anyOf": [
{
"type": "number",
"maximum": 1000,
"exclusiveMinimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 1000,
"exclusiveMinimum": 0
},
"high": {
"type": "number",
"maximum": 1000,
"exclusiveMinimum": 0
}
}
}
],
"description": "T: Visits per new patient, on average (visits). A number, or {\"low\", \"high\"} for a range."
},
"appointmentsPerMonth": {
"anyOf": [
{
"type": "number",
"maximum": 400000,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 400000,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 400000,
"minimum": 0
}
}
}
],
"description": "A: Appointments booked (appointments per month). A number, or {\"low\", \"high\"} for a range."
},
"inboundCallsPerMonth": {
"anyOf": [
{
"type": "number",
"maximum": 300000,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 300000,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 300000,
"minimum": 0
}
}
}
],
"description": "C×D: Inbound calls (calls per month). A number, or {\"low\", \"high\"} for a range."
},
"whatsappDaysPerMonth": {
"anyOf": [
{
"type": "number",
"maximum": 31,
"minimum": 1
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 31,
"minimum": 1
},
"high": {
"type": "number",
"maximum": 31,
"minimum": 1
}
}
}
],
"description": "Dw: Days a month messages come in (messages can arrive on closed days too: ask) (days per month). A number, or {\"low\", \"high\"} for a range."
},
"refilledNoShowPercent": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
}
],
"description": "S: Of the no-show slots, the share filled again by another patient (% of no-shows). A number, or {\"low\", \"high\"} for a range. 0–100: 30 means 30%."
},
"repeatAttemptsPercent": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
}
],
"description": "X: If `Mu` is not available: of the unanswered calls, the share that are repeat attempts by a caller already counted (% of unanswered calls). A number, or {\"low\", \"high\"} for a range. 0–100: 30 means 30%."
},
"newPatientCallsPercent": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
}
],
"description": "N: Calls that come from new patients (% of inbound calls). A number, or {\"low\", \"high\"} for a range. 0–100: 30 means 30%."
},
"newPatientsLostPercent": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
}
],
"description": "L: New patients not reached who never call back or book (% of new patients not reached). A number, or {\"low\", \"high\"} for a range. 0–100: 30 means 30%."
},
"unansweredCallsPercent": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
}
],
"description": "U: Calls not answered (missed, abandoned or sent to voicemail) (% of inbound calls). A number, or {\"low\", \"high\"} for a range. 0–100: 30 means 30%."
},
"whatsappWaitingPercent": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
}
],
"description": "O: Conversations that wait for a reply: sent outside opening hours, or left unanswered (% of conversations). A number, or {\"low\", \"high\"} for a range. 0–100: 30 means 30%."
},
"afterHoursMissedPercent": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
}
],
"description": "Uout: Optional: of the unanswered calls, the share made outside opening hours (% of unanswered calls). A number, or {\"low\", \"high\"} for a range. 0–100: 30 means 30%."
},
"whatsappNewPatientPercent": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
}
],
"description": "Nw: Conversations from new patients (% of conversations). A number, or {\"low\", \"high\"} for a range. 0–100: 30 means 30%."
},
"uniqueMissedCallersPerMonth": {
"anyOf": [
{
"type": "number",
"maximum": 300000,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 300000,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 300000,
"minimum": 0
}
}
}
],
"description": "Mu: Best, if the report gives it: unique numbers among the unanswered calls, each caller counted once however many times they called (numbers per month). A number, or {\"low\", \"high\"} for a range."
},
"whatsappConversationsPerDay": {
"anyOf": [
{
"type": "number",
"maximum": 10000,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 10000,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 10000,
"minimum": 0
}
}
}
],
"description": "W: WhatsApp conversations started by patients (count people, not individual messages) (conversations per day). A number, or {\"low\", \"high\"} for a range."
},
"whatsappConversationsPerMonth": {
"anyOf": [
{
"type": "number",
"maximum": 300000,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 300000,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 300000,
"minimum": 0
}
}
}
],
"description": "W×Dw: WhatsApp conversations started by patients (count people, not individual messages) (conversations per month). A number, or {\"low\", \"high\"} for a range."
},
"whatsappNewPatientsLostPercent": {
"anyOf": [
{
"type": "number",
"maximum": 100,
"minimum": 0
},
{
"type": "object",
"required": [
"low",
"high"
],
"properties": {
"low": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"high": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
}
],
"description": "Lw: Of the new patients who waited, the share who never booked (% of those who waited). A number, or {\"low\", \"high\"} for a range. 0–100: 30 means 30%."
}
}
}