The Cal MCP connector routes your AI agent's tool calls to Cal's own MCP server through Scalekit. Each user signs in to Cal once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 74 tools.
- Tools
- 74
- What they doRead · write · destructive
- 42 · 27 · 542 read27 write5 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
What you can do
- Manage bookings: create, confirm, reschedule, and cancel bookings, and add attendees or mark no-shows
- Check availability: find open time slots for a host and read busy times from connected calendars
- Manage event types: create, update, and delete the meeting types people can book
- Set working hours: create, update, and delete availability schedules, including the default schedule
- Manage organizations: add, update, and remove organization members, and read routing forms and their responses
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Cal MCP connection
In AgentKit > Connections, create a Cal MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Cal MCP server, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'calmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Cal MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'calmcp_get_me',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "calmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Cal MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="calmcp_get_me",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolcalmcp_find_api_operationSearch the Cal.com API v2 catalog for operations not covered by a dedicated tool.Read-onlyFind Api Operation
Search the Cal.com API v2 catalog for operations not covered by a dedicated tool. Returns operationIds to pass to describe_api_operation and call_api_operation.
Inputs
querystringrequired- Words describing what you need, e.g. 'list team bookings' or 'update webhook'
limitinteger- Max matches to return (1-50, default 10)
calmcp_get_app_linkBuild a URL that opens the relevant page in the Cal.com web app so the user can review or edit something in the dashboard.Read-onlyGet App Link
Build a URL that opens the relevant page in the Cal.com web app so the user can review or edit something in the dashboard. Use it whenever you show the user a booking, event type, schedule, team, routing form or setting â people want a link, not a description. Returns the URL; do not fabricate URLs yourself.
Inputs
pagestringrequired- Which app page to link toone of
bookingsbookingevent_typesevent_typepublic_booking_pageavailabilityscheduletroubleshoot_availabilityteamsteam_settingsrouting_formsrouting_formworkflowsworkflowinsightsappsmemberssettings formIdstring- For page=routing_form: routing form ID (required)
idinteger- For page=event_type, schedule, team_settings or workflow: numeric ID (required)
sectionstring- For page=settings: settings section path (required)one of
my-account/profilemy-account/generalmy-account/calendarsmy-account/conferencingmy-account/appearancemy-account/out-of-officesecurity/passwordsecurity/two-factor-authdeveloper/api-keysdeveloper/webhooksdeveloper/oauthdeveloper/mcpbillingorganizations/profileorganizations/generalorganizations/teamsorganizations/attributesorganizations/roles slugstring- For page=public_booking_page: event type slug (required)
statusstring- For page=bookings: list filter, default upcomingone of
upcomingunconfirmedrecurringpastcancelled tabstring- For page=event_type: settings tab, default setupone of
setupavailabilityteamlimitsadvancedrecurringappsworkflowswebhooksai teamSlugstring- For page=public_booking_page: team slug for team booking pages
uidstring- For page=booking: booking UID (required)
usernamestring- For page=public_booking_page: host username
calmcp_get_attribute_optionsList all available options for a SINGLE_SELECT or MULTI_SELECT attribute.Read-onlyGet Attribute Options
List all available options for a SINGLE_SELECT or MULTI_SELECT attribute. Returns option IDs and values needed when assigning attributes to users via assign_attribute_to_user.
Inputs
attributeIdstringrequired- No description.
orgIdnumberrequired- No description.
calmcp_get_availabilityGet available time slots for a host.Read-onlyGet Availability
Get available time slots for a host. You MUST provide at least one identifier: (1) eventTypeId, (2) eventTypeSlug + username, (3) eventTypeSlug + teamSlug, or (4) usernames (comma-separated, min 2, for dynamic events). 'username' is the host whose availability you are checking. Start/end must be in UTC ISO 8601.
Inputs
endstringrequired- Range end in UTC, ISO 8601 (e.g. '2024-08-14' or '2024-08-14T18:00:00Z')
startstringrequired- Range start in UTC, ISO 8601 (e.g. '2024-08-13' or '2024-08-13T09:00:00Z')
bookingUidToReschedulestring- Booking UID being rescheduled â ensures original time appears in available slots
durationinteger- Desired slot duration in minutes (for variable-duration or dynamic events, defaults to 30)
eventTypeIdinteger- Event type ID. Use this OR (eventTypeSlug + username) OR (eventTypeSlug + teamSlug).
eventTypeSlugstring- Event type slug. Must be combined with username (individual) or teamSlug (team).
formatstring- Response format: 'range' (start+end) or 'time' (start only)
organizationSlugstring- Organization slug, needed when the user/team is within an organization.
teamSlugstring- Team slug. Required with eventTypeSlug for team event types.
timeZonestring- IANA time zone for returned slots (e.g. America/New_York). Defaults to UTC.
usernamestring- Username of the host whose availability you are checking. Required with eventTypeSlug for individual event types.
usernamesstring- Comma-separated or array of usernames for dynamic events (min 2). organizationSlug is needed only if users belong to an org.
calmcp_get_bookingGet a specific booking by its UID (use get_bookings to find UIDs).Read-onlyGet Booking
Get a specific booking by its UID (use get_bookings to find UIDs). Returns full details including attendees, location, and metadata.
Inputs
bookingUidstringrequired- Booking UID
calmcp_get_booking_attendeeGet a specific attendee by their numeric ID within a booking.Read-onlyGet Booking Attendee
Get a specific attendee by their numeric ID within a booking. Use get_booking_attendees to find attendee IDs.
Inputs
attendeeIdnumberrequired- No description.
bookingUidstringrequired- No description.
calmcp_get_booking_attendeesGet all attendees for a booking by its UID.Read-onlyGet Booking Attendees
Get all attendees for a booking by its UID.
Inputs
bookingUidstringrequired- Booking UID
calmcp_get_booking_routing_traceGet the routing trace for a booking â the step-by-step decision path showing how the booking was routed (routing form evaluation, CRM lookups, host selection).Read-onlyGet Booking Routing Trace
Get the routing trace for a booking â the step-by-step decision path showing how the booking was routed (routing form evaluation, CRM lookups, host selection). Returns human-readable steps grouped by round, plus the routing form submission answers. Only available for bookings that completed routing (permanent traces). Use get_bookings to find booking UIDs.
Inputs
bookingUidstringrequired- No description.
calmcp_get_bookingsList bookings with pagination (default 100, max 250 per page — use take/skip for more).Read-onlyGet Bookings
List bookings with pagination (default 100, max 250 per page — use take/skip for more). Supports filtering by status (upcoming, recurring, past, cancelled, unconfirmed), attendee email/name, event type, team, date ranges (afterStart, beforeEnd), and sorting (sortStart, sortEnd, sortCreated).
Inputs
afterCreatedAtstring- Filter bookings created after this ISO 8601 date
afterStartstring- Filter bookings starting after this ISO 8601 date
afterUpdatedAtstring- Filter bookings updated after this ISO 8601 date
attendeeEmailstring- Filter by attendee email
attendeeNamestring- Filter by attendee name
beforeCreatedAtstring- Filter bookings created before this ISO 8601 date
beforeEndstring- Filter bookings ending before this ISO 8601 date
beforeUpdatedAtstring- Filter bookings updated before this ISO 8601 date
bookingUidstring- Filter by booking UID
eventTypeIdinteger- Filter by event type ID
eventTypeIdsstring- Comma-separated event type IDs (e.g. '100,200')
scopestring- Whose bookings to return. 'mine' (default) returns only bookings where the authenticated user is organizer, host, or attendee. 'all' returns every booking the API key/token can see â useful for admins who want the org-wide view. Pagination (take/skip) operates on the unfiltered API response, so 'mine' may return fewer than `take` items per page.one of
mineall skipinteger- Results to skip (offset, min 0)
sortCreatedstring- Sort by creation timeone of
ascdesc sortEndstring- Sort by end timeone of
ascdesc sortStartstring- Sort by start timeone of
ascdesc sortUpdatedAtstring- Sort by updated timeone of
ascdesc statusstring- Filter by booking status. Confirmed bookings are 'upcoming' (or 'past' once over); 'unconfirmed' means awaiting confirmation.one of
upcomingrecurringpastcancelledunconfirmed takeinteger- Max results to return (1-250)
teamIdinteger- Filter by team ID
teamsIdsstring- Comma-separated team IDs (e.g. '50,60')
calmcp_get_busy_timesGet busy/blocked time blocks from a connected calendar (e.g.Read-onlyGet Busy Times
Get busy/blocked time blocks from a connected calendar (e.g. Google Calendar) between two dates. Returns a list of time ranges when the user is unavailable. Required: dateFrom, dateTo (YYYY-MM-DD), credentialId, and externalId. WORKFLOW: (1) Call get_connected_calendars first to get the real credentialId (number) and externalId (e.g. email) for the calendar — NEVER guess or fabricate these. (2) Provide dateFrom and dateTo as YYYY-MM-DD strings. (3) Optionally pass timeZone (IANA, e.g. 'America/New_York') to localise the results.
Inputs
credentialIdnumberrequired- The credential ID of the calendar integration. Use get_connected_calendars to obtain this — never guess.
dateFromstringrequired- Start date for the query (e.g. '2024-08-13'). Required.
dateTostringrequired- End date for the query (e.g. '2024-08-14'). Required.
externalIdstringrequired- The external calendar ID (e.g. the email address for Google Calendar). Use get_connected_calendars to obtain this — never guess.
loggedInUsersTzstring- IANA time zone of the logged-in user (e.g. 'America/New_York'). Used to interpret date boundaries.
timeZonestring- IANA time zone for the query (e.g. 'America/New_York'). Defaults to UTC.
calmcp_get_conferencing_appsList all conferencing applications connected to the authenticated user's account (e.g.Read-onlyGet Conferencing Apps
List all conferencing applications connected to the authenticated user's account (e.g. Zoom, Google Meet, Cal Video).
Inputs
This tool takes no inputs.
calmcp_get_connected_calendarsList all calendar integrations connected to the authenticated user's account.Read-onlyGet Connected Calendars
List all calendar integrations connected to the authenticated user's account. Returns each calendar's credentialId and externalId, which are required by get_busy_times. Also shows the user's destination calendar.
Inputs
This tool takes no inputs.
calmcp_get_crm_sync_errorsList CRM sync errors for an event type and CRM app slug, such as salesforce.Read-onlyGet Crm Sync Errors
List CRM sync errors for an event type and CRM app slug, such as salesforce. By default returns active/current errors only; set includeDismissed=true to include dismissed historical errors. Use eventTypeId plus appSlug, not credentialId. Supports cursor pagination via limit (1-100, default 50) and cursor. Requires read access to the event type.
Inputs
appSlugstringrequired- CRM app slug connected to the event type, for example `salesforce`.
eventTypeIdnumberrequired- No description.
cursorstring- Opaque cursor from `pagination.nextCursor`. Omit to fetch the first page of CRM sync errors.
includeDismissedboolean- When true, returns dismissed historical errors as well as active errors. Defaults to false.default
false limitnumber- Maximum number of CRM sync errors to return.default
50
calmcp_get_default_scheduleGet the authenticated user's default schedule.Read-onlyGet Default Schedule
Get the authenticated user's default schedule.
Inputs
This tool takes no inputs.
calmcp_get_eventGet one Cal Event (a fixed-date RSVP page served at cal.com/{slug}) by its uuid.Read-onlyGet Event
Get one Cal Event (a fixed-date RSVP page served at cal.com/{slug}) by its uuid. Not for event types (use get_event_type with a numeric id) or calendar events. Use this when you already have the Event's uuid; otherwise call get_events first and never guess the uuid. An Event the user cannot access returns 404, the same as one that does not exist.
Inputs
uuidstringrequired- Event UUID. Accepts the canonical UUID (e.g. `018ff5cd-6dc4-7d57-bcbc-374702ca8b38`) or its short-uuid (Flickr Base58) form (e.g. `1cbZYoAFoJdwqN4tixezd5`).
calmcp_get_event_typeGet a specific event type by its numeric ID (use get_event_types to find IDs).Read-onlyGet Event Type
Get a specific event type by its numeric ID (use get_event_types to find IDs). Returns full details including locations, booking fields, and schedule.
Inputs
eventTypeIdstringrequired- Numeric event type ID or its UUID. Accepts the canonical UUID or its short-uuid (Flickr Base58) form, e.g. the one in an app.cal.com/links/{uuid} URL.
calmcp_get_event_type_historyGet the audit history (change log) for an event type by ID (use get_event_types to find IDs).Read-onlyGet Event Type History
Get the audit history (change log) for an event type by ID (use get_event_types to find IDs). Returns audit log entries showing what changed, who made the change, when, and the previous/new field values, ordered most recent first. Supports cursor pagination via limit (1-50, default 25) and cursor. Requires audit-history access to the event type â general read access alone is not sufficient.
Inputs
eventTypeIdnumberrequired- No description.
cursorstring- Cursor from the previous response. Pass `pagination.nextCursor` to fetch the next page of audit logs.
limitnumber- The number of audit logs to return. Defaults to 25 and cannot exceed 50.
calmcp_get_event_type_settingsGet the full event type settings as exposed by the Cal.com API â including scheduling type, hosts, locations, booking fields, limits, and all other configuration.Read-onlyGet Event Type Settings
Get the full event type settings as exposed by the Cal.com API â including scheduling type, hosts, locations, booking fields, limits, and all other configuration. For org-scoped team event types, pass orgId + teamId.
Inputs
eventTypeIdintegerrequired- Event type ID. Use get_event_types to find this.
orgIdinteger- Organization ID for org-scoped team event types. Use get_me to obtain your organizationId.
teamIdinteger- Team ID for org-scoped team event types. Required together with orgId.
calmcp_get_event_typesList event types.Read-onlyGet Event Types
List event types. Without parameters returns all event types for the authenticated user. Pass 'username' to list another user's event types, or username + eventSlug for a specific one. Use usernames (comma-separated) for dynamic group event types.
Inputs
eventSlugstring- Slug of a specific event type to return. Must be used together with username.
orgIdnumber- Organization ID to filter by (alternative to orgSlug).
orgSlugstring- Organization slug to filter by.
sortCreatedAtstring- Sort event types by creation date.one of
ascdesc usernamestring- Username of the person whose event types you want to list. Omit to list the authenticated user's event types.
usernamesstring- Comma-separated usernames for fetching a dynamic group event type (e.g. 'alice,bob').
calmcp_get_eventsList the authenticated user's Cal Events: fixed-date RSVP pages served at cal.com/{slug}, such as a workshop or meetup that guests register for.Read-onlyGet Events
List the authenticated user's Cal Events: fixed-date RSVP pages served at cal.com/{slug}, such as a workshop or meetup that guests register for. Events are NOT event types (bookable meeting templates; use get_event_types) and NOT calendar events or bookings. Use this when the user asks about their Events or RSVP pages, or to find an Event's uuid for get_event. Returns Events the user owns or co-hosts, newest start time first; team-owned Events they do not host are not included. Supports limit (1-250, default 50) and filtering by slug; when pagination.hasMore is true, pass pagination.nextCursor as cursor to fetch the next page.
Inputs
cursorstring- Opaque cursor for cursor-based pagination. Pass the `pagination.nextCursor` value from a previous response to fetch the next page. Omit to fetch the first page.
limitnumber- Maximum number of Events to return.default
50 slugstring- Filter by the event's public page slug (cal.com/{slug}).
statusstring- Filter events by lifecycle status. `draft`: not published and not cancelled, ordered soonest first. `upcoming`: published and not yet ended, or cancelled but not yet started, ordered soonest first. `past`: everything else, ordered latest first. Omit to return all statuses, newest first. When provided, `pagination.nextCursor` encodes the status â cursors from one status value cannot be used with another and return 400.one of
draftupcomingpast
calmcp_get_meGet the authenticated user's profile including username, email, time zone, default schedule, and organizationId.Read-onlyGet Me
Get the authenticated user's profile including username, email, time zone, default schedule, and organizationId. Call this first when you need the user's own details (email, username, organizationId) for other tools.
Inputs
This tool takes no inputs.
calmcp_get_my_teamsList teams the authenticated user belongs to.Read-onlyGet My Teams
List teams the authenticated user belongs to. Supports take/skip pagination (take max 250). Works for any org member (org admins see all teams). Use get_me to obtain your organizationId. Returns team IDs, names, and slugs needed by other team-scoped tools.
Inputs
orgIdnumberrequired- No description.
skipnumber- Number of items to skipdefault
0 takenumber- Maximum number of items to returndefault
250
calmcp_get_org_attributeGet a single organization attribute by ID.Read-onlyGet Org Attribute
Get a single organization attribute by ID. Use get_org_attributes to find attribute IDs and get_attribute_options to list available options.
Inputs
attributeIdstringrequired- No description.
orgIdnumberrequired- No description.
calmcp_get_org_attributesList all attributes defined for an organization.Read-onlyGet Org Attributes
List all attributes defined for an organization. Attributes are custom fields (TEXT, NUMBER, SINGLE_SELECT, MULTI_SELECT) used to tag members for routing and round-robin. Supports pagination with skip/take.
Inputs
orgIdnumberrequired- No description.
skipnumber- Number of items to skipdefault
0 takenumber- Maximum number of items to returndefault
250
calmcp_get_org_membershipGet a specific organization membership by its numeric ID.Read-onlyGet Org Membership
Get a specific organization membership by its numeric ID.
Inputs
membershipIdnumberrequired- No description.
orgIdnumberrequired- No description.
calmcp_get_org_membershipsList all memberships in an organization.Read-onlyGet Org Memberships
List all memberships in an organization. Supports pagination with take/skip.
Inputs
orgIdnumberrequired- No description.
skipnumber- Number of items to skipdefault
0 takenumber- Maximum number of items to returndefault
250
calmcp_get_org_routing_form_responsesGet responses for a specific routing form.Read-onlyGet Org Routing Form Responses
Get responses for a specific routing form. Supports filtering by date ranges, routed booking UID, and sorting.
Inputs
orgIdnumberrequired- No description.
routingFormIdstringrequired- No description.
afterCreatedAtstring- Filter by responses created after this date
afterUpdatedAtstring- Filter by responses created after this date
beforeCreatedAtstring- Filter by responses created before this date
beforeUpdatedAtstring- Filter by responses updated before this date
routedToBookingUidstring- Filter by responses routed to a specific booking
skipnumber- Number of responses to skip
sortCreatedAtstring- Sort by creation timeone of
ascdesc sortUpdatedAtstring- Sort by update timeone of
ascdesc takenumber- Number of responses to take
calmcp_get_org_routing_formsList routing forms for an organization.Read-onlyGet Org Routing Forms
List routing forms for an organization. Supports filtering by team IDs, date ranges, routed booking UID, and sorting.
Inputs
orgIdnumberrequired- No description.
afterCreatedAtstring- Filter by responses created after this date
afterUpdatedAtstring- Filter by responses created after this date
beforeCreatedAtstring- Filter by responses created before this date
beforeUpdatedAtstring- Filter by responses updated before this date
routedToBookingUidstring- Filter by responses routed to a specific booking
skipnumber- Number of responses to skip
sortCreatedAtstring- Sort by creation timeone of
ascdesc sortUpdatedAtstring- Sort by update timeone of
ascdesc takenumber- Number of responses to take
teamIdsarray- Filter by teamIds. Team ids must be separated by a comma.
calmcp_get_org_team_bookingsList all bookings for a team within an organization.Read-onlyGet Org Team Bookings
List all bookings for a team within an organization. Requires TEAM_ADMIN role. Supports filtering by status (upcoming, recurring, past, cancelled, unconfirmed), attendee email/name, event type, date ranges (afterStart, beforeEnd, afterCreatedAt, beforeCreatedAt, afterUpdatedAt, beforeUpdatedAt), and sorting (sortStart, sortEnd, sortCreated, sortUpdatedAt).
Inputs
orgIdnumberrequired- No description.
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
afterCreatedAtstring- Filter bookings that have been created after this date string.
afterStartstring- Filter bookings with start after this date string.
afterUpdatedAtstring- Filter bookings that have been updated after this date string.
attendeeEmailstring- Filter bookings by the attendee's email address.
attendeeNamestring- Filter bookings by the attendee's name.
beforeCreatedAtstring- Filter bookings that have been created before this date string.
beforeEndstring- Filter bookings with end before this date string.
beforeUpdatedAtstring- Filter bookings that have been updated before this date string.
bookingUidstring- Filter bookings by the booking Uid.
eventTypeIdstring- Filter bookings by event type id.
eventTypeIdsstring- Filter bookings by event type ids. Event type ids must be separated by a comma.
skipnumber- The number of items to skipdefault
0 sortCreatedstring- Sort results by their creation time (when booking was made) in ascending or descending order.one of
ascdesc sortEndstring- Sort results by their end time in ascending or descending order.one of
ascdesc sortStartstring- Sort results by their start time in ascending or descending order.one of
ascdesc sortUpdatedAtstring- Sort results by their updated time (for example when booking status changes) in ascending or descending order.one of
ascdesc statusarray- Filter bookings by status. If you want to filter by multiple statuses, separate them with a comma.
takenumber- The number of items to returndefault
100
calmcp_get_org_teamsList all teams in an organization.Read-onlyGet Org Teams
List all teams in an organization. Supports take/skip pagination (take max 250). Requires ORG_ADMIN role. Use get_me to obtain your organizationId. Returns team IDs, names, and slugs needed by other team-scoped tools. If this fails with 403, use get_my_teams instead.
Inputs
orgIdnumberrequired- No description.
skipnumber- Number of items to skipdefault
0 takenumber- Maximum number of items to returndefault
250
calmcp_get_org_user_bookingsList all bookings for a specific user within an organization.Read-onlyGet Org User Bookings
List all bookings for a specific user within an organization. Requires ORG_ADMIN role. Use get_org_memberships to find user IDs. Supports filtering by status, attendee email/name, event type, team, date ranges, and sorting.
Inputs
orgIdnumberrequired- No description.
userIdnumberrequired- No description.
afterCreatedAtstring- Filter bookings that have been created after this date string.
afterStartstring- Filter bookings with start after this date string.
afterUpdatedAtstring- Filter bookings that have been updated after this date string.
attendeeEmailstring- Filter bookings by the attendee's email address.
attendeeNamestring- Filter bookings by the attendee's name.
beforeCreatedAtstring- Filter bookings that have been created before this date string.
beforeEndstring- Filter bookings with end before this date string.
beforeUpdatedAtstring- Filter bookings that have been updated before this date string.
bookingUidstring- Filter bookings by the booking Uid.
eventTypeIdstring- Filter bookings by event type id.
eventTypeIdsstring- Filter bookings by event type ids. Event type ids must be separated by a comma.
skipnumber- The number of items to skipdefault
0 sortCreatedstring- Sort results by their creation time (when booking was made) in ascending or descending order.one of
ascdesc sortEndstring- Sort results by their end time in ascending or descending order.one of
ascdesc sortStartstring- Sort results by their start time in ascending or descending order.one of
ascdesc sortUpdatedAtstring- Sort results by their updated time (for example when booking status changes) in ascending or descending order.one of
ascdesc statusarray- Filter bookings by status. If you want to filter by multiple statuses, separate them with a comma.
takenumber- The number of items to returndefault
100 teamIdstring- Filter bookings by team id that user is part of
teamsIdsstring- Filter bookings by team ids that user is part of. Team ids must be separated by a comma.
calmcp_get_routing_formGet one team routing form: its questions (id, label, identifier, type, required, hidden, options) and its routes in evaluation order (id, name, kind, action, readable conditions).Read-onlyGet Routing Form
Get one team routing form: its questions (id, label, identifier, type, required, hidden, options) and its routes in evaluation order (id, name, kind, action, readable conditions). Call this before changing a form's routes or questions: route edits reference the route ids and question labels returned here, question edits reference the question and option ids, and applying an edit requires the form's updatedAt. Use get_team_routing_forms to find routingFormId; never guess route, question or option ids.
Inputs
orgIdnumberrequired- No description.
routingFormIdstringrequired- No description.
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
calmcp_get_routing_form_historyGet the change history of a team routing form, newest first: each entry has an id, a timestamp, who made the change, and what changed (questions, routes, route conditions and settings, with before and after values).Read-onlyGet Routing Form History
Get the change history of a team routing form, newest first: each entry has an id, a timestamp, who made the change, and what changed (questions, routes, route conditions and settings, with before and after values). Use it to see what changed on a form and when, and to review its recent changes before and after editing it with edit_routing_form_routes; a new edit can take a few seconds to appear. Use get_team_routing_forms to find routingFormId. Supports cursor pagination: limit (1-50, default 25) and cursor set to pagination.nextCursor.
Inputs
orgIdnumberrequired- No description.
routingFormIdstringrequired- No description.
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
cursorstring- Pass `pagination.nextCursor` from the previous response to fetch older entries.
limitnumber- Number of history entries to return.default
25
calmcp_get_scheduleGet a specific schedule by its numeric ID.Read-onlyGet Schedule
Get a specific schedule by its numeric ID. Returns availability slots and overrides.
Inputs
scheduleIdnumberrequired- No description.
calmcp_get_schedulesList all schedules for the authenticated user.Read-onlyGet Schedules
List all schedules for the authenticated user.
Inputs
This tool takes no inputs.
calmcp_get_scheduling_configGet the scheduling configuration for a team event type.Read-onlyGet Scheduling Config
Get the scheduling configuration for a team event type. For roundRobin types: returns hosts (with priority, weight, mandatory status, group assignment), host groups, distribution settings (maxLeadThreshold), and advanced settings (weights enabled, no-show calculation, CRM fallback). For collective/managed types: returns hosts with basic info and assignAllTeamMembers. The event type must be a team event type â returns 422 otherwise.
Inputs
eventTypeIdnumberrequired- No description.
calmcp_get_team_membershipGet a specific team membership by its numeric ID.Read-onlyGet Team Membership
Get a specific team membership by its numeric ID. Use get_team_memberships to find this â never guess.
Inputs
membershipIdnumberrequired- No description.
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
calmcp_get_team_membershipsList all memberships in a team.Read-onlyGet Team Memberships
List all memberships in a team. Supports pagination with take/skip (take max 250) and filtering by up to 20 email addresses.
Inputs
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
emailsarray- Filter team memberships by email addresses. If you want to filter by multiple emails, separate them with a comma (max 20 emails for performance).
skipnumber- Number of items to skipdefault
0 takenumber- Maximum number of items to returndefault
250
calmcp_get_team_routing_formsList routing forms that belong to a team in an organization.Read-onlyGet Team Routing Forms
List routing forms that belong to a team in an organization. Use this as a team admin; get_org_routing_forms requires an organization admin. Use get_my_teams or get_org_teams to find teamId. Supports filtering by name (case-insensitive substring) and disabled status, created/updated date range filters, sorting by created/updated date, and skip/take pagination. Use get_routing_form with a returned id to read its questions and routes.
Inputs
orgIdnumberrequired- No description.
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
afterCreatedAtstring- Filter by responses created after this date
afterUpdatedAtstring- Filter by responses created after this date
beforeCreatedAtstring- Filter by responses created before this date
beforeUpdatedAtstring- Filter by responses updated before this date
disabledboolean- Filter by disabled status
namestring- Filter by name
routedToBookingUidstring- Filter by responses routed to a specific booking
skipnumber- Number of responses to skip
sortCreatedAtstring- Sort by creation timeone of
ascdesc sortUpdatedAtstring- Sort by update timeone of
ascdesc takenumber- Number of responses to take
calmcp_get_user_attribute_historyGet the attribute assignment history (audit log) for a user within an organization.Read-onlyGet User Attribute History
Get the attribute assignment history (audit log) for a user within an organization. Returns a chronological log of attribute assignment changes (assigned, updated, unassigned). Supports pagination with limit (1-50) and cursor. Requires org admin role.
Inputs
orgIdnumberrequired- No description.
userIdnumberrequired- No description.
cursorstring- Cursor from the previous response.
limitnumber- Maximum number of audit log entries to return.default
25
calmcp_get_user_attributesGet all attribute options assigned to a specific user within an organization.Read-onlyGet User Attributes
Get all attribute options assigned to a specific user within an organization. Returns grouped attributes with their assigned option values and weights.
Inputs
orgIdnumberrequired- No description.
userIdnumberrequired- No description.
calmcp_search_docsSearch the Cal.com product documentation and return the most relevant pages with an excerpt of the top hit.Read-onlySearch Docs
Search the Cal.com product documentation and return the most relevant pages with an excerpt of the top hit. Use when the user asks how a feature works or how to set something up.
Inputs
querystringrequired- What you want to learn, e.g. 'set up round robin' or 'embed booking page'
limitinteger- Max results to return (1-10, default 5)
calmcp_add_booking_attendeeAdd a new attendee to an existing booking.WriteAdd Booking Attendee
Add a new attendee to an existing booking. Required: name, email, timeZone. ASK THE USER for all attendee details — never guess or fabricate names, emails, or time zones.
Inputs
bookingUidstringrequired- No description.
emailstringrequired- The email of the attendee.
namestringrequired- The name of the attendee.
timeZonestringrequired- The time zone of the attendee.
languagestring- The preferred language of the attendee. Used for booking confirmation.one of
arcadeeseuheidjalvplrosrthviazcseles-419fihritkmnlptrusvtrzh-CNbgdaenetfrhuiwkonopt-BRsksltaukzh-TWbndefaulten phoneNumberstring- The phone number of the attendee in international format.
calmcp_assign_attribute_to_userAssign an attribute option to a user.WriteAssign Attribute To User
Assign an attribute option to a user. For SINGLE_SELECT/MULTI_SELECT attributes, pass attributeOptionId (use get_attribute_options to list available options). For TEXT/NUMBER attributes, pass value instead to create an option on the fly. Optionally set a weight for round-robin routing.
Inputs
attributeIdstringrequired- No description.
orgIdnumberrequired- No description.
userIdnumberrequired- No description.
attributeOptionIdstring- No description.
valuestring- No description.
weightnumber- The weight of the attribute for this user
calmcp_calculate_routing_form_slotsSubmit a routing form response and get available slots.WriteCalculate Routing Form Slots
Submit a routing form response and get available slots. The response object contains the user's answers (keys are routing form field slugs/IDs). Use get_org_routing_forms to find routingFormId. Start/end must be in UTC ISO 8601.
Inputs
endstringrequired- Range end in UTC, ISO 8601 (e.g. '2024-08-14' or '2024-08-14T18:00:00Z')
responseobjectrequired- Routing form response object. Keys are routing form field IDs, values are the user's answers. Use get_org_routing_forms to discover the form's fields and their IDs. Ask the user for the answer values — never fabricate.
routingFormIdstringrequired- Routing form ID. Use get_org_routing_forms to find this — never guess.
startstringrequired- Range start in UTC, ISO 8601 (e.g. '2024-08-13' or '2024-08-13T09:00:00Z')
bookingUidToReschedulestring- Booking UID being rescheduled — ensures original time appears in available slots
durationnumber- Desired slot duration in minutes (for variable-duration events)
formatstring- Slot format: 'range' returns start+end, 'time' returns start onlyone of
rangetime timeZonestring- IANA time zone for returned slots (default UTC)
calmcp_call_api_operationCall any Cal.com API v2 operation by operationId with arguments shaped by describe_api_operation.WriteCall Api Operation
Call any Cal.com API v2 operation by operationId with arguments shaped by describe_api_operation. Prefer a dedicated tool when one exists. Confirm with the user before calling operations that create, change or delete data.
Inputs
operationIdstringrequired- operationId returned by find_api_operation
argsobject- Arguments matching the inputSchema returned by describe_api_operation
calmcp_confirm_bookingConfirm a pending booking that requires manual confirmation.WriteConfirm Booking
Confirm a pending booking that requires manual confirmation. Only the host can confirm.
- Idempotent
Inputs
bookingUidstringrequired- Booking UID
calmcp_confirm_booking_seatsConfirm selected pending seats on a confirmation-required seated booking.WriteConfirm Booking Seats
Confirm selected pending seats on a confirmation-required seated booking. Pass seatUids from the booking. POST /bookings/{bookingUid}/confirm refuses these bookings.
Inputs
bookingUidstringrequired- No description.
seatUidsarrayrequired- Seat UIDs to confirm. A seat that is already confirmed stays confirmed. Duplicate UIDs in one request are confirmed once.
calmcp_create_bookingCreate a booking.WriteCreate Booking
Create a booking. WORKFLOW: (1) Use get_event_types to find the event type ID/slug. (2) Call get_availability to find open slots — NEVER pick a time without checking availability first. (3) If using bookingFieldsResponses, call get_event_type first to discover required custom fields. (4) For attendee details (name, email, timeZone), use get_me if booking for yourself, otherwise ASK THE USER — never guess or fabricate attendee info. Identify the event type by: eventTypeId, OR eventTypeSlug + username (individual), OR eventTypeSlug + teamSlug (team). The 'start' time MUST be in UTC ISO 8601. 'username' is the HOST whose calendar you are booking. 'attendee' is the GUEST (the caller).
Inputs
attendeeobjectrequired- Attendee details â the person making the booking (the guest/caller), NOT the host. To book another user's calendar, set their username in the 'username' field and put YOUR (the caller's) details here. NEVER guess or fabricate email addresses â ask the user if unknown.
startstringrequired- Start time in UTC, ISO 8601 (e.g. 2024-08-13T09:00:00Z). Must be UTC.
allowBookingOutOfBoundsboolean- If true and the authenticated user is a host, allow booking outside the configured scheduling window (e.g. before minimumBookingNotice or beyond the booking window). Ignored for non-hosts.
allowConflictsboolean- If true and the authenticated user is a host, skip availability conflict checks. Ignored for non-hosts.
bookingFieldsResponsesobject- Custom booking field responses as {slug: value} pairs
eventTypeIdinteger- Event type ID. Required unless eventTypeSlug + username (or teamSlug) are provided.
eventTypeSlugstring- Event type slug (e.g. '15min'). Must be combined with username (for individual) or teamSlug (for team).
guestsarray- Additional guest emails to include. Ask the user for guest emails â never guess or fabricate.
lengthInMinutesinteger- Desired booking length for variable-duration event types. Uses event type default if omitted.
locationobject- Meeting location override as an object. Must match one of the event type's configured location types: {type:'integration',integration:'cal-video'|'google-meet'|'zoom'|...}, {type:'attendeePhone',phone:'+...'}, {type:'attendeeAddress',address:'...'}, {type:'attendeeDefined',location:'...'}, {type:'address'}, {type:'link'}, {type:'phone'}, or {type:'organizersDefaultApp'} (team events only).
metadataobject- Metadata key-value pairs (max 50 keys, keys â¤40 chars, string values â¤500 chars)
organizationSlugstring- Organization slug, needed when the user/team is within an organization.
teamSlugstring- Team slug. Required with eventTypeSlug for team event types.
usernamestring- Username of the host whose calendar you are booking on. Required with eventTypeSlug for individual event types.
calmcp_create_event_typeCreate a new event type.WriteCreate Event Type
Create a new event type. Required: title, slug, lengthInMinutes. Supports locations, booking fields, buffers, recurrence, confirmation policy, seats, and more.
Inputs
lengthInMinutesnumberrequired- No description.
slugstringrequired- No description.
titlestringrequired- No description.
afterEventBuffernumber- Extra time automatically blocked on your calendar after a meeting ends. This gives you time to wrap up, add notes, or decompress before your next commitment.
allowReschedulingCancelledBookingsboolean- When enabled, users will be able to create a new booking when trying to reschedule a cancelled booking.default
false allowReschedulingPastBookingsboolean- Enabling this option allows for past events to be rescheduled.default
false beforeEventBuffernumber- Extra time automatically blocked on your calendar before a meeting starts. This gives you time to prepare, review notes, or transition from your previous activity.
bookerActiveBookingsLimitstring- Limit the number of active bookings a booker can make for this event type.
bookerLayoutsobject- Should booker have week, month or column view. Specify default layout and enabled layouts user can pick.
bookingFieldsarray- Booking fields for the event type. Omit this property to use the default fields. Provide an array to customize default fields or add custom booking fields. At least one of `email` or `attendeePhoneNumber` must be visible and required. The array cannot be empty, contain duplicate default fields or custom slugs, or use a default field's slug for a custom field. Omitted default fields are added with their default settings. Workflow-added fields are read-only and ignored.
bookingLimitsCountstring- Limit how many times this event can be booked
bookingLimitsDurationstring- Limit total amount of time that this event can be booked
bookingRequiresAuthenticationboolean- Boolean to require authentication for booking this event type via api. If true, only authenticated users who are the event-type owner or org/team admin/owner can book this event type.default
false bookingWindowstring- Limit how far in the future this event can be booked
calendarInvitesobject- Write-only host and guest calendar-invite description settings. These are saved separately from the event type and are not returned by event-type read endpoints.
calVideoSettingsobject- Cal video settings for the event type. Platform customers can't manage this property because currently we have no way of determining if managed user is a host or an attendee.
colorobject- No description.
confirmationPolicystring- Specify how the booking needs to be manually confirmed before it is pushed to the integrations and a confirmation mail is sent.
crmobject- CRM app settings for the event type, mirroring the event type Apps tab toggles. The credential is resolved server-side â the app must be installed for the event type owner.
customNamestring- Customizable event name with valid variables: {Link title}, {Event type title} (legacy), {Organiser}, {Scheduler}, {Location}, {Organiser first name}, {Scheduler first name}, {Scheduler last name}, {Event duration}, {LOCATION}, {HOST/ATTENDEE}, {HOST}, {ATTENDEE}, {USER}
descriptionstring- No description.
destinationCalendarobject- No description.
disableCancellingobject- Settings for disabling cancelling of this event type.
disableReschedulingobject- Settings for disabling rescheduling of this event type. Can be always disabled or disabled when less than X minutes before the meeting.
emailSettingsobject- Email settings for this event type. Personal event types require an accepted organization membership; team event types require an organization team. This does not include emails sent by custom email workflows.
hiddenboolean- No description.
hideCalendarEventDetailsboolean- No description.
hideCalendarNotesboolean- No description.
hideOrganizerEmailboolean- Boolean to Hide organizer's email address from the booking screen, email notifications, and calendar events
interfaceLanguagestring- Set preferred language for the booking interface. Use empty string for visitor's browser language (default).one of
enarazbgbncacsdadeeleses-419euetfifrhehuitjakmkonlnoplpt-BRptrorusk-SKslsrsvtrukvizh-CNzh-TW lengthInMinutesOptionsarray- If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.
locationsarray- Locations where the event will take place. If not provided, cal video link will be used as the location. Note: Setting a location to a conferencing app does not install the app - the app must already be installed. Via API, only Google Meet (google-meet), Microsoft Teams (office365-video), and Zoom (zoom) can be installed. Cal Video (cal-video) is installed by default. All other conferencing apps must be connected via the Cal.com web app and are not available for Platform plan customers. You can only set an event type location to an app that has already been installed or connected.
lockTimeZoneToggleOnBookingPageboolean- No description.
minimumBookingNoticenumber- Minimum number of minutes before the event that a booking can be made.
offsetStartnumber- Offset timeslots shown to bookers by a specified number of minutes
onlyShowFirstAvailableSlotboolean- This will limit your availability for this event type to one slot per day, scheduled at the earliest available time.
privateNoteEnabledboolean- When enabled, a private note calendar event is created alongside the booking with the resolved template as its description. Only visible to the host.default
false privateNoteModestring- How private notes are delivered: as an additional host event or by sending separate host and guest invites.one of
duplicate_eventseparate_events privateNoteTemplatestring- Template for the private note content. Supports variables like {Attendee name}, {Link title}, {Event type title} (legacy), {Location}, {Host name}, {Event duration}, and custom booking field names.
recurrencestring- Create a recurring event type.
requiresBookerEmailVerificationboolean- No description.
scheduleIdnumber- If you want that this event has different schedule than user's default one you can specify it here.
seatsstring- Create an event type with multiple seats.
showOptimizedSlotsboolean- Arrange time slots to optimize availability.default
false skipAttendeeEmailDeliverabilityCheckboolean- When true, skips the MX deliverability check for attendee emails on booking. Format validation and watchlist still apply. Requires the editor to belong to an organization (including platform orgs).
slotIntervalnumber- Number representing length of each slot when event is booked. By default it equal length of the event type. If event length is 60 minutes then we would have slots 9AM, 10AM, 11AM etc. but if it was changed to 30 minutes then we would have slots 9AM, 9:30AM, 10AM, 10:30AM etc. as the available times to book the 60 minute event.
successRedirectUrlstring- A valid URL where the booker will redirect to, once the booking is completed successfully
useDestinationCalendarEmailboolean- No description.
useIsolatedAvailabilityboolean- When true, only this event type's own Cal.com bookings block the slot. The availability schedule and connected calendars still apply. Same as "Consider only this booking link's bookings" in the web app. Requires an organization with at least 15 members.default
false weekStartstring- Day the booking page calendar starts the week on. Overrides the host's account setting for this event type only. Omit or set to null to inherit the account setting.one of
SundayMondayTuesdayWednesdayThursdayFridaySaturday
calmcp_create_org_membershipAdd a user to an organization.WriteCreate Org Membership
Add a user to an organization. Required: userId (must be a real user ID from the system) and role (MEMBER, ADMIN, or OWNER). Platform managed users should only have MEMBER role.
Inputs
orgIdintegerrequired- Organization ID. Use get_me to obtain your organizationId â never guess.
rolestringrequired- Role (managed users: MEMBER only)one of
MEMBEROWNERADMIN userIdnumberrequired- User ID of the person to add. Provide userId OR email, not both. Use get_org_users to find this â never guess.
acceptedboolean- Whether accepted
disableImpersonationboolean- Disable impersonation
emailstring- Email of an existing Cal.com user to invite. Provide email OR userId, not both. Triggers the invite flow (auto-accept or pending based on org settings).
calmcp_create_routing_formCreate a routing form for a team in an organization, from a name and an optional description.WriteCreate Routing Form
Create a routing form for a team in an organization, from a name and an optional description. Confirm the name and the team with the user before calling; use get_my_teams or get_org_teams to find teamId and never guess it. Each call creates a new form, so never call it again to retry or to rename a form. The form starts with no questions and one fallback route, and is returned with its id, routes and updatedAt. To change its routes, pass the returned routes and updatedAt straight to edit_routing_form_routes, and don't call get_routing_form right after creating the form, because it can briefly miss a new form. This tool does not add questions, and until the form has questions the only route change that applies is setFallback.
Inputs
namestringrequired- No description.
orgIdnumberrequired- No description.
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
descriptionstring- No description.
calmcp_create_scheduleCreate a new schedule.WriteCreate Schedule
Create a new schedule. Required: name, timeZone, isDefault. Each user should have exactly one default schedule. Supports availability slots and date-specific overrides.
Inputs
isDefaultbooleanrequired- Whether this is the user's default schedule. Each user should have exactly one default schedule.
namestringrequired- Schedule name
timeZonestringrequired- IANA time zone used to calculate available times (e.g. America/New_York)
availabilityarray- Availability slots. If not provided, defaults to Mon-Fri 09:00-17:00.
overridesarray- Date-specific overrides. Use to change availability for a specific date or mark it as unavailable.
calmcp_create_team_inviteGenerate an invite link for a team.WriteCreate Team Invite
Generate an invite link for a team. Returns a URL that can be shared with users to join the team.
Inputs
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
calmcp_create_team_membershipAdd a user to a team.WriteCreate Team Membership
Add a user to a team. Required: userId (must be a real user ID from the system). Optional: role (defaults to MEMBER), accepted, disableImpersonation. Ask the user for the userId â never guess.
Inputs
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
userIdnumberrequired- No description.
acceptedboolean- No description.default
false disableImpersonationboolean- No description.default
false rolestring- No description.one of
MEMBEROWNERADMINdefaultMEMBER
calmcp_decline_booking_seatsDecline selected seats on a confirmation-required seated booking.WriteDecline Booking Seats
Decline selected seats on a confirmation-required seated booking. Waiting and confirmed seats can be declined. Pass seatUids from the booking. POST /bookings/{bookingUid}/decline refuses these bookings.
Inputs
bookingUidstringrequired- No description.
seatUidsarrayrequired- Seat UIDs to decline. A waiting or confirmed seat becomes declined. A seat that is already declined stays declined. Duplicate UIDs in one request are declined once.
calmcp_describe_api_operationGet the full input schema of an API v2 operation before calling it with call_api_operation.WriteDescribe Api Operation
Get the full input schema of an API v2 operation before calling it with call_api_operation.
Inputs
operationIdstringrequired- operationId returned by find_api_operation
calmcp_duplicate_event_typeDuplicate an organization team event type into the same team or another team of the same organization.WriteDuplicate Event Type
Duplicate an organization team event type into the same team or another team of the same organization. Find the source with get_event_types or get_event_type and never guess ids: teamId is the source's team and orgId its organization (get_me). Before calling, confirm with the user the target team (targetTeamId; use get_my_teams or get_org_teams to find it), the new title and the new slug, which must not be used in the target team; a 409 means the slug is taken, so ask for another. description and lengthInMinutes default to the source's. A copy in another team leaves out hosts who are not accepted members of the target team and activates none of the source's workflows: tell the user which ones were dropped, from droppedHostUserIds and droppedWorkflowIds. When destinationCalendarDropped is true, the copy was created without the source's destination calendar because the caller cannot set it (they are not a host of the copy, or the calendar is another member's connection): tell the user, so a host can set it. Duplicating into a team of another organization, or a team outside any organization, is refused with 400.
Inputs
eventTypeIdnumberrequired- No description.
orgIdnumberrequired- No description.
slugstringrequired- Must not be used by another event type in the target team.
targetTeamIdnumberrequired- The team the copy is created in: the source event type's team, or another team of the same organization.
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
titlestringrequired- No description.
descriptionstring- Defaults to the source event type's description.
lengthInMinutesnumber- Defaults to the source event type's length.
calmcp_edit_routing_form_fieldsEdit the questions of an existing team routing form: add, update or remove questions.WriteEdit Routing Form Fields
Edit the questions of an existing team routing form: add, update or remove questions. Call get_routing_form first and refer to existing questions by the fieldId it returns and to their options by option id; a label only names a new question, and ids are never guessed. Send only the operations that change something: every route and every untouched question keeps its id and settings, and an update changes only the properties it lists. To change a choice question's options, send its complete option list in display order: keep each existing option's id (a renamed option keeps its id, so routes comparing against it keep matching), omit the id for a new option, and leave an option out to remove it. A question's type can't be changed; remove it and add a new one. Position is 0-based among the form's questions, and add appends when it is omitted. Always preview first with dryRun: true (the default), show the user the returned changes and warnings, and get their confirmation. Then send the same operations with dryRun: false and expectedUpdatedAt set to the updatedAt from the preview. A 409 means the form changed after the preview: call get_routing_form again, rebuild and preview the edit, and ask for confirmation again; never retry an apply blindly. Removing a question or an option that a route uses (on this form or on a form that routes through it) is rejected with 400: change or remove that route first with edit_routing_form_routes. A hidden question is not shown to the booker and takes its answer from a URL parameter named after its identifier, e.g. a hidden "Lead Source" filled in by the link the lead clicked; a hidden question can't be required. Renaming a question without an explicit identifier changes the key prefilled links use; the preview warns when that happens.
Inputs
operationsarrayrequired- No description.
orgIdnumberrequired- No description.
routingFormIdstringrequired- No description.
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
dryRunboolean- Preview changes without saving. Defaults to true.default
true expectedUpdatedAtstring- Required when dryRun is false: the updatedAt from the preview or from get_routing_form.
calmcp_edit_routing_form_routesEdit the routes of an existing team routing form: add, replace, remove or move routes, or change the fallback.WriteEdit Routing Form Routes
Edit the routes of an existing team routing form: add, replace, remove or move routes, or change the fallback. Call get_routing_form first, refer to routes by the routeId it returns and to questions by their exact label, and never guess ids. Send only the operations that change something, never the full routes array: untouched routes keep their ids and settings. Always preview first with dryRun: true (the default), show the user the returned changes and warnings, and get their confirmation. Then send the same operations with dryRun: false and expectedUpdatedAt set to the updatedAt from the preview. A 409 means the form changed after the preview: call get_routing_form again, rebuild and preview the edit, and ask for confirmation again; never retry an apply blindly. Routes are evaluated top to bottom and the first match wins, so put the most specific routes first (position is 0-based among non-fallback routes; add appends when omitted). Multiselect questions have no equals: all_in means every selected option is in the list, so it is a subset test. An unanswered optional question counts as empty, and an empty value matches not_equals, not_contains, not_all_in, less_than, less_or_equal and ends_with; make the question required, or route on a choice question with explicit options, when that would catch the wrong people. Number questions support only equals, not_equals, greater_than, less_than, greater_or_equal, less_or_equal and between; use non-overlapping ranges. Router routes can be moved or removed but not replaced. Change the fallback only with setFallback. On a route to a round-robin event type, memberFilter limits the hosts to team members whose attributes match, and fallbackMemberFilter (same shape) sets the hosts used when memberFilter matches nobody. Fallback rules need attribute rules on the route: send memberFilter too, or replace a route that already has them. A route whose own fallback action (set in the route builder, not the form fallback that setFallback changes) shows a message or redirects to a URL never uses fallback rules, so the edit is refused. On replace, omitting memberFilter or fallbackMemberFilter keeps the stored rules; get_routing_form only counts them in its summary, so omit them rather than rebuilding rules you cannot read. Attach examples (answers keyed by question label, and the expectedRoute they must reach: a route id, route name or event-type slug, or null for the fallback) so the server checks that the edited routes catch the intended answers; a failed example rejects the edit with 400.
Inputs
operationsarrayrequired- No description.
orgIdnumberrequired- No description.
routingFormIdstringrequired- No description.
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
dryRunboolean- Preview changes without saving. Defaults to true.default
true examplesarray- No description.
expectedUpdatedAtstring- Required when dryRun is false: the updatedAt from the preview or from get_routing_form.
calmcp_mark_booking_absentMark host or attendees as absent for a past booking.WriteMark Booking Absent
Mark host or attendees as absent for a past booking. Set host=true if the host was absent. Use get_booking_attendees to look up real attendee emails before calling this.
- Idempotent
Inputs
bookingUidstringrequired- No description.
attendeesarray- No description.
hostboolean- Whether the host was absent
calmcp_reschedule_bookingReschedule a booking to a new time.WriteReschedule Booking
Reschedule a booking to a new time. WORKFLOW: (1) Call get_availability to find open slots — NEVER pick a new time without checking availability first. (2) The new start time must be in UTC ISO 8601. rescheduledBy is only needed for confirmation-required bookings — use the event owner's email (from get_me) for auto-confirmation. Never fabricate emails.
- Idempotent
Inputs
bookingUidstringrequired- Booking UID
startstringrequired- New start time in UTC, ISO 8601 (e.g. 2024-08-13T09:00:00Z)
rescheduledBystring- Only needed when rescheduling a booking that requires confirmation. If the event owner's email is provided, the rescheduled booking is auto-confirmed; otherwise the owner must confirm. Use get_me to get the authenticated user's email — never fabricate.
reschedulingReasonstring- Reason for rescheduling
calmcp_unassign_attribute_from_userRemove an attribute option assignment from a user.WriteUnassign Attribute From User
Remove an attribute option assignment from a user. Use get_user_attributes to find the attributeOptionId. Confirm with the user before proceeding.
Inputs
attributeOptionIdstringrequired- No description.
orgIdnumberrequired- No description.
userIdnumberrequired- No description.
calmcp_update_event_typeUpdate an existing event type by ID (use get_event_types to find IDs).WriteUpdate Event Type
Update an existing event type by ID (use get_event_types to find IDs). Any provided field replaces the current value. Array fields (locations, bookingFields) replace entirely — fetch the current event type first with get_event_type to avoid losing existing values.
- Idempotent
Inputs
eventTypeIdnumberrequired- No description.
afterEventBuffernumber- Extra time automatically blocked on your calendar after a meeting ends. This gives you time to wrap up, add notes, or decompress before your next commitment.
allowAffectingUpcomingBookingsboolean- Allows this update to affect upcoming bookings when a live confirmation session exists. Not stored and not returned. `true` confirms the edit: - Turning seats off cancels every attendee and booking attempt, and new bookings are taken one at a time. - Turning confirmation off rejects pending requests, leaves accepted attendees, and confirms new booking attempts until the seats are full. - Setting the seat cap below the seats already accepted keeps existing bookings and their seats, and applies the lower cap to new bookings and later confirmations. `false` and omitting the field leave the update refused when it would affect upcoming bookings.
allowReschedulingCancelledBookingsboolean- When enabled, users will be able to create a new booking when trying to reschedule a cancelled booking.default
false allowReschedulingPastBookingsboolean- Enabling this option allows for past events to be rescheduled.default
false beforeEventBuffernumber- Extra time automatically blocked on your calendar before a meeting starts. This gives you time to prepare, review notes, or transition from your previous activity.
bookerActiveBookingsLimitstring- Limit the number of active bookings a booker can make for this event type.
bookerLayoutsobject- Should booker have week, month or column view. Specify default layout and enabled layouts user can pick.
bookingFieldsarray- Booking fields for the event type. Omit this property to keep the current fields. Provide an array to replace them, customize default fields, or add custom booking fields. At least one of `email` or `attendeePhoneNumber` must be visible and required. The array cannot be empty, contain duplicate default fields or custom slugs, or use a default field's slug for a custom field. Omitted default fields are restored with their default settings. Workflow-added fields are read-only and ignored.
bookingLimitsCountstring- Limit how many times this event can be booked
bookingLimitsDurationstring- Limit total amount of time that this event can be booked
bookingProposalCountnumber- Maximum number of timeslots a proposal may include. The client chooses from 1 through this maximum. Set to null to use the default single-slot booking flow.
bookingRequiresAuthenticationboolean- Boolean to require authentication for booking this event type via api. If true, only authenticated users who are the event-type owner or org/team admin/owner can book this event type.default
false bookingWindowstring- Limit how far in the future this event can be booked
calendarInvitesobject- Write-only host and guest calendar-invite description settings. These are saved separately from the event type and are not returned by event-type read endpoints.
calVideoSettingsobject- Cal video settings for the event type
colorobject- No description.
confirmationPolicystring- Specify how the booking needs to be manually confirmed before it is pushed to the integrations and a confirmation mail is sent.
crmobject- CRM app settings for the event type, mirroring the event type Apps tab toggles. The credential is resolved server-side â the app must be installed for the event type owner.
customNamestring- Customizable event name with valid variables: {Link title}, {Event type title} (legacy), {Organiser}, {Scheduler}, {Location}, {Organiser first name}, {Scheduler first name}, {Scheduler last name}, {Event duration}, {LOCATION}, {HOST/ATTENDEE}, {HOST}, {ATTENDEE}, {USER}
descriptionstring- No description.
destinationCalendarobject- No description.
disableCancellingobject- Settings for disabling cancelling of this event type.
disableReschedulingobject- Settings for disabling rescheduling of this event type. Can be always disabled or disabled when less than X minutes before the meeting.
emailSettingsobject- Email settings for this event type. Personal event types require an accepted organization membership; team event types require an organization team. This does not include emails sent by custom email workflows.
hiddenboolean- No description.
hideCalendarEventDetailsboolean- No description.
hideCalendarNotesboolean- No description.
hideOrganizerEmailboolean- Boolean to Hide organizer's email address from the booking screen, email notifications, and calendar events
interfaceLanguagestring- Set preferred language for the booking interface. Use empty string for visitor's browser language (default).one of
enarazbgbncacsdadeeleses-419euetfifrhehuitjakmkonlnoplpt-BRptrorusk-SKslsrsvtrukvizh-CNzh-TW lengthInMinutesnumber- No description.
lengthInMinutesOptionsarray- If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.
locationsarray- Locations where the event will take place. If not provided, cal video link will be used as the location. Note: Setting a location to a conferencing app does not install the app - the app must already be installed. Via API, only Google Meet (google-meet), Microsoft Teams (office365-video), and Zoom (zoom) can be installed. Cal Video (cal-video) is installed by default. All other conferencing apps must be connected via the Cal.com web app and are not available for Platform plan customers. You can only set an event type location to an app that has already been installed or connected.
lockTimeZoneToggleOnBookingPageboolean- No description.
minimumBookingNoticenumber- Minimum number of minutes before the event that a booking can be made.
offsetStartnumber- Offset timeslots shown to bookers by a specified number of minutes
onlyShowFirstAvailableSlotboolean- This will limit your availability for this event type to one slot per day, scheduled at the earliest available time.
privateNoteEnabledboolean- When enabled, a private note calendar event is created alongside the booking with the resolved template as its description. Only visible to the host.default
false privateNoteModestring- How private notes are delivered: as an additional host event or by sending separate host and guest invites.one of
duplicate_eventseparate_events privateNoteTemplatestring- Template for the private note content. Supports variables like {Attendee name}, {Link title}, {Event type title} (legacy), {Location}, {Host name}, {Event duration}, and custom booking field names.
recurrencestring- Create a recurring event type.
requiresBookerEmailVerificationboolean- No description.
scheduleIdnumber- If you want that this event has different schedule than user's default one you can specify it here.
seatsstring- Create an event type with multiple seats.
showOptimizedSlotsboolean- Arrange time slots to optimize availability.default
false skipAttendeeEmailDeliverabilityCheckboolean- When true, skips the MX deliverability check for attendee emails on booking. Format validation and watchlist still apply. Requires the editor to belong to an organization (including platform orgs).
slotIntervalnumber- Number representing length of each slot when event is booked. By default it equal length of the event type. If event length is 60 minutes then we would have slots 9AM, 10AM, 11AM etc. but if it was changed to 30 minutes then we would have slots 9AM, 9:30AM, 10AM, 10:30AM etc. as the available times to book the 60 minute event.
slugstring- No description.
successRedirectUrlstring- A valid URL where the booker will redirect to, once the booking is completed successfully
titlestring- No description.
useDestinationCalendarEmailboolean- No description.
useIsolatedAvailabilityboolean- When true, only this event type's own Cal.com bookings block the slot. The availability schedule and connected calendars still apply. Same as "Consider only this booking link's bookings" in the web app. Requires an organization with at least 15 members.default
false weekStartstring- Day the booking page calendar starts the week on. Overrides the host's account setting for this event type only. Omit or set to null to inherit the account setting.one of
SundayMondayTuesdayWednesdayThursdayFridaySaturday
calmcp_update_meUpdate the authenticated user's profile.WriteUpdate Me
Update the authenticated user's profile. Supports name, email, bio, time zone, week start, time format, default schedule, locale, avatar URL, and custom metadata.
- Idempotent
Inputs
avatarUrlstring- URL of the user's avatar image
biostring- Bio
defaultScheduleIdnumber- No description.
emailstring- No description.
localestring- No description.one of
arcadeeseuheidjalvplrosrthviazcseles-419fihritkmnlptrusvtrzh-CNbgdaenetfrhuiwkonopt-BRsksltaukzh-TWbn metadataobject- You can store any additional data you want here. Metadata must have at most 50 keys, each key up to 40 characters, and values up to 500 characters.
namestring- No description.
timeFormatstring- Must be 12 or 24
timeZonestring- No description.
weekStartstring- No description.one of
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
calmcp_update_org_membershipUpdate an organization membership.WriteUpdate Org Membership
Update an organization membership. Can change role, accepted status, or impersonation settings.
- Idempotent
Inputs
membershipIdnumberrequired- No description.
orgIdnumberrequired- No description.
acceptedboolean- No description.
disableImpersonationboolean- No description.
rolestring- No description.one of
MEMBEROWNERADMIN
calmcp_update_scheduleUpdate an existing schedule.WriteUpdate Schedule
Update an existing schedule. Array fields (availability, overrides) replace all existing entries.
- Idempotent
Inputs
scheduleIdstringrequired- No description.
availabilityarray- No description.
isDefaultboolean- No description.
namestring- No description.
overridesarray- No description.
timeZonestring- No description.
calmcp_update_team_membershipUpdate a team membership.WriteUpdate Team Membership
Update a team membership. Can change accepted status, role, or impersonation settings. Use get_team_memberships to find the membershipId â never guess.
Inputs
membershipIdnumberrequired- No description.
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
acceptedboolean- No description.
disableImpersonationboolean- No description.
rolestring- No description.one of
MEMBEROWNERADMIN
calmcp_update_user_attributeUpdate an existing attribute assignment for a user (e.g.WriteUpdate User Attribute
Update an existing attribute assignment for a user (e.g. change the weight). Use get_user_attributes to find the attributeOptionId.
Inputs
attributeOptionIdstringrequired- No description.
orgIdnumberrequired- No description.
userIdnumberrequired- No description.
weightnumber- The weight of the attribute for this user
calmcp_cancel_bookingCancel a booking by UID.DestructiveCancel Booking
Cancel a booking by UID. For recurring non-seated bookings, set cancelSubsequentBookings=true to cancel future recurrences. For seated bookings, pass seatUid to cancel a specific seat instead of the entire booking. Confirm with the user before cancelling.
- Idempotent
Inputs
bookingUidstringrequired- Booking UID
cancellationReasonstring- Reason for cancellation
cancelSubsequentBookingsboolean- For recurring non-seated bookings only: if true, also cancels all subsequent recurrences after this one.
seatUidstring- UID of the specific seat to cancel within a seated booking. Required when cancelling an individual seat instead of the entire booking.
calmcp_delete_event_typePermanently delete an event type by ID.DestructiveDelete Event Type
Permanently delete an event type by ID. This action is irreversible — confirm with the user before proceeding.
- Idempotent
Inputs
eventTypeIdnumberrequired- No description.
calmcp_delete_org_membershipRemove a membership from an organization.DestructiveDelete Org Membership
Remove a membership from an organization. This action is irreversible — confirm with the user before proceeding.
- Idempotent
Inputs
membershipIdnumberrequired- No description.
orgIdnumberrequired- No description.
calmcp_delete_scheduleDelete a schedule by its numeric ID.DestructiveDelete Schedule
Delete a schedule by its numeric ID. This action is irreversible — confirm with the user before proceeding.
- Idempotent
Inputs
scheduleIdnumberrequired- No description.
calmcp_delete_team_membershipRemove a user from a team.DestructiveDelete Team Membership
Remove a user from a team. This action is irreversible â confirm with the user before proceeding. Use get_team_memberships to find the membershipId â never guess.
Inputs
membershipIdnumberrequired- No description.
teamIdstringrequired- The team's uuid (preferred), its short-uuid (Flickr Base58) form, or its numeric id.
No tools match.