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 35 tools.
- Tools
- 35
- What they doRead · write · destructive
- 18 · 13 · 418 read13 write4 destructive
- Users sign in with
- OAuth
- OAuth app
- Your own Cal MCP server app
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 and copy its redirect URI. The name you give it is the
connection_nameyour code passes. See Configure connections.Register an OAuth app
Cal MCP server connections use your own OAuth app. Register one with Cal MCP server and add the redirect URI you copied.
Then enter the app's Client ID and Client Secret on the Cal MCP connection.
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_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
attendeeIdintegerrequired- Attendee ID. Use get_booking_attendees to find this.
bookingUidstringrequired- Booking UID
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_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')
skipinteger- Results to skip (offset)
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- Comma-separated statuses: upcoming, recurring, past, cancelled, unconfirmed
takeinteger- Max results to return (default 100, max 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_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_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
eventTypeIdintegerrequired- Event type ID. Use get_event_types to find this.
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_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_org_membershipGet a specific organization membership by its numeric ID.Read-onlyGet Org Membership
Get a specific organization membership by its numeric ID.
Inputs
membershipIdintegerrequired- Membership ID. Use get_org_memberships to find this.
orgIdintegerrequired- Organization ID. Use get_me to obtain your organizationId — never guess.
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
orgIdintegerrequired- Organization ID. Use get_me to obtain your organizationId — never guess.
skipnumber- Results to skip (offset)
takenumber- Max results to return
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
orgIdintegerrequired- Organization ID. Use get_me to obtain your organizationId — never guess.
routingFormIdstringrequired- Routing form ID. Use get_org_routing_forms to find this — never guess.
afterCreatedAtstring- Created after (ISO 8601)
afterUpdatedAtstring- Updated after (ISO 8601)
beforeCreatedAtstring- Created before (ISO 8601)
beforeUpdatedAtstring- Updated before (ISO 8601)
routedToBookingUidstring- Filter by routed booking UID
skipnumber- Results to skip
sortCreatedAtstring- Sort by createdone of
ascdesc sortUpdatedAtstring- Sort by updatedone of
ascdesc takenumber- Max results
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
orgIdintegerrequired- Organization ID. Use get_me to obtain your organizationId — never guess.
afterCreatedAtstring- Created after (ISO 8601)
afterUpdatedAtstring- Updated after (ISO 8601)
beforeCreatedAtstring- Created before (ISO 8601)
beforeUpdatedAtstring- Updated before (ISO 8601)
routedToBookingUidstring- Filter by routed booking UID
skipnumber- Results to skip
sortCreatedAtstring- Sort by createdone of
ascdesc sortUpdatedAtstring- Sort by updatedone of
ascdesc takenumber- Max results
teamIdsarray- Filter by team IDs
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
scheduleIdintegerrequired- Schedule ID
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_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- Booking UID
emailstringrequired- Attendee email address. Ask the user — never guess or fabricate.
namestringrequired- Attendee name. Ask the user — never guess.
timeZonestringrequired- IANA time zone. Ask the user — never guess.
languagestring- ISO 639-1 language code (e.g. 'en')
phoneNumberstring- Phone in international format. Ask the user — never guess.
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_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_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
lengthInMinutesintegerrequired- Duration in minutes
slugstringrequired- URL-friendly slug (e.g. '30min')
titlestringrequired- Event type title
afterEventBufferinteger- Minutes blocked on calendar after the meeting ends.
beforeEventBufferinteger- Minutes blocked on calendar before the meeting starts.
bookingFieldsarray- Custom fields added to the booking form. Each object defines a field with properties like name, type, label, required, etc.
bookingLimitsCountobject- Limit how many times this event can be booked per period (e.g. {day: 2, week: 5}).
bookingWindowobject- Limit how far in the future this event can be booked.
confirmationPolicyobject- Manual confirmation policy. Controls whether bookings require host confirmation.
customNamestring- Custom event name template with variables: {Event type title}, {Organiser}, {Scheduler}, {Location}.
descriptionstring- Description shown on the booking page
destinationCalendarobject- Which external calendar new bookings are added to.
disableGuestsboolean- If true, bookers cannot add guest emails.
hiddenboolean- Whether the event type is hidden from the public profile.
hideCalendarNotesboolean- Hide calendar notes from the booking.
lengthInMinutesOptionsarray- Multiple duration options the attendee can choose from (e.g. [15, 30, 60]). If provided, the booker picks their preferred duration.
locationsarray- Locations where the event takes place. If not provided, Cal Video is used. Each element is a location object (e.g. {type: 'inPerson', address: '...'}). Note: setting a conferencing app as location requires the app to already be installed.
lockTimeZoneToggleOnBookingPageboolean- Lock the timezone on the booking page.
minimumBookingNoticeinteger- Minimum minutes before the event that a booking can be made.
offsetStartinteger- Offset timeslots shown to bookers by a specified number of minutes.
onlyShowFirstAvailableSlotboolean- Limit availability to one slot per day (the earliest available).
recurrenceobject- Recurrence settings to create a recurring event type (e.g. {frequency: 'weekly', interval: 1, occurrences: 12}).
requiresBookerEmailVerificationboolean- Whether booker must verify their email before the booking is confirmed.
scheduleIdinteger- Use a specific schedule instead of the user's default. Use get_schedules to find schedule IDs.
seatsobject- Enable seated events. Object with seatsPerTimeSlot and other seat settings.
slotIntervalinteger- Length of each slot in minutes. Defaults to the event duration.
successRedirectUrlstring- URL to redirect the booker to after a successful booking.
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. Must be a real user ID — ask the user for this, never guess.
acceptedboolean- Whether accepted
disableImpersonationboolean- Disable impersonation
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_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- Booking UID
attendeesarray- Attendees with absent status. Use real attendee emails from the booking.
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_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
eventTypeIdintegerrequired- Event type ID to update. Use get_event_types to find this.
afterEventBufferinteger- Minutes blocked on calendar after the meeting.
beforeEventBufferinteger- Minutes blocked on calendar before the meeting.
bookingFieldsarray- Updated booking fields array. Replaces ALL existing booking fields. To modify fields, first fetch the current event type with get_event_type, then include all desired fields here.
bookingLimitsCountobject- Limit how many times this event can be booked per period (e.g. {day: 2, week: 5}).
bookingWindowobject- Limit how far in the future this event can be booked.
confirmationPolicyobject- Manual confirmation policy settings.
customNamestring- Custom event name template.
descriptionstring- New description
destinationCalendarobject- Which external calendar new bookings are added to.
disableGuestsboolean- If true, bookers cannot add guest emails.
hiddenboolean- Whether the event type is hidden.
hideCalendarNotesboolean- Hide calendar notes.
lengthInMinutesinteger- New duration in minutes
lengthInMinutesOptionsarray- Multiple duration options the attendee can choose from (e.g. [15, 30, 60]). If provided, the booker picks their preferred duration.
locationsarray- Updated locations array. Replaces all existing locations.
lockTimeZoneToggleOnBookingPageboolean- Lock timezone on booking page.
minimumBookingNoticeinteger- Minimum minutes before event that a booking can be made.
offsetStartinteger- Offset timeslots by specified minutes.
onlyShowFirstAvailableSlotboolean- Show only the earliest available slot per day.
recurrenceobject- Recurrence settings (e.g. {frequency: 'weekly', interval: 1, occurrences: 12}).
requiresBookerEmailVerificationboolean- Whether booker must verify their email.
scheduleIdinteger- Schedule ID to use instead of default. Use get_schedules to find schedule IDs.
seatsobject- Seated event settings.
slotIntervalinteger- Length of each slot in minutes.
slugstring- New URL-friendly slug
successRedirectUrlstring- Redirect URL after successful booking.
titlestring- New title
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- Short biography or description
defaultScheduleIdinteger- ID of the default schedule to use for event types
emailstring- Email address
localestring- Locale / language code (e.g. 'en', 'fr', 'de')
metadataobject- Custom metadata key-value pairs (max 50 keys, keys ≤40 chars, string values ≤500 chars)
namestring- Display name
timeFormatinteger- Time format: 12 or 24
timeZonestring- IANA time zone (e.g. America/New_York)
weekStartstring- Week start day (e.g. Monday, Sunday)
calmcp_update_org_membershipUpdate an organization membership.WriteUpdate Org Membership
Update an organization membership. Can change role, accepted status, or impersonation settings.
- Idempotent
Inputs
membershipIdintegerrequired- Membership ID. Use get_org_memberships to find this.
orgIdintegerrequired- Organization ID. Use get_me to obtain your organizationId — never guess.
acceptedboolean- Whether accepted
disableImpersonationboolean- Disable impersonation
rolestring- New roleone of
MEMBEROWNERADMIN
calmcp_update_scheduleUpdate an existing schedule.WriteUpdate Schedule
Update an existing schedule. Array fields (availability, overrides) replace all existing entries.
- Idempotent
Inputs
scheduleIdintegerrequired- Schedule ID
availabilityarray- New availability slots. Replaces all existing slots.
isDefaultboolean- Set as the user's default schedule.
namestring- New name
overridesarray- Date-specific overrides. Replaces all existing overrides.
timeZonestring- New IANA time zone
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
eventTypeIdintegerrequired- Event type ID to delete. Use get_event_types to find this.
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
membershipIdintegerrequired- Membership ID. Use get_org_memberships to find this.
orgIdintegerrequired- Organization ID. Use get_me to obtain your organizationId — never guess.
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
scheduleIdintegerrequired- Schedule ID
No tools match.