Skip to main content
Glama
satviksriv

bookings-mcp

by satviksriv

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_report grouped by staff and answers in two sentences.

Why it's built this way

Decision

Reason

Business rules live in src/domain.ts, not in the tool handlers

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 isError with a plain sentence

Claude reads "Marcus is already booked at that time. Call check_availability…" and recovers on its own

Tool annotations (readOnlyHint, destructiveHint)

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 console.log output is the most common way MCP servers break

Related MCP server: Travel Company MCP Server

Tools

Tool

Type

What it does

search_customers

read

Match on name, email or phone; shows last visit and upcoming bookings

get_customer

read

Profile, visit and spend totals, no-shows, 20 latest bookings

create_customer

write

Requires email or phone; blocks duplicate emails

list_services

read

Services with duration, price and qualified staff

check_availability

read

Open 15-minute start times per staff member, inside opening hours, never in the past

create_booking

write

Validates hours, staff skills and conflicts; auto-assigns a free stylist if none is named

cancel_booking

destructive

Future confirmed bookings only, reason required

list_bookings

read

Schedule for a date range, filterable by staff and status

revenue_report

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 protocol

The 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 inspect

Project 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 suites

Adapting 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 tools
cancel_bookingCancel bookingA
DestructiveIdempotent

Cancel a future confirmed booking. A reason is required and stored. Confirm with the user before calling.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYes
booking_idYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 availabilityA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDate as YYYY-MM-DD
staff_idNoOnly this staff member
service_idYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
startYesBusiness local time as YYYY-MM-DDTHH:MM
staff_idNo
service_idYes
customer_idYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
emailNo
notesNoPreferences, allergies to products, etc.
phoneNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 profileA
Read-only

Full profile for one customer: contact details, notes, visit and spend totals, no-shows, and the 20 most recent bookings.

ParametersJSON Schema
NameRequiredDescriptionDefault
customer_idYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 bookingsA
Read-only

Bookings between two dates (inclusive), with customer, phone, service, staff and status. Use for day schedules and follow-up lists. Max 500 rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesDate as YYYY-MM-DD
fromYesDate as YYYY-MM-DD
statusNo
staff_idNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 servicesA
Read-only

All bookable services with id, duration in minutes, price in USD, and which staff perform them.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 reportA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesDate as YYYY-MM-DD
fromYesDate as YYYY-MM-DD
group_byNoservice

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 customersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYesName, email or phone fragment

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 9 tool updatesv1.0.0
    • First observedcancel_booking
    • First observedcheck_availability
    • First observedcreate_booking
    • First observedcreate_customer
    • First observedget_customer
    • First observedlist_bookings
    • First observedlist_services
    • First observedrevenue_report
    • First observedsearch_customers

TDQS

A4.1/5.0

Scored across 9 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides 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