Calendar scheduling, bookings, and availability for AI agents
A Model Context Protocol (MCP) server that exposes Cal.com's v2 API for managing event types, bookings, schedules, availability, and organization membership.
Overview
The MewCP Cal MCP Server provides programmatic access to a Cal.com scheduling account:
Read and create event types, and inspect the authenticated user's profile
Create, retrieve, reschedule, confirm, cancel, and mark bookings absent
Manage availability schedules and query open time slots and busy times
List organization memberships and routing forms
Perfect for:
Automating meeting booking and rescheduling workflows
Building scheduling assistants that surface open slots and busy times
Managing team and organization scheduling resources programmatically
- `event_type_id` (integer, required) — The event type ID: the numeric Cal.com identifier of the event type to retrieve, as an integer (e.g. 123456). Required — the call fails with a validation error if omitted.
output data schema:
{ id?: number | null; title?: string | null
Create a new event type
Inputs:
- `title` (string, required) — Title of the event type: the display name for the new event type, as a plain non-empty string (e.g. '30 Minute Meeting'). Required — the call fails with a validation error if omitted or blank.
- `booking_id` (string, required) — The booking ID to retrieve, as a plain string (e.g. '12345'). Required.
output data schema:
{ id?: number | null; uid?: string | null; title?:
Create a new booking
Inputs:
- `event_type_id` (integer, required) — Event type ID to book, as an integer (e.g. 42). Required.- `start` (string, required) — Booking start datetime in ISO 8601 / RFC 3339 UTC format (e.g. '2024-08-13T09:00:00Z'). Required.- `attendee_name` (string, required) — Attendee full name as a plain string (e.g. 'Ada Lovelace'). Required.- `attendee_email` (string, required) — Attendee email address as a plain string (e.g. 'ada@example.com'). Required.
output schema:
DESTRUCTIVE — REQUIRES EXPLICIT USER CONFIRMATION BEFORE CALLING. Cancel a booking. Permanently cancels the booking identified by booking_id, releasing its time slot and notifying the host and every attendee. This action is irreversible — the cancelled booking and its confirmed slot cannot be recovered. NEVER call this tool autonomously or as part of an automated flow. You MUST stop, tell the user exactly which booking will be cancelled and that it is permanent, and wait for their explicit written confirmation before proceeding. The response includes the booking's state before cancellation.
Inputs:
- `booking_id` (string, required) — The booking ID to cancel, as a plain string (e.g. '12345'). Required.
output data schema:
{ before
Reschedule an existing booking. Only the fields you provide are changed — others keep their current value. NOTE: this overwrites the current start and end times — the original state is not stored after the call. The response includes both the before and after state so you have a full record of what changed.
Inputs:
- `booking_id` (string, required) — The booking ID to reschedule, as a plain string (e.g. '12345'). Required.- `start` (string, required) — New start time in ISO 8601 / RFC 3339 UTC format (e.g. '2024-08-13T09:00:00Z'). Required.- `end` (string, required) — New end time in ISO 8601 / RFC 3339 UTC format (e.g. '2024-08-13T09:30:00
Confirm a pending booking. Only the fields you provide are changed — others keep their current value. NOTE: this overwrites the booking's current status — the original state is not stored after the call. The response includes both the before and after state so you have a full record of what changed.
Inputs:
- `booking_id` (string, required) — ID of the pending booking to confirm, as a plain string (e.g. '12345'). Required.
output data schema:
{ before?: { id?: number | null; uid?: string
Mark a booking as absent. Only the fields you provide are changed — others keep their current value. NOTE: this overwrites the booking's current attendance state — the original state is not stored after the call. The response includes both the before and after state so you have a full record of what changed.
Inputs:
- `booking_id` (string, required) — ID of the booking to mark as absent, as a plain string (e.g. '12345'). Required.
output data schema:
{ before?: { id?: number | null; uid?:
Schedules
Get all schedules for the user
Inputs:
no inputs.
output data schema:
{ count: number; schedules: { id?: number | null; ownerId?: number | null; name?:
Get a specific schedule by ID
Inputs:
- `schedule_id` (string, required) — The schedule ID identifying the schedule to retrieve. Plain string containing the Cal.com numeric schedule identifier (for example "12345"). Required — the call fails with a validation error if omitted or blank.
output data schema:
{ id?: number | null; ownerId?: number |
Get default schedule
Inputs:
no inputs.
output data schema:
{ id?: number | null; ownerId?: number | null; name?: string | null; timeZone
Create a new schedule
Inputs:
- `name` (string, required) — Name of the schedule to create, as shown in Cal.com. Plain free-text string (for example "Working Hours"). Required — the call fails with a validation error if omitted or blank.
output data schema:
{ id?: number | null; ownerId?: number | null;
Availability
Get available time slots
Inputs:
- `date` (string, required) — Calendar day to look up available slots for, as a plain string in YYYY-MM-DD format (ISO 8601 calendar date). Required — there is no default, and the call fails with VALIDATION_ERROR if it is omitted or not in YYYY-MM-DD format.
This server uses static API-key authentication. Add your Cal.com API key to your MewCP account as the api_key credential field. The server sends it upstream to the Cal.com v2 API as: