Skip to main content
Glama

Server Details

MCP layer for local businesses: discover, query, book, and transact with verified SMB AI agents.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 41 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cameronjmcewan-dev/advocatemcp
GitHub Stars
1

TDQS

A4.1/5.0

Scored across 18 tools

Disambiguation5/5

Every tool targets a distinct action: searching, listing, quoting, reserving, confirming, canceling, payment, handoffs, and business info. Even overlapping steps like request_service and submit_quote_request are clearly separated by stage (open form vs. submit after consent), making misselection unlikely.

Naming Consistency5/5

All 18 tools follow a consistent verb_noun pattern (e.g., search_businesses, list_services, reserve_slot, confirm_booking, initiate_handoff). There are no mixed conventions or vague verbs like 'process' or 'do_thing'.

Tool Count4/5

18 tools is just above the typical 3-15 sweet spot, but each tool serves a clear, non-redundant purpose in the booking and advocacy workflow. The count feels slightly heavy but is justified by the breadth of the domain (search, quotes, booking, payments, handoffs, subscriptions).

Completeness4/5

The tool set covers the core lifecycle: discover businesses, check availability, reserve, confirm, pay, cancel, and get policies. It also includes quote requests, handoffs, and updates. Minor gaps exist (e.g., no explicit reschedule or booking listing), but agents can work around these with existing tools.

Available Tools

18 tools
cancel_bookingCancel Paid BookingA
DestructiveIdempotent
Inspect

Cancels a paid, confirmed booking using the cancel_token from its payment receipt. Within 60 minutes of paying, or before the business's refund window, the full refund is requested; report it as full only after the payment ledger confirms it. After that window the deposit is forfeited under the booking's policy. A pending refund means cancellation is complete while refund verification or retry continues. Only the agent that paid holds the token. Cancelling twice answers already_cancelled.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier
cancel_tokenYesThe cancel_token from the payment receipt
reservation_idYesThe paid reservation's id

Output Schema

ParametersJSON Schema
NameRequiredDescription
refundYesfull: the payment ledger confirms the refund; none: deposit was forfeited; pending: cancellation is complete and refund verification or retry is pending
statusYes
currencyYes
pending_centsYes
refunded_centsYes
reservation_idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true. The description adds valuable context beyond these: the refund window logic, the distinction between full refund and forfeited deposit, the meaning of 'pending refund', and the already_cancelled response for duplicate calls. It doesn't contradict the annotations. The only minor gap is that it doesn't explicitly state what happens to the booking record itself (e.g., whether it's deleted or marked cancelled), but the destructiveHint and the refund discussion cover the key behavioral traits.

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 dense paragraph that front-loads the core action and token requirement, then explains refund behavior and edge cases. Every sentence adds meaningful information. It's slightly long but justified given the complexity of refund logic. The structure is logical: action → refund timing → pending state → token ownership → duplicate behavior.

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?

The description covers the essential behavioral context: what constitutes a full refund, when deposit is forfeited, what pending refund means, token ownership, and duplicate handling. The output schema exists, so return values don't need to be described. The only minor gap is that it doesn't explicitly mention prerequisites like having a payment receipt or the business's refund policy details, but the description references the policy and the token requirement sufficiently.

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 100%, so the schema already documents all three parameters (slug, reservation_id, cancel_token). The description adds the crucial semantic link that cancel_token comes from the payment receipt and that reservation_id is for the paid reservation, but it doesn't go beyond what the schema already states. Baseline 3 is appropriate since the schema does the heavy lifting.

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 ('Cancels'), a specific resource ('a paid, confirmed booking'), and the key mechanism ('using the cancel_token from its payment receipt'). It clearly distinguishes this from siblings like confirm_booking and create_booking_payment_link by focusing on the cancellation action and its token requirement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit context for when to use the tool: for paid, confirmed bookings with a cancel_token. It also gives clear behavioral guidance on refund timing ('Within 60 minutes of paying, or before the business's refund window'), how to report refund status ('report it as full only after the payment ledger confirms it'), and what to do about pending refunds. It even addresses the edge case of double cancellation ('Cancelling twice answers already_cancelled'). This is strong usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

confirm_bookingConfirm BookingA
Destructive
Inspect

Confirm a reservation made with reserve_slot. Present the returned stored booking_details to the customer and relay only the customer-supplied 6-digit code received at their email or phone; never generate, guess, or fetch it. For an active configured calendar, a verified code attempts a direct commit to the selected calendar with no owner approval. booking_pending means the provider outcome is uncertain; repeat confirm_booking later to check the stored outcome, but it never retries a provider write automatically. A paid booking (reserve_slot returned payment.required = true) has no code: this answers payment_required — pay it with create_booking_payment_link — or payment_in_flight while its payment is settling.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe customer-supplied 6-digit confirmation code received at their own email or SMS contact. Relay only that supplied code; never generate, guess, or fetch it.
slugYesBusiness slug identifier
reservation_idYesThe reservation id returned by reserve_slot

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes'confirmed': a booking was committed to the selected configured calendar, or a historical legacy reservation was confirmed. 'booking_pending': the provider outcome is unresolved; do not create another booking or seek owner approval — repeat confirm_booking later to read the stored outcome. 'pending_merchant': a historical merchant-review reservation awaits a business decision — see message. 'already_confirmed': this reservation was confirmed earlier (safe replay).
messageNoOptional customer-facing status detail to relay
reservation_idYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal a non-read, destructive operation, but the description adds valuable behavioral context beyond them: a verified code attempts a direct calendar commit with no owner approval, booking_pending means the provider outcome is uncertain with no automatic provider retry, and paid bookings have no code. This meaningfully explains side effects and state transitions beyond the structured hints.

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 dense but every sentence earns its place: it states the core action first, then covers the code rule, commit behavior, pending outcome, and the paid-booking exception. There is no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating, stateful confirmation tool, the description covers the main success path, the uncertain provider outcome, the no-retry behavior, and the paid-booking branch. An output schema exists, so return-value details do not need to be in the description, and schema validation covers the code format. Nothing essential for selecting and invoking this tool correctly is missing.

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 100%, so the baseline is 3. The description adds extra value by explaining the lifecycle of the code parameter: it must be customer-supplied, never generated or fetched, and is absent for paid bookings. This goes beyond the schema's own documentation, though slug and reservation_id semantics remain mostly schema-dependent.

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 and resource ('Confirm a reservation made with reserve_slot') and clearly distinguishes this from related payment and booking tools. It also names the alternative for paid bookings, so an agent can tell it apart from create_booking_payment_link and reserve_slot without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance and exclusions: use it when a reservation exists and a customer supplies the code; for paid bookings with payment.required=true, route to create_booking_payment_link; for payment_in_flight, wait; for booking_pending, repeat confirm_booking later. These conditions and alternatives are stated directly rather than left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_availabilityGet Business AvailabilityA
Read-onlyIdempotent
Inspect

Return available windows from the business's active configured calendar, using its selected timezone, duration, operating hours, and current local or connected-calendar occupancy. Use a returned window to start a booking. Availability can change before confirmation, including when the calendar provider is unavailable. If this business uses an unsupported calendar or booking provider, call get_booking_destination to find its published public booking route.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier
window_endNoUnix seconds (absolute instant; default now + 7 days). See window_start on reading the response's `timezone`.
window_startNoUnix seconds (absolute instant; default now). The business's own timezone is not an input — it is returned as `timezone` in the response. To target a local phrase like "Tuesday afternoon", request a generously wide window and filter the returned slots using that `timezone`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
slotsYes
sourceYes
timezoneYes
generated_atYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds valuable behavioral context beyond these: it explains that availability is computed using the business's timezone, duration, operating hours, and occupancy, and it discloses that results can change before confirmation, including when the calendar provider is unavailable. This reinforces the openWorldHint and provides operational insight without contradicting annotations.

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 sentences with no filler. The first sentence delivers the core functionality, the second gives a direct usage instruction, and the third adds a critical caveat and an alternative route. It is front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with a full output schema, the description covers the key context: what it does, how results are computed, that they can change, and what to do for unsupported providers. Nothing essential for an agent to correctly invoke this tool is missing.

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 input schema descriptions cover all three parameters with 100% coverage, explaining window_start and window_end defaults and the timezone handling. The description does not add any additional parameter-specific meaning beyond what the schema provides, so it stays at the baseline for full schema coverage.

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 the exact purpose: 'Return available windows from the business's active configured calendar' – a specific verb, resource, and scope. It clearly differentiates from siblings by mentioning get_booking_destination as an alternative for unsupported providers, and it implies that this tool is for retrieving availability, not for booking directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use this tool ('Use a returned window to start a booking') and provides an alternative condition: 'If this business uses an unsupported calendar or booking provider, call get_booking_destination'. This gives clear routing guidance and covers the primary use case and exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_booking_destinationGet Booking DestinationA
Read-onlyIdempotent
Inspect

Returns the public booking route for a business. Use this before helping a user book an appointment: it distinguishes an external provider page from an active configured calendar that uses the Advocate booking flow, and from businesses with no supported booking destination. External pages are links only; Advocate does not sync their availability or make bookings there.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
kindYes
modeYes
slugYes
providerYes
eligibilityYes
guidance_for_agentYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavior beyond annotations: external provider pages are links only, and Advocate does not sync their availability or make bookings there. This is important, non-obvious behavioral context that helps an agent interpret results safely. It is consistent with the readOnlyHint and idempotentHint annotations.

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 sentences, all purposeful: the core function, the usage context, and the critical behavioral caveat. The information is front-loaded and no words are wasted. This is an ideal length for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the single parameter, rich annotations, and the presence of an output schema, the description covers everything needed to use the tool correctly. It explains the edge case of external provider pages and clarifies the limitations around availability syncing and booking, so an agent can act appropriately on the result.

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 already fully describes the single parameter 'slug' with 100% coverage, so the description does not need to add parameter details. The description's business-level context indirectly reinforces the parameter's meaning but adds no new semantic detail beyond the schema.

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 opens with a specific verb and resource: 'Returns the public booking route for a business.' It also clarifies what the tool distinguishes among external provider pages, active configured calendars using the Advocate booking flow, and businesses without a supported booking destination. This clearly separates it from sibling tools like get_availability or get_payment_handoff_url.

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 says 'Use this before helping a user book an appointment,' giving a precise when-to-use context. It does not name alternative tools or say when not to use it, but the context makes the intended placement in the workflow clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cancellation_policyGet Cancellation PolicyA
Read-onlyIdempotent
Inspect

Returns the business's cancellation policy text. Use this when a user asks about cancellation terms, fees, or no-show policies. The response includes agent guidance on how to frame the policy with appropriate freshness caveats.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier

Output Schema

ParametersJSON Schema
NameRequiredDescription
slugYes
has_policyYes
policy_textYes
guidance_for_agentYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, idempotentHint=true, destructiveHint=false. Description adds that response includes agent guidance and freshness caveats, which is useful context beyond the annotations.

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?

Two concise sentences with no waste. First sentence states purpose, second provides usage guidance and response details. Front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple tool structure (1 param, read-only, idempotent, with output schema), the description fully covers purpose, usage, and response content. No gaps.

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 has 100% coverage for the single parameter 'slug' with its description. Description does not add additional meaning to the parameter beyond what schema already provides, so baseline score of 3 applies.

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?

Description clearly states verb 'Returns' and resource 'cancellation policy text'. Distinguishes from siblings like get_availability or get_credentials by specifying exactly what business policy is returned.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this when a user asks about cancellation terms, fees, or no-show policies' and mentions that response includes agent guidance on framing with freshness caveats.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_credentialsGet Business CredentialsA
Read-onlyIdempotent
Inspect

Returns the business's self-reported licenses, insurance, bonding, and certifications. Use this for trust-sensitive verticals (contractors, healthcare, legal, locksmiths) when a user asks 'are they licensed?' or 'are they insured?'. The response carries explicit 'self-reported' framing so agents don't upgrade tenant claims to verified facts.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier

Output Schema

ParametersJSON Schema
NameRequiredDescription
slugYes
bondedYes
insuredYes
summaryYes
licensesYes
certificationsYes
has_credentialsYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds critical context: the response is 'self-reported' and agents should not upgrade claims to verified facts, which is valuable beyond the annotations.

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?

Two concise sentences: first states purpose, second provides usage guidelines and key behavioral note. No filler or redundancy; every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, output schema present, read-only), the description covers purpose, usage context, and critical behavioral nuance completely. No gaps remain.

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 coverage is 100% with a description for the only parameter (slug). The description does not add additional parameter semantics beyond what the schema provides, so baseline 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 tool returns business credentials (licenses, insurance, etc.) and uses specific verbs. It is easily distinguishable from sibling tools like get_availability or get_cancellation_policy which cover different aspects.

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?

Explicitly recommends use for trust-sensitive verticals and gives example user queries ('are they licensed?'). While it lacks explicit 'do not use' statements, the guidance is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_payment_handoff_urlGet Payment Handoff URLA
Idempotent
Inspect

Returns a plain-text summary of a priced offer (service, amount, currency, cancellation policy, and how long the price is valid) plus a URL on our domain that shows the same summary. The URL is for the CUSTOMER to open themselves in their own browser — do not open, fetch, or follow it yourself. Use this once get_quote or a booking flow has produced an offer_id and the user is ready to review or continue with a priced offer. If the booking's deposit was already paid through create_booking_payment_link, this answers deposit_taken: do not send the person to pay again; the balance is due at the visit.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier
offer_idYesThe offer id returned by get_quote

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
stateYes
summaryYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the idempotent and non-destructive annotations, the description discloses the key behavioral constraint: the URL must be handed to the customer and not followed by the agent. It also adds the deposit_taken context and clarifies the next step, adding real behavioral value.

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 dense but every sentence earns its place: output first, then the critical warning, then usage preconditions, then the deposit caveat. It is well-structured and front-loaded with the most important information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With two fully described parameters, an output schema, and clear annotations, the description covers the output contents, customer context, usage conditions, and the relevant sibling tool. An agent has everything needed to invoke this tool correctly.

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 already fully documents both parameters with descriptions, so the baseline is high. The description adds useful context by explaining that offer_id comes from get_quote or a booking flow and that the result interacts with deposit status, helping the agent pick the correct value.

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 precisely what the tool returns: a plain-text summary of a priced offer plus a customer-facing URL, and it enumerates the summary fields. It clearly distinguishes itself from sibling tools by emphasizing the URL is for the customer to open, not for the agent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides an explicit precondition ('once get_quote or a booking flow has produced an offer_id'), a readiness condition, and an exclusion for already-paid deposits via create_booking_payment_link. It also gives the critical do-not-open/fetch/follow instruction, which is essential operational guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_quoteGet Price QuoteA
Idempotent
Inspect

Return a price quote for a service at a business. Exact configured prices may create a time-limited offer; unmatched requests use a third-party AI estimate that is not firm merchant pricing and must be confirmed with the business. Use this when a user asks 'how much does X cost?' or 'what's the price for Y?'.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier
paramsNoOptional service parameters (e.g., {size:'large'})
serviceYesRequested service name to quote

Output Schema

ParametersJSON Schema
NameRequiredDescription
offerYesServer-minted immutable price offer — only exact configured prices mint one; estimates and ranges never do.
quoteYes
reasonNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the annotations by disclosing that exact configured prices may create a time-limited offer, and that unmatched requests use a third-party AI estimate that is not firm merchant pricing and must be confirmed. This is valuable behavioral context beyond readOnlyHint and idempotentHint.

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 sentences with no filler. It front-loads the core purpose, then adds the critical caveat about pricing behavior, and finally gives a practical usage trigger. Every sentence contributes meaningful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description, combined with the rich schema, output schema presence, and annotations, provides enough context for an agent to call the tool correctly. It explains what the tool does, when to use it, and the important caveat that some quotes are non-binding estimates.

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 input schema already has 100% description coverage for slug, service, and params, so the description does not need to repeat parameter details. The description adds no additional parameter-level meaning beyond the schema, placing it at the baseline for well-covered schemas.

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 that the tool returns a price quote for a service at a business, using a specific verb and resource. It does not explicitly distinguish itself from sibling tools like submit_quote_request or list_services, so it stops short of full differentiation.

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 explicit usage guidance: 'Use this when a user asks how much does X cost?' This gives clear context for when the tool is appropriate. However, it does not mention when not to use it or point to alternatives, so it earns a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

initiate_handoffInitiate HandoffA
DestructiveIdempotent
Inspect

Begin a handoff from the agent to either a human operator (SMS/email via lead_routing_json) or another agent (signed continuation URL). In human mode the notification body is composed by the server from the contact and reason fields — callers supply those fields, not the message text. Idempotent: re-using the same idempotency_key returns the original handoff.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesHandoff mode: human (SMS/email) or agent (continuation URL)
slugYesBusiness slug identifier
reasonNoWhy the user wants to reach a human
messageNoDeprecated alias for `reason`. The notification body is composed by the server from the fields above; this value is delivered as the reason line, not as the message itself. Supplying both is an error.
purposeNoPurpose description for agent-mode continuation
urgencyNoHow time-sensitive (default: normal)
agent_idNoOptional agent identifier
contact_nameNoEnd-user's name
contact_emailNoEnd-user's email
contact_phoneNoEnd-user's phone
reservation_idNoOptional link to a prior reservation
idempotency_keyYesUnique key for idempotent handoff

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYesThe handoff's mode, and which of the fields below are present. Normally the mode you asked for — but an idempotent replay returns the STORED handoff's mode, which differs when an idempotency_key is reused with a different mode than the call that created it.
reasonNohuman mode, not delivered: 'form_routing_configured', 'no_recipient_configured', 'sms_consent_missing', a shape-mismatch skip, a spend-cap denial, or a provider failure code
statusNohuman mode replay while the original send is still in flight: 'pending'
channelNohuman mode, skipped before sending: the channel that would have been used ('sms' or 'email'), or 'form' when the business only takes leads through a web form
form_urlNohuman mode, channel 'form': the business's own contact form for the user to complete
deliveredNohuman mode: present only as false, when nothing was sent — see reason
ticket_idNohuman mode, delivered: the provider's message id, or the handoff_id when the provider issues none
expires_atNoagent mode: Unix seconds when continuation_url stops working (one hour)
handoff_idYes
delivered_viaNohuman mode: 'sms' or 'email' — the channel the notification went to
handshake_tokenNoagent mode: the bare token carried inside continuation_url
continuation_urlNoagent mode: signed URL the next agent redeems exactly once at /a2a/continue
idempotent_replayNoPresent and true when this idempotency_key already had a handoff; nothing was re-sent and no token was re-minted
continuation_expiredNoagent mode replay: true when the stored continuation has already expired; it is never re-minted — start a new handoff

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds useful nuance beyond the annotations, especially the idempotent key behavior and the server-side composition of notification bodies. However, the annotations mark destructiveHint true and the description does not disclose any destructive or irreversible effects, leaving part of the behavior unexplained.

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 compact and front-loaded with the core purpose, then adds only the two most decision-relevant clarifications: mode behavior and idempotency. No sentence is wasted.

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 an output schema, annotations, and 100% schema description coverage, the description fills the remaining gaps around mode semantics and idempotent behavior. It does not detail destructive aspects, but for the tool's complexity it is sufficiently 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?

The schema already covers all 12 parameters, but the description adds significant meaning: callers supply contact and reason fields in human mode, message is a deprecated alias, and idempotency prevents duplicates. This helps the agent choose and populate parameters correctly beyond the raw schema.

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 tool begins a handoff and gives the two concrete modes (human operator vs. another agent), making the verb, resource, and scope unambiguous. It also distinguishes its function from the sibling tools without requiring schema inspection.

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 explains when this tool is relevant, including the two distinct handoff targets and how human notifications are composed server-side. It does not explicitly name alternative tools or spell out exclusion caveats, but the context is clear enough for a selecting agent.

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-onlyIdempotent
Inspect

Lists the services a business has configured, with their prices and the exact arguments to quote each one. Call this BEFORE get_quote: the service name must match a configured service, and only a service marked payable returns an exact price with the offer_id that get_payment_handoff_url requires. Quoting a name that is not on this list silently falls back to an estimate with no offer.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier

Output Schema

ParametersJSON Schema
NameRequiredDescription
slugYes
servicesYes
guidance_for_agentYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: the silent fallback to an estimate with no offer when a name is not on the list, and the condition that only payable services return an exact price with offer_id. This goes beyond the annotations and helps the agent anticipate failure modes.

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 compact and front-loaded: it states the core purpose in the first sentence, then immediately provides the critical usage ordering and fallback warning. Every sentence earns its place, and there is no redundant repetition of schema or annotation information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has a single parameter, a rich output schema, and annotations covering safety, the description is complete. It explains the prerequisite relationship with get_quote, the payable-service condition, and the failure mode for unlisted names. An agent has everything needed to call this tool correctly and interpret its role in the workflow.

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 100%, so the schema already documents the slug parameter. The description does not add extra meaning about the parameter beyond what the schema provides, but it does imply the slug identifies the business whose services are listed. Baseline 3 is appropriate because the schema carries the parameter documentation burden.

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 tool lists configured services with prices and quoting arguments, and explicitly distinguishes it from get_quote. It names the specific resource (services) and the action (list), making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to call this BEFORE get_quote, explains the dependency (service name must match a configured service), and warns about the fallback behavior when quoting an unlisted name. This is strong when-to-use guidance with clear alternatives and sequencing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_business_agentQuery Business AgentAInspect

Ask a registered business's AI advocate a question and get a citation-ready answer plus a referral link. The question and the business's public profile are processed by an AI provider, and the question and answer are recorded to operate the service. Do not enter sensitive personal, medical, payment, or authentication information. Use this for questions about one business's services, hours, policies, or fit.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier
queryYesThe visitor's question about this business
stageNoOptional buyer stage: browsing | comparing | committing
agent_idNoOptional self-asserted calling-agent id — used for logging/tuning only, never auth

Output Schema

ParametersJSON Schema
NameRequiredDescription
answerYesPlain-text answer grounded ONLY in the business's public profile; a fixed apology sentence when the model was unavailable or over budget
businessYesThe business's display name
referral_urlYesSigned, tracked link to the business's own website for the user to follow; null when the business lists no website
business_slugYesEcho of the slug that was queried

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavioral traits beyond the annotations: the question and public profile are processed by an AI provider, the interaction is recorded, and users should avoid entering sensitive personal, medical, payment, or authentication information. This meaningfully supplements the sparse annotation metadata and warns about side effects and privacy.

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 sentences with no filler: the first states the outcome, the second covers privacy/processing behavior, and the third gives usage guidance. Every sentence earns its place and the key action is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with an output schema and well-documented parameters, the description provides sufficient context: what the tool does, what it returns, when to use it, what side effects exist, and what information to avoid. An agent selecting or invoking this tool has the essential information it needs.

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 100%, so the schema already documents all four parameters. The description does not add substantial parameter-level detail, though it does reinforce the nature of the query as a visitor question about a single business. This meets the baseline but does not exceed it.

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 opens with a precise verb+resource: 'Ask a registered business's AI advocate a question and get a citation-ready answer plus a referral link.' It clearly scopes the tool to questions about a single business and names the output format, distinguishing it from sibling tools like search_businesses or request_service.

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 when to use the tool: 'Use this for questions about one business's services, hours, policies, or fit.' It does not explicitly name sibling alternatives or state when not to use them, but the one-business scope and question-oriented purpose provide clear usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_callbackRequest CallbackB
DestructiveIdempotent
Inspect

Submit a callback request on behalf of a user. Advocate attempts a notification through the business's configured lead routing channel (SMS/email); provider acceptance is not proof the business read it. A failed or pending result can require direct follow-up or a retry. Idempotent: re-using the same idempotency_key returns the original request.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier
reasonNoWhy the user wants the callback
urgencyNoHow time-sensitive (default: normal)
agent_idNoOptional agent identifier
contact_nameNoEnd-user's name
contact_emailNoEnd-user's email
contact_phoneNoEnd-user's phone
idempotency_keyYesIdempotency key
preferred_channelNoChannel the user prefers (default: any)

Output Schema

ParametersJSON Schema
NameRequiredDescription
reasonNoPresent for a known routing or provider outcome: 'form_routing_configured', 'no_recipient_configured', 'sms_consent_missing', a shape-mismatch skip, a spend-cap denial, or a provider failure code
statusYes'notified': the configured notification provider accepted the request; this does not prove the business read it. 'failed': routing was not available or the provider reported a failure — see reason. 'pending': a web-form business (see form_url), or a replay while the original send is still in flight.
form_urlNoPresent with reason 'form_routing_configured': the business's own contact form for the user to complete, or null where the business chose form routing without supplying one
callback_idYes
delivered_viaYes'sms' or 'email' when notified; null otherwise
acknowledgmentYesCustomer-facing sentence to relay; null only on a replay caught while the original send is still in flight
idempotent_replayNoPresent and true when this idempotency_key already had a request; nothing was re-sent

TDQS

B3.2/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations declare destructiveHint=true, but the description says 'Submit a callback request' and emphasizes idempotency, indicating a non-destructive create operation. This is a direct annotation contradiction. The description does disclose delivery-not-guaranteed and follow-up needs, but the contradiction forces the lowest score.

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 sentences with no fluff: purpose, delivery caveat, and idempotency behavior are each covered. The information is front-loaded and 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 9-parameter state-changing tool, the description covers purpose, external delivery behavior, failure handling, and idempotency, which is solid given the output schema and full parameter schema coverage. The main gap is the lack of alternative-tool routing, and the destructiveHint contradiction adds confusion.

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 100%, so the schema fully documents each parameter; the description adds value by explaining idempotency_key behavior and the SMS/email channel context. This matches the baseline of 3 where the schema does the heavy lifting.

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 states a specific verb and resource ('Submit a callback request') and adds useful context (on behalf of a user, via lead routing). It is clearly distinct from siblings like request_service or submit_quote_request, though it does not explicitly name or contrast those alternatives.

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 when to use the tool (when a user wants a callback) and provides post-use guidance about failed or pending notification results requiring follow-up or retry. However, it does not explicitly state when to choose this tool over alternatives or provide exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_serviceRequest a business quoteA
Idempotent
Inspect

Open a quote-request form for a specific business using its public slug or provider_business_id obtained from search or the business feed. Shows the business and service catalog; does not send a request or book anything. The customer must review the form and explicitly consent before submitting. Operational access is logged.

ParametersJSON Schema
NameRequiredDescriptionDefault
business_idYesExact public business slug or provider_business_id obtained from search or the business feed

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
addressNo
disclosureYes
business_idYes
context_tokenYes
service_namesYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond annotations by disclosing that the tool only shows the business and service catalog, does not submit or book, requires explicit customer consent, and logs operational access. This gives the agent clear expectations about side effects and usage constraints.

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 concise and well-structured, front-loading the core action and identifier source, then adding key behavioral caveats in short sentences. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with a full schema description and an output schema, the description is complete. It explains when to use it, what it does and does not do, the consent requirement, and logging behavior, leaving no important gap for an agent.

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 already fully describes business_id as an exact public slug or provider_business_id obtained from search or the business feed. The description repeats this same information without adding new parameter-level meaning, so the baseline of 3 applies.

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 tool opens a quote-request form for a specific business, using a specific identifier. It explicitly distinguishes itself from submitting a request or booking anything, which separates it from siblings like submit_quote_request and confirm_booking.

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 to use the tool: after obtaining a business slug or provider_business_id from search or the business feed. It also implies exclusions by saying it does not send a request or book, though it does not explicitly name alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reserve_slotReserve Time SlotA
DestructiveIdempotent
Inspect

Reserve a time slot on an active configured calendar. Returns a pending_offer reservation and sends a 6-digit confirmation code to the customer's email or phone. The reservation expires in 15 minutes if not confirmed. Idempotent: re-using the same idempotency_key returns the original reservation without resending the code. At a business that takes a deposit for agent bookings, pass the offer_id from get_quote (without it the answer is quote_required); no code is sent and the result's payment block carries the amount to pay instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier
agent_idNoOptional agent identifier
offer_idNoOptional id of a signed get_quote offer to redeem against this reservation. Omit for a business with no exact-priced service — authentication is a capability upgrade here, never a toll.
window_endYesSlot end (Unix seconds, an absolute instant) — the matching get_availability slot's `end`; see window_start.
window_startYesSlot start (Unix seconds, an absolute instant). Take it from a get_availability slot: that response carries the business's `timezone`, so request a wide availability window there and filter the returned slots locally rather than guessing the zone.
idempotency_keyYesUnique key for idempotent reservation
customer_contactYesHow to reach the customer. MUST include at least one of email or phone — the confirmation code is delivered there, and a hold nobody can confirm is unreachable from both sides. Email is used when both are present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesReservation state — 'pending_offer' on a fresh hold; a replay returns the existing row's state
paymentNoAlways present. required:false — confirm with the code (confirmation.method 'otp'). required:true — the customer pays amount_cents (currency) to confirm; balance_due_cents is paid at the visit.
expires_atYesISO-8601. When this hold lapses if it is not confirmed (by code, or by payment when payment.required)
confirmationYes
reservation_idYes
booking_detailsNoFor configured calendars: present these fixed booking details to the customer before confirming their code. No owner approval is required.
idempotent_replayNoPresent and true when this idempotency_key already had a reservation; no new code was sent

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond annotations by disclosing the 15-minute expiry, the confirmation code delivery mechanism, idempotent re-use behavior, and the deposit edge case where no code is sent and payment amount appears in the result. Annotations already flag idempotency and write intent, but the description adds operational detail that materially affects agent 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 dense but every sentence earns its place: main purpose, return value, code delivery, expiry, idempotency, and the deposit exception. It is front-loaded with the core action and progressively adds edge cases. No filler or repetition of schema text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters, nested objects, and an output schema, the description covers all critical operational aspects: what it does, how to handle idempotency, deposit requirements, and contact preferences. It does not need to describe return values since an output schema exists. Nothing an agent needs to call it correctly is missing.

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 100%, so each parameter is already documented. The description adds cross-tool meaning by explaining how offer_id ties to get_quote and the consequence of omitting it (quote_required). It also clarifies the customer_contact requirement (must include email or phone) beyond the schema's structural requirement, which is useful. This exceeds the baseline for high schema coverage.

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 ('Reserve'), a clear resource ('a time slot on an active configured calendar'), and distinguishes it from siblings by mentioning it returns a pending_offer reservation and sends a confirmation code. It clearly differentiates from get_availability (listing) and confirm_booking (confirming).

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: it is the reservation step, and it explicitly addresses the deposit scenario by instructing to pass offer_id from get_quote and warning about the quote_required result when omitted. It does not explicitly name alternatives like confirm_booking, but the flow is unambiguous from the sibling list and the description's own details.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_businessesSearch BusinessesA
Read-onlyIdempotent
Inspect

Find registered businesses by search term and optional location; returns matches with their slugs. Call it before the business-specific tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchYesSearch term — matched against business name, description, services, and category
locationNoOptional location filter (city, state, or region). Narrows results geographically.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the behavioral detail that results include slugs, which helps the agent understand the output shape. No contradictions; the added context is valuable but not extensive.

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?

Two sentences, no filler, and the core action is front-loaded. The sentence about calling it before business-specific tools is a useful addition without waste. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple search tool with an output schema present and annotations covering safety, the description is sufficient. It states the purpose, the optional filter, and the return value, plus the operational order. Nothing an agent needs to call it correctly is missing.

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 100%—both 'search' and 'location' are fully described in the schema. The description merely restates 'by search term and optional location' without adding new semantic detail. Baseline 3 is appropriate because the schema carries the parameter meaning.

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?

States a specific verb ('Find'), resource ('registered businesses'), and criteria (search term + optional location), and explicitly notes the return value (matches with slugs). Clearly distinguishes from the business-specific sibling tools by framing it as the entry point for locating businesses.

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?

Provides direct sequencing guidance: 'Call it before the business-specific tools.' This tells the agent when to use it, but does not explicitly mention when not to use it or name an alternative. The context is clear enough for a search-first workflow, so it earns a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_quote_requestSend a quote requestA
DestructiveIdempotent
Inspect

After the customer explicitly agrees, save their service requirements and contact details and send a notification to the business's configured email or opted-in SMS destination. This requests a business response, not a price commitment, booking or payment. Use context from request_service. Reuse the same idempotency_key AND details to check an uncertain submission; never automatically start a new request. Exclude medical, payment-card and authentication information.

ParametersJSON Schema
NameRequiredDescriptionDefault
consentYesTrue only after the customer explicitly agrees to send these contact details and this request to the named business
detailsYesBrief service requirements; exclude sensitive medical, financial and authentication information
serviceYesService the customer wants a quote for
business_idYesThe exact provider_business_id (public business slug) returned by request_service
contact_nameNo
contact_emailNo
contact_phoneNo
context_tokenYesOpaque business context from request_service; pass unchanged
idempotency_keyYesA UUID for this request; reuse unchanged when checking or retrying an uncertain submission

Output Schema

ParametersJSON Schema
NameRequiredDescription
codeNo
statusYes
messageYes
replayedNo
request_idYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses idempotency behavior: reuse the same idempotency_key AND details to check an uncertain submission, and never automatically start a new request. It also warns to exclude sensitive medical, payment-card, and authentication information, and clarifies that this action does not create a booking, payment, or price commitment.

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 compact and front-loaded: it starts with the consent condition and core action, then adds exclusions, idempotency guidance, and sensitive-data warnings. Every sentence contributes meaningful behavioral or usage information with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation tool with an output schema and many siblings, the description covers the essential context: when consent is required, where the context token comes from, how to handle idempotent retries, what the tool does not do, and what content must be excluded. Return values need not be described because an output schema exists.

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 67%, so the schema already documents most parameters. The description adds useful operational semantics: context_token should come from request_service, idempotency_key must be reused with the same details when checking an uncertain submission, and details must exclude sensitive information. It treats contact_name, contact_email, and contact_phone collectively as 'contact details' but does not individually explain each, so it does not fully compensate for the missing schema descriptions.

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 operation: save the customer's service requirements and contact details, then send a notification to the business. It explicitly scopes the action as requesting a business response rather than a price commitment, booking, or payment, which distinguishes it from siblings like get_quote and confirm_booking.

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 gives a clear precondition ('After the customer explicitly agrees'), a prerequisite source ('Use context from request_service'), and explicit exclusions ('not a price commitment, booking or payment'). It does not name sibling alternatives directly, but the when-not conditions are specific enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

subscribe_to_updatesSubscribe to UpdatesA
DestructiveIdempotent
Inspect

Start a pending email subscription to updates from a business. Returns a confirmation URL that only the user must click within 7 days; no subscription is active until that confirmation. Idempotent: re-using the same idempotency_key returns the original subscription.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBusiness slug identifier
topicsYesTopic tags (e.g., ['deals', 'schedule_changes'])
agent_idNoOptional agent identifier
contact_emailYesEmail to subscribe — confirmed via returned token
idempotency_keyYesIdempotency key

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes'pending' until the user opens confirmation_url; a replay returns the stored state (e.g. 'confirmed' once they have)
topicsYesNormalised topic tags: trimmed, lower-cased, de-duplicated
expires_atYesUnix seconds when confirmation_url stops working
acknowledgmentYesCustomer-facing sentence to relay, including the confirmation link
subscription_idYes
confirmation_urlYesThe link the user must open within 7 days to start receiving updates
idempotent_replayNoPresent and true when this idempotency_key already had a subscription; the stored token is returned, refreshed only if it had expired
confirmation_tokenYesCapability token for this subscriber only — it is the proof of consent; never pass it to another tool or party

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (idempotentHint, mutating hints), the description discloses the full workflow: the subscription is pending until the user clicks a confirmation URL, the URL is user-exclusive, and it expires within 7 days. It also specifies what idempotency means in practice — reusing the key returns the original subscription. This is exactly the behavioral nuance an agent needs and cannot derive from annotations.

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 sentences with zero waste: purpose first, then the confirmation workflow, then idempotency semantics. Every sentence carries load-bearing information, and the most decision-relevant facts (pending state, 7-day window, user-only click) are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for this tool's complexity. The output schema covers return values, annotations cover the mutating/idempotent profile, the schema documents all five parameters, and the description covers the workflow quirks (pending, expiry, confirmation). No critical gap remains for an agent to call this correctly.

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 100%, so the baseline is 3. The description adds genuine semantics on top: it ties contact_email to the confirmation flow and, more importantly, explains that re-using idempotency_key returns the original subscription — a behavioral consequence absent from the schema's bare 'Idempotency key' label.

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 opens with a specific verb+resource: 'Start a pending email subscription to updates from a business.' This is unambiguous and clearly distinct from the sibling tools (booking, quoting, availability, payment), so an agent can identify what this tool does 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.

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 purpose statement — this tool is for email subscriptions to business updates, which is outside the booking/quote/payment domain of the siblings. However, there is no explicit when-to-use or when-not-to-use guidance, and no alternative tool is named, so the agent must infer applicability.

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. 1 tool update
    • Changedcancel_booking4 fields changed
      • addedOutput schema / properties / pending_cents
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / refund / description
        Previous value: -"full: refunded to the payment method; none: the deposit was forfeited under the policy"New value: +"full: the payment ledger confirms the refund; none: deposit was forfeited; pending: cancellation is complete and refund verification or retry is pending"
      • changedOutput schema / properties / refund / enum
        Previous value: -[
        -  "full",
        -  "none"
        -]New value: +[
        +  "full",
        +  "none",
        +  "pending"
        +]
      • changedOutput schema / required
        Previous value: -[
        -  "status",
        -  "reservation_id",
        -  "refund",
        -  "refunded_cents",
        -  "currency"
        -]New value: +[
        +  "status",
        +  "reservation_id",
        +  "refund",
        +  "refunded_cents",
        +  "pending_cents",
        +  "currency"
        +]
  2. 1 tool update
    • Addedget_booking_destination
  3. 2 tool updates
    • Addedcancel_booking
    • Addedcreate_booking_payment_link
  4. 1 tool update
    • Changedreserve_slot3 fields changed
      • changedOutput schema / properties / confirmation / properties / method / description
        Previous value: -"Always 'otp' today"New value: +"'otp': a 6-digit code was sent to the customer. 'payment': no code — this booking is confirmed by paying the deposit in `payment`"
      • changedOutput schema / properties / expires_at / description
        Previous value: -"ISO-8601. When this hold lapses if the code is not confirmed"New value: +"ISO-8601. When this hold lapses if it is not confirmed (by code, or by payment when payment.required)"
      • addedOutput schema / properties / payment
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Always present. required:false — confirm with the code (confirmation.method 'otp'). required:true — the customer pays amount_cents (currency) to confirm; balance_due_cents is paid at the visit.",
        +  "properties": {
        +    "amount_cents": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "balance_due_cents": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "currency": {
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "deposit",
        +        "full"
        +      ],
        +      "type": "string"
        +    },
        +    "required": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "required"
        +  ],
        +  "type": "object"
        +}
  5. 1 tool update
    • Changedrequest_service2 fields changed
      • changedInput schema / properties / business_id / description
        Previous value: -"Exact provider_business_id from the business feed, also the public business slug"New value: +"Exact public business slug or provider_business_id obtained from search or the business feed"
      • changedOutput schema / required
        Previous value: -[
        -  "business_id",
        -  "name",
        -  "address",
        -  "service_names",
        -  "context_token",
        -  "disclosure"
        -]New value: +[
        +  "business_id",
        +  "name",
        +  "service_names",
        +  "context_token",
        +  "disclosure"
        +]
  6. 5 tool updates
    • Changedconfirm_booking3 fields changed
      • changedInput schema / properties / code / description
        Previous value: -"The 6-digit confirmation code the customer received at their contact (email or SMS) and read back to the agent"New value: +"The customer-supplied 6-digit confirmation code received at their own email or SMS contact. Relay only that supplied code; never generate, guess, or fetch it."
      • changedOutput schema / properties / message / description
        Previous value: -"Present with pending_merchant: customer-facing text to relay"New value: +"Optional customer-facing status detail to relay"
      • changedOutput schema / properties / status / description
        Previous value: -"'confirmed': the code was right and the slot is now exclusively held. 'pending_merchant': the code was right; the business must accept within 24 hours and may decline — see message. 'already_confirmed': this reservation was confirmed earlier (safe replay)."New value: +"'confirmed': a booking was committed to the selected configured calendar, or a historical legacy reservation was confirmed. 'booking_pending': the provider outcome is unresolved; do not create another booking or seek owner approval — repeat confirm_booking later to read the stored outcome. 'pending_merchant': a historical merchant-review reservation awaits a business decision — see message. 'already_confirmed': this reservation was confirmed earlier (safe replay)."
    • Changedrequest_callback2 fields changed
      • changedOutput schema / properties / reason / description
        Previous value: -"Present when nothing was delivered: 'form_routing_configured', 'no_recipient_configured', 'sms_consent_missing', a shape-mismatch skip, a spend-cap denial, or a provider failure code"New value: +"Present for a known routing or provider outcome: 'form_routing_configured', 'no_recipient_configured', 'sms_consent_missing', a shape-mismatch skip, a spend-cap denial, or a provider failure code"
      • changedOutput schema / properties / status / description
        Previous value: -"'notified': the business received the request. 'failed': nothing was delivered — see reason. 'pending': a web-form business (see form_url), or a replay caught while the original send is still in flight."New value: +"'notified': the configured notification provider accepted the request; this does not prove the business read it. 'failed': routing was not available or the provider reported a failure — see reason. 'pending': a web-form business (see form_url), or a replay while the original send is still in flight."
    • Addedrequest_service
    • Changedreserve_slot1 field changed
      • addedOutput schema / properties / booking_details
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "For configured calendars: present these fixed booking details to the customer before confirming their code. No owner approval is required.",
        +  "properties": {
        +    "business_name": {
        +      "type": "string"
        +    },
        +    "calendar_name": {
        +      "type": "string"
        +    },
        +    "end": {
        +      "type": "string"
        +    },
        +    "reference": {
        +      "type": "string"
        +    },
        +    "start": {
        +      "type": "string"
        +    },
        +    "timezone": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "business_name",
        +    "timezone",
        +    "start",
        +    "end",
        +    "calendar_name",
        +    "reference"
        +  ],
        +  "type": "object"
        +}
    • Addedsubmit_quote_request
  7. 6 tool updates
    • Changedconfirm_booking1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Present with pending_merchant: customer-facing text to relay",
        +      "type": "string"
        +    },
        +    "reservation_id": {
        +      "format": "uuid",
        +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "'confirmed': the code was right and the slot is now exclusively held. 'pending_merchant': the code was right; the business must accept within 24 hours and may decline — see message. 'already_confirmed': this reservation was confirmed earlier (safe replay).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "reservation_id"
        +  ],
        +  "type": "object"
        +}
    • Changedinitiate_handoff1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "channel": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "human mode, skipped before sending: the channel that would have been used ('sms' or 'email'), or 'form' when the business only takes leads through a web form"
        +    },
        +    "continuation_expired": {
        +      "description": "agent mode replay: true when the stored continuation has already expired; it is never re-minted — start a new handoff",
        +      "type": "boolean"
        +    },
        +    "continuation_url": {
        +      "description": "agent mode: signed URL the next agent redeems exactly once at /a2a/continue",
        +      "type": "string"
        +    },
        +    "delivered": {
        +      "description": "human mode: present only as false, when nothing was sent — see reason",
        +      "type": "boolean"
        +    },
        +    "delivered_via": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "human mode: 'sms' or 'email' — the channel the notification went to"
        +    },
        +    "expires_at": {
        +      "description": "agent mode: Unix seconds when continuation_url stops working (one hour)",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "form_url": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "human mode, channel 'form': the business's own contact form for the user to complete"
        +    },
        +    "handoff_id": {
        +      "format": "uuid",
        +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +      "type": "string"
        +    },
        +    "handshake_token": {
        +      "description": "agent mode: the bare token carried inside continuation_url",
        +      "type": "string"
        +    },
        +    "idempotent_replay": {
        +      "description": "Present and true when this idempotency_key already had a handoff; nothing was re-sent and no token was re-minted",
        +      "type": "boolean"
        +    },
        +    "mode": {
        +      "description": "The handoff's mode, and which of the fields below are present. Normally the mode you asked for — but an idempotent replay returns the STORED handoff's mode, which differs when an idempotency_key is reused with a different mode than the call that created it.",
        +      "enum": [
        +        "human",
        +        "agent"
        +      ],
        +      "type": "string"
        +    },
        +    "reason": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "human mode, not delivered: 'form_routing_configured', 'no_recipient_configured', 'sms_consent_missing', a shape-mismatch skip, a spend-cap denial, or a provider failure code"
        +    },
        +    "status": {
        +      "description": "human mode replay while the original send is still in flight: 'pending'",
        +      "type": "string"
        +    },
        +    "ticket_id": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "human mode, delivered: the provider's message id, or the handoff_id when the provider issues none"
        +    }
        +  },
        +  "required": [
        +    "mode",
        +    "handoff_id"
        +  ],
        +  "type": "object"
        +}
    • Changedquery_business_agent1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "answer": {
        +      "description": "Plain-text answer grounded ONLY in the business's public profile; a fixed apology sentence when the model was unavailable or over budget",
        +      "type": "string"
        +    },
        +    "business": {
        +      "description": "The business's display name",
        +      "type": "string"
        +    },
        +    "business_slug": {
        +      "description": "Echo of the slug that was queried",
        +      "type": "string"
        +    },
        +    "referral_url": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Signed, tracked link to the business's own website for the user to follow; null when the business lists no website"
        +    }
        +  },
        +  "required": [
        +    "answer",
        +    "referral_url",
        +    "business",
        +    "business_slug"
        +  ],
        +  "type": "object"
        +}
    • Changedrequest_callback1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "acknowledgment": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Customer-facing sentence to relay; null only on a replay caught while the original send is still in flight"
        +    },
        +    "callback_id": {
        +      "format": "uuid",
        +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +      "type": "string"
        +    },
        +    "delivered_via": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "'sms' or 'email' when notified; null otherwise"
        +    },
        +    "form_url": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Present with reason 'form_routing_configured': the business's own contact form for the user to complete, or null where the business chose form routing without supplying one"
        +    },
        +    "idempotent_replay": {
        +      "description": "Present and true when this idempotency_key already had a request; nothing was re-sent",
        +      "type": "boolean"
        +    },
        +    "reason": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Present when nothing was delivered: 'form_routing_configured', 'no_recipient_configured', 'sms_consent_missing', a shape-mismatch skip, a spend-cap denial, or a provider failure code"
        +    },
        +    "status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "'notified': the business received the request. 'failed': nothing was delivered — see reason. 'pending': a web-form business (see form_url), or a replay caught while the original send is still in flight."
        +    }
        +  },
        +  "required": [
        +    "callback_id",
        +    "status",
        +    "delivered_via",
        +    "acknowledgment"
        +  ],
        +  "type": "object"
        +}
    • Changedreserve_slot3 fields changed
      • addedInput schema / properties / customer_contact / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "email"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "phone"
        +    ]
        +  }
        +]
      • changedInput schema / properties / window_end / description
        Previous value: -"Slot end (Unix seconds)"New value: +"Slot end (Unix seconds, an absolute instant) — the matching get_availability slot's `end`; see window_start."
      • changedInput schema / properties / window_start / description
        Previous value: -"Slot start (Unix seconds)"New value: +"Slot start (Unix seconds, an absolute instant). Take it from a get_availability slot: that response carries the business's `timezone`, so request a wide availability window there and filter the returned slots locally rather than guessing the zone."
    • Changedsubscribe_to_updates1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "acknowledgment": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Customer-facing sentence to relay, including the confirmation link"
        +    },
        +    "confirmation_token": {
        +      "description": "Capability token for this subscriber only — it is the proof of consent; never pass it to another tool or party",
        +      "type": "string"
        +    },
        +    "confirmation_url": {
        +      "description": "The link the user must open within 7 days to start receiving updates",
        +      "type": "string"
        +    },
        +    "expires_at": {
        +      "description": "Unix seconds when confirmation_url stops working",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "idempotent_replay": {
        +      "description": "Present and true when this idempotency_key already had a subscription; the stored token is returned, refreshed only if it had expired",
        +      "type": "boolean"
        +    },
        +    "status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "'pending' until the user opens confirmation_url; a replay returns the stored state (e.g. 'confirmed' once they have)"
        +    },
        +    "subscription_id": {
        +      "format": "uuid",
        +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +      "type": "string"
        +    },
        +    "topics": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Normalised topic tags: trimmed, lower-cased, de-duplicated"
        +    }
        +  },
        +  "required": [
        +    "subscription_id",
        +    "status",
        +    "confirmation_token",
        +    "confirmation_url",
        +    "expires_at",
        +    "topics",
        +    "acknowledgment"
        +  ],
        +  "type": "object"
        +}
  8. 1 tool update
    • Changedsearch_businesses4 fields changed
      • removedOutput schema / properties / results / items / properties / description
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
      • addedOutput schema / properties / results / items / properties / summary
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / results / items / properties / summary_truncated
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "slug",
        -  "name",
        -  "description",
        -  "category",
        -  "location",
        -  "website"
        -]New value: +[
        +  "slug",
        +  "name",
        +  "summary",
        +  "summary_truncated",
        +  "category",
        +  "location",
        +  "website"
        +]
  9. 1 tool update
    • Changedreserve_slot1 field changed
      • changedInput schema / properties / customer_contact / properties / phone / description
        Previous value: -"SMS fallback for the confirmation code when no email is given. Give it in E.164 form, e.g. +15125551234; a bare national number is accepted and read as US. If it cannot be resolved to a real number and no email was supplied, the call returns invalid_phone rather than holding a slot nobody can confirm."New value: +"SMS fallback for the confirmation code when no email is given. Any common way of writing a number is accepted and reformatted for you: (512) 317-1992, 512-317-1992 and 5123171992 all work, and a bare national number is read as US. Only input that cannot be read as a number at all is refused, and then only when no email was supplied, since a hold nobody can confirm is worse than a refused call."
  10. 1 tool update
    • Changedreserve_slot1 field changed
      • changedInput schema / properties / customer_contact / properties / phone / description
        Previous value: -"SMS fallback for the confirmation code when no email is given"New value: +"SMS fallback for the confirmation code when no email is given. Give it in E.164 form, e.g. +15125551234; a bare national number is accepted and read as US. If it cannot be resolved to a real number and no email was supplied, the call returns invalid_phone rather than holding a slot nobody can confirm."
  11. 1 tool update
    • Changedreserve_slot1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "confirmation": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "channel": {
        +          "description": "Where the code went: 'email', 'sms', or 'none' if delivery was unavailable",
        +          "type": "string"
        +        },
        +        "delivered": {
        +          "description": "False means the hold exists but no code reached the customer — the booking cannot be confirmed until one does",
        +          "type": "boolean"
        +        },
        +        "method": {
        +          "description": "Always 'otp' today",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "method",
        +        "channel",
        +        "delivered"
        +      ],
        +      "type": "object"
        +    },
        +    "expires_at": {
        +      "description": "ISO-8601. When this hold lapses if the code is not confirmed",
        +      "type": "string"
        +    },
        +    "idempotent_replay": {
        +      "description": "Present and true when this idempotency_key already had a reservation; no new code was sent",
        +      "type": "boolean"
        +    },
        +    "reservation_id": {
        +      "format": "uuid",
        +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Reservation state — 'pending_offer' on a fresh hold; a replay returns the existing row's state",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "reservation_id",
        +    "status",
        +    "expires_at",
        +    "confirmation"
        +  ],
        +  "type": "object"
        +}
  12. 1 tool update
    • Changedreserve_slot4 fields changed
      • changedInput schema / properties / customer_contact / description
        Previous value: -"Customer contact information"New value: +"How to reach the customer. MUST include at least one of email or phone — the confirmation code is delivered there, and a hold nobody can confirm is unreachable from both sides. Email is used when both are present."
      • addedInput schema / properties / customer_contact / properties / email / description
        Added value: +"Where the 6-digit confirmation code is sent, preferred over phone"
      • addedInput schema / properties / customer_contact / properties / name / description
        Added value: +"Customer's name, if known"
      • addedInput schema / properties / customer_contact / properties / phone / description
        Added value: +"SMS fallback for the confirmation code when no email is given"
  13. 2 tool updates
    • Changedget_availability2 fields changed
      • changedInput schema / properties / window_end / description
        Previous value: -"Unix seconds; default now + 7 days"New value: +"Unix seconds (absolute instant; default now + 7 days). See window_start on reading the response's `timezone`."
      • changedInput schema / properties / window_start / description
        Previous value: -"Unix seconds; default now"New value: +"Unix seconds (absolute instant; default now). The business's own timezone is not an input — it is returned as `timezone` in the response. To target a local phrase like \"Tuesday afternoon\", request a generously wide window and filter the returned slots using that `timezone`."
    • Addedlist_services
  14. 2 tool updates
    • Addedget_payment_handoff_url
    • Changedget_quote2 fields changed
      • addedInput schema / properties / params / additionalProperties / maxLength
        Added value: +200
      • addedInput schema / properties / params / propertyNames / maxLength
        Added value: +64
  15. 2 tool updates
    • Addedconfirm_booking
    • Changedreserve_slot1 field changed
      • addedInput schema / properties / offer_id
        Added value: +{
        +  "description": "Optional id of a signed get_quote offer to redeem against this reservation. Omit for a business with no exact-priced service — authentication is a capability upgrade here, never a toll.",
        +  "format": "uuid",
        +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +  "type": "string"
        +}
  16. 1 tool update
    • Changedget_quote2 fields changed
      • addedOutput schema / properties / offer
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "expires_at": {
        +          "description": "Offer expiry (Unix seconds); the quoted price is guaranteed until then",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "key_id": {
        +          "type": "string"
        +        },
        +        "offer_id": {
        +          "type": "string"
        +        },
        +        "version": {
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "offer_id",
        +        "version",
        +        "key_id",
        +        "expires_at"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Server-minted immutable price offer — only exact configured prices mint one; estimates and ranges never do."
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "quote"
        -]New value: +[
        +  "quote",
        +  "offer"
        +]

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An agent-callable MCP server that lets autonomous AI agents find, verify, message, schedule with, and transact with small and mid-sized businesses through a single compliance-enforced tool surface.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Country-agnostic MCP-callable directory for AI agents to find local SMBs — realtors, insurance agents, medical practitioners — by category, location, or natural-language query. Returns business catalog data and UTM-tagged booking URLs (zero PII).
    5
    MIT
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables MCP-compatible agents to build and operate complete AI front offices for local businesses—branded websites, booking, intake, CRM, and AI agents in one workspace.
    51
    AGPL 3.0
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.