Skip to main content
The Cal ID MCP server exposes 58 tools. You rarely need to call them by name — describe what you want and your assistant picks the right one. This reference is for when you’re debugging, checking whether something is possible, or writing a prompt that has to be precise.
Every tool runs the equivalent REST API call as you. Each tool’s own description ends with the route it maps to — for example create_booking reports [POST /booking/] — so you can always trace a tool back to the API reference.

Bookings

Despite the singular name, get_booking lists bookings. Use get_booking_by_id for one specific booking. This mirrors the REST API, where the collection lives at /booking/.

Slots

Event types

Availability and schedules

A schedule is a named set of working hours. An availability is a rule inside one.

Contacts

Teams

Team slugs are globally unique across all of Cal ID, not just your account. create_team can fail with a conflict even when you have no teams at all — the slug is simply taken by someone else. Pick a more specific slug and retry.

Team event types

Team members

Webhooks

MCP can manage webhook subscriptions. It cannot receive deliveries — those go to your own server. See Build a webhook receiver.

Profile

Diagnostics

get_diagnostics_client_ip is a temporary internal diagnostic. Don’t build anything on it — it may be removed without notice.

Booking through MCP

This is the single most common failure, and it is not a bug.
You cannot work out bookable times yourself. A time that looks perfectly valid — a weekday, inside your working hours, matching what your booking page shows — can still be rejected with no_available_users_found_error.Always call get_slots first, then book a time it actually returned.
The correct sequence:
1

Find the event type

Use get_event_types and note the id of the event you want.
2

Ask for real slots

Call get_slots with that event type ID and a date range. It returns only genuinely bookable times.Pass the ID as a string here — "106371", not 106371.
3

Book one of them

Pass a time get_slots returned into create_booking as start. Don’t round it, adjust it, or compute your own.Two shape changes catch people between these steps: create_booking wants the same eventTypeId back as a number, and all of its arguments go inside a body object.
The response nests times two levels deeper than you might expect. content[1] holds the usual success/data envelope, and the times sit under data.slots, grouped by date:
The full path to a bookable time is therefore content[1].data.slots["2026-08-31"][0].time. Reading the date keys from the wrong level — straight off content[1], or off a slots key at the top — makes a healthy response look like “no availability.”
The first offered day is often later than you’d assume — minimum booking notice, buffers, and calendar conflicts all push it out. Treat whatever get_slots returns as the truth.

Input gotchas

Worth knowing if you call tools directly rather than prompting conversationally.
Every tool that sends data — all 25 that create, update, cancel, or reschedule something — takes its fields inside a body object rather than at the top level. (Delete tools send no data, so they have no body.) This is the most common shape error, and the message it produces doesn’t name the field you forgot:
create_booking puts everything in body:
Tools that act on an existing record keep the identifier outside body and the changes inside it. cancel_booking:
Read-only tools take their parameters flat — get_slots has no body.
The same ID changes type between the two halves of the booking flow, so the value that just worked fails on the next call.Passing a number to get_slots returns Expected string, received number. Passing a string to create_booking returns Expected number, received string. Neither message tells you which direction to convert, so check the table.get_event_types returns id as a number, which is the form create_booking wants and get_slots doesn’t.These tools also want eventTypeId as a number: create_slots_reserve, update_slots, get_availability, get_team_event_type, update_team_eventtype, and delete_team_eventtype. get_slots is the outlier.
get_slots takes start and end. So does create_booking, inside its body. reschedule_booking takes only start.startTime and endTime are a different concept entirely — they are the clock times on an availability rule, used by create_availability and update_availability. No booking tool uses them. Sending startTime to create_booking fails as a missing start.
Every tool result returns a status line first, then the JSON payload:
Parsing content[0] as JSON gets you the status line and fails. Read content[1].
35 of the 58 tools write, and delete_eventtype, delete_team, and cancel_booking take effect immediately. Keep tool-approval prompts enabled in your client so these need a confirmation, or filter them out at the bridge with --ignore-tool — see How access and permissions work.

MCP setup and API details

Connect a client

Setup for Claude, Cursor, ChatGPT, and other MCP clients.

MCP overview

What MCP covers, and how permissions work.

Create a booking

The same slots-then-book flow using the REST API directly.

API reference

Full reference for every endpoint behind these tools.