Cliniko MCP by usefulapi
by usefulapi.io · remote · no sign-in to list tools · v1.16.3 · published by io.usefulapi
Hosted MCP server for Cliniko — patients, appointments, availability, and invoices for AI agents.
17 tools: 2 can delete or cancel things and 15 only read.
Scanned Oct 21, 2026
- Deletes or cancels2Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads15Claude Code: allow: see these tools
No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http cliniko https://cliniko.usefulapi.io/mcpTools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
17 tools
Deletes or cancels 2Claude Code: deny
cliniko_create_appointmentWRITE — books a REAL new individual appointment in the live Cliniko practice.No findings
Why it is in this group
- The name "cliniko_create_appointment" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it WRITE — books a REAL new individual appointment in the live Cliniko practice. Requires patient_id, practitioner_id, business_id, appointment_type_id, and starts_at (ISO 8601). ends_at defaults from the appointment type if omitted. POST /individual_appointments.
Annotations the server declares
- title: Create an appointment
- destructiveHint: true
cliniko_create_patientWRITE — creates a REAL new patient record in the live Cliniko practice.No findings
Why it is in this group
- The name "cliniko_create_patient" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it WRITE — creates a REAL new patient record in the live Cliniko practice. Requires first_name + last_name. POST /patients.
Annotations the server declares
- title: Create a patient
- destructiveHint: true
Only reads 15Claude Code: allow
cliniko_get_accountGet the Cliniko account and subscription details for the authenticated API key.No findings
Why it is in this group
- The name "cliniko_get_account" says "get": a word for reading.
Description, as the server wrote it Get the Cliniko account and subscription details for the authenticated API key. A good first call to sanity-check auth, shard, and User-Agent. GET /account.
Annotations the server declares
- title: Get account details
- readOnlyHint: true
cliniko_get_appointmentFetch a single individual appointment by id.No findings
Why it is in this group
- The name "cliniko_get_appointment" says "get": a word for reading.
Description, as the server wrote it Fetch a single individual appointment by id. GET /individual_appointments/{id}.
Annotations the server declares
- title: Get an appointment
- readOnlyHint: true
cliniko_get_invoiceFetch a single invoice by id.No findings
Why it is in this group
- The name "cliniko_get_invoice" says "get": a word for reading.
Description, as the server wrote it Fetch a single invoice by id. GET /invoices/{id}.
Annotations the server declares
- title: Get an invoice
- readOnlyHint: true
cliniko_get_patientFetch a single patient by id.No findings
Why it is in this group
- The name "cliniko_get_patient" says "get": a word for reading.
Description, as the server wrote it Fetch a single patient by id. GET /patients/{id}.
Annotations the server declares
- title: Get a patient
- readOnlyHint: true
cliniko_get_treatment_noteFetch a single treatment note by id.No findings
Why it is in this group
- The name "cliniko_get_treatment_note" says "get": a word for reading.
Description, as the server wrote it Fetch a single treatment note by id. NOTE: treatment notes are protected health information (PHI). Read-only. GET /treatment_notes/{id}.
Annotations the server declares
- title: Get a treatment note
- readOnlyHint: true
cliniko_list_appointment_typesList appointment types (service definitions).No findings
Why it is in this group
- The name "cliniko_list_appointment_types" says "list": a word for reading.
Description, as the server wrote it List appointment types (service definitions). GET /appointment_types.
Annotations the server declares
- title: List appointment types
- readOnlyHint: true
cliniko_list_appointmentsList individual appointments, optionally filtered by patient/practitioner/business/type and a starts_at date-time window (starts_from / starts_to, ISO 8601).No findings
Why it is in this group
- The name "cliniko_list_appointments" says "list": a word for reading.
Description, as the server wrote it List individual appointments, optionally filtered by patient/practitioner/business/type and a starts_at date-time window (starts_from / starts_to, ISO 8601). GET /individual_appointments.
Annotations the server declares
- title: List appointments
- readOnlyHint: true
cliniko_list_available_timesList bookable appointment slots for a business + practitioner + appointment type within a date range (from/to, yyyy-mm-dd, span <= 7 days).No findings
Why it is in this group
- The name "cliniko_list_available_times" says "list": a word for reading.
Description, as the server wrote it List bookable appointment slots for a business + practitioner + appointment type within a date range (from/to, yyyy-mm-dd, span <= 7 days). High-value booking-slot lookup. GET /businesses/{business_id}/practitioners/{practitioner_id}/appointment_types/{appointment_type_id}/available_times.
Annotations the server declares
- title: List available times
- readOnlyHint: true
cliniko_list_businessesList businesses (practice locations) in the account.No findings
Why it is in this group
- The name "cliniko_list_businesses" says "list": a word for reading.
Description, as the server wrote it List businesses (practice locations) in the account. GET /businesses.
Annotations the server declares
- title: List businesses
- readOnlyHint: true
cliniko_list_invoicesList invoices, optionally filtered by patient.No findings
Why it is in this group
- The name "cliniko_list_invoices" says "list": a word for reading.
Description, as the server wrote it List invoices, optionally filtered by patient. GET /invoices.
Annotations the server declares
- title: List invoices
- readOnlyHint: true
cliniko_list_patientsSearch/list patients.No findings
Why it is in this group
- The name "cliniko_list_patients" says "list": a word for reading.
Description, as the server wrote it Search/list patients. Name/email filters use Cliniko 'contains' matching (q[]=field:~value). GET /patients.
Annotations the server declares
- title: List patients
- readOnlyHint: true
cliniko_list_practitionersList practitioners in the account.No findings
Why it is in this group
- The name "cliniko_list_practitioners" says "list": a word for reading.
Description, as the server wrote it List practitioners in the account. GET /practitioners.
Annotations the server declares
- title: List practitioners
- readOnlyHint: true
cliniko_list_productsList billable products/items.No findings
Why it is in this group
- The name "cliniko_list_products" says "list": a word for reading.
Description, as the server wrote it List billable products/items. GET /products.
Annotations the server declares
- title: List products
- readOnlyHint: true
cliniko_list_treatment_notesList treatment notes, optionally filtered by patient.No findings
Why it is in this group
- The name "cliniko_list_treatment_notes" says "list": a word for reading.
Description, as the server wrote it List treatment notes, optionally filtered by patient. NOTE: treatment notes are protected health information (PHI) — handle with care. Read-only. GET /treatment_notes.
Annotations the server declares
- title: List treatment notes
- readOnlyHint: true
cliniko_next_available_timeGet the single next bookable slot for a business + practitioner + appointment type (optionally from a date).No findings
Why it is in this group
- The description's first verb is "get": a word for reading.
Description, as the server wrote it Get the single next bookable slot for a business + practitioner + appointment type (optionally from a date). GET /businesses/{business_id}/practitioners/{practitioner_id}/appointment_types/{appointment_type_id}/next_available_time.
Annotations the server declares
- title: Next available time
- readOnlyHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.16.3. Values in angle brackets are yours to fill in.
claude mcp add --transport http cliniko https://cliniko.usefulapi.io/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__cliniko__cliniko_get_account",
"mcp__cliniko__cliniko_list_patients",
"mcp__cliniko__cliniko_get_patient",
"mcp__cliniko__cliniko_list_appointments",
"mcp__cliniko__cliniko_get_appointment",
"mcp__cliniko__cliniko_list_practitioners",
"mcp__cliniko__cliniko_list_businesses",
"mcp__cliniko__cliniko_list_appointment_types",
"mcp__cliniko__cliniko_list_products",
"mcp__cliniko__cliniko_list_invoices",
"mcp__cliniko__cliniko_get_invoice",
"mcp__cliniko__cliniko_list_treatment_notes",
"mcp__cliniko__cliniko_get_treatment_note",
"mcp__cliniko__cliniko_list_available_times",
"mcp__cliniko__cliniko_next_available_time"
],
"ask": [],
"deny": [
"mcp__cliniko__cliniko_create_patient",
"mcp__cliniko__cliniko_create_appointment"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as cliniko. Review it before you use it.