Connect Cal ID to Your AI Assistant
Works with MCP-compatible appsMCP is a secure way for AI tools like Claude, Cursor, and ChatGPT connectors to use your Cal ID account. Once connected, your assistant can help you check bookings, find contacts, manage event types, and work with schedules using plain language.
Connection Link
Most apps ask for a server URL. Use this link:
- MCP server URL:
https://mcp.cal.id/mcp
Keep your token private. Treat your Cal ID token like a password. Do not paste it in public chats, screenshots, or shared documents.
What You Can Do
Bookings
Ask about upcoming meetings, reschedule bookings, or cancel a booking when needed.
Contacts
List contacts, create a contact, update details, or view recent meeting history.
Availability
Find open slots, review schedules, and check event types without opening the dashboard.
Before You Start
- Open the AI app you want to connect, such as Claude Desktop or Cursor.
- Copy the MCP server URL shown above.
- Have your Cal ID API key or access token ready. In examples below, replace
calid_xxxwith your real token. - After saving the setup, restart or reconnect the AI app if it does not connect right away.
Need an API key? Generate one from the Cal ID dashboard for this environment: https://cal.id/settings/developer/api-keys
Choose Your App
Pick the app you use and follow the steps. The examples are ready to copy and paste.
What You Need
- Claude Desktop installed.
- Your Cal ID token.
- The MCP server URL from this page.
Steps
- Open Claude Desktop.
- Open Settings, then Developer or Connectors.
- Add a custom MCP server.
- Paste the setup below and replace
calid_xxx. - Save, then restart Claude if needed.
Try this direct setup first:
{
"mcpServers": {
"calid": {
"type": "http",
"url": "https://mcp.cal.id/mcp",
"headers": {
"Authorization": "Bearer calid_xxx"
}
}
}
}
If Claude does not accept the direct setup, use this bridge setup instead:
{
"mcpServers": {
"calid": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.cal.id/mcp", "--transport", "http-first"],
"env": {
"MCP_REMOTE_HEADER_AUTHORIZATION": "Bearer calid_xxx"
}
}
}
}
Check It Works
- Open a new Claude chat.
- Look for
calidin the tools or connectors menu. - Ask: “List my contacts.”
If Something Goes Wrong
- If Claude says unauthorized, check that your token is pasted correctly.
- If tools do not appear, restart Claude and reopen the app.
- If the direct setup fails, use the bridge setup above.
What You Need
- Cursor installed.
- Your Cal ID token.
- Access to Cursor Settings → MCP, or a
.cursor/mcp.jsonfile.
Steps
- Open Cursor Settings → MCP.
- Add a new server named
calid. - Paste the setup below and replace
calid_xxx. - Reload Cursor or reconnect the server.
{
"mcpServers": {
"calid": {
"url": "https://mcp.cal.id/mcp",
"headers": {
"Authorization": "Bearer calid_xxx"
}
}
}
}
Check It Works
- Confirm Cursor shows the server as connected.
- Ask: “Use Cal ID to list my contacts.”
If Something Goes Wrong
- If Cursor rejects the setup, check for missing commas or quotes.
- If it connects but tools fail, check your token.
- Make sure the URL ends with
/mcp.
What You Need
- A ChatGPT plan or workspace that supports custom connectors.
- Developer mode or admin permission, if your workspace requires it.
- Your Cal ID token, if ChatGPT asks for bearer-token authentication.
Steps
- Open ChatGPT Settings → Connectors or Apps & Connectors.
- Add a custom connector.
- Paste this MCP server URL:
https://mcp.cal.id/mcp. - If asked for authentication, choose bearer token and paste your token.
- Save the connector and enable it in a chat.
{
"name": "Cal ID",
"mcp_url": "https://mcp.cal.id/mcp",
"authentication": {
"type": "bearer",
"token": "calid_xxx"
}
}
Check It Works
- Confirm ChatGPT shows the connector as connected.
- Start a new chat and select Cal ID.
- Ask: “List my contacts.”
If Something Goes Wrong
- If you do not see custom connectors, your plan or workspace may not have them enabled.
- If ChatGPT asks for admin approval, contact your workspace admin.
- If bearer-token setup is unavailable, use Claude, Cursor, or another MCP client for now.
What You Need
- An app that supports MCP servers.
- A place to paste a server URL and authorization header.
- Your Cal ID token.
Steps
- Add a new MCP server in your app.
- Use the server URL
https://mcp.cal.id/mcp. - Add the authorization header shown below.
- Save and reconnect.
{
"mcpServers": {
"calid": {
"type": "http",
"url": "https://mcp.cal.id/mcp",
"headers": {
"Authorization": "Bearer calid_xxx",
"Accept": "application/json, text/event-stream"
}
}
}
}
Check It Works
- Confirm the app shows the server as connected.
- Ask it to list contacts or bookings.
- If available, check that tools like
list_contactsappear.
If Something Goes Wrong
- Use the MCP server URL, not the API docs URL.
- Make sure your token is in the authorization header.
- If your app asks for a transport type, choose HTTP or Streamable HTTP.
Advanced Connection Test
Most users can skip this. Use it only if you want to check the connection manually or share details with support.
curl -i https://mcp.cal.id/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Authorization: Bearer calid_xxx" \
-d '{"jsonrpc":"2.0","id":"init-1","method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'
Advanced Tool Check
This confirms which Cal ID actions your app can see, such as contacts, bookings, schedules, and teams.
curl -i https://mcp.cal.id/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Authorization: Bearer calid_xxx" \
-H "mcp-session-id: <SESSION_ID>" \
-d '{"jsonrpc":"2.0","id":"2","method":"tools/list","params":{}}'
Available Actions
These are the Cal ID actions your connected app can use. You usually do not need to call them by name; just ask naturally.
Availability & Schedules
| Tool | Description |
|---|---|
create_availability |
Create availability for the current user and given schedule |
create_schedule |
Create a schedule |
delete_availability |
Delete an availability |
delete_schedule |
Delete a schedule for the current user |
get_availability |
Get current user availability |
get_schedule |
Get current user schedules |
update_availability |
Update an availability |
update_schedule |
Update a schedule for the current user |
Booking
| Tool | Description |
|---|---|
create_booking |
Create a new booking |
get_booking |
Get current user bookings |
get_booking_by_id |
Get booking by id |
update_booking_reassignbookingautomatically |
Reassign booking to automatically via round robin |
update_booking_reassignbookingtouser |
Reassign round robin booking to a certain user |
Contact
| Tool | Description |
|---|---|
create_contact |
Create a contact for the current user |
delete_contact |
Delete contact by id |
get_contact |
Get contact by id |
get_contact_meetings |
Get contact meeting history |
update_contact |
Update contact by id |
Event
| Tool | Description |
|---|---|
get_event_types |
Get all event types for the authenticated user (paginated) |
get_event_types_by_id |
Get event type by ID for the authenticated user |
Eventtype
| Tool | Description |
|---|---|
create_eventtype |
Create a new event type for the authenticated user |
delete_eventtype |
Delete event type for the authenticated user |
update_eventtype |
Update event type details for the authenticated user |
Other
| Tool | Description |
|---|---|
add_team_member |
Create a team membership |
cancel_booking |
Cancel booking by id Optional request body field controls for cancellation scope, seated-event seat cancellation, and payment refund handling. |
change_booking_confirmation_status |
Change booking confirmation status (accept or decline) |
list_contacts |
List current user contacts |
remove_team_member |
Delete a membership of a team |
reschedule_booking |
Reschedule booking by id |
Slots
| Tool | Description |
|---|---|
create_slots_reserve |
Reserve a given slot |
delete_slots |
Delete slot by id |
get_slot |
Get slot by uid |
get_slots |
Get available slots for an event type or users |
update_slots |
Update slot by id |
Teams
| Tool | Description |
|---|---|
create_team |
Create a new team for the authenticated user |
create_team_eventtype |
Create an event type for a team |
delete_team |
Delete team for the authenticated user |
delete_team_eventtype |
Delete a team event type |
get_team |
Get team by ID for the authenticated user |
get_team_event_type |
Get a team event type by ID |
get_team_event_types |
Get event types for a team |
get_team_membership |
Get a specific membership of a team |
get_team_memberships |
Get memberships of a team |
get_team_schedules |
Get all team members' schedules |
get_teams |
Get all teams for the authenticated user (paginated) |
update_team_details |
Update team details for the authenticated user |
update_team_eventtype |
Update a team event type |
update_team_membership |
Update a membership of a team |
User
| Tool | Description |
|---|---|
update_user_profile |
Edit user profile |
Users
| Tool | Description |
|---|---|
create_users_edit_profile_avatar |
Upload avatar via multipart/form-data |
get_users |
Get user public events |
get_users_me |
Get current user profile |
Webhook
| Tool | Description |
|---|---|
create_webhook |
Created webhook by id |
delete_webhook |
Delete webhook by id |
get_webhook |
Get user webhooks |
get_webhook_by_id |
Get webhook by id |
update_webhook |
Update webhook by id |
Try These Prompts
- "What bookings do I have this week?"
- "Show my available slots for next Monday."
- "Create a 30-minute sales demo event type"
- "List my contacts and show recent meeting history for one of them."
- "Create a booking with John Doe for next Tuesday at 3pm."