The Calendly MCP server enables AI-powered apps and developers to securely connect to Calendly using the Model Context Protocol (MCP). It translates natural-language commands (e.g., “Book a 30-minute meeting with Sam next Tuesday”) into structured Calendly API calls with no need to implement raw REST requests. The server is fully hosted by Calendly atDocumentation Index
Fetch the complete documentation index at: https://calendly-preview.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
https://mcp.calendly.com. Self-hosting or local deployment is not supported.
Before you build — check client compatibility. Calendly MCP uses DCR (RFC 7591), so clients self-register to obtain a client_id at runtime. If your MCP client prompts you to paste in a client_id and client_secret from a developer console, it does not support DCR and will not work with Calendly MCP today.
| Supported Today | Not Supported Today | |
|---|---|---|
| OAuth flow | ✅ OAuth 2.1 Authorization Code + PKCE (S256) | ❌ Manual OAuth app provisioning (console-issued credentials) |
| Registration | ✅ Dynamic Client Registration (DCR, RFC 7591) | ❌ Static, pre-registered client_id flows without DCR |
| Auth method | ✅ OAuth discovery via protected resource metadata | ❌ Non-OAuth bearer tokens (e.g. personal access tokens) |
- Secure, standards-based OAuth 2.1 authentication
- Full coverage of Calendly’s scheduling capabilities
- Compatible with any MCP-compliant client or agent framework
- Same scopes and permissions as Calendly’s public API
Authentication model
Calendly MCP uses Dynamic Client Registration (DCR), which means you do not need to pre-register an OAuth application or put any OAuth secrets into your MCP client configuration. After setting the server URL, the client and server navigate the auth flow automatically. Once Calendly MCP is connected to a client, it generates an OAuth application for the session. A browser window opens for the user to grant access to their Calendly account. After pressing “Connect to Calendly” on the consent screen, the scheduling tools are available immediately. For developers building custom MCP clients, the full DCR walkthrough is in Section 3. At a high level:- The MCP endpoint is an OAuth-protected resource.
- An unauthenticated request returns 401 with a link to the OAuth resource metadata.
- The client fetches that metadata to discover the authorization server and required scopes.
- The client fetches authorization server metadata to find the token, auth, and
registration_endpoint. - The client calls
registration_endpoint(DCR) to self-register and receive aclient_id. - The client runs the Authorization Code + PKCE flow to obtain an access token.
- The client sends the access token on all subsequent MCP calls.
Integration walkthrough
This section is for developers building their own MCP clients. If you’re new to building MCP clients, see Build an MCP client and Connect to remote MCP servers in the MCP docs. The steps below focus on:- Initial handshake between your MCP client and the Calendly MCP server.
- Discovery of the Calendly MCP protected resource.
- Discovery of the Calendly authorization server.
- Registration of your MCP client via DCR.
Step 0: Initial handshake
When your MCP client first tries to call the Calendly MCP server without a token, the server responds with 401 Unauthorized and tells the client where to find the protected resource metadata document, as defined in RFC 9728.Step 1: Discover the Calendly MCP protected resource
Your MCP client (or the MCP framework you’re using) should first discover the MCP server’s protected resource metadata. Requestresourceis the identifier your client should use when requesting tokens for the MCP server.authorization_serverstells you which OAuth authorization server(s) to talk to (for Calendly MCP, this ishttps://calendly.com/).- scopes_supported lists the only scopes currently issued for MCP. Calendly MCP requires both for full access.
mcp:scheduling:readmcp:scheduling:write
Step 2: Discover the Calendly authorization server
Next, discover the Calendly OAuth authorization server metadata. This tells you where to send DCR, authorization, and token requests. Requestregistration_endpoint– this is the URL you will call to dynamically register your MCP client.
Step 3: Register your MCP client via DCR
With theregistration_endpoint discovered, your MCP client can register itself dynamically.
- Endpoint:
POST https://calendly.com/oauth/register - Authentication: For MCP, a registration token is not required, however the endpoint is heavily validated and rate‑limited.
- Content type:
application/json
3.1 Minimal valid registration request
This is the minimal JSON body your MCP client should send to register:client_name- Human‑readable label shown on Calendly’s consent screen.
- Should clearly identify your MCP client or product.
redirect_uris- Array of one or more redirect URIs.
- For production:
- Must be HTTPS.
- Must be exact URIs (no wildcards like
https://*.example.com/...). - Must not contain multiple schemes in a single URI (e.g.,
https://http://...). - Must not contain userinfo (e.g.,
https://user@evil.example/...). - Leading/trailing spaces are rejected.
- For local development,
http://localhost/...orhttp://127.0.0.1/...may be allowed per environment policy.
grant_types- For MCP, use:
- [
"authorization_code"] - Include
"refresh_token"if your client will use refresh tokens.
- [
- For MCP, use:
response_types- MCP only supports the authorization code with PCKE flow:
- [
"code"] is required.
- [
- MCP only supports the authorization code with PCKE flow:
token_endpoint_auth_method- For MCP DCR, Calendly treats clients as public and requires:
"none"
- That implies:
- No
client_secretis used at the token endpoint. - PKCE is required to protect the authorization code.
- No
- For MCP DCR, Calendly treats clients as public and requires:
- Scopes
- Calendly MCP currently issues:
mcp:scheduling:readmcp:scheduling:write
- These are configured server‑side for MCP DCR clients.
- You do not need to include
scope/scopesin the registration request. The server will attach the MCP scopes for you.
- Calendly MCP currently issues:
3.2 Successful registration response
On success, you’ll receive a JSON document describing your new client:client_id- Opaque identifier your MCP client must use in all later OAuth interactions.
- Treat it as a stable, long‑lived identifier.
client_secret- For MCP DCR, no client secret is issued (public client).
- Your MCP client must rely on PKCE and
token_endpoint_auth_method: "none".
- scopes
- Confirms the scopes assigned to this client.
- For MCP, expect
["mcp:scheduling:read", "mcp:scheduling:write"].
client_idredirect_uris- Any metadata your MCP framework expects for subsequent authorization and token requests.
3.3 Error responses and validation behavior
If the registration request is invalid, the endpoint returns an error:- Invalid scopes:
- Wildcard or malformed redirect URIs, multiple schemes, or leading spaces:
invalid_client_metadata:
- Inspect the
errorsobject to see which field(s) failed validation. - Correct the JSON body (e.g., fix
redirect_uris, adjust scopes, remove wildcards). - Retry the
POST /oauth/registerrequest.
With these steps, your custom MCP client can perform standards‑based Dynamic Client Registration against Calendly’s authorization server, using only:
- Discovery URLs:
https://mcp.calendly.com/.well-known/oauth-protected-resourcehttps://calendly.com/.well-known/oauth-authorization-server
- DCR endpoint:
https://calendly.com/oauth/register
authorization_endpoint and token_endpoint, and the client_id returned from DCR.
Supported tools
The Calendly MCP server exposes tools mapped to Calendly’s public API v2. Each tool includes annotation metadata — a human-readable title and hints (readOnlyHint, destructiveHint, idempotentHint) — to enhance the user experience and optimize repeated calls. See the full list of Calendly MCP server tools.Example prompts
| Prompt | Result |
|---|---|
| “List my event types.” | Returns the user’s event types |
| “Find open slots next week for my 30 min coaching session.” | Lists available time ranges |
| “Remove Fridays as available days for scheduling 30 min coaching sessions.” | Updates availability |
| “What is my scheduling link for 30 min coaching sessions?” | Returns a scheduling link |
| “Book a 30 min coaching session with User A (user@email.com) for this Thursday at 2 PM.” | Creates a scheduled event |
| “Cancel my 2 PM coaching session.” | Cancels a scheduled event |
| “Generate a one-time scheduling link for my 30 min coaching session.” | Creates a single-use link |