TidyCal MCP server
Ask Claude, ChatGPT, or another MCP-capable assistant about your TidyCal schedule: your booking types, your bookings, and when you are free. With your permission it can also book and cancel meetings and set up booking types.
Server URL
Point your MCP client at:
https://tidycal.com/mcp
It speaks MCP over HTTP. There is nothing to install and no API key to paste.
Connecting
Every app uses the same address, https://tidycal.com/mcp,
with no www. These menus belong to each app, so their names can change.
When you connect, TidyCal asks for permission to read your scheduling data and, separately, to create and change bookings and booking types. If you do not approve the second one, your assistant can only read.
ChatGPT
Works on Free and Plus ChatGPT plans, on chatgpt.com.
- Click Plugins in the left sidebar. It is no longer under Settings.
- Click Add (top right), then Add custom MCP server.
- Name: TidyCal. Server URL:
https://tidycal.com/mcp. Authentication: OAuth. - Tick I understand and want to continue, then click Create as a plugin.
- Click Connect TidyCal, sign in to TidyCal and click Authorize.
- Start a new chat, type @, choose TidyCal and ask "what booking types do I offer?"
If you do not see Add custom MCP server, your ChatGPT plan or workspace does not offer it yet.
Claude
Works on claude.ai.
- Click Customize in the left sidebar, then Connectors. (If you open Settings and then Connectors, it tells you they have moved to Customize.)
- Click Add, then Add custom connector.
- Enter
https://tidycal.com/mcpas the connector address, name it TidyCal and save. - Click Connect next to TidyCal, sign in to TidyCal and click Authorize.
- In a new chat, ask "what booking types do I offer?"
On a Claude Team plan, only an organization owner can add a custom connector. Once an owner adds TidyCal, everyone else just clicks Connect.
Grok Bot (desktop app)
- Ask one of your bots: "Install the TidyCal MCP: https://tidycal.com/mcp"
- Click Connect on the TidyCal card it shows.
- Sign in to TidyCal and click Authorize. The approval screen names the app Cursor. That is expected.
Gemini and other clients
Gemini is not supported: TidyCal does not accept sign-ins from Gemini, so it cannot connect even where Gemini lets you add a custom app. Tools that run on your own computer, such as Claude Code, can connect with the same address using the client's steps for a remote MCP server over HTTP.
Authentication
OAuth 2.1 with PKCE and dynamic client registration — the flow MCP clients already implement, so you should not have to configure any of it by hand. The details, for anyone connecting a client that needs them:
| Discovery | https://tidycal.com/.well-known/oauth-protected-resourcehttps://tidycal.com/.well-known/oauth-authorization-server |
|---|---|
| Registration | https://tidycal.com/oauth/register — dynamic, no pre-registration |
| Grant type | authorization_code (PKCE, S256) and refresh_token |
| Scopes |
mcp:scheduling:read (See your bookings, booking types, availability, and teams)mcp:scheduling:write (Create and change bookings and booking types) |
What it can do
It can read your account and, with your permission, change it. Tools marked Changes data create or cancel things and work only if you approved the write permission when you connected. If you did not, they refuse and your assistant tells you. Cancelling a booking always emails the booker and the host, and it cannot be undone.
| Tool | What it does |
|---|---|
get-current-user |
Get the authenticated TidyCal user's profile: name, email, timezone, language, currency, and Pro status. Call this first when the user asks about themselves or to confirm whose account is connected. |
list-teams |
List the teams that the authenticated user owns or belongs to. Returns paginated team summaries (id, name, timestamps). Use this when the user mentions teams, group scheduling, or collaborative booking pages. |
get-team |
Get a single team by ID. Returns the team summary if the authenticated user owns or belongs to that team; otherwise returns a not-found error (does not leak IDs). |
list-booking-types |
List the authenticated user's booking types — the scheduling pages they offer to their clients (e.g., "30-minute consult", "60-minute interview"). Returns paginated results with full details: title, slug, duration, price, description, and configuration. Use this when the user asks "what booking types do I have" or wants to identify a specific one before calling another tool. |
get-booking-type |
Get full details for one booking type by ID, including availability windows, questions, reminders, and pricing. Authorization is enforced — returns a not-found error if the booking type does not belong to the authenticated user or a team they're on. |
list-booking-type-available-times |
List the available time slots for a booking type within a date range — the times a client could actually book. This is the canonical TidyCal availability lookup and accounts for the user's schedule, existing bookings, calendar conflicts, and buffers. Use this when the user asks "when am I available?" or "when can someone book the 30-minute consult next week?". |
list-bookings |
List the authenticated user's scheduled bookings (meetings on their calendar via TidyCal). Supports an optional date-range filter (starts_at / ends_at) and a cancelled flag. Use this for questions like "what does my schedule look like next week?", "show my upcoming meetings", or "list my cancelled bookings". |
get-booking |
Get full details for one booking by ID, including the booking type, contact, questions, payment, and hosts. Authorization is enforced via BookingPolicy — returns a not-found error if the user is neither the host nor an authorized team member. |
list-busy-times |
List external calendar events (non-booking events from the user's connected calendars) that occur in a date range. Covers every connected provider — Google, Microsoft, Apple and read-only calendar feeds (ICS links) — for calendars the user has enabled for conflict checking. These are the events that block TidyCal availability. Use this when the user asks "what conflicts are on my calendar?" or "show my external events next week" — for actual TidyCal meetings, use list-bookings instead. |
list-date-polls |
List the authenticated user's date polls (meeting polls where invitees vote on proposed times) with the votes on each proposed slot. Each poll has its status (open, closed or cancelled), duration, location, poll page URL, the booked time once closed (booking_cancelled is true if that booking was later cancelled), and a list of slots, most votes first, with the voter contact IDs for each slot. Voters are listed once per poll. Use this when the user asks how a poll is going or which date won. |
list-locations |
List the configured locations for a booking type — physical addresses, phone numbers, video conferencing providers (Zoom, Google Meet, etc.). Each booking type can have multiple locations; the guest picks one when booking. |
list-store-orders |
List the orders on the authenticated user's TidyCal Store: digital products sold on their own and add-ons bought with a booking. Newest first. Optionally filter by status. Use this for questions like "what did I sell this week?" or "show my refunded Store orders". |
create-booking |
Changes data Book a meeting on one of the user's free booking types for a given person at a given start time. The person receives the usual confirmation email and the booking goes on the calendar. Use list-booking-type-available-times first to pick a start time that is open. Booking types that charge a price cannot be booked this way. Needs the write permission. |
cancel-booking |
Changes data Cancel one of the user's upcoming bookings. This frees the time slot and cannot be undone. The booker and the host are always emailed about the cancellation. Only cancel when the user has clearly asked for that booking to be cancelled. Needs the write permission. |
create-booking-type |
Changes data Create a new booking type (a scheduling page, e.g., "30-minute consult"), free or paid, on the user's account. It uses the user's default availability and gets its own booking page link from url_slug. Set price to charge bookers on that page; the money goes to the user's connected payment account. Confirm the price and currency with the user first. Use list-booking-types first to avoid duplicating one that already exists. Needs the write permission. |
create-contact |
Changes data Add a contact (a person the user schedules with) to the user's TidyCal account. If a contact with the same email already exists it is returned instead of creating a duplicate. No email is sent to the contact. Needs the write permission. |
Troubleshooting
- ChatGPT says "Authentication succeeded, action discovery failed"
-
The address has
wwwin it. Remove the TidyCal plugin, add it again withhttps://tidycal.com/mcp(no www), and connect. - The connection fails before the sign-in screen
-
Check the URL is exactly
https://tidycal.com/mcp, with nowww, trailing slash or path after it. - "This account cannot use the MCP server"
- This appears only on accounts that cannot sign in to TidyCal. Contact [email protected].
- A meeting on my Google, Outlook, or Apple calendar is missing
- TidyCal bookings show up straight away. Events from your connected calendars appear once TidyCal next syncs that calendar, so a very recent change can take a little while to show.