Connect Cal.com to ChatGPT: Manage Bookings and Availability via MCP
Learn how to connect Cal.com to ChatGPT using a managed MCP server. Automate bookings, manage availability, and handle scheduling workflows with AI agents.
To connect Cal.com to ChatGPT, you need a Model Context Protocol (MCP) server. This server acts as a translation layer, converting the LLM's standardized tool calls into Cal.com's specific REST API requests. You can either build and maintain this translation layer yourself, or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL. If your team uses Claude, check out our guide on connecting Cal.com to Claude or explore our broader architectural overview on connecting Cal.com to AI Agents.
As we've seen when connecting Affinity to ChatGPT, giving a Large Language Model (LLM) read and write access to a scheduling platform is an engineering challenge. You have to handle authentication, map JSON schemas to MCP tool definitions, and deal with rate limits. Every time Cal.com updates an endpoint, you have to update your server code, redeploy, and test the integration. This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for Cal.com, connect it natively to ChatGPT, and execute complex scheduling workflows using natural language.
The Engineering Reality of the Cal.com API
A custom MCP server is a self-hosted integration layer. As we noted in our guide on connecting Basecamp to ChatGPT, while the open standard provides a predictable way for models to discover tools, the reality of implementing it against vendor APIs is painful. If you decide to build a custom MCP server for Cal.com, you own the entire API lifecycle.
Cal.com's API introduces several specific integration challenges that break standard CRUD assumptions:
Timezone Normalization and ISO 8601 Strictness
Scheduling APIs are notorious for timezone drift. Cal.com requires strict ISO 8601 strings and explicit timeZone parameters for most schedule and booking operations. If an LLM hallucinates a local time string without the offset, the booking fails or lands on the wrong day. The MCP tool schema must explicitly enforce timezone requirements so the LLM knows exactly how to format its payload.
Dynamic Attendee Schemas
A standard booking requires basic inputs like name and email, but custom event types in Cal.com introduce dynamic fields. Much like the strict parameter requirements when connecting Billsby to ChatGPT, you cannot just POST a flat object to create a booking. The LLM has to resolve the eventTypeId or eventTypeSlug first to understand what input fields the specific booking requires. Your MCP server needs to expose both the event type discovery endpoints and the booking creation endpoints so the agent can introspect the schema before attempting a write operation.
Handling Rate Limits
Similar to handling Anthropic rate limits, Cal.com enforces strict rate limits. If your ChatGPT agent tries to batch process too many schedule updates at once, Cal.com will return an HTTP 429 error. Truto does not automatically retry, throttle, or apply backoff on rate limit errors. When the upstream API returns a 429, Truto passes that error directly to the caller, normalizing the upstream rate limit info into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller - in this case, your ChatGPT client or agent framework - is responsible for implementing retry logic and exponential backoff.
Generating the Cal.com MCP Server
Truto's MCP servers feature turns any connected Cal.com account into an MCP-compatible tool server. Tool generation is dynamic and documentation-driven. Rather than hand-coding tool definitions, Truto derives them from the integration's resource definitions and JSON Schema documentation.
You can generate the MCP server URL using either the Truto dashboard or the REST API.
Method 1: Via the Truto UI
This is the fastest path for testing and manual setups.
- Navigate to the integrated account page for your Cal.com connection in the Truto dashboard.
- Click the MCP Servers tab.
- Click Create MCP Server.
- Select your desired configuration (name, allowed methods, tags, and expiry).
- Copy the generated MCP server URL.
Method 2: Via the API
For programmatic provisioning, you can generate the server via a POST request. The API validates that the integration has tools available, generates a secure token, stores it in the database, and returns a ready-to-use URL.
Endpoint: POST /integrated-account/:id/mcp
{
"name": "ChatGPT Scheduling Agent",
"config": {
"methods": ["read", "write"],
"require_api_token_auth": false
},
"expires_at": null
}The response includes the database record plus the MCP server URL:
{
"id": "abc-123",
"name": "ChatGPT Scheduling Agent",
"config": { "methods": ["read", "write"] },
"expires_at": null,
"url": "https://api.truto.one/mcp/a1b2c3d4e5f6..."
}Each MCP server is scoped to a single integrated account. The server URL contains a cryptographic token that encodes which account to use and what tools to expose. The URL alone is enough to authenticate and serve tools.
Connecting the MCP Server to ChatGPT
Once you have your MCP server URL, you need to register it with your ChatGPT client. You can do this through the ChatGPT UI or via a local Server-Sent Events (SSE) client.
Method A: Via the ChatGPT UI
This approach works well for individual users on supported ChatGPT plans.
- Open ChatGPT and navigate to Settings -> Apps -> Advanced settings.
- Enable Developer mode.
- Under MCP servers / Custom connectors, click to add a new server.
- Set the Name to something recognizable, like "Cal.com (Truto)".
- Paste the Truto MCP URL into the Server URL field.
- Save the configuration. ChatGPT will connect, perform the JSON-RPC handshake, and list the available Cal.com tools.
Method B: Via Manual Config File (SSE Client)
If you are running a custom agent framework or a local client that supports MCP configuration files, you can use the official SSE client wrapper.
Add the following to your MCP client configuration file:
{
"mcpServers": {
"calcom": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sse",
"--url",
"https://api.truto.one/mcp/YOUR_TOKEN"
]
}
}
}When the client connects, all communication happens over HTTP POST with JSON-RPC 2.0 messages. The Truto MCP router handles the full protocol lifecycle, splitting flat arguments into query and body parameters based on the dynamically generated schemas.
graph TD A[ChatGPT Client] -->|JSON-RPC 2.0<br>over HTTP| B[Truto MCP Endpoint] B -->|Token Validation| C[Truto Proxy API] C -->|Standardized HTTP Request| D[Cal.com API] D -->|Raw JSON Response| C C -->|Parsed Result & Cursors| B B -->|MCP Formatted Response| A
Security and Access Control
Exposing your scheduling infrastructure to an LLM requires strict guardrails. Truto provides several mechanisms to lock down your MCP servers.
- Method filtering: Restrict the MCP server to read-only operations using
config.methods: ["read"]. This ensures the model can list bookings and check availability, but cannot create or delete schedules. - Tag filtering: Restrict the server to specific resource types using
config.tags. For example, you can expose event types without exposing team management endpoints. - Token auth: For enterprise environments, set
require_api_token_auth: true. This forces the MCP client to provide a valid Truto API token in theAuthorizationheader, adding a second layer of authentication beyond the URL token. - Ephemeral access: Use the
expires_atfield to generate temporary credentials for contractors or short-lived automated workflows. The server automatically revokes access when the timestamp passes.
Cal.com MCP Tool Inventory
When ChatGPT connects to the server, it receives a list of callable tools. Truto generates these tool names as descriptive snake_case strings. Here are the primary tools you will use for scheduling automation.
list_all_calcom_bookings
- Description: Get all bookings in Cal.com. Returns id, uid, title, description, hosts, status, and cancellation reasons.
- Example Prompt: "Pull a list of all my bookings for next week and summarize the attendees and statuses."
create_a_calcom_booking
- Description: Create a booking with start time and attendee details in Cal.com using eventTypeId or eventTypeSlug.
- Example Prompt: "Create a new booking for john@example.com using the 'discovery-call' event type slug, starting at 2026-10-15T14:00:00Z."
list_all_calcom_event_types
- Description: Get all event types in Cal.com. Returns id, title, description, and locations.
- Example Prompt: "List all active event types and tell me which ones are configured for Zoom meetings."
list_all_calcom_schedules
- Description: Get all schedules of the authenticated user in Cal.com including name and availability.
- Example Prompt: "Check my current schedules and tell me what my working hours are for Fridays."
update_a_calcom_schedule_by_id
- Description: Update a schedule by id in Cal.com. Requires scheduleId and returns updated fields like name and timeZone.
- Example Prompt: "Update schedule ID 4092 to change the timeZone to 'America/Los_Angeles'."
Here is the complete inventory of additional Cal.com tools available. For full schema details, visit the Cal.com integration page.
- list_all_calcom_schedule: Get all schedules in Cal.com. Returns schedules with id, userId, name, timeZone, and availability.
- get_single_calcom_booking_by_id: Get booking details by id in Cal.com. Returns fields including id, uid, title, description, and hosts.
- delete_a_calcom_schedule_by_id: Delete a schedule by id in Cal.com. Returns status indicating success or error.
- delete_a_calcom_team_by_id: Delete a team by id in Cal.com. Requires id and returns status 200 on success.
- create_a_calcom_team: Create a team in Cal.com with a required name. Returns status and data of the created team.
- list_all_calcom_teams: Get list of teams in Cal.com. Returns an array with team details.
- update_a_calcom_team_by_id: Update a team by id in Cal.com. Returns updated team fields including id, parentId, name, and slug.
- get_single_calcom_team_by_id: Get a team by id in Cal.com. Returns id, name, slug, bio, and privacy settings.
- create_a_calcom_event_type: Create an event type in Cal.com with required parameters like length, title, and slug.
- update_a_calcom_event_type_by_id: Update an event type by id in Cal.com. Returns updated fields like length and title.
- get_single_calcom_event_type_by_id: Get event type by id in Cal.com. Returns id, length, title, slug, and location details.
- delete_a_calcom_event_type_by_id: Delete an event type by id in Cal.com. Returns the deleted event type's core details.
- list_all_calcom_calendars: Get all calendars connected to Cal.com. Returns connectedCalendars array with integration details.
- create_a_calcom_schedule: Create a schedule with name, timeZone, and availability for the authenticated user.
- get_single_calcom_schedule_by_id: Get schedule details by id in Cal.com including ownerId, name, and timeZone.
Workflows in Action
Connecting the tools is only the first step. The real value comes from orchestrating these tools into reliable, multi-step workflows. Here are two concrete examples of how ChatGPT handles complex scheduling requests using the Cal.com MCP server.
Scenario 1: Sales SDR Rescheduling a Demo
Sales representatives often need to adjust their calendars dynamically based on prospect requests. Instead of manually navigating the Cal.com interface, an SDR can instruct ChatGPT to handle the logistics.
"Look up my bookings for today. Find the sync with Acme Corp, check the event type, and book a new 30-min discovery call for that same client tomorrow at 10 AM EST. Use the same event type slug."
Execution Steps:
list_all_calcom_bookings: ChatGPT queries the bookings list, applying a date filter for today. It parses the response to locate the booking containing "Acme Corp" in the title or description.get_single_calcom_booking_by_id: The agent fetches the specific booking details to extract the attendee's email address and the associated event type ID.get_single_calcom_event_type_by_id: The agent resolves the event type ID to retrieve theslugrequired for the new booking.create_a_calcom_booking: ChatGPT constructs the POST payload, calculating the correct ISO 8601 timestamp for "tomorrow at 10 AM EST", and executes the booking creation tool.
Result: The agent confirms the new booking has been created and returns the unique booking ID and URL to the SDR.
Scenario 2: Recruiting Coordinator Provisioning a New Team
When a new hiring panel is formed, recruiting coordinators need to set up dedicated teams, event types, and schedules. This is traditionally a tedious manual process.
"Create a new team called 'Engineering Hiring Panel'. Once created, build a new event type for this team called 'Technical Screen' with a 60-minute duration and a slug of 'tech-screen'."
Execution Steps:
create_a_calcom_team: ChatGPT executes the creation tool, passing "Engineering Hiring Panel" as the name parameter. It extracts the new team'sidfrom the response.create_a_calcom_event_type: Using the newly acquired team ID, the agent constructs the payload for the event type. It sets thetitleto "Technical Screen", thelengthto 60, theslugto "tech-screen", and associates it with the correct team.list_all_calcom_event_types: The agent performs a quick read operation to verify the event type was successfully attached to the team.
Result: The agent provides a summary of the newly provisioned team and event type, ready for the recruiting staff to use.
Strategic Next Steps
Connecting Cal.com to ChatGPT via an MCP server shifts scheduling from a manual, UI-bound process to an automated, conversational workflow. By leveraging a managed infrastructure layer, you avoid the heavy lifting of OAuth token management, schema validation, and API maintenance.
To build resilient AI agents, ensure you implement robust error handling for rate limits, enforce strict ISO 8601 formatting in your system prompts, and use method filtering to restrict agent permissions to the minimum required scope.
FAQ
- How do I handle Cal.com timezone issues with ChatGPT?
- Always instruct the LLM to pass explicit ISO 8601 formatted timestamps and specify the timeZone parameter when calling the schedule or booking tools.
- Can I restrict ChatGPT to read-only access for Cal.com?
- Yes. When configuring your MCP server, apply a method filter for ["read"] to ensure the model can only list and get records, blocking any create or delete operations.
- Does Truto store my Cal.com booking data?
- No. Truto uses a pass-through architecture. Data is processed in memory during the tool call and immediately returned to the LLM without being stored at rest.