Acuity Scheduling MCP by usefulapi
Read appointments, types, calendars and availability; create, cancel or reschedule bookings.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"acuity-scheduling": {
"url": "https://acuity-scheduling.usefulapi.io/mcp"
}
}
}Remote endpoints
https://acuity-scheduling.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (18)
🟢acuity_list_appointments(max, offset, view, excludeForms, minDate, ...)
List appointments scheduled on the account. For bulk contact/parent lists, use view: contacts to return only id, firstName, lastName, email, phone and datetime, without forms/formsText. Contacts view or an explicit offset returns {appointments, pagination}; follow pagination.nextOffset with identical filters until null. Pages fit below the tool output cap and can contain fewer than max rows. Offsets are connector-managed by fetching a prefix (Acuity has no documented native offset); at 10,000 appointments per filter/date window, narrow minDate/maxDate and restart at 0. Appointments may change between calls; deduplicate by id. Default full view without offset preserves the original array response. Acuity REST: GET /appointments.
Input Schema
{
"type": "object",
"properties": {
"max": {
"description": "Max appointments to return (default 100). Paginated output may return fewer to fit the output cap; follow nextOffset.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"offset": {
"description": "Zero-based connector offset; enables paginated output. Start at 0, then use pagination.nextOffset with the same filters. At 10,000 rows, narrow the date range.",
"type": "integer",
"minimum": 0,
"maximum": 9999
},
"view": {
"description": "full (default): appointment details. contacts: only id, firstName, lastName, email, phone and datetime, in a compact paginated response; excludes intake forms and notes.",
"type": "string",
"enum": [
"full",
"contacts"
]
},
"excludeForms": {
"description": "Omit forms and formsText, including from full-view results. Automatically true for contacts view. Uses Acuity's excludeForms parameter.",
"type": "boolean"
},
"minDate": {
"description": "Only appointments on/after this date (YYYY-MM-DD or ISO datetime).",
"type": "string"
},
"maxDate": {
"description": "Only appointments on/before this date (YYYY-MM-DD or ISO datetime).",
"type": "string"
},
"calendarID": {
"description": "Filter to a specific calendar id.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"appointmentTypeID": {
"description": "Filter to a specific appointment type id.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"canceled": {
"description": "If true, return canceled appointments (default false).",
"type": "boolean"
},
"email": {
"description": "Filter by client email.",
"type": "string"
},
"firstName": {
"description": "Filter by client first name.",
"type": "string"
},
"lastName": {
"description": "Filter by client last name.",
"type": "string"
},
"direction": {
"description": "Sort order by datetime. Acuity defaults to DESC; paginated calls use DESC unless specified.",
"type": "string",
"enum": [
"ASC",
"DESC"
]
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_get_appointment(id)
Get a single appointment by its id. Acuity REST: GET /appointments/{id}.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Appointment id."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_list_appointment_types(includeDeleted)
List the account's appointment types (services and classes), including price, duration and calendars. Acuity REST: GET /appointment-types.
Input Schema
{
"type": "object",
"properties": {
"includeDeleted": {
"description": "If true, also include deleted/inactive appointment types.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_list_calendars
List the account's calendars (staff/resources appointments can be booked on). Acuity REST: GET /calendars.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_availability_dates(appointmentTypeID, month, calendarID, timezone)
List dates in a month that have availability for an appointment type. Acuity REST: GET /availability/dates.
Input Schema
{
"type": "object",
"properties": {
"appointmentTypeID": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Appointment type id to check availability for (required)."
},
"month": {
"type": "string",
"description": "Month to check, formatted YYYY-MM, e.g. '2026-08'."
},
"calendarID": {
"description": "Restrict to a specific calendar id.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"timezone": {
"description": "IANA timezone for the returned dates, e.g. 'America/New_York'.",
"type": "string"
}
},
"required": [
"appointmentTypeID",
"month"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_availability_times(appointmentTypeID, date, calendarID, timezone)
List available time slots on a given date for an appointment type. Acuity REST: GET /availability/times.
Input Schema
{
"type": "object",
"properties": {
"appointmentTypeID": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Appointment type id to check availability for (required)."
},
"date": {
"type": "string",
"description": "Date to check, formatted YYYY-MM-DD, e.g. '2026-08-15'."
},
"calendarID": {
"description": "Restrict to a specific calendar id.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"timezone": {
"description": "IANA timezone for the returned times, e.g. 'America/New_York'.",
"type": "string"
}
},
"required": [
"appointmentTypeID",
"date"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_availability_classes(appointmentTypeID, month, includeUnavailable, timezone)
List group class time slots (for class-type appointment types) in a month. Acuity REST: GET /availability/classes.
Input Schema
{
"type": "object",
"properties": {
"appointmentTypeID": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Class appointment type id (required)."
},
"month": {
"type": "string",
"description": "Month to check, formatted YYYY-MM, e.g. '2026-08'."
},
"includeUnavailable": {
"description": "If true, also include full/unavailable class times.",
"type": "boolean"
},
"timezone": {
"description": "IANA timezone for the returned times, e.g. 'America/New_York'.",
"type": "string"
}
},
"required": [
"appointmentTypeID",
"month"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_list_clients(search)
List clients on the account, optionally filtered by a search string (name/email/phone). Acuity REST: GET /clients.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Optional search string to match client name, email, or phone.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_list_forms
List the account's custom intake forms and their fields. Acuity REST: GET /forms.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_list_products
List the account's products / packages / gift certificates for sale. Acuity REST: GET /products.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_list_orders(max, email)
List store orders (product / package / gift-certificate purchases). Acuity REST: GET /orders.
Input Schema
{
"type": "object",
"properties": {
"max": {
"description": "Max orders to return.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"email": {
"description": "Filter orders by buyer email.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_list_blocks(max, minDate, maxDate, calendarID)
List blocked-off (unavailable) time ranges on the account's calendars. Acuity REST: GET /blocks.
Input Schema
{
"type": "object",
"properties": {
"max": {
"description": "Max blocks to return.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"minDate": {
"description": "Only blocks on/after this date (YYYY-MM-DD or ISO datetime).",
"type": "string"
},
"maxDate": {
"description": "Only blocks on/before this date (YYYY-MM-DD or ISO datetime).",
"type": "string"
},
"calendarID": {
"description": "Filter to a specific calendar id.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_list_labels
List the appointment labels (colored tags) defined on the account. Acuity REST: GET /labels.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢acuity_get_me
Get the authenticated Acuity account's profile (name, email, timezone, plan, currency). Acuity REST: GET /me.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴acuity_create_appointment(appointmentTypeID, datetime, firstName, lastName, email, ...)
CREATES a new appointment (books a client into a time slot). This MODIFIES the calendar and, unless suppressed, may send confirmation emails. Acuity REST: POST /appointments.
Input Schema
{
"type": "object",
"properties": {
"appointmentTypeID": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Appointment type id to book (required)."
},
"datetime": {
"type": "string",
"description": "Start time in ISO 8601 with offset, e.g. '2026-08-15T14:00:00-0400' (required)."
},
"firstName": {
"type": "string",
"description": "Client first name (required)."
},
"lastName": {
"type": "string",
"description": "Client last name (required)."
},
"email": {
"type": "string",
"description": "Client email (required)."
},
"calendarID": {
"description": "Calendar id to book on (defaults to an available one).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"phone": {
"description": "Client phone number.",
"type": "string"
},
"timezone": {
"description": "IANA timezone for the datetime, e.g. 'America/New_York'.",
"type": "string"
},
"notes": {
"description": "Notes to attach to the appointment.",
"type": "string"
},
"fields": {
"description": "Intake form field answers, each { id, value }.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Intake form field id."
},
"value": {
"type": "string",
"description": "Field value."
}
},
"required": [
"id",
"value"
]
}
},
"admin": {
"description": "If true, book as admin — bypasses availability checks and required-form enforcement. Default false.",
"type": "boolean"
},
"noEmail": {
"description": "If true, suppress client/owner confirmation emails.",
"type": "boolean"
}
},
"required": [
"appointmentTypeID",
"datetime",
"firstName",
"lastName",
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴acuity_cancel_appointment(id, cancelNote, admin, noEmail)
CANCELS an existing appointment. This MODIFIES the calendar and, unless suppressed, may send cancellation emails. Acuity REST: PUT /appointments/{id}/cancel.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Appointment id to cancel (required)."
},
"cancelNote": {
"description": "Optional note explaining the cancellation.",
"type": "string"
},
"admin": {
"description": "If true, cancel as admin (bypasses client cancellation restrictions).",
"type": "boolean"
},
"noEmail": {
"description": "If true, suppress cancellation emails.",
"type": "boolean"
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴acuity_reschedule_appointment(id, datetime, calendarID, admin, noEmail)
RESCHEDULES an existing appointment to a new time (and optionally a new calendar). This MODIFIES the calendar and, unless suppressed, may send update emails. Acuity REST: PUT /appointments/{id}/reschedule.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Appointment id to reschedule (required)."
},
"datetime": {
"type": "string",
"description": "New start time in ISO 8601 with offset, e.g. '2026-08-16T10:00:00-0400' (required)."
},
"calendarID": {
"description": "Move the appointment to this calendar id.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"admin": {
"description": "If true, reschedule as admin (bypasses availability checks).",
"type": "boolean"
},
"noEmail": {
"description": "If true, suppress reschedule emails.",
"type": "boolean"
}
},
"required": [
"id",
"datetime"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴acuity_create_client(firstName, lastName, email, phone, notes)
CREATES a new client record in the account's client list. This ADDS data to the account. Acuity REST: POST /clients.
Input Schema
{
"type": "object",
"properties": {
"firstName": {
"type": "string",
"description": "Client first name (required)."
},
"lastName": {
"type": "string",
"description": "Client last name (required)."
},
"email": {
"description": "Client email.",
"type": "string"
},
"phone": {
"description": "Client phone number.",
"type": "string"
},
"notes": {
"description": "Notes about the client.",
"type": "string"
}
},
"required": [
"firstName",
"lastName"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence