bookings-mcp
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., "@bookings-mcpBook Ava Patel for a haircut tomorrow afternoon with Priya."
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.
bookings-mcp
An MCP server that lets Claude run the front desk of a service business: it finds customers, checks real availability, books and cancels appointments without double-booking, and answers revenue questions from the actual data.
It ships with a demo dataset for Maple Street Studio, a fictional three-stylist salon (40 customers, six services, 60 days of history and two weeks of upcoming bookings), plus a Claude skill that tells Claude how to use the tools the way a good receptionist would.
"Book Ava Patel for a haircut tomorrow afternoon with Priya." Claude searches the customer, checks Priya's open slots, offers three times, confirms, and books.
"How did we do in August, and who had the most no-shows?" Claude runs
revenue_reportgrouped by staff and answers in two sentences.
Why it's built this way
Decision | Reason |
Business rules live in | Rules are unit-tested without the protocol, and the same logic could back a web app or n8n workflow |
Bookings run in a transaction with an overlap check | Two requests for the same slot cannot both succeed |
Rule violations return | Claude reads "Marcus is already booked at that time. Call check_availability…" and recovers on its own |
Tool annotations ( | Clients can auto-approve reads and ask before cancellations |
No reschedule tool | The skill books the new slot before cancelling the old one, so a failure never leaves the customer with nothing |
Node's built-in SQLite | No native build step, so it installs the same way on Windows, macOS and Linux |
stdout reserved for protocol, logs to stderr | Stray |
Related MCP server: Travel Company MCP Server
Tools
Tool | Type | What it does |
| read | Match on name, email or phone; shows last visit and upcoming bookings |
| read | Profile, visit and spend totals, no-shows, 20 latest bookings |
| write | Requires email or phone; blocks duplicate emails |
| read | Services with duration, price and qualified staff |
| read | Open 15-minute start times per staff member, inside opening hours, never in the past |
| write | Validates hours, staff skills and conflicts; auto-assigns a free stylist if none is named |
| destructive | Future confirmed bookings only, reason required |
| read | Schedule for a date range, filterable by staff and status |
| read | Revenue, average ticket, no-show rate and cancellations by service, staff or day |
It also provides a daily_briefing prompt for a morning summary.
Quick start
Requires Node.js 22.13 or later.
npm install
npm run build
npm test # 31 tests: business rules + end-to-end over the MCP protocolThe first run creates data/bookings.db and fills it with demo data. Set BOOKINGS_SEED_DEMO=false to start empty, or BOOKINGS_DB_PATH to use another file.
Claude Desktop
Add to claude_desktop_config.json (Windows: %APPDATA%\Claude\, macOS: ~/Library/Application Support/Claude/), using the absolute path to this folder:
{
"mcpServers": {
"bookings": {
"command": "node",
"args": ["C:\\path\\to\\bookings-mcp\\dist\\index.js"],
"env": { "BOOKINGS_DB_PATH": "C:\\path\\to\\bookings-mcp\\data\\bookings.db" }
}
}
}Restart Claude Desktop, then add the skill: zip skills/front-desk and upload it under Customize → Skills.
Claude Code
claude mcp add bookings -- node /absolute/path/to/bookings-mcp/dist/index.js
mkdir -p .claude/skills && cp -r skills/front-desk .claude/skills/Inspect the tools without Claude
npm run inspectProject layout
src/
domain.ts business rules: availability, booking, cancellation, reports
server.ts MCP tool and prompt definitions (thin wrappers over domain.ts)
db.ts schema and transaction helper
seed.ts deterministic demo data
time.ts local-time helpers
index.ts stdio entry point
skills/front-desk/SKILL.md how Claude should use the tools
test/ vitest suitesAdapting it to a real business
Swap src/db.ts and the queries in src/domain.ts for the client's system (Google Calendar, Square, Fresha, a Postgres database or a REST API). The tool names, schemas, error messages and skill stay the same, so Claude's behaviour carries over unchanged. Opening hours live in OPENING_HOURS in src/domain.ts.
License
MIT
Available Tools
9 toolscancel_bookingCancel bookingADestructiveIdempotent
Cancel a future confirmed booking. A reason is required and stored. Confirm with the user before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | ||
| booking_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and idempotent behavior. The description adds that a reason is required and stored, and that user confirmation is needed before calling. This provides behavioral context beyond the annotations without contradicting them. It does not detail the full side effects (e.g., status change), but the added info is valuable.
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?
The description is three short sentences with no fluff. The core action is front-loaded, followed by the reason requirement and the user-confirmation instruction. 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 simple destructive action with two parameters and no output schema, the description covers the essential aspects: what it does, the requirement of a reason, and the need for user confirmation. It does not mention error handling or post-cancellation effects, but these are not critical for correct invocation. Overall, it is sufficiently complete.
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 0%, so the description must compensate. It explains that 'reason' is required and stored, giving semantic meaning to that parameter. However, it does not explain 'booking_id' beyond the obvious implication from the action. It partially compensates but leaves booking_id to inference.
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 clearly states the action (cancel) and the resource (booking), and adds the qualifier 'future confirmed' which distinguishes it from canceling past or unconfirmed bookings. It is specific and unambiguous, though it does not explicitly name alternative tools.
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 provides clear context: cancel a future confirmed booking, and explicitly instructs to confirm with the user before calling. It implies when to use (for confirmed future bookings) but does not explicitly mention when not to use or alternatives. The 'future confirmed' constraint gives practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_availabilityCheck availabilityARead-only
Open start times for a service on a date, per qualified staff member, in 15-minute steps within opening hours. Past times are excluded. Returns closed=true on days the business is shut.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date as YYYY-MM-DD | |
| staff_id | No | Only this staff member | |
| service_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=false. The description adds meaningful behavior beyond this: 15-minute increments, opening-hours constraint, exclusion of past times, and the closed=true return flag. This is strong additional transparency, though it does not cover every edge case like no-qualified-staff behavior.
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?
The description is two sentences, front-loaded with the core purpose, and contains no filler or redundant restatement of the tool name. Every clause adds useful detail.
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 availability tool with no output schema, the description explains the essential return semantics: open start times, interval granularity, business-hours scoping, past-time exclusion, and the closed flag. It does not describe the full response shape or grouping, but it gives an agent enough to invoke and interpret the result reasonably.
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 67%, with service_id lacking a description. The description helps by referring to 'a service' and 'per qualified staff member', which clarifies service_id and the intended role of staff_id. But it does not fully specify optional staff_id behavior or the exact meaning of all parameters, so the schema still carries much of the load.
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 clearly states a specific verb and resource: 'Open start times for a service on a date, per qualified staff member, in 15-minute steps within opening hours.' It also adds distinguishing details (past times excluded, closed=true on shut days) and is readily distinguishable from siblings like create_booking or list_services.
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 provides clear context for when the tool is appropriate—checking open start times for a specific service, date, and optional staff member. However, it does not explicitly name alternatives or state when not to use it, such as 'use list_bookings to see existing appointments'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_bookingCreate bookingA
Book a customer for a service. If staff_id is omitted, the first qualified free staff member is assigned. Rejects past times, closed days, times outside opening hours and double-bookings. Confirm the details with the user before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| start | Yes | Business local time as YYYY-MM-DDTHH:MM | |
| staff_id | No | ||
| service_id | Yes | ||
| customer_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnly=false, openWorld=false, idempotent=false, and destructive=false, so the description carries the behavioral burden. It does so well by disclosing auto-assignment of staff when staff_id is omitted and enumerating validation rejections: past times, closed days, outside opening hours, and double-bookings. It does not detail the response shape, but that is less critical here.
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 tightly scoped sentences with no filler. The primary action is first, staff-assignment behavior follows, validation rules are compactly listed, and the user-confirmation requirement closes the description efficiently.
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 straightforward create operation with no output schema, the description covers the essential call context: what the tool does, how optional staff selection works, what input times are rejected, and the required user confirmation. It is slightly light on explaining any output or error behavior, but that is not necessary given the tool's simplicity.
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 low (only start has a description), so the description must compensate. It adds meaning for staff_id (auto-assignment if omitted), start (validation constraints), and implicitly maps customer_id/service_id via 'book a customer for a service.' This gives useful semantic grounding beyond the bare integer schemas.
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 states a specific verb-resource pair ('Book a customer for a service') that clearly identifies this as the creation action among siblings like cancel_booking and list_bookings. The additional staff-assignment detail further distinguishes its behavior from a simple scheduling call.
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 gives clear context for use ('Book a customer for a service') and adds a critical precondition: confirm details with the user before calling. It does not explicitly mention alternatives, but no sibling provides equivalent booking creation, so the usage context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_customerCreate customerA
Add a new customer. Requires a name and at least an email or phone. Fails if the email already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| No | |||
| notes | No | Preferences, allergies to products, etc. | |
| phone | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false (readOnlyHint, openWorldHint, idempotentHint, destructiveHint), so the description carries the burden of disclosing behavior. It adds valuable detail: the tool validates that a name is present and that at least one of email/phone is given, and it fails on duplicate emails. This goes beyond the schema and gives the agent a clear model of what happens. It doesn't mention the return value or side effects, but for a create operation this is a reasonable disclosure level.
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?
The description is three short sentences with no filler. The purpose is front-loaded ('Add a new customer'), followed by essential constraints. Every sentence earns its place, and the structure is easy to scan.
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 tool with four flat parameters, no output schema, and no nested objects, the description covers the key functional requirements and failure modes. It omits the return value (e.g., the created customer object or ID), which could be inferred but isn't stated. Given the simplicity and sibling context, this is a minor gap, making the description nearly complete.
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 only 25% (only notes has a description), so the tool description must compensate. It does so by clarifying the relationship between parameters: 'Requires a name and at least an email or phone' adds a cross-field constraint not present in the schema (which only requires name). It also discloses email uniqueness. This adds meaningful semantic guidance beyond the raw properties, though it doesn't elaborate on phone format or notes usage.
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 begins with a clear, specific verb and resource: 'Add a new customer.' It immediately distinguishes this from sibling tools (search_customers, get_customer, create_booking) by the action and target. The additional constraints (name, email/phone) further clarify its scope without ambiguity.
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 provides practical usage context by stating the required inputs ('Requires a name and at least an email or phone') and a failure condition (duplicate email). While it doesn't explicitly name alternative tools for non-creation tasks, the sibling names (search_customers, get_customer) make it obvious when this tool is appropriate. This is clear enough for an agent to decide, though it lacks an explicit 'use X instead' note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_customerGet customer profileARead-only
Full profile for one customer: contact details, notes, visit and spend totals, no-shows, and the 20 most recent bookings.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds a specific behavioral limit: 'the 20 most recent bookings', which is not captured in annotations. It also clarifies the output scope by listing fields. This adds value beyond annotations, though it does not discuss error handling or authentication.
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?
The description is a single, front-loaded sentence that states the purpose and then lists the returned data. Every word is informative with no redundancy or 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 operation with one parameter and no output schema, the description covers the main aspects: what is returned and the booking limit. It does not describe the response structure, but the enumerated contents are sufficient for an agent to understand the output. The lack of pagination details is acceptable given the '20 most recent' limit.
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?
The schema defines customer_id as a required integer with constraints. The description does not discuss the parameter, but the parameter is self-explanatory from its name and the schema fully documents it. With only one parameter and complete schema coverage, the description does not need to elaborate, so a baseline of 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?
The description clearly states the verb 'get' and the resource 'customer profile', and enumerates the contents (contact details, notes, visit and spend totals, no-shows, and 20 most recent bookings). This distinguishes it from search_customers (which implies searching multiple) and create_customer (creation).
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 does not explicitly mention when to use this tool versus alternatives like search_customers. It simply states what it returns, leaving the usage context implied. There is no mention of prerequisites (e.g., needing a customer ID from a search) or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bookingsList bookingsARead-only
Bookings between two dates (inclusive), with customer, phone, service, staff and status. Use for day schedules and follow-up lists. Max 500 rows.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Date as YYYY-MM-DD | |
| from | Yes | Date as YYYY-MM-DD | |
| status | No | ||
| staff_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful behavior beyond that: the date range is inclusive and results are capped at 'Max 500 rows.' This gives agents important expectations about output limits not present in the annotations or 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?
Three short sentences, each earning its place: what is returned, when to use it, and the row cap. The core behavior is front-loaded and there is no filler or repetition of schema content.
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 listing tool with no output schema, the description adequately conveys the returned fields, date-range behavior, and row cap. It could mention ordering or pagination, but the information provided is sufficient for correct invocation in most cases.
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 50%, covering the two date parameters; the description adds inclusive-date semantics on top of that. However, status and staff_id are only hinted at through the response field list ('...and status') and are not explicitly explained as filter parameters, so the description only partially compensates for the schema gap.
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 uses a specific verb ('List') with a clear resource ('bookings') and a precise scope ('between two dates, inclusive'), plus the fields returned. This clearly differentiates it from sibling tools like create_booking, cancel_booking, and revenue_report without needing to open 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?
The description explicitly states a use case: 'Use for day schedules and follow-up lists.' It gives clear context for when to choose this tool, though it does not mention exclusions or name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_servicesList servicesARead-only
All bookable services with id, duration in minutes, price in USD, and which staff perform them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description aligns with them. It adds meaningful context beyond the annotations by specifying that the response includes id, duration in minutes, price in USD, and performing staff, and by qualifying the scope as 'bookable' services.
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?
The description is a single, front-loaded sentence with no filler. Every word contributes either the operation's scope or the content of the result.
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 explaining the return value, and it does list the key fields. It is sufficient for a simple parameterless listing tool, though it leaves minor details like response structure or staff representation unspecified.
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?
The tool has zero parameters, so the description needs no parameter-level explanation. The baseline of 4 applies; the description is entirely appropriate for a parameterless list operation.
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 clearly states a list/read operation over a specific resource (services) and enumerates the returned fields (id, duration, price, staff). This distinctively separates it from sibling tools that operate on customers, bookings, availability, or revenue.
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 context is implied by the resource itself: this is the obvious tool for retrieving the catalog of bookable services. However, there is no explicit statement of when to choose this tool over alternatives, nor any exclusions or conditions, though the disjoint sibling set makes confusion unlikely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revenue_reportRevenue reportARead-only
Revenue from completed bookings between two dates, grouped by service, staff or day, with totals, average ticket, no-show rate, cancellations, and the value of confirmed upcoming bookings in the range. Amounts in USD.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Date as YYYY-MM-DD | |
| from | Yes | Date as YYYY-MM-DD | |
| group_by | No | service |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, covering the read-only nature. The description adds useful scope details (completed vs. confirmed upcoming bookings) and currency (USD), but does not disclose potential limitations like pagination, timezone handling, or error behavior. Given the annotation coverage, this is adequate but not exceptional.
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?
The description is a single, compact sentence that packs in the core purpose, grouping options, and all included metrics without unnecessary fluff. It is front-loaded with the main purpose and efficiently conveys the report's scope. It could be slightly more structured, but it is appropriately concise.
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?
Given the lack of an output schema, the description carries the burden of explaining what the tool returns. It lists all key metrics and grouping options, providing a comprehensive picture of the report's content. It does not mention output format or potential edge cases, but for a read-only reporting tool this is a reasonably complete specification.
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?
The schema covers from/to with date format descriptions, but group_by has only an enum and no description. The description clarifies that grouping can be by service, staff, or day, directly mapping to the enum values. It also clarifies that the date range refers to booking dates, adding meaning beyond the raw schema. Since schema coverage is 67%, the description compensates well for the undocumented group_by parameter.
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 clearly identifies the tool as a revenue report for completed bookings, specifying the grouping options (service, staff, day) and the metrics returned (totals, average ticket, no-show rate, cancellations, confirmed upcoming value). It is distinct from sibling tools like list_bookings which focus on individual records, so an agent can easily differentiate.
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 its use for revenue aggregation and analysis, but it does not explicitly state when to choose this over alternatives such as list_bookings for raw data or search_customers for customer details. There is no explicit 'when not to use' guidance, leaving the agent to infer the appropriate context from the description and sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_customersSearch customersARead-only
Find customers by part of their name, email or phone. Returns id, contact details, last visit and number of upcoming bookings. Use this before creating a customer to avoid duplicates.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Name, email or phone fragment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful behavior context, such as partial matching and returned fields, but it doesn't describe ordering, pagination, or how the limit parameter affects results.
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?
The description is three short sentences with no filler. It front-loads the core search behavior, then states the output and the practical use case, making every sentence earn 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?
Given no output schema, the description usefully lists return fields and gives explicit workflow context. It covers the required query input and the duplicate-avoidance purpose, though it omits minor details like result ordering and whether results are paginated.
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?
The schema documents the query parameter's meaning and the limit's constraints, and the description reinforces that query is a name, email, or phone fragment. However, the description doesn't add semantic detail for the limit parameter beyond what the schema already provides.
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 uses a specific verb and resource: 'Find customers by part of their name, email or phone.' It clearly defines the search scope and lists the returned fields, making the tool's purpose distinct from siblings like get_customer.
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 explicitly advises using this tool before creating a customer to avoid duplicates, which is clear contextual guidance. It doesn't mention alternatives or when not to use it, but the primary workflow is well established.
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.
9 tool updates
v1.0.0- First observed
cancel_booking - First observed
check_availability - First observed
create_booking - First observed
create_customer - First observed
get_customer - First observed
list_bookings - First observed
list_services - First observed
revenue_report - First observed
search_customers
TDQS
Scored across 9 tools
Each tool targets a distinct resource and action: customer search/get/create, service listing, availability checks, booking create/cancel/list, and revenue reporting. The descriptions clearly separate the list and detail views, and list_bookings versus revenue_report are distinguished by granularity versus aggregation.
Most tools follow a clear verb_noun pattern such as search_customers, create_booking, and cancel_booking. The main inconsistency is revenue_report, which lacks an explicit verb, and there is minor singular/plural variation like get_customer versus search_customers.
Nine tools is well-scoped for a bookings domain, covering customers, services, availability, bookings, and reporting. Each tool has a clear purpose and none feel redundant or unnecessary.
The core booking workflow is covered: find/create customers, check availability, create/cancel bookings, and view schedules and revenue. Missing capabilities like rescheduling a booking or updating customer details are minor gaps that agents can work around, but they would require external handling.
Maintenance
Related MCP Connectors
Find real businesses and book appointments. Books via Cal.com; imports 12 platforms.
Agentic CRM for service businesses — bookings, customers, WhatsApp, loyalty, invoicing.
Scheduling, availability, clients, billing and CRM for appointment-based services.
- FitnitoOAuthcom.fitnito
Schedule, members, and bookings in your AI tools
Related MCP Servers
- FlicenseCqualityDmaintenanceConnects Claude AI to Google Sheets, Gmail, and Calendar for comprehensive revenue tracking and business management. Enables lead pipeline management, email handling, calendar scheduling, task tracking, and file operations through natural language.29-
- FlicenseNot gradedqualityDmaintenanceEnables Claude to access and manage a travel company's customer data, trip history, and information requests. Supports searching customers, querying trips by destination or date, and tracking customer inquiries through natural language.1-
- FlicenseAqualityFmaintenanceConnects Claude to Jobber to manage clients, jobs, invoices, quotes, and scheduling through natural language.10-
- AlicenseNot gradedqualityCmaintenanceProvides structured, read-mostly access to small-business back-office data including customers, invoices, and account notes, allowing Claude to query overdue invoices, revenue summaries, and more.MIT