Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Cal MCP server

Vendor MCP
Open markdown

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

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. 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>
  3. Create the Cal MCP connection

    In AgentKit > Connections, create a Cal MCP connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for Cal MCP server, so you don't need to register an OAuth app.

  4. 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.actions
    const connector = 'calmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { 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 call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'calmcp_get_me',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • calmcp_find_api_operationSearch the Cal.com API v2 catalog for operations not covered by a dedicated tool.Read-only

    Find 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_attribute_optionsList all available options for a SINGLE_SELECT or MULTI_SELECT attribute.Read-only

    Get 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-only

    Get 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-only

    Get 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-only

    Get 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-only

    Get 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-only

    Get 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.