Calendly MCP connector
OAuth 2.1/DCRCalendarProductivityConnect to the Calendly MCP server to manage scheduled events, invitees, event types, and availability directly from your AI workflows.
Calendly MCP connector
-
Install the SDK
Section titled “Install the SDK”Terminal window npm install @scalekit-sdk/nodeTerminal window pip install scalekit -
Set your credentials
Section titled “Set your credentials”Add your Scalekit credentials to your
.envfile. 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> -
Set up the connector
Section titled “Set up the connector”Register your Calendly credentials with Scalekit so it handles the token lifecycle. You do this once per environment.
Dashboard setup steps
Calendly uses OAuth 2.1 with Dynamic Client Registration (DCR) and PKCE. Calendly hosts its authorization server on a different domain (
calendly.com) than its MCP server (mcp.calendly.com), so you register an OAuth client with Calendly yourself and save the resulting client ID in Scalekit. Complete this setup once per environment.-
Copy the redirect URI from Scalekit
In the Scalekit dashboard, go to AgentKit > Connections > Create connection. Find Calendly and click Create. Copy the redirect URI — it looks like
https://<SCALEKIT_ENVIRONMENT_URL>/sso/v1/oauth/<CONNECTION_ID>/callback. You pass this value as theredirect_urisentry in the next step, and it must match exactly. -
Register an OAuth client with Calendly
Send a registration request to Calendly’s DCR endpoint. Replace
<SCALEKIT_CONNECTION_CALLBACK_URL>with the redirect URI you copied.Terminal window curl -X POST https://calendly.com/oauth/register \-H "Content-Type: application/json" \-d '{"client_name": "Scalekit Calendly MCP Connector","redirect_uris": ["<SCALEKIT_CONNECTION_CALLBACK_URL>"],"grant_types": ["authorization_code", "refresh_token"],"response_types": ["code"],"token_endpoint_auth_method": "none","scope": "mcp:scheduling:read mcp:scheduling:write"}'Calendly responds with the registered client. Calendly issues a public PKCE client, so the response contains a
client_idand no client secret.{"client_id": "90pDPl704dEMw2mTwRDvLsYOVBCXcWWiGb-44ehwdLU","token_endpoint_auth_method": "none","grant_types": ["authorization_code", "refresh_token"],"response_types": ["code"],"scopes": ["mcp:scheduling:read", "mcp:scheduling:write"]} -
Save the client ID in Scalekit
Copy the
client_idfrom the response. In the Scalekit dashboard, open AgentKit > Connections > Calendly, paste the value into the Client ID field of the connection’s OAuth configuration, and click Save. Leave the client secret empty, because Calendly issues a public PKCE client. -
Authorize the connection
Generate an authorization link for a user and complete the consent flow. Calendly prompts the user to grant the
mcp:scheduling:readandmcp:scheduling:writescopes. After consent, the connected account becomes active and Scalekit manages token refresh for every user who authorizes the connection.
-
-
Authorize and make your first call
Section titled “Authorize and make your first call”quickstart.ts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENV_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'calendlymcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Calendly MCP:', link)process.stdout.write('Press Enter after authorizing...')await new Promise(r => process.stdin.once('data', r))// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'calendlymcp_event_types_list_event_types',toolInput: {},})console.log(result)quickstart.py import osfrom scalekit.client import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENV_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "calendlymcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Calendly MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="calendlymcp_event_types_list_event_types",connection_name=connection_name,identifier=identifier,)print(result)
What you can do
Section titled “What you can do”Connect this agent connector to let your agent:
- Get availability, event types, meetings — Use: Fetch details for one named availability schedule
- List availability, event types — Use: List all named availability schedules for the connected user
- Create event types, meetings — Use: Create a new event type on the connected account
- Update event types — Use: Update fields on an existing event type
- Event meetings cancel — Use: Cancel a scheduled meeting on behalf of the connected host When: User confirms they want to cancel a specific meeting
- Delete meetings — Use: Remove a no-show mark from an invitee
Common workflows
Section titled “Common workflows”Resolve the connected user first
Most Calendly tools need the connected host’s user URI. Call calendlymcp_users_get_current_user once at the start of a workflow, then reuse the returned resource.uri (and timezone) in later calls.
const me = await actions.executeTool({ connectionName: 'calendlymcp', identifier: 'user_123', toolName: 'calendlymcp_users_get_current_user', toolInput: {},});const userUri = me.resource.uri;console.log(userUri, me.resource.timezone);me = actions.execute_tool( connection_name="calendlymcp", identifier="user_123", tool_name="calendlymcp_users_get_current_user", tool_input={},)user_uri = me["resource"]["uri"]print(user_uri, me["resource"]["timezone"])List upcoming meetings and their invitees
Use calendlymcp_meetings_list_events to fetch scheduled meetings, then calendlymcp_meetings_list_event_invitees to see who is attending a specific meeting. Pass the user URI from the previous step and filter by status to limit results to active meetings.
// Step 1 — list active meetings for the connected userconst events = await actions.executeTool({ connectionName: 'calendlymcp', identifier: 'user_123', toolName: 'calendlymcp_meetings_list_events', toolInput: { user: userUri, status: 'active', count: '20', },});const meetingUri = events.collection[0].uri;
// Step 2 — list the invitees for that meetingconst invitees = await actions.executeTool({ connectionName: 'calendlymcp', identifier: 'user_123', toolName: 'calendlymcp_meetings_list_event_invitees', toolInput: { uri: meetingUri },});console.log(invitees);# Step 1 — list active meetings for the connected userevents = actions.execute_tool( connection_name="calendlymcp", identifier="user_123", tool_name="calendlymcp_meetings_list_events", tool_input={ "user": user_uri, "status": "active", "count": "20", },)meeting_uri = events["collection"][0]["uri"]
# Step 2 — list the invitees for that meetinginvitees = actions.execute_tool( connection_name="calendlymcp", identifier="user_123", tool_name="calendlymcp_meetings_list_event_invitees", tool_input={"uri": meeting_uri},)print(invitees)Book a slot on an event type
Find a bookable slot with calendlymcp_event_types_list_event_type_available_times, then book it with calendlymcp_meetings_create_invitee. Pass the UTC start_time from the availability response verbatim — do not rewrite it to a local label.
// Step 1 — find available times for the event typeconst slots = await actions.executeTool({ connectionName: 'calendlymcp', identifier: 'user_123', toolName: 'calendlymcp_event_types_list_event_type_available_times', toolInput: { event_type: 'https://api.calendly.com/event_types/EVENT_TYPE_UUID', start_time: '2026-07-01T00:00:00Z', end_time: '2026-07-07T00:00:00Z', },});const startTime = slots.collection[0].start_time;
// Step 2 — book the slot for an inviteeconst booking = await actions.executeTool({ connectionName: 'calendlymcp', identifier: 'user_123', toolName: 'calendlymcp_meetings_create_invitee', toolInput: { post_invitee_request: { event_type: 'https://api.calendly.com/event_types/EVENT_TYPE_UUID', start_time: startTime, name: 'Jordan Lee', email: 'jordan@example.com', }, },});console.log(booking);# Step 1 — find available times for the event typeslots = actions.execute_tool( connection_name="calendlymcp", identifier="user_123", tool_name="calendlymcp_event_types_list_event_type_available_times", tool_input={ "event_type": "https://api.calendly.com/event_types/EVENT_TYPE_UUID", "start_time": "2026-07-01T00:00:00Z", "end_time": "2026-07-07T00:00:00Z", },)start_time = slots["collection"][0]["start_time"]
# Step 2 — book the slot for an inviteebooking = actions.execute_tool( connection_name="calendlymcp", identifier="user_123", tool_name="calendlymcp_meetings_create_invitee", tool_input={ "post_invitee_request": { "event_type": "https://api.calendly.com/event_types/EVENT_TYPE_UUID", "start_time": start_time, "name": "Jordan Lee", "email": "jordan@example.com", }, },)print(booking)Share a single-use scheduling link
Use calendlymcp_scheduling_links_create_single_use_scheduling_link to generate a one-time booking link for an event type, then send the returned booking_url to the invitee. Use this when you want the link to follow the event type’s existing settings without overrides.
const link = await actions.executeTool({ connectionName: 'calendlymcp', identifier: 'user_123', toolName: 'calendlymcp_scheduling_links_create_single_use_scheduling_link', toolInput: { create_scheduling_link_request: { owner: 'https://api.calendly.com/event_types/EVENT_TYPE_UUID', owner_type: 'EventType', max_event_count: 1, }, },});console.log(link.resource.booking_url);link = actions.execute_tool( connection_name="calendlymcp", identifier="user_123", tool_name="calendlymcp_scheduling_links_create_single_use_scheduling_link", tool_input={ "create_scheduling_link_request": { "owner": "https://api.calendly.com/event_types/EVENT_TYPE_UUID", "owner_type": "EventType", "max_event_count": 1, }, },)print(link["resource"]["booking_url"])Cancel a meeting
Use calendlymcp_meetings_cancel_event with the meeting uri from calendlymcp_meetings_list_events. Canceling notifies every invitee, so confirm the action with the user first. To reschedule instead, surface the invitee’s reschedule_url rather than canceling.
await actions.executeTool({ connectionName: 'calendlymcp', identifier: 'user_123', toolName: 'calendlymcp_meetings_cancel_event', toolInput: { uri: meetingUri, create_scheduled_event_cancellation_request: 'Host unavailable — will follow up to reschedule.', },});actions.execute_tool( connection_name="calendlymcp", identifier="user_123", tool_name="calendlymcp_meetings_cancel_event", tool_input={ "uri": meeting_uri, "create_scheduled_event_cancellation_request": "Host unavailable — will follow up to reschedule.", },)Tool list
Section titled “Tool list”Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.
calendlymcp_availability_get_user_availability_schedule#Use: Fetch details for one named availability schedule.
When: User asks about specific schedule rules or needs rules for a named schedule.
Needs: Schedule URI from `availability-list_user_availability_schedules`.
Do: Read `rules` array and `timezone` for display or to inform event-type updates.
Avoid: Writing to this schedule—use event-type-level update for changes.
Then: Report schedule details to user or use rules for availability queries.1 param
Use: Fetch details for one named availability schedule. When: User asks about specific schedule rules or needs rules for a named schedule. Needs: Schedule URI from `availability-list_user_availability_schedules`. Do: Read `rules` array and `timezone` for display or to inform event-type updates. Avoid: Writing to this schedule—use event-type-level update for changes. Then: Report schedule details to user or use rules for availability queries.
uristringrequiredAvailability schedule URI. not a browsable link — never show to users.calendlymcp_availability_list_user_availability_schedules#Use: List all named availability schedules for the connected user.
When: User asks about availability schedules or you need to identify one by name.
Needs: User URI from `users-get_current_user`.
Do: Use returned `uri` to fetch schedule details or associate with an event type.
Avoid: Confusing user availability schedules with event-type-level schedules.
Then: Use schedule URI in `availability-get_user_availability_schedule` for details.1 param
Use: List all named availability schedules for the connected user. When: User asks about availability schedules or you need to identify one by name. Needs: User URI from `users-get_current_user`. Do: Use returned `uri` to fetch schedule details or associate with an event type. Avoid: Confusing user availability schedules with event-type-level schedules. Then: Use schedule URI in `availability-get_user_availability_schedule` for details.
userstringrequiredA URI reference to a usercalendlymcp_availability_list_user_busy_times#Use: List a user's busy time blocks within a date range.
When: User asks when they are busy or you need to avoid conflicts before suggesting slots.
Needs: User URI from `users-get_current_user` and ISO 8601 start/end range.
Do: Pass user URI and date range; use returned intervals to report conflicts.
Avoid: Substituting for `event_types-list_event_type_available_times`—they differ.
Then: Use busy intervals to inform scheduling recommendations.3 params
Use: List a user's busy time blocks within a date range. When: User asks when they are busy or you need to avoid conflicts before suggesting slots. Needs: User URI from `users-get_current_user` and ISO 8601 start/end range. Do: Pass user URI and date range; use returned intervals to report conflicts. Avoid: Substituting for `event_types-list_event_type_available_times`—they differ. Then: Use busy intervals to inform scheduling recommendations.
end_timestringrequiredEnd time of the requested availability range. Date must be in the future of start_time.start_timestringrequiredStart time of the requested availability range. Date cannot be in the past.userstringrequiredThe uri associated with the usercalendlymcp_event_types_create_event_type#Use: Create a new event type on the connected account.
When: User explicitly asks to create a new event type.
Needs: Host user URI from `users-get_current_user`.
Do: Set name, duration, and host URI; omit optional fields unless user specified them.
Avoid: Creating duplicates—call `event_types-list_event_types` first to check for existing types.
Then: Confirm the new event type URI and share the scheduling URL.1 param
Use: Create a new event type on the connected account. When: User explicitly asks to create a new event type. Needs: Host user URI from `users-get_current_user`. Do: Set name, duration, and host URI; omit optional fields unless user specified them. Avoid: Creating duplicates—call `event_types-list_event_types` first to check for existing types. Then: Confirm the new event type URI and share the scheduling URL.
create_event_type_requestobjectrequiredCreateEventTypeRequestcalendlymcp_event_types_get_event_type#Use: Fetch full details for one event type by URI.
When: Before updating an event type or confirming its current configuration.
Needs: Event type URI.
Do: Use the returned fields as the baseline for any patch payload.
Avoid: Constructing update payloads without reading current state first.
Then: Proceed with `event_types-update_event_type` using the returned data as base.1 param
Use: Fetch full details for one event type by URI. When: Before updating an event type or confirming its current configuration. Needs: Event type URI. Do: Use the returned fields as the baseline for any patch payload. Avoid: Constructing update payloads without reading current state first. Then: Proceed with `event_types-update_event_type` using the returned data as base.
uristringrequiredEvent type URI. not a browsable link — never show to users.calendlymcp_event_types_list_event_type_availability_schedule#Use: Read the current availability schedule (rules) for an event type.
When: Before calling `event_types-update_event_type_availability_schedule`.
Needs: Event type URI.
Do: Retain the full `rules` array verbatim—it is the required base for updates.
Avoid: Calling the update endpoint without first reading the current rules.
Then: Pass the rules to `event_types-update_event_type_availability_schedule` with only the needed edits.1 param
Use: Read the current availability schedule (rules) for an event type. When: Before calling `event_types-update_event_type_availability_schedule`. Needs: Event type URI. Do: Retain the full `rules` array verbatim—it is the required base for updates. Avoid: Calling the update endpoint without first reading the current rules. Then: Pass the rules to `event_types-update_event_type_availability_schedule` with only the needed edits.
event_typestringrequiredThe URI associated with the event typecalendlymcp_event_types_list_event_type_available_times#Use: List bookable time slots for an event type within a date range.
When: User wants slots, or to confirm availability before booking.
Needs: Event type URI and start/end date range (ISO 8601).
Do: Pass `start_time` verbatim to subsequent tool calls; do not rewrite UTC values.
Avoid: Stale data, or trusting a prior local label—re-check UTC `start_time` if questioned.
Then: Pass UTC `start_time` to `meetings-create_invitee`.3 params
Use: List bookable time slots for an event type within a date range. When: User wants slots, or to confirm availability before booking. Needs: Event type URI and start/end date range (ISO 8601). Do: Pass `start_time` verbatim to subsequent tool calls; do not rewrite UTC values. Avoid: Stale data, or trusting a prior local label—re-check UTC `start_time` if questioned. Then: Pass UTC `start_time` to `meetings-create_invitee`.
end_timestringrequiredEnd time of the requested availability range. Date must be in the future of start_time.event_typestringrequiredThe uri associated with the event typestart_timestringrequiredStart time of the requested availability range. Date cannot be in the past.calendlymcp_event_types_list_event_types#Use: List all event types for the connected user or org.
When: Start of any event-type task, or when selecting an event type by name.
Needs: User URI from `users-get_current_user`.
Do: Filter by current user URI unless user explicitly asks about a different host or org.
Avoid: Assuming a cached list is current—call fresh each session.
Then: Carry the selected `uri` into get, update, or availability tools.8 params
Use: List all event types for the connected user or org. When: Start of any event-type task, or when selecting an event type by name. Needs: User URI from `users-get_current_user`. Do: Filter by current user URI unless user explicitly asks about a different host or org. Avoid: Assuming a cached list is current—call fresh each session. Then: Carry the selected `uri` into get, update, or availability tools.
activestringoptionalReturn only active event types if true, only inactive if false, or all event types if this parameter is omitted.admin_managedstringoptionalReturn only admin managed event types if true, exclude admin managed event types if false, or include all event types if this parameter is omitted.countstringoptionalThe number of rows to returnorganizationstringoptionalView available personal, team, and organization event types associated with the organization's URI.page_tokenstringoptionalThe token to pass to get the next or previous portion of the collectionsortstringoptionalOrder results by the specified field and direction. Accepts comma-separated list of {field}:{direction} values.Supported fields are: name, position, created_at, updated_at. Sort direction is specified as: asc, desc.userstringoptionalView available personal, team, and organization event types associated with the user's URI.user_availability_schedulestringoptionalUsed in conjunction with `user` parameter, returns a filtered list of Event Types that use the given primary availability schedule.calendlymcp_event_types_update_event_type#Use: Update fields on an existing event type.
When: User asks to change name, duration, description, or other settings.
Needs: Event type URI from `event_types-list_event_types` or `event_types-get_event_type`.
Do: Read current state first with `event_types-get_event_type`; patch only requested fields.
Avoid: Sending fields not read from current state—partial writes may reset unset fields.
Then: Confirm changes with `event_types-get_event_type`.2 params
Use: Update fields on an existing event type. When: User asks to change name, duration, description, or other settings. Needs: Event type URI from `event_types-list_event_types` or `event_types-get_event_type`. Do: Read current state first with `event_types-get_event_type`; patch only requested fields. Avoid: Sending fields not read from current state—partial writes may reset unset fields. Then: Confirm changes with `event_types-get_event_type`.
update_event_type_requestobjectrequiredUpdateEventTypeRequesturistringrequiredEvent type URI. not a browsable link — never show to users.calendlymcp_event_types_update_event_type_availability_schedule#Use: Overwrite the availability schedule for an event type.
When: User requests schedule changes (hours, days, one-off date overrides) for an event type.
Needs: Event type URI and current rules from `event_types-list_event_type_availability_schedule`.
Do: Must copy existing rules verbatim, modify only requested entries, send full rules array with IANA timezone. wday rules need `wday` field; date rules need `date` field (YYYY-MM-DD); `intervals` is list of `{from, to}` in HH:MM 24h.
Avoid: Constructing rules from scratch or sending a partial array—this endpoint overwrites all rules.
Then: Re-read schedule with `event_types-list_event_type_availability_schedule` to confirm.2 params
Use: Overwrite the availability schedule for an event type. When: User requests schedule changes (hours, days, one-off date overrides) for an event type. Needs: Event type URI and current rules from `event_types-list_event_type_availability_schedule`. Do: Must copy existing rules verbatim, modify only requested entries, send full rules array with IANA timezone. wday rules need `wday` field; date rules need `date` field (YYYY-MM-DD); `intervals` is list of `{from, to}` in HH:MM 24h. Avoid: Constructing rules from scratch or sending a partial array—this endpoint overwrites all rules. Then: Re-read schedule with `event_types-list_event_type_availability_schedule` to confirm.
event_typestringrequiredEvent Type uri in which to update the availability scheduleupdate_event_type_availability_requestobjectrequiredUpdateEventTypeAvailabilityRequestcalendlymcp_locations_list_user_meeting_locations#Use: List allowed meeting location kinds for a user.
When: Before creating bookings that need a `location` payload.
Needs: User URI from `users-get_current_user`.
Do: Read supported location `kind` values; choose one compatible with the event type.
Avoid: Submitting a location kind not configured for the host or event type.
Then: Use chosen kind in `meetings-create_invitee` location payload.1 param
Use: List allowed meeting location kinds for a user. When: Before creating bookings that need a `location` payload. Needs: User URI from `users-get_current_user`. Do: Read supported location `kind` values; choose one compatible with the event type. Avoid: Submitting a location kind not configured for the host or event type. Then: Use chosen kind in `meetings-create_invitee` location payload.
userstringrequiredThe URI associated with the usercalendlymcp_meetings_cancel_event#Use: Cancel a scheduled meeting on behalf of the connected host
When: User confirms they want to cancel a specific meeting.
Needs: Meeting URI from `meetings-list_events` or `meetings-get_event`.
Do: Pass meeting URI and optional cancellation reason.
Avoid: Canceling without confirmation; this notifies all invitees. For reschedule, surface `reschedule_url` instead.
Then: Inform user the meeting is canceled and optionally list remaining meetings.2 params
Use: Cancel a scheduled meeting on behalf of the connected host When: User confirms they want to cancel a specific meeting. Needs: Meeting URI from `meetings-list_events` or `meetings-get_event`. Do: Pass meeting URI and optional cancellation reason. Avoid: Canceling without confirmation; this notifies all invitees. For reschedule, surface `reschedule_url` instead. Then: Inform user the meeting is canceled and optionally list remaining meetings.
uristringrequiredScheduled meeting URI. NOT the same as the invitee `cancel_url` (which is the public link you send to a human). not a browsable link — never show to users.create_scheduled_event_cancellation_requeststringoptionalOptional cancellation reason.calendlymcp_meetings_create_invitee#Use: Book a meeting slot for an invitee on a Calendly event type.
When: User provides invitee name, email, and a confirmed available time slot.
Needs: Event type URI, `start_time` from `event_types-list_event_type_available_times`, invitee name and email. Include `location` if the event type has configured locations.
Do: Set invitee name/email as the person being booked; host is the connected user from `users-get_current_user`. Never swap host and invitee fields.
Avoid: Booking without confirming slot availability first, or omitting `location` when event type requires it.
Then: Confirm booking with invitee details and meeting URI.1 param
Use: Book a meeting slot for an invitee on a Calendly event type. When: User provides invitee name, email, and a confirmed available time slot. Needs: Event type URI, `start_time` from `event_types-list_event_type_available_times`, invitee name and email. Include `location` if the event type has configured locations. Do: Set invitee name/email as the person being booked; host is the connected user from `users-get_current_user`. Never swap host and invitee fields. Avoid: Booking without confirming slot availability first, or omitting `location` when event type requires it. Then: Confirm booking with invitee details and meeting URI.
post_invitee_requestobjectrequiredPostInviteeRequestcalendlymcp_meetings_create_invitee_no_show#Use: Mark an invitee as a no-show for a past meeting.
When: User reports an invitee did not attend.
Needs: Invitee URI from `meetings-list_event_invitees`.
Do: Pass invitee URI; operation is idempotent.
Avoid: Marking no-show before the meeting end time.
Then: Confirm no-show is recorded and carry forward the no-show URI.1 param
Use: Mark an invitee as a no-show for a past meeting. When: User reports an invitee did not attend. Needs: Invitee URI from `meetings-list_event_invitees`. Do: Pass invitee URI; operation is idempotent. Avoid: Marking no-show before the meeting end time. Then: Confirm no-show is recorded and carry forward the no-show URI.
create_invitee_no_show_requestobjectrequiredCreateInviteeNoShowRequestcalendlymcp_meetings_delete_invitee_no_show#Use: Remove a no-show mark from an invitee.
When: User asks to undo a no-show marking.
Needs: No-show URI from `meetings-create_invitee_no_show`.
Do: Pass no-show URI; operation is idempotent.
Avoid: Calling without confirming a no-show record exists.
Then: Confirm no-show has been removed.1 param
Use: Remove a no-show mark from an invitee. When: User asks to undo a no-show marking. Needs: No-show URI from `meetings-create_invitee_no_show`. Do: Pass no-show URI; operation is idempotent. Avoid: Calling without confirming a no-show record exists. Then: Confirm no-show has been removed.
uristringrequiredInvitee no-show URI. not a browsable link — never show to users.calendlymcp_meetings_get_event#Use: Fetch details for a single scheduled meeting.
When: User asks about a specific meeting or before canceling/examining invitees.
Needs: Meeting URI from `meetings-list_events`.
Do: Use returned `event_type`, `start_time`, `end_time`, and `location` for display or next actions.
Avoid: Calling this without a known meeting URI. list meetings first.
Then: Use meeting URI in `meetings-list_event_invitees` or `meetings-cancel_event`.1 param
Use: Fetch details for a single scheduled meeting. When: User asks about a specific meeting or before canceling/examining invitees. Needs: Meeting URI from `meetings-list_events`. Do: Use returned `event_type`, `start_time`, `end_time`, and `location` for display or next actions. Avoid: Calling this without a known meeting URI. list meetings first. Then: Use meeting URI in `meetings-list_event_invitees` or `meetings-cancel_event`.
uristringrequiredScheduled meeting URI. not a browsable link — never show to users.calendlymcp_meetings_get_event_invitee#Use: Fetch details for a single meeting invitee.
When: User asks about a specific attendee's booking details.
Needs: Meeting URI from `meetings-list_events` and Invitee URI from `meetings-list_event_invitees`.
Do: Use returned fields for display or no-show status. Reschedule: surface `reschedule_url`.
Avoid: Calling without known meeting and invitee URIs.
Then: Use invitee URI in no-show tools if needed.2 params
Use: Fetch details for a single meeting invitee. When: User asks about a specific attendee's booking details. Needs: Meeting URI from `meetings-list_events` and Invitee URI from `meetings-list_event_invitees`. Do: Use returned fields for display or no-show status. Reschedule: surface `reschedule_url`. Avoid: Calling without known meeting and invitee URIs. Then: Use invitee URI in no-show tools if needed.
event_uristringrequiredScheduled meeting URI. not a browsable link — never show to users.invitee_uristringrequiredMeeting invitee URI. not a browsable link — never show to users.calendlymcp_meetings_get_invitee_no_show#Use: Fetch the no-show record for a meeting invitee.
When: User asks whether a no-show was recorded for an invitee.
Needs: No-show URI from `meetings-create_invitee_no_show`.
Do: Check returned record for no-show status and timestamp.
Avoid: Calling if no no-show has been recorded—returns 404.
Then: Report no-show status to user.1 param
Use: Fetch the no-show record for a meeting invitee. When: User asks whether a no-show was recorded for an invitee. Needs: No-show URI from `meetings-create_invitee_no_show`. Do: Check returned record for no-show status and timestamp. Avoid: Calling if no no-show has been recorded—returns 404. Then: Report no-show status to user.
uristringrequiredInvitee no-show URI. not a browsable link — never show to users.calendlymcp_meetings_list_event_invitees#Use: List all invitees for a scheduled meeting.
When: User asks who is attending a meeting or you need invitee URIs.
Needs: Meeting URI from `meetings-list_events`.
Do: Use returned invitee `uri` for no-show marking or detail lookups.
Avoid: Calling without a meeting URI. list meetings first.
Then: Use invitee URI in `meetings-get_event_invitee` or `meetings-create_invitee_no_show`. For reschedule, surface each invitee's `reschedule_url`.6 params
Use: List all invitees for a scheduled meeting. When: User asks who is attending a meeting or you need invitee URIs. Needs: Meeting URI from `meetings-list_events`. Do: Use returned invitee `uri` for no-show marking or detail lookups. Avoid: Calling without a meeting URI. list meetings first. Then: Use invitee URI in `meetings-get_event_invitee` or `meetings-create_invitee_no_show`. For reschedule, surface each invitee's `reschedule_url`.
uristringrequiredScheduled meeting URI. not a browsable link — never show to users.countstringoptionalThe number of rows to returnemailstringoptionalIndicates if the results should be filtered by email addresspage_tokenstringoptionalThe token to pass to get the next or previous portion of the collectionsortstringoptionalOrder results by the **created_at** field and direction specified: ascending ("asc") or descending ("desc")statusstringoptionalIndicates if the invitee "canceled" or still "active"calendlymcp_meetings_list_events#Use: List scheduled meetings for user/org.
When: Upcoming/past meetings or to find meetings by date.
Needs: User/org URI via `users-get_current_user`.
Do: Filter status (active/canceled), date range; carry `uri`. Default enrich via `meetings-list_event_invitees`; skip for times/count-only.
Avoid: Fetching unfiltered when the user has a specific date in mind.
Then: Use meeting `uri` in `meetings-get_event` or `meetings-cancel_event` as needed.10 params
Use: List scheduled meetings for user/org. When: Upcoming/past meetings or to find meetings by date. Needs: User/org URI via `users-get_current_user`. Do: Filter status (active/canceled), date range; carry `uri`. Default enrich via `meetings-list_event_invitees`; skip for times/count-only. Avoid: Fetching unfiltered when the user has a specific date in mind. Then: Use meeting `uri` in `meetings-get_event` or `meetings-cancel_event` as needed.
countstringoptionalThe number of rows to returngroupstringoptionalReturn events that are scheduled with the group associated with this URIinvitee_emailstringoptionalReturn events that are scheduled with the invitee associated with this email addressmax_start_timestringoptionalInclude events with start times prior to this time (sample time format: "2020-01-02T03:04:05.678123Z"). This time should use the UTC timezone.min_start_timestringoptionalInclude events with start times after this time (sample time format: "2020-01-02T03:04:05.678123Z"). This time should use the UTC timezone.organizationstringoptionalReturn events that are scheduled with the organization associated with this URIpage_tokenstringoptionalThe token to pass to get the next or previous portion of the collectionsortstringoptionalOrder results by the specified field and direction. Accepts comma-separated list of {field}:{direction} values. Supported fields are: start_time. Sort direction is specified as: asc, desc.statusstringoptionalWhether the scheduled event is `active` or `canceled`userstringoptionalReturn events that are scheduled with the user associated with this URIcalendlymcp_organizations_create_organization_invitation#Use: Invite a user to the organization by email.
When: User asks to add a new member.
Needs: Org URI and invitee email address.
Do: Check `organizations-list_organization_invitations` first to avoid duplicate invites.
Avoid: Calling without confirming no pending invite exists for this email.
Then: Confirm invitation sent and optionally show pending invitations.2 params
Use: Invite a user to the organization by email. When: User asks to add a new member. Needs: Org URI and invitee email address. Do: Check `organizations-list_organization_invitations` first to avoid duplicate invites. Avoid: Calling without confirming no pending invite exists for this email. Then: Confirm invitation sent and optionally show pending invitations.
create_organization_invitation_requestobjectrequiredCreateOrganizationInvitationRequesturistringrequiredOrganization URI. not a browsable link — never show to users.calendlymcp_organizations_get_organization#Use: Fetch details for the connected user's organization.
When: User asks about the org or you need the org URI for org-scoped list tools.
Needs: Org URI from `users-get_current_user` (`resource.current_organization`).
Do: Use returned `uri` for org-scoped event type or membership queries.
Avoid: Calling without an org URI.
Then: Use org URI in `organizations-list_organization_memberships`.1 param
Use: Fetch details for the connected user's organization. When: User asks about the org or you need the org URI for org-scoped list tools. Needs: Org URI from `users-get_current_user` (`resource.current_organization`). Do: Use returned `uri` for org-scoped event type or membership queries. Avoid: Calling without an org URI. Then: Use org URI in `organizations-list_organization_memberships`.
uristringrequiredOrganization URI. not a browsable link — never show to users.calendlymcp_organizations_get_organization_membership#Use: Fetch details for a single org membership.
When: You need role or status for a specific member.
Needs: Membership URI from `organizations-list_organization_memberships`.
Do: Check `role` and `status` fields for permissions context.
Avoid: Calling without a known membership URI.
Then: Use membership data to confirm before invite or removal actions.1 param
Use: Fetch details for a single org membership. When: You need role or status for a specific member. Needs: Membership URI from `organizations-list_organization_memberships`. Do: Check `role` and `status` fields for permissions context. Avoid: Calling without a known membership URI. Then: Use membership data to confirm before invite or removal actions.
uristringrequiredOrganization membership URI. not a browsable link — never show to users.calendlymcp_organizations_list_organization_invitations#Use: List pending invitations for the organization.
When: User asks to see pending invites or check if someone was already invited.
Needs: Org URI from `users-get_current_user`.
Do: Check returned list before sending a new invite to avoid duplicates.
Avoid: Sending a new invitation without checking for existing pending ones.
Then: Use invitation URI in `organizations-revoke_organization_invitation` if needed.6 params
Use: List pending invitations for the organization. When: User asks to see pending invites or check if someone was already invited. Needs: Org URI from `users-get_current_user`. Do: Check returned list before sending a new invite to avoid duplicates. Avoid: Sending a new invitation without checking for existing pending ones. Then: Use invitation URI in `organizations-revoke_organization_invitation` if needed.
uristringrequiredOrganization URI. not a browsable link — never show to users.countstringoptionalThe number of rows to returnemailstringoptionalIndicates if the results should be filtered by email addresspage_tokenstringoptionalThe token to pass to get the next or previous portion of the collectionsortstringoptionalOrder results by the field name and direction specified (ascending or descending). Returns multiple sets of results in a comma-separated list.statusstringoptionalIndicates if the results should be filtered by status ("pending", "accepted", or "declined")calendlymcp_organizations_list_organization_memberships#Use: List all members of an organization.
When: User asks who is in the org or you need to find a member's user URI.
Needs: Org URI from `users-get_current_user`.
Do: Use returned `user.uri` for per-user event-type or availability queries.
Avoid: Fetching the full list when you only need the connected user—use `users-get_current_user` instead.
Then: Use member URI in user-scoped tools or `organizations-get_organization_membership`.6 params
Use: List all members of an organization. When: User asks who is in the org or you need to find a member's user URI. Needs: Org URI from `users-get_current_user`. Do: Use returned `user.uri` for per-user event-type or availability queries. Avoid: Fetching the full list when you only need the connected user—use `users-get_current_user` instead. Then: Use member URI in user-scoped tools or `organizations-get_organization_membership`.
countstringoptionalThe number of rows to returnemailstringoptionalIndicates if the results should be filtered by email addressorganizationstringoptionalIndicates if the results should be filtered by organizationpage_tokenstringoptionalThe token to pass to get the next or previous portion of the collectionrolestringoptionalIndicates if the results should be filtered by roleuserstringoptionalIndicates if the results should be filtered by usercalendlymcp_organizations_revoke_organization_invitation#Use: Revoke a pending organization invitation.
When: User asks to cancel a pending invite.
Needs: Organization URI from `users-get_current_user` and Invitation URI from `organizations-list_organization_invitations`.
Do: Confirm with user before revoking; this cannot be undone.
Avoid: Revoking without confirming the invite is still pending.
Then: Confirm revocation and optionally refresh invitations list.2 params
Use: Revoke a pending organization invitation. When: User asks to cancel a pending invite. Needs: Organization URI from `users-get_current_user` and Invitation URI from `organizations-list_organization_invitations`. Do: Confirm with user before revoking; this cannot be undone. Avoid: Revoking without confirming the invite is still pending. Then: Confirm revocation and optionally refresh invitations list.
org_uristringrequiredOrganization URI. not a browsable link — never show to users.uristringrequiredPending invitation URI. not a browsable link — never show to users.calendlymcp_routing_forms_get_routing_form#Use: Fetch details for a single routing form.
When: User asks about a specific form or its questions.
Needs: Routing form URI from `routing_forms-list_routing_forms`.
Do: Use returned question IDs for submission filtering.
Avoid: Calling without a known form URI.
Then: Use form details to answer user questions or list submissions.1 param
Use: Fetch details for a single routing form. When: User asks about a specific form or its questions. Needs: Routing form URI from `routing_forms-list_routing_forms`. Do: Use returned question IDs for submission filtering. Avoid: Calling without a known form URI. Then: Use form details to answer user questions or list submissions.
uristringrequiredRouting form URI. not a browsable link — never show to users.calendlymcp_routing_forms_get_routing_form_submission#Use: Fetch details for a single routing form submission.
When: User asks about a specific submission or response.
Needs: Submission URI from `routing_forms-list_routing_form_submissions`.
Do: Read `questions_and_answers` for the submitted values.
Avoid: Calling without a known submission URI.
Then: Report submission details to user.1 param
Use: Fetch details for a single routing form submission. When: User asks about a specific submission or response. Needs: Submission URI from `routing_forms-list_routing_form_submissions`. Do: Read `questions_and_answers` for the submitted values. Avoid: Calling without a known submission URI. Then: Report submission details to user.
uristringrequiredRouting form submission URI. not a browsable link — never show to users.calendlymcp_routing_forms_list_routing_form_submissions#Use: List submissions for a routing form.
When: User asks to see form responses or analyze routing data.
Needs: Routing form URI from `routing_forms-list_routing_forms`.
Do: Use pagination params for large result sets.
Avoid: Fetching all submissions without date/count filters on high-volume forms.
Then: Use submission URI in `routing_forms-get_routing_form_submission`.4 params
Use: List submissions for a routing form. When: User asks to see form responses or analyze routing data. Needs: Routing form URI from `routing_forms-list_routing_forms`. Do: Use pagination params for large result sets. Avoid: Fetching all submissions without date/count filters on high-volume forms. Then: Use submission URI in `routing_forms-get_routing_form_submission`.
formstringrequiredView routing form submissions associated with the routing form's URI.countstringoptionalThe number of rows to returnpage_tokenstringoptionalThe token to pass to get the next or previous portion of the collectionsortstringoptionalOrder results by the specified field and direction. Accepts comma-separated list of {field}:{direction} values. Supported fields are: created_at. Sort direction is specified as: asc, desc.calendlymcp_routing_forms_list_routing_forms#Use: List routing forms for the org.
When: User asks about routing forms or you need to find a form by name.
Needs: Org URI from `users-get_current_user`.
Do: Use returned `uri` to fetch form details.
Avoid: Assuming form names without listing first.
Then: Use form URI in `routing_forms-get_routing_form`.4 params
Use: List routing forms for the org. When: User asks about routing forms or you need to find a form by name. Needs: Org URI from `users-get_current_user`. Do: Use returned `uri` to fetch form details. Avoid: Assuming form names without listing first. Then: Use form URI in `routing_forms-get_routing_form`.
organizationstringrequiredView organization routing forms associated with the organization's URI.countstringoptionalThe number of rows to returnpage_tokenstringoptionalThe token to pass to get the next or previous portion of the collectionsortstringoptionalOrder results by the specified field and direction. Accepts comma-separated list of {field}:{direction} values. Supported fields are: created_at. Sort direction is specified as: asc, desc.calendlymcp_scheduling_links_create_single_use_scheduling_link#Use: Create a single-use scheduling link using the event type's settings unchanged.
When: User wants a one-time link with no overrides. For per-link customization (duration, scheduling window, location, availability), use `shares-create_share` instead.
Needs: Event type URI from `event_types-list_event_types`.
Do: Each call creates a new link; store the returned `booking_url`.
Avoid: Using when any override is requested — this endpoint cannot customize the link. Don't create more links than needed; each call creates a distinct non-reusable link.
Then: Share `booking_url` with the intended invitee.1 param
Use: Create a single-use scheduling link using the event type's settings unchanged. When: User wants a one-time link with no overrides. For per-link customization (duration, scheduling window, location, availability), use `shares-create_share` instead. Needs: Event type URI from `event_types-list_event_types`. Do: Each call creates a new link; store the returned `booking_url`. Avoid: Using when any override is requested — this endpoint cannot customize the link. Don't create more links than needed; each call creates a distinct non-reusable link. Then: Share `booking_url` with the intended invitee.
create_scheduling_link_requestobjectrequiredCreateSchedulingLinkRequestcalendlymcp_users_get_current_user#Use: Resolve the connected host account and canonical user URI.
When: Start any scheduling, booking, event-type, or availability workflow.
Needs: No inputs.
Do: Call once and keep `resource.uri`, `timezone`, and `scheduling_url` for downstream calls.
Avoid: Skipping this and guessing host identity.
Then: Use `resource.uri` in list/get tools unless the user explicitly names another host.0 params
Use: Resolve the connected host account and canonical user URI. When: Start any scheduling, booking, event-type, or availability workflow. Needs: No inputs. Do: Call once and keep `resource.uri`, `timezone`, and `scheduling_url` for downstream calls. Avoid: Skipping this and guessing host identity. Then: Use `resource.uri` in list/get tools unless the user explicitly names another host.
calendlymcp_users_get_user#Use: Fetch profile for a specific user by URI.
When: User asks about another person's account or you hold a user URI from org/membership data.
Needs: User URI.
Do: Pass the user URI from org/membership data; do not use this to look up the connected user.
Avoid: Calling this without a known URI - use `users-get_current_user` for the connected user.
Then: Use returned `uri` and `timezone` for event-type or availability lookups scoped to that user.1 param
Use: Fetch profile for a specific user by URI. When: User asks about another person's account or you hold a user URI from org/membership data. Needs: User URI. Do: Pass the user URI from org/membership data; do not use this to look up the connected user. Avoid: Calling this without a known URI - use `users-get_current_user` for the connected user. Then: Use returned `uri` and `timezone` for event-type or availability lookups scoped to that user.
uristringrequiredUser URI. not a browsable link — never show to users.