Acuity Scheduling MCP by usefulapi

Read appointments, types, calendars and availability; create, cancel or reschedule bookings.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
78%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,277Tokens (tool definitions)
~1.5 KBTypical response size
Significant attention impact (2.56% of 128k context)

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-http

What it can do

Tool inventory

Tools (18)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded18 tools
verifiedversion not recorded18 tools
verifiedversion not recorded18 tools
verifiedversion not recorded18 tools
failed observationversion not recorded—