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 at 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 |
Auth method | ✅ OAuth discovery via protected resource metadata | ❌ Non-OAuth bearer tokens (e.g. personal access tokens) |
Key benefits
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
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 a client_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.
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.
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.
HTTP/1.1 401 UnauthorizedWWW-Authenticate: Bearer realm="mcp",resource_metadata="https://mcp.calendly.com/.well-known/oauth-protected-resource"
This tells the client that authorization is required for the Calendly MCP server and where to get the metadata needed to kick off the discovery and DCR flow.
Your MCP client (or the MCP framework you’re using) should first discover the MCP server’s protected resource metadata.
Request
GET https://mcp.calendly.com/.well-known/oauth-protected-resourceAccept: application/json
Successful response (example)
{"resource": "https://mcp.calendly.com/","authorization_servers": ["https://calendly.com/"],"scopes_supported": ["mcp:scheduling:read","mcp:scheduling:write"],"bearer_methods_supported": ["header"]}
Key points:
resource is the identifier your client should use when requesting tokens for the MCP server.
authorization_servers tells you which OAuth authorization server(s) to talk to (for Calendly MCP, this is https://calendly.com/).
scopes_supported lists the only scopes currently issued for MCP. Calendly MCP requires both for full access.
mcp:scheduling:read
mcp:scheduling:write
Your DCR and later OAuth requests should treat this document as the source of truth for the MCP resource and scopes.
Next, discover the Calendly OAuth authorization server metadata. This tells you where to send DCR, authorization, and token requests.
Request
GET https://calendly.com/.well-known/oauth-authorization-serverAccept: application/json
Successful response (example)
{"issuer": "https://calendly.com/","authorization_endpoint": "https://calendly.com/oauth/authorize","token_endpoint": "https://calendly.com/oauth/token","registration_endpoint": "https://calendly.com/oauth/register"}
Key field for DCR:
registration_endpoint – this is the URL you will call to dynamically register your MCP client.
With the registration_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
This is the minimal JSON body your MCP client should send to register:
POST https://calendly.com/oauth/registerContent-Type: application/json
{"client_name": "My MCP Client","redirect_uris": ["https://myapp.example.com/mcp/callback"],"grant_types": ["authorization_code"],"response_types": ["code"],"token_endpoint_auth_method": "none"}
Field notes
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://[email protected]/...).
Leading/trailing spaces are rejected.
For local development, http://localhost/... or http://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.
response_types
MCP only supports the authorization code with PCKE flow:
["code"] is required.
token_endpoint_auth_method
For MCP DCR, Calendly treats clients as public and requires:
"none"
That implies:
No client_secret is used at the token endpoint.
PKCE is required to protect the authorization code.
Scopes
Calendly MCP currently issues:
mcp:scheduling:read
mcp:scheduling:write
These are configured server‑side for MCP DCR clients.
You do not need to include scope/scopes in the registration request. The server will attach the MCP scopes for you.
On success, you’ll receive a JSON document describing your new client:
{"client_id": "auto-generated-client-id","client_name": "My MCP Client","redirect_uris": ["https://myapp.example.com/mcp/callback"],"scopes": ["mcp:scheduling:read","mcp:scheduling:write"],"grant_types": ["authorization_code"],"response_types": ["code"],"token_endpoint_auth_method": "none"}
Important points:
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"].
Store at least:
client_id
redirect_uris
Any metadata your MCP framework expects for subsequent authorization and token requests.
If the registration request is invalid, the endpoint returns an error:
{"error": "invalid_client_metadata","errors": {"redirect_uri": ["must start with https in Production."]}}
Other examples you might encounter:
Invalid scopes:
{"error": "invalid_client_metadata","errors": {"scopes": {"0": ["must be one of: mcp:scheduling:read, mcp:scheduling:write"]}}}
Wildcard or malformed redirect URIs, multiple schemes, or leading spaces:
{"error": "invalid_client_metadata","errors": {"redirect_uri": ["must be an exact https URI without wildcards or user info."]}}
When you receive invalid_client_metadata:
Inspect the errors object to see which field(s) failed validation.
Correct the JSON body (e.g., fix redirect_uris, adjust scopes, remove wildcards).
Retry the POST /oauth/register request.
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-resource
https://calendly.com/.well-known/oauth-authorization-server
DCR endpoint:
https://calendly.com/oauth/register
Once registered, you can proceed with the standard OAuth 2.1 authorization code + PKCE flow using the discovered authorization_endpoint and token_endpoint, and the client_id returned from DCR.
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.
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 ([email protected]) 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 |