Cal MCP

Live

OAUTH 2.0

CALENDAR

Calendar

Let your agent check availability, book meetings, and reschedule events as the real person who owns the Cal.com calendar.

  • Acts as the owner. Every booking and reschedule is attributed to the real user, not a shared scheduling bot.
  • Tokens stay vaulted. Cal.com OAuth credentials sit in an AES-256 vault, resolved per request, never in the prompt.
  • Scoped before every call. Calendar and event-type scopes enforced ahead of each API call, with a 90-day audit trail.
Cal MCP
agent · Acme Q3
Run
Find me a 30-minute slot with Priya next week and book it.
S
cal_availability_get
88ms
Cal agent
Priya is free Tuesday 2:00pm and Thursday 10:30am. I booked the Tuesday 2:00pm slot as a 30-minute intro call and sent both of you a confirmation.
Sources: availability, intro-call event type, next 7 days
calmcp
1 booking
18:29
Message Claude...

Tools your scheduling agent reaches for on Cal.com, scoped per user.

CALL ANY TOOL
Check availability, create and reschedule bookings, list event types, and cancel meetings, each call scoped to the authenticated user's own calendar access.
calmcp_get_me
Get 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.
Parameters
Name
Type
Required
Description
No parameters required
calmcp_update_me
Update me
calmcp_get_booking
Get booking
calmcp_create_booking
Create booking
calmcp_get_bookings
Get bookings
calmcp_create_schedule
Create schedule
calmcp_get_schedule
Get schedule
calmcp_update_schedule
Update schedule
calmcp_get_schedules
Get schedules
calmcp_create_event_type
Create event type
calmcp_get_availability
Get availability
calmcp_update_event_type
Update event type
calmcp_get_busy_times
Get busy times
calmcp_add_booking_attendee
Add booking attendee
calmcp_get_event_type
Get event type
calmcp_create_org_membership
Create org membership
calmcp_get_event_types
Get event types
calmcp_update_org_membership
Update org membership
calmcp_get_org_membership
Get org membership
calmcp_confirm_booking
Confirm booking
calmcp_get_org_memberships
Get org memberships
calmcp_reschedule_booking
Reschedule booking
calmcp_get_booking_attendee
Get booking attendee
calmcp_mark_booking_absent
Mark booking absent
calmcp_get_default_schedule
Get default schedule
calmcp_calculate_routing_form_slots
Calculate routing form slots
calmcp_get_booking_attendees
Get booking attendees
calmcp_cancel_booking
Cancel booking
calmcp_get_conferencing_apps
Get conferencing apps
calmcp_delete_schedule
Delete schedule
Build your Agent
The same per-user auth pattern wires into every agent framework.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { ChatOpenAI } from "@langchain/openai";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["calmcp"], toolNames: ["cal_availability_get", "cal_bookings_list", "cal_booking_create"] },
pageSize: 100,
});

const agent = createReactAgent({ llm: new ChatOpenAI({ model: "gpt-4o" }), tools });
await agent.invoke({ messages: [{ role: "user", content: "Book a 30-minute intro call next week" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const openai = new OpenAI();
const sk = new ScalekitClient(process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["calmcp"], toolNames: ["cal_availability_get", "cal_bookings_list", "cal_booking_create"] },
pageSize: 100,
});

const res = await openai.responses.create({
model: "gpt-4o",
input: "Find an open slot with Priya and book it",
tools,
});
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const anthropic = new Anthropic();
const sk = new ScalekitClient(process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["calmcp"], toolNames: ["cal_availability_get", "cal_bookings_list", "cal_booking_create"] },
pageSize: 100,
});

const msg = await anthropic.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
tools,
messages: [{ role: "user", content: "Reschedule my Thursday call to next Monday" }],
});
import { LlmAgent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["calmcp"], toolNames: ["cal_availability_get", "cal_bookings_list", "cal_booking_create"] },
pageSize: 100,
});

const agent = new LlmAgent({ name: "cal_agent", model: "gemini-2.0-flash", tools });
await agent.run("List my upcoming bookings this week");
Try these prompts
Paste any prompt into your agent to start managing Cal.com bookings.
Book & schedule
Copy the prompt
Copied
Find me a 30-minute slot with Priya next week and book it.
Copy the prompt
Copied
Book a discovery call with acme@example.com on Thursday afternoon.
Copy the prompt
Copied
Check my open slots for the intro-call event type next week.
Manage bookings
Copy the prompt
Copied
Reschedule my Thursday 3pm call to next Monday morning.
Copy the prompt
Copied
Cancel the demo booking with globex@example.com and let them know.
Copy the prompt
Copied
Move all my Friday meetings back by 30 minutes.
Report & recall
Copy the prompt
Copied
List all my upcoming bookings this week.
Copy the prompt
Copied
Which event types do I currently offer?
Copy the prompt
Copied
How many meetings did I have last month?
SEE HOW AUTH WORKS
The user authorises Cal.com once. Every later agent call uses their token with calendar scope enforced.
1
Authorize
Your user connects
Cal MCP
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Cal MCP
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Cal MCP
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Cal MCP
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other calendar connectors.
Support and Ops Teams
Email-to-calendar agent
Reads scheduling intent out of Gmail threads, resolves the times everyone actually has free, and creates the event on the user's own Google Calendar. No shared service account.
Support and Ops Teams
Meeting prep
Pulls agenda, participant context, and open action items before every meeting.
GTM and RevOps Teams
Sales call prep agent
Reads tomorrow's calls from Google Calendar, mines past Granola notes and Attio history for context, and delivers each rep a prep brief in Slack, scoped to the calls that rep actually owns.
GTM and RevOps Teams
CRM AI agent
Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's own delegated OAuth.
Test other agents
See the same per-user auth pattern across other calendar connectors.
OPS
Email-to-calendar scheduling agent
Read scheduling intent out of Gmail threads, resolve mutual free time, and create the Google Calendar event.
SALES
Sales call prep agent
Read tomorrow's calls from Google Calendar, mine Granola notes and Attio history, and deliver each rep a prep brief in Slack.
OPS
Meeting prep agent
Assemble the agenda, HubSpot attendee history, and open action items from Gmail before every meeting on the calendar.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Cal.com token looks fine in a demo. In production every booking and cancel logs as one service account, so you lose track of whose calendar was touched. Scalekit resolves the real user's credential per call.
// shared token
book → scheduling_bot

// scalekit
book → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Cal today. Others tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Cal.com as the user or as a shared key?
As the user. Scalekit resolves the authenticated user's own Cal.com credential at request time, so every booking, reschedule, and cancel is attributed to them in Cal.com rather than a shared scheduling bot.
Where is the Cal.com token stored?
In an AES-256 encrypted vault, namespaced per tenant. Tokens are fetched only at the moment of a tool call, refreshed automatically before expiry, and revocable from a single dashboard, never exposed to the model or the prompt.
Can I limit what the agent is allowed to do in Cal.com?
Yes. Pass a toolNames filter to listScopedTools to expose only the actions you want, for example read-only availability and booking lists without create or cancel. Scalekit also runs a scope check before each API call.
What happens when a user revokes Cal.com access?
The credential is invalidated at the next tool call, which fails closed rather than falling back to a shared token. Other users are unaffected, and the revocation is recorded in the audit trail.
Can the agent book meetings across time zones and event types?
Yes. Availability is resolved against the user's own working hours, buffers, and booking limits, and Cal.com handles timezone detection for each attendee. You choose which event types the agent can book by scoping the toolNames and event type IDs it receives.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""calmcp"": {
""url"": ""https://mcp.scalekit.com/calmcp"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.calmcp]
url = ""https://mcp.scalekit.com/calmcp""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""calmcp"": {
""url"": ""https://mcp.scalekit.com/calmcp"",
""type"": ""http""
}
}
}