YouCanBookMe MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@YouCanBookMe MCP Serverfind open morning slots on acme-demo next week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
YouCanBookMe MCP Server
A Model Context Protocol server for YouCanBookMe. It lets Claude, Cursor, ChatGPT and other AI agents find open times on your booking pages, book, reschedule and cancel bookings, and answer questions like "how many no-shows did we have last month?".
Unofficial. This is a community project and is not affiliated with YouCanBookMe or Capacity. It was built from YouCanBookMe's public API docs.
What you can ask your agent
"What's on my Demo booking page for the next 3 days, and who are the bookers?"
"Find two morning slots on acme-demo next week in New York time and draft an email offering them to Sam."
"Book Dana Levi (dana@acme.com, London) into the first Tuesday slot."
"Move booking ref QNBZAQPTAITT to Thursday at 2pm."
"How many bookings, cancellations and no-shows did each booking page get in September?"
"Find every booking made by someone at acme.com this quarter."
Related MCP server: Cal.com MCP Server for Customers
Tools
Tool | What it does | Writes? |
| All booking pages (profiles) with id, title and subdomain | No |
| One page's settings (choose fields with dot notation) | No |
| Upcoming bookings for the next N days, with booker name and email | No |
| Bookings in a time range by status, page, or text (name, email, ref) | No |
| One booking with times, status and form answers | No |
| Counts by status (finished, cancelled, noShow...) and by page for a period | No |
| Open slots, grouped by day with local times, returns an | Starts an intent |
| Book a slot found above (creates a real booking) | Yes |
| Move a booking to a new start time | Yes |
| Cancel as the calendar owner (removes the calendar event) | Destructive |
| Permanently delete a booking record | Destructive |
YouCanBookMe's booking API is built on booking intents (create intent, set selections, read availability, confirm). This server hides that flow behind two tools. find_available_times returns readable slots plus an intentId, and book_time fills in the form and confirms. Availability comes back as unix-millisecond timestamps, so the server converts it to ISO times and local clock times an LLM can reason about. Write tools carry MCP annotations, so clients can ask before running them.
Setup
In YouCanBookMe, open Account > Password & Security (link) and copy your Account ID and API key (starts with
ak_). On a Team plan, use the Organization Owner's key.Build it:
git clone https://github.com/OfirOhan/youcanbookme-mcp.git
cd youcanbookme-mcp && npm install && npm run buildClaude Desktop
Add this to claude_desktop_config.json:
{
"mcpServers": {
"youcanbookme": {
"command": "node",
"args": ["/absolute/path/to/youcanbookme-mcp/dist/index.js"],
"env": { "YCBM_ACCOUNT_ID": "your-account-id", "YCBM_API_KEY": "ak_..." }
}
}
}Claude Code / Cursor / other MCP clients
claude mcp add youcanbookme -e YCBM_ACCOUNT_ID=... -e YCBM_API_KEY=ak_... -- node /path/to/youcanbookme-mcp/dist/index.jsFor Cursor and other clients, use the same command with the variables in the environment.
Variable | Default | Notes |
| (required) | Your account ID (HTTP basic auth username) |
| (required) | Your API key (HTTP basic auth password) |
|
| Override for testing |
Development
npm install
npm test # builds, runs unit tests and an end-to-end MCP stdio test against a fake YouCanBookMe APIThe tests run on Node 20, 22 and 24 in CI.
Author
Built by Ofir Ohana, an AI agents engineer. Issues and PRs are welcome.
License
MIT
Available Tools
11 toolsbooking_reportBooking reportARead-only
Counts of bookings in a period by status (finished, cancelled, noShow, upcoming...) and by booking page. Good for 'how many no-shows did we have last month?'.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End of the period, ISO 8601, e.g. 2026-10-12T09:00:00Z | |
| from | Yes | Start of the period, ISO 8601, e.g. 2026-10-12T09:00:00Z | |
| bookingPageIds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds genuinely useful behavioral detail by disclosing that results are grouped counts by status (finished, cancelled, noShow, upcoming) and by booking page, which tells the agent what the response will contain. It stops short of describing pagination or whether both groupings are always returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with what is counted and grouped before the example query. No filler and every clause adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only aggregation tool with no output schema, the description conveys the essential return shape (counts by status and booking page) and the period requirement. It could say more about the exact response structure and the role of bookingPageIds, but nothing critical to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: from/to are well documented in the schema, but bookingPageIds has no schema description. The phrase 'by booking page' hints that this parameter scopes or groups by page, adding marginal meaning, but it does not explain the array semantics or filtering behavior. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (counts) plus the resource (bookings) and the exact grouping dimensions (status and booking page). An agent can immediately separate this aggregate-report tool from the sibling listing tools like search_bookings or list_upcoming_bookings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example question ('how many no-shows did we have last month?') clearly signals the intended usage context for a counting/aggregation query. However, it never names an alternative tool or states when not to use it, so the routing guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
book_timeBook a timeA
Book a slot found by find_available_times. Fills the booking form and confirms the intent, which creates a real booking and calendar event and sends notifications, so confirm details with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | |||
| units | No | Seats to book (default 1) | |
| intentId | Yes | intentId returned by find_available_times | |
| lastName | No | ||
| startsAt | Yes | Slot start, exactly as returned by find_available_times, ISO 8601, e.g. 2026-10-12T09:00:00Z | |
| timeZone | Yes | Booker's IANA time zone | |
| firstName | Yes | ||
| otherAnswers | No | Answers to other required form questions, by question code, e.g. [{id:'PHONE', value:'+1...'}] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false, so the write/side-effect profile is partly covered. The description adds genuine value beyond that: it discloses that the call creates a real booking plus a calendar event and sends notifications, which is the kind of irreversible-external-effect detail an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and its input source, then the side effects, then the safety caveat. No filler and no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent mutation tool with no output schema, the description covers the source of inputs, the side effects, and the confirmation requirement, which is close to complete. Minor gap: it does not say what the response contains or how to recover from a failed/duplicate booking, though annotations handle the idempotency signal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 63% and the description adds no field-level meaning beyond noting that intentId comes from find_available_times, which the schema already states. With most parameters self-documented in the schema, this sits at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Book a slot') and anchors it to the sibling that produces the input ('found by find_available_times'), which cleanly separates it from search/get/cancel/reschedule siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear workflow precondition (use only with a slot returned by find_available_times) and an explicit caution to confirm details with the user first. It does not name an alternative for the related operations, but the sourcing dependency is stated plainly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_bookingCancel bookingADestructiveIdempotent
Cancel a booking as the calendar owner. The calendar event is removed and cancellation notifications are sent per the page's settings. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| bookingId | Yes | Booking ID (UUID), from search_bookings or list_upcoming_bookings |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description still adds real value beyond them: the calendar event is removed, cancellation notifications are sent according to the page's settings, and confirmation is required first — side effects an agent cannot infer from the hints alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and actor, followed by the consequences and the confirmation requirement. Every clause earns its place with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no output schema, the description covers actor scope, side effects (event removal, notifications), and a confirmation safeguard. It leaves only minor gaps, such as behavior when the booking is already cancelled (implied by idempotentHint=true but not stated).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema already documents bookingId fully, including its provenance (search_bookings or list_upcoming_bookings). The description adds no parameter-level meaning, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cancel a booking') plus the acting scope ('as the calendar owner'), so the core action is unambiguous. However, it never distinguishes itself from the sibling 'delete_booking', which an agent must disambiguate before choosing between them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The instruction 'Confirm with the user first' gives one actionable usage rule and 'as the calendar owner' implies a permission precondition. But there is no explicit when-to-use-this-vs-alternatives guidance, notably against delete_booking or reschedule_booking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_bookingDelete bookingADestructiveIdempotent
Permanently delete a booking record from YouCanBookMe. No further notifications are sent, but the calendar event stays on the calendar. Prefer cancel_booking unless the user explicitly wants the record gone.
| Name | Required | Description | Default |
|---|---|---|---|
| bookingId | Yes | Booking ID (UUID), from search_bookings or list_upcoming_bookings |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/idempotent/openWorld, but the description adds consequences the annotations cannot: no further notifications are sent and the calendar event is left intact. That is exactly the side-effect detail an agent needs before destroying a record.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the destructive nature front-loaded and the alternative-tool guidance immediately after. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with full annotation coverage and no output schema, the description supplies everything missing: permanence, notification behavior, calendar-event persistence, and the safer alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single bookingId parameter already documents its format (UUID) and its source tools. The description adds no parameter-level meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a booking record') with the product scope (YouCanBookMe) and explicitly distinguishes the operation from cancel_booking, a real sibling in the tool list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: 'Prefer cancel_booking unless the user explicitly wants the record gone.' This names the alternative tool and the condition that selects this one, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_available_timesFind available timesA
Find open times on a booking page, grouped by day with readable local times. This starts a booking intent and returns its intentId. Pass that intentId and one slot's exact startsAt to book_time to book it.
| Name | Required | Description | Default |
|---|---|---|---|
| from | No | Only show slots from, ISO 8601, e.g. 2026-10-12T09:00:00Z | |
| until | No | Only show slots until, ISO 8601, e.g. 2026-10-12T09:00:00Z | |
| duration | No | Duration in minutes, if the page lets the booker choose | |
| timeZone | Yes | Booker's IANA time zone for display and booking, e.g. America/New_York | |
| subdomain | Yes | Booking page subdomain (from list_booking_pages), e.g. 'acme-demo' for acme-demo.youcanbook.me | |
| teamMemberId | No | Team member ID, or AUTO to let the page assign | |
| appointmentTypeIds | No | Appointment type IDs, if the page uses them |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a genuinely non-obvious side effect beyond the annotations: despite the 'find' name, it starts a booking intent and returns an intentId. This is exactly the kind of hidden state creation an agent needs, and it aligns with (rather than repeats) readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler; the purpose and return grouping come first, then the handoff to book_time. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers the key return value (intentId) and result grouping, and all parameters are schema-documented. Minor gaps remain: no mention of behavior when no slots are available, intent expiry, or pagination limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters, including examples for from/until and the IANA timeZone. The description adds only the downstream intentId/startsAt pairing, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find open times on a booking page') plus the return shape ('grouped by day with readable local times'). This clearly distinguishes it from sibling reads like get_booking_page and from the downstream book_time action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the tool as the first step of a booking flow and routes the agent to book_time with the intentId and an exact startsAt. It gives a clear use context but does not state when NOT to use it or how it relates to reschedule/cancel flows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bookingGet bookingARead-only
Get one booking with times, status, booking page, and the booker's form answers.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Override the comma-separated field list | |
| bookingId | Yes | Booking ID (UUID), from search_bookings or list_upcoming_bookings |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context about the payload contents (times, status, booking page, form answers), but says nothing about permissions, error behavior for a missing/invalid ID, or the fields override's effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that names the resource first and then the returned content. Every clause carries information; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only lookup with no output schema, the description's enumeration of returned data adequately compensates for the missing output schema. Only minor gaps remain: no note on behavior when the booking is not found and no guidance on the optional fields override.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both bookingId and the fields override are documented in the schema itself; baseline 3 applies. The description adds no meaning beyond the schema - it doesn't explain what the 'fields' override does or why one would use it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('one booking') and enumerates what comes back: times, status, booking page, and the booker's form answers. It is clearly distinguishable from the list-oriented siblings (search_bookings, list_upcoming_bookings), though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use/when-not statement in the description. Usage is only implied: fetching a single booking by ID versus the list/search siblings. The schema's bookingId note ('from search_bookings or list_upcoming_bookings') supplies the workflow hint, but that is structured data, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_booking_pageGet booking pageBRead-only
Get one booking page's settings. Use fields to ask for specific nested settings (dot notation).
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Comma-separated fields, e.g. id,title,subdomain,timeZone | |
| profileId | Yes | Booking page (profile) ID, from list_booking_pages |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe-read profile is covered without the description. The description adds only the single-page scoping ('one booking page's settings') and says nothing about auth, error behavior for unknown IDs, or response shape. Minimum-viable given annotations carry the safety signal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core purpose front-loaded and the parameter hint following. Nothing wastes the agent's attention.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with full schema coverage and no output schema, the description covers what the tool returns conceptually ('settings') and how to shape the request. It stops short of describing error/not-found behavior or id-source alternatives, but nothing essential for invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (fields, profileId) are already documented, making 3 the baseline. The description adds the dot-notation hint for nested settings beyond the schema's flat comma-separated example, but that hint is thin and arguably inconsistent with the schema example (id,title,subdomain,timeZone) and the absence of nested objects.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one booking page's settings'), and the word 'one' signals a single-record fetch, distinguishing it in spirit from list_booking_pages. However it never names or contrasts the sibling retrieval tools (get_booking, list_booking_pages) explicitly, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance offered is about the `fields` parameter ('use fields to ask for specific nested settings'), not about when to choose this tool over list_booking_pages or get_booking. No prerequisites, no when-not-to-use, no alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_booking_pagesList booking pagesARead-only
List the account's booking pages (the API calls them profiles). Returns each page's id, title and subdomain. The subdomain is what find_available_times needs.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Comma-separated fields to return (default: id,title,subdomain,description) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the concrete return shape (id, title, subdomain) but says nothing about pagination, result limits, or ordering for what could be a multi-page account, which is the main behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, all earning their place: identity of the resource, the vocabulary caveat, the return contents, and the downstream use. The most useful routing hint (subdomain for find_available_times) is placed last as a natural call-to-action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values and does so explicitly, and it flags the profiles/booking-pages naming alias that would otherwise confuse an agent. It is only slightly incomplete regarding pagination behavior and the overridable 'fields' parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional 'fields' parameter is fully documented there, so the baseline of 3 applies. The description does not mention the fields parameter at all, and its field list ('id, title and subdomain') is narrower than the schema's stated default set including description, adding no real semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the account's booking pages') and disambiguates the API's own vocabulary by noting the API calls them profiles. It also enumerates the returned fields, so it is clearly distinguishable from the singular sibling get_booking_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies a concrete downstream reason to call it: 'The subdomain is what find_available_times needs,' which effectively routes the agent from this tool into the scheduling flow. It does not explicitly state when to prefer get_booking_page or search_bookings over this list call, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_upcoming_bookingsList upcoming bookingsARead-only
List upcoming (not cancelled) bookings for the next N days, soonest first, with booker name and email.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days ahead (default 7) | |
| bookingPageIds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds real context beyond them: cancelled bookings are excluded, results are ordered soonest-first, and each row carries the booker name and email. It still says nothing about pagination or result-size limits on a potentially open-ended window.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, front-loading the operation and layering scope, ordering, and returned fields in a natural reading order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully names the key returned fields (booker name and email), and annotations cover the read-only profile. The gap is the undocumented bookingPageIds parameter and the absence of any note on result volume for larger day windows.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: 'days' is fully documented by the schema (default 7, range 1-90) and echoed by the description's 'next N days', but bookingPageIds has no description anywhere. The description also fails to clarify whether supplying bookingPageIds narrows the list to those pages or is a scope requirement, so it does not compensate for the coverage gap. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource (list upcoming bookings) plus meaningful scope: not cancelled, next N days, soonest first. That functionally separates it from search_bookings and get_booking, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the 'upcoming, not cancelled, next N days' framing, which tells the agent this is a time-window roll-up rather than a query tool. There is no explicit when-to-use/when-not guidance and no routing to search_bookings or booking_report for other needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reschedule_bookingReschedule bookingAIdempotent
Move a booking to a new start time. Use find_available_times first to pick a free slot. The booker is notified, so confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| bookingId | Yes | Booking ID (UUID), from search_bookings or list_upcoming_bookings | |
| newStartsAt | Yes | New start time, ISO 8601, e.g. 2026-10-12T09:00:00Z |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds value the annotations cannot: the side effect that the booker is notified, plus a confirmation requirement. It does not describe what happens to the vacated slot or failure behavior, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: operation, prerequisite tool, and side-effect caution. The core action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema and full annotation coverage, the description supplies the key missing pieces: the prerequisite lookup and the notification side effect. It stops short of covering edge cases such as timezone handling or what happens if the new slot is taken.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two parameters, both documented in the schema (bookingId source, ISO 8601 format for newStartsAt). The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Move a booking to a new start time'), which cleanly separates it from siblings like book_time, cancel_booking, and delete_booking. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the prerequisite alternative ('Use find_available_times first to pick a free slot') and adds a human-in-the-loop condition ('confirm with the user first' because the booker is notified). This is when-to-use plus a named sibling, not inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_bookingsSearch bookingsARead-only
Search bookings in a time range, optionally by status, booking page, or text (booker name/email in the form, title, or booking ref). Returns counts by status and page plus a compact list with booker name and email. Set raw=true for YCBM's full objects.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End of the range, ISO 8601, e.g. 2026-10-12T09:00:00Z | |
| raw | No | ||
| from | Yes | Start of the range (bookings starting at or after this), ISO 8601, e.g. 2026-10-12T09:00:00Z | |
| pageSize | No | 10-500 (default 50) | |
| searchIn | No | Where to look for searchText (default: form, title, ref) | |
| statuses | No | Only these statuses | |
| direction | No | ||
| searchText | No | Text to search for (3+ chars), e.g. an email or surname | |
| fromBookingId | No | Continue after this booking ID (pagination) | |
| bookingPageIds | No | Only these booking page IDs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful behavior beyond that: it discloses the return shape (counts by status and page plus a compact list with booker name and email) and the effect of raw=true, which is valuable given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, no filler. The scope (time range) and filters come first, followed by return shape and the raw toggle, so the highest-value information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter read tool with no output schema, the description covers the essential call semantics and return shape. Pagination controls (direction, fromBookingId, pageSize) are left to the schema, which is acceptable since they are documented there, but the description could note continuation behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so most parameters are documented. The description goes beyond by explaining what searchText actually matches against (booker name/email, title, booking ref) and what raw=true does, which compensates for the undocumented raw flag in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) plus resource (bookings) and enumerates the filter dimensions: time range, status, booking page, and text. An agent can distinguish it from get_booking or list_upcoming_bookings by the presence of multi-filter search, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through 'optionally by status, booking page, or text' and the required time range, but it never states when to prefer this over list_upcoming_bookings or get_booking, nor any exclusions or prerequisites. Usage is inferable rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.0- First observed
book_time - First observed
booking_report - First observed
cancel_booking - First observed
delete_booking - First observed
find_available_times - First observed
get_booking - First observed
get_booking_page - First observed
list_booking_pages - First observed
list_upcoming_bookings - First observed
reschedule_booking - First observed
search_bookings
TDQS
Scored across 11 tools
Most tools target clearly distinct operations (get_booking vs get_booking_page, cancel_booking vs delete_booking, find_available_times vs book_time). The main overlap is between search_bookings, list_upcoming_bookings, and booking_report, all of which return booking information, but their descriptions clarify different use cases well enough.
The set is mostly consistent snake_case with a verb_noun pattern (get_booking, cancel_booking, list_booking_pages, find_available_times). Minor deviations like booking_report (noun_noun) and book_time (verb_noun but less explicit) are readable but slightly break the pattern.
Eleven tools is well-scoped for a booking management server. Each tool covers a distinct part of the booking workflow—discovery, availability, booking, modification, cancellation, deletion, and reporting—without obvious redundancy.
The server covers the full booking lifecycle for existing pages: list/get pages, search/get bookings, check availability, book, reschedule, cancel, delete, and report. It lacks booking page creation/update settings and possibly booking note/comment operations, but core agent workflows are well supported.
Maintenance
Related MCP Connectors
Manage YouCanBook.me bookings, booking pages, appointment types, team members and locations.
- FitnitoOAuthcom.fitnito
Schedule, members, and bookings in your AI tools
AI-native scheduling and booking: check availability, book meetings, share links.
Calendar API for AI agents: events, availability, Google/Microsoft setup, scheduling, and iCal.
Related MCP Servers
AlicenseAqualityCmaintenanceConnects AI assistants to Cal.com for managing bookings, event types, and availability through natural language.1250 npmMIT- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to book meetings, check availability, and manage Cal.com scheduling through natural conversation.MIT
- AlicenseNot gradedqualityDmaintenanceExposes Cal.com scheduling tools to AI agents via MCP, enabling listing event types, checking availability, and managing bookings (create, cancel, reschedule).570 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to schedule meetings via Astrocal's scheduling API, including checking availability, booking, canceling, rescheduling, and managing waitlists through natural conversation.58 npm1MIT