Hosted MCP server for Cliniko — patients, appointments, availability, and invoices for AI agents.
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.
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.
Start time, ISO 8601 e.g. 2026-07-20T09:00:00Z (required).
Patient id (required).
Business id (required).
Practitioner id (required).
Appointment type id (required).
Appointment notes.
End time, ISO 8601. Defaults from the appointment type if omitted.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
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.
| Argument | Type | Description |
|---|---|---|
| notes | string | Appointment notes. |
| ends_at | string | End time, ISO 8601. Defaults from the appointment type if omitted. |
| starts_at* | string | Start time, ISO 8601 e.g. 2026-07-20T09:00:00Z (required). |
| patient_id* | any | Patient id (required). |
| business_id* | any | Business id (required). |
| practitioner_id* | any | Practitioner id (required). |
| appointment_type_id* | any | Appointment type id (required). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"patient_id",
"practitioner_id",
"business_id",
"appointment_type_id",
"starts_at"
],
"properties": {
"notes": {
"type": "string",
"description": "Appointment notes."
},
"ends_at": {
"type": "string",
"description": "End time, ISO 8601. Defaults from the appointment type if omitted."
},
"starts_at": {
"type": "string",
"minLength": 1,
"description": "Start time, ISO 8601 e.g. 2026-07-20T09:00:00Z (required)."
},
"patient_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Patient id (required)."
},
"business_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Business id (required)."
},
"practitioner_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Practitioner id (required)."
},
"appointment_type_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Appointment type id (required)."
}
}
}WRITE — creates a REAL new patient record in the live Cliniko practice. Requires first_name + last_name. POST /patients.
| Argument | Type | Description |
|---|---|---|
| city | string | City. |
| string | Email address. | |
| notes | string | Free-text notes. |
| state | string | State / region. |
| address_1 | string | Street address line 1. |
| last_name* | string | Patient last name (required). |
| post_code | string | Post / ZIP code. |
| first_name* | string | Patient first name (required). |
| country_code | string | ISO country code, e.g. AU. |
| phone_number | string | A phone number (stored as a Mobile phone number). |
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.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Fetch a single individual appointment by id. GET /individual_appointments/{id}.
| Argument | Type | Description |
|---|---|---|
| id* | any | Individual appointment id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Individual appointment id."
}
}
}Fetch a single invoice by id. GET /invoices/{id}.
| Argument | Type | Description |
|---|---|---|
| id* | any | Invoice id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Invoice id."
}
}
}Fetch a single patient by id. GET /patients/{id}.
| Argument | Type | Description |
|---|---|---|
| id* | any | Patient id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Patient id."
}
}
}Fetch a single treatment note by id. NOTE: treatment notes are protected health information (PHI). Read-only. GET /treatment_notes/{id}.
| Argument | Type | Description |
|---|---|---|
| id* | any | Treatment note id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Treatment note id."
}
}
}List appointment types (service definitions). GET /appointment_types.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (1-based). Default 1. |
| per_page | integer | Results per page (max 100). Default 50. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Page number (1-based). Default 1.",
"exclusiveMinimum": 0
},
"per_page": {
"type": "integer",
"maximum": 100,
"description": "Results per page (max 100). Default 50.",
"exclusiveMinimum": 0
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (1-based). Default 1. |
| sort | string | Field to sort by, e.g. created_at. |
| order | string | Sort direction. asc | desc. |
| per_page | integer | Results per page (max 100). Default 50. |
| starts_to | string | Only appointments starting before this ISO 8601 time (q[]=starts_at:<). |
| patient_id | any | Filter by patient id (q[]=patient_id:=). |
| business_id | any | Filter by business id. |
| starts_from | string | Only appointments starting at/after this ISO 8601 time (q[]=starts_at:>). |
| practitioner_id | any | Filter by practitioner id. |
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.
| Argument | Type | Description |
|---|---|---|
| to* | string | Range end yyyy-mm-dd (cannot be more than 7 days after `from`). |
| from* | string | Range start yyyy-mm-dd (cannot be more than 7 days before `to`). |
| business_id* | any | Business id (path). |
| practitioner_id* | any | Practitioner id (path). |
| appointment_type_id* | any | Appointment type id (path). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"business_id",
"practitioner_id",
"appointment_type_id",
"from",
"to"
],
"properties": {
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Range end yyyy-mm-dd (cannot be more than 7 days after `from`)."
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Range start yyyy-mm-dd (cannot be more than 7 days before `to`)."
},
"business_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Business id (path)."
},
"practitioner_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Practitioner id (path)."
},
"appointment_type_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Appointment type id (path)."
}
}
}List businesses (practice locations) in the account. GET /businesses.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (1-based). Default 1. |
| per_page | integer | Results per page (max 100). Default 50. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Page number (1-based). Default 1.",
"exclusiveMinimum": 0
},
"per_page": {
"type": "integer",
"maximum": 100,
"description": "Results per page (max 100). Default 50.",
"exclusiveMinimum": 0
}
}
}List invoices, optionally filtered by patient. GET /invoices.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (1-based). Default 1. |
| sort | string | Field to sort by, e.g. created_at. |
| order | string | Sort direction. asc | desc. |
| per_page | integer | Results per page (max 100). Default 50. |
| patient_id | any | Filter by patient id (q[]=patient_id:=). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Page number (1-based). Default 1.",
"exclusiveMinimum": 0
},
"sort": {
"type": "string",
"description": "Field to sort by, e.g. created_at."
},
"order": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort direction. asc | desc."
},
"per_page": {
"type": "integer",
"maximum": 100,
"description": "Results per page (max 100). Default 50.",
"exclusiveMinimum": 0
},
"patient_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Filter by patient id (q[]=patient_id:=)."
}
}
}Search/list patients. Name/email filters use Cliniko 'contains' matching (q[]=field:~value). GET /patients.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (1-based). Default 1. |
| sort | string | Field to sort by, e.g. created_at. |
| string | Filter by email (contains match). | |
| order | string | Sort direction. asc | desc. |
| per_page | integer | Results per page (max 100). Default 50. |
| last_name | string | Filter by last name (contains match). |
| first_name | string | Filter by first name (contains match). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Page number (1-based). Default 1.",
"exclusiveMinimum": 0
},
"sort": {
"type": "string",
"description": "Field to sort by, e.g. created_at."
},
"email": {
"type": "string",
"description": "Filter by email (contains match)."
},
"order": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort direction. asc | desc."
},
"per_page": {
"type": "integer",
"maximum": 100,
"description": "Results per page (max 100). Default 50.",
"exclusiveMinimum": 0
},
"last_name": {
"type": "string",
"description": "Filter by last name (contains match)."
},
"first_name": {
"type": "string",
"description": "Filter by first name (contains match)."
}
}
}List practitioners in the account. GET /practitioners.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (1-based). Default 1. |
| per_page | integer | Results per page (max 100). Default 50. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Page number (1-based). Default 1.",
"exclusiveMinimum": 0
},
"per_page": {
"type": "integer",
"maximum": 100,
"description": "Results per page (max 100). Default 50.",
"exclusiveMinimum": 0
}
}
}List billable products/items. GET /products.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (1-based). Default 1. |
| per_page | integer | Results per page (max 100). Default 50. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Page number (1-based). Default 1.",
"exclusiveMinimum": 0
},
"per_page": {
"type": "integer",
"maximum": 100,
"description": "Results per page (max 100). Default 50.",
"exclusiveMinimum": 0
}
}
}List treatment notes, optionally filtered by patient. NOTE: treatment notes are protected health information (PHI) — handle with care. Read-only. GET /treatment_notes.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (1-based). Default 1. |
| per_page | integer | Results per page (max 100). Default 50. |
| patient_id | any | Filter by patient id (q[]=patient_id:=). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Page number (1-based). Default 1.",
"exclusiveMinimum": 0
},
"per_page": {
"type": "integer",
"maximum": 100,
"description": "Results per page (max 100). Default 50.",
"exclusiveMinimum": 0
},
"patient_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Filter by patient id (q[]=patient_id:=)."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| from | string | Optional earliest date yyyy-mm-dd to search from. |
| business_id* | any | Business id (path). |
| practitioner_id* | any | Practitioner id (path). |
| appointment_type_id* | any | Appointment type id (path). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"business_id",
"practitioner_id",
"appointment_type_id"
],
"properties": {
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Optional earliest date yyyy-mm-dd to search from."
},
"business_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Business id (path)."
},
"practitioner_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Practitioner id (path)."
},
"appointment_type_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Appointment type id (path)."
}
}
}| date_of_birth | string | Date of birth yyyy-mm-dd. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"first_name",
"last_name"
],
"properties": {
"city": {
"type": "string",
"description": "City."
},
"email": {
"type": "string",
"description": "Email address."
},
"notes": {
"type": "string",
"description": "Free-text notes."
},
"state": {
"type": "string",
"description": "State / region."
},
"address_1": {
"type": "string",
"description": "Street address line 1."
},
"last_name": {
"type": "string",
"minLength": 1,
"description": "Patient last name (required)."
},
"post_code": {
"type": "string",
"description": "Post / ZIP code."
},
"first_name": {
"type": "string",
"minLength": 1,
"description": "Patient first name (required)."
},
"country_code": {
"type": "string",
"description": "ISO country code, e.g. AU."
},
"phone_number": {
"type": "string",
"description": "A phone number (stored as a Mobile phone number)."
},
"date_of_birth": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Date of birth yyyy-mm-dd."
}
}
}| appointment_type_id | any | Filter by appointment type id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Page number (1-based). Default 1.",
"exclusiveMinimum": 0
},
"sort": {
"type": "string",
"description": "Field to sort by, e.g. created_at."
},
"order": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort direction. asc | desc."
},
"per_page": {
"type": "integer",
"maximum": 100,
"description": "Results per page (max 100). Default 50.",
"exclusiveMinimum": 0
},
"starts_to": {
"type": "string",
"description": "Only appointments starting before this ISO 8601 time (q[]=starts_at:<)."
},
"patient_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Filter by patient id (q[]=patient_id:=)."
},
"business_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Filter by business id."
},
"starts_from": {
"type": "string",
"description": "Only appointments starting at/after this ISO 8601 time (q[]=starts_at:>)."
},
"practitioner_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Filter by practitioner id."
},
"appointment_type_id": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "string",
"minLength": 1
}
],
"description": "Filter by appointment type id."
}
}
}