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 with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
cameronjmcewan-dev/advocatemcp
GitHub Stars
1

Available Tools

15 tools
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.

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.5/5.0
Behavior5/5

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

Beyond annotations, it discloses a direct provider commit with no owner approval, states that booking_pending leaves the provider outcome uncertain, and clarifies that repeated calls check the stored outcome without retrying the provider write automatically. This goes well beyond the structured annotation flags.

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?

Four purposeful sentences cover the main action, code-handling constraint, commit semantics, and retry behavior without fluff. The critical operation is front-loaded in the first sentence.

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 an output schema present and full parameter documentation, the description covers prerequisites, sequencing, side effects, and pending-state handling. An agent has what it needs to call the tool correctly and set appropriate expectations.

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% for all three parameters, and the description largely restates the schema's code provenance guidance and the reservation_id link to reserve_slot. It adds no significant new parameter-level semantics beyond the structured 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 first sentence states a specific action — 'Confirm a reservation made with reserve_slot' — with a clear resource and predecessor tool. It also gives concrete behavioral scope: relay only a customer-supplied code and never generate, guess, or fetch it.

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 establishes the intended workflow: use it on reservations created by reserve_slot, and for an active configured calendar with a verified code it attempts a direct commit. It gives a retry guideline for booking_pending, but does not explicitly name exclusions or alternative tools.

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
Idempotent
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.

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.3/5.0
Behavior4/5

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

The description goes beyond annotations by explaining that availability depends on the business's configured timezone, duration, operating hours, and current occupancy, and that results can change before confirmation, including when the calendar provider is unavailable. Although readOnlyHint is false, the description does not directly contradict that annotation because it never explicitly promises no state change.

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 each earn their place: one defines the result and inputs, one states the intended booking follow-up, and one warns about volatility and provider failure. There is no filler or redundant restatement of the schema.

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?

Combined with a fully documented input schema and an output schema, the description covers what the tool returns, how the result should be used, timezone handling, and the important reliability caveat about changing availability and provider unavailability. Nothing critical is missing for an agent to call the tool correctly.

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%, and the schema already explains slug, window_start/window_end defaults, absolute instants, and how to interpret the response timezone. The description adds useful context about the business's configured calendar, but it does not meaningfully extend the per-parameter semantics already present in 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 names a specific verb and resource: 'Return available windows from the business's active configured calendar.' It also clarifies the tool's role by saying to use a returned window to start a booking, which distinguishes it from reservation or confirmation siblings like reserve_slot 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 gives clear context that this tool is the availability-lookup step before booking, and the caveat that availability can change before confirmation implies a firmer sibling should be used when a guarantee is needed. It does not explicitly name when-not-to-use alternatives, so it stops short of a 5.

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
Idempotent
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.2/5.0
Behavior4/5

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

Annotations only indicate idempotent and non-destructive behavior. The description adds meaningful behavioral context by revealing the response includes agent guidance on framing the policy and appropriate freshness caveats. This is useful beyond what annotations provide.

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 tight sentences with no filler. The main purpose is front-loaded, and the usage guidance and response caveat each earn their 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?

The tool has one simple parameter and an output schema, so the description doesn't need to detail return values. It covers the core purpose, typical trigger conditions, and a notable response trait. A minor gap is the lack of any mention of required authorization or error behavior, but these are less critical given the tool's simplicity.

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% for the single 'slug' parameter, and the schema already explains it as a 'Business slug identifier'. The description adds no extra parameter-level detail, 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 uses a specific verb ('Returns') and names a concrete resource ('the business's cancellation policy text'). The use-case hint ('when a user asks about cancellation terms, fees, or no-show policies') also helps distinguish it from sibling tools like get_quote or get_availability.

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 states when to use the tool: when the user asks about cancellation terms, fees, or no-show policies. It does not mention when not to use it or alternatives, but the sibling set contains no direct competitor for this specific retrieval task, making the guidance adequate.

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
Idempotent
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.5/5.0
Behavior5/5

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

The description adds a valuable behavioral caveat beyond what annotations provide: the data is self-reported and the response carries explicit framing so agents do not treat tenant claims as verified facts. This directly informs how an agent should interpret and relay the returned information.

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, each adding distinct value: what is returned, when to use it, and a caveat about the self-reported nature of the data. 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 single-parameter tool with an output schema, the description covers the domain, the trigger conditions, and the key trust caveat. Nothing critical is missing for an agent to invoke it correctly and interpret its results appropriately.

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 single parameter 'slug' is already documented in the schema with 100% coverage, so the description adds little beyond identifying whose credentials are returned. 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?

The description names a specific verb ('Returns') and a precise resource: the business's self-reported licenses, insurance, bonding, and certifications. It clearly distinguishes itself from sibling tools like get_quote or search_businesses by focusing on credential and verification data.

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

Usage Guidelines4/5

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

It provides concrete trigger conditions: trust-sensitive verticals and literal user questions like 'are they licensed?' or 'are they insured?'. It does not explicitly discuss when to prefer a sibling tool such as query_business_agent, but the use case is clear 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.

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
stateYes
summaryYes

TDQS

A4.3/5.0
Behavior4/5

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

Adds meaningful behavioral context beyond the annotations by describing the plain-text return content and including a critical warning: the URL is for the customer to open, not for the agent to fetch or follow. This is valuable operational guidance that the idempotentHint and destructiveHint annotations do not convey.

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 well-structured sentences with no filler: the first front-loads the return value and its contents, and the second carries the URL caution and timing guidance. 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?

Complete for a two-parameter tool with full output schema and annotations. The description covers what is returned, when to call it, and the key behavioral constraint about not following the URL, leaving no critical gaps for correct invocation.

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 baseline is 3. The description reinforces that offer_id comes from get_quote and relates to a priced offer, but does not add parameter-level detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: returns a plain-text summary of a priced offer plus a customer-facing URL, listing the exact contents (service, amount, currency, cancellation policy, price validity). It also distinguishes itself from the get_quote/booking flow by requiring an existing offer_id and a user ready to review or continue.

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 clear usage context: use after get_quote or a booking flow has produced an offer_id and the user is ready to review/continue with a priced offer. It does not explicitly name alternative tools or state when-not-to-use cases, so it falls just short of full routing 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
Idempotent
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.7/5.0
Behavior5/5

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

The description adds meaningful behavioral context beyond the annotations: quoting a non-listed name silently falls back to an estimate with no offer, and exact prices require a service marked payable. This is important failure-mode information that neither the idempotentHint nor destructiveHint annotations convey.

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, each earning its place: the first states the function, the second gives the critical usage ordering, and the third explains the failure mode. The most actionable information is front-loaded, and there is no filler or repetition.

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 that the tool has one simple required parameter, an output schema, and rich sibling-tool context, the description covers purpose, ordering, dependencies, and failure behavior. Nothing essential is missing for an agent to correctly select and invoke this tool.

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 describes the only parameter, slug, as 'Business slug identifier' with 100% coverage. The description does not add additional parameter-level detail, so the baseline of 3 is appropriate; the schema carries the burden for this dimension.

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 what the tool does: 'Lists the services a business has configured, with their prices and the exact arguments to quote each one.' It names a specific verb, resource, and output details, and further distinguishes itself from get_quote and get_payment_handoff_url by explaining its role in the quoting flow.

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 'Call this BEFORE get_quote' and explains the dependency: the service name must match a configured service, and only payable services return an offer_id for get_payment_handoff_url. It also warns about the silent fallback to an estimate, making the when-to-use guidance remarkably clear.

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.

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
expires_atYesISO-8601. When this hold lapses if the code is not confirmed
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.3/5.0
Behavior5/5

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

The description adds concrete behavior beyond the annotations: it returns a 'pending_offer reservation,' sends a '6-digit confirmation code' to the customer, expires in 15 minutes, and clarifies idempotent reuse semantics by stating the original reservation is returned without resending the code. This materially enriches what the agent knows beyond readOnly/idempotent 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 compact and front-loaded with the core purpose, followed by behavior, expiry, and idempotency. Every sentence earns its place and none repeat what the schema or annotations already state redundantly.

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 complexity, the rich input schema, the output schema, and the annotations, the description covers the essential operational behavior: what it returns, how confirmation codes are delivered, the 15-minute expiry, and idempotency semantics. An agent has enough information to select and invoke it correctly.

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 parameters and their semantics. The description adds no new parameter-level meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Reserve a time slot on an active configured calendar.' It clearly distinguishes this from confirmation by stating it returns a 'pending_offer reservation' and sends a confirmation code, which implies the reservation is not yet confirmed and therefore differs from 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 Guidelines3/5

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

The description implies usage context—reserving a slot from an active calendar, then later confirming—but it never names an alternative tool or states when to prefer confirm_booking or get_availability. An agent must infer the workflow from the sibling list and the word 'pending_offer,' so the guidance is implied rather than explicit.

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

search_businessesSearch BusinessesA
Idempotent
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/5.0
Behavior3/5

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

The description adds useful behavioral context by noting the tool returns matches with slugs and restricts results to registered businesses. However, with readOnlyHint false and idempotentHint true, the description does not clarify potential side effects or lack thereof; it relies mostly on the annotations for the safety profile.

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 with no filler. The core action is front-loaded, the return value is specified, and the sequencing instruction earns its place by helping the agent decide when to call it.

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 low-complexity search tool with a full input schema and an output schema, the description covers the essential purpose, result content, and when to call it. It could be slightly more explicit about its relationship to query_business_agent or other search-adjacent siblings, but overall it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents 'search' and 'location'. The description restates that there is an optional location filter but does not add meaningful meaning beyond the schema, so the baseline 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 states a specific verb ('Find'), a clear resource ('registered businesses'), and the criteria ('by search term and optional location'). It also distinguishes the tool from the many sibling tools by noting it returns slugs and should be called before business-specific tools.

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

Usage Guidelines4/5

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

The description gives explicit when-to-use guidance: 'Call it before the business-specific tools.' This gives the agent a clear trigger and sequence. It does not explicitly name alternative search-like tools such as query_business_agent or state when not to use it, so it stops short of a full 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. Dates show when Glama detected each change.

  1. 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"
        +]
  2. 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
  3. 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"
        +}
  4. 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"
        +]
  5. 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."
  6. 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."
  7. 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"
        +}
  8. 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"
  9. 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
  10. 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
  11. 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"
        +}
  12. 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"
        +]
  13. 1 tool update
    • Changedinitiate_handoff7 fields changed
      • addedInput schema / properties / contact_email
        Added value: +{
        +  "description": "End-user's email",
        +  "format": "email",
        +  "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / contact_name
        Added value: +{
        +  "description": "End-user's name",
        +  "maxLength": 120,
        +  "type": "string"
        +}
      • addedInput schema / properties / contact_phone
        Added value: +{
        +  "description": "End-user's phone",
        +  "maxLength": 40,
        +  "type": "string"
        +}
      • changedInput schema / properties / message / description
        Previous value: -"Message body for human-mode notification"New value: +"Deprecated 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."
      • addedInput schema / properties / message / maxLength
        Added value: +800
      • addedInput schema / properties / reason
        Added value: +{
        +  "description": "Why the user wants to reach a human",
        +  "maxLength": 800,
        +  "type": "string"
        +}
      • addedInput schema / properties / urgency
        Added value: +{
        +  "description": "How time-sensitive (default: normal)",
        +  "enum": [
        +    "low",
        +    "normal",
        +    "high",
        +    "emergency"
        +  ],
        +  "type": "string"
        +}
  14. 3 tool updates
    • Changedrequest_callback2 fields changed
      • addedInput schema / properties / contact_email / format
        Added value: +"email"
      • addedInput schema / properties / contact_email / pattern
        Added value: +"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedreserve_slot2 fields changed
      • addedInput schema / properties / customer_contact / properties / email / format
        Added value: +"email"
      • addedInput schema / properties / customer_contact / properties / email / pattern
        Added value: +"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedsubscribe_to_updates2 fields changed
      • addedInput schema / properties / contact_email / format
        Added value: +"email"
      • addedInput schema / properties / contact_email / pattern
        Added value: +"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
  15. 10 tool updates
    • Changedget_availability5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / slug / description
        Previous value: -"business slug"New value: +"Business slug identifier"
      • addedInput schema / properties / window_end / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / window_start / maximum
        Added value: +9007199254740991
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "generated_at": {
        +      "type": "number"
        +    },
        +    "slots": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "capacity": {
        +            "type": "number"
        +          },
        +          "end": {
        +            "type": "number"
        +          },
        +          "start": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "start",
        +          "end",
        +          "capacity"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "source": {
        +      "type": "string"
        +    },
        +    "timezone": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "slots",
        +    "source",
        +    "timezone",
        +    "generated_at"
        +  ],
        +  "type": "object"
        +}
    • Changedget_cancellation_policy3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / slug / description
        Previous value: -"business slug"New value: +"Business slug identifier"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "guidance_for_agent": {
        +      "type": "string"
        +    },
        +    "has_policy": {
        +      "type": "boolean"
        +    },
        +    "policy_text": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "slug": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "slug",
        +    "has_policy",
        +    "policy_text",
        +    "guidance_for_agent"
        +  ],
        +  "type": "object"
        +}
    • Changedget_credentials3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / slug / description
        Previous value: -"business slug"New value: +"Business slug identifier"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "bonded": {
        +      "anyOf": [
        +        {
        +          "type": "boolean"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "certifications": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "has_credentials": {
        +      "type": "boolean"
        +    },
        +    "insured": {
        +      "anyOf": [
        +        {
        +          "type": "boolean"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "licenses": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "expires_at": {
        +            "type": "string"
        +          },
        +          "jurisdiction": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "number": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "type": "string"
        +    },
        +    "summary": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "slug",
        +    "has_credentials",
        +    "licenses",
        +    "insured",
        +    "bonded",
        +    "certifications",
        +    "summary"
        +  ],
        +  "type": "object"
        +}
    • Changedget_quote6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / params / description
        Previous value: -"optional service parameters (e.g., {size:'large'})"New value: +"Optional service parameters (e.g., {size:'large'})"
      • addedInput schema / properties / params / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / service / description
        Previous value: -"requested service name"New value: +"Requested service name to quote"
      • changedInput schema / properties / slug / description
        Previous value: -"business slug"New value: +"Business slug identifier"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "quote": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "basis": {
        +              "enum": [
        +                "pricing_json_v2",
        +                "llm_estimate"
        +              ],
        +              "type": "string"
        +            },
        +            "confidence": {
        +              "enum": [
        +                "exact",
        +                "range",
        +                "estimate"
        +              ],
        +              "type": "string"
        +            },
        +            "currency": {
        +              "type": "string"
        +            },
        +            "disclaimer": {
        +              "type": "string"
        +            },
        +            "high": {
        +              "type": "number"
        +            },
        +            "low": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "low",
        +            "high",
        +            "currency",
        +            "confidence",
        +            "basis"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "reason": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "quote"
        +  ],
        +  "type": "object"
        +}
    • Changedinitiate_handoff10 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / agent_id
        Added value: +{
        +  "description": "Optional agent identifier",
        +  "type": "string"
        +}
      • addedInput schema / properties / idempotency_key
        Added value: +{
        +  "description": "Unique key for idempotent handoff",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / message
        Added value: +{
        +  "description": "Message body for human-mode notification",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / mode / description
        Added value: +"Handoff mode: human (SMS/email) or agent (continuation URL)"
      • removedInput schema / properties / payload
        Removed value: -{
        -  "additionalProperties": {},
        -  "type": "object"
        -}
      • addedInput schema / properties / purpose
        Added value: +{
        +  "description": "Purpose description for agent-mode continuation",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / reservation_id / description
        Added value: +"Optional link to a prior reservation"
      • addedInput schema / properties / slug / description
        Added value: +"Business slug identifier"
      • changedInput schema / required
        Previous value: -[
        -  "slug",
        -  "mode",
        -  "payload"
        -]New value: +[
        +  "slug",
        +  "mode",
        +  "idempotency_key"
        +]
    • Changedquery_business_agent6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / agent_id / description
        Previous value: -"Optional caller-asserted agent identifier (e.g. 'claude-desktop', 'cursor', 'gpt-agent'). Used to tune the response shape. May be overridden by the x-agent-identity header. Self-asserted only in v1 — not used for auth or rate limiting."New value: +"Optional self-asserted calling-agent id — used for logging/tuning only, never auth"
      • changedInput schema / properties / query / description
        Previous value: -"The user's question about this business"New value: +"The visitor's question about this business"
      • addedInput schema / properties / query / maxLength
        Added value: +2000
      • changedInput schema / properties / slug / description
        Previous value: -"The business slug identifier (e.g. 'joes-pizza-austin'). Use search_businesses first if you don't know the slug."New value: +"Business slug identifier"
      • changedInput schema / properties / stage / description
        Previous value: -"Optional buyer stage. 'browsing' (default) — exploring options. 'comparing' — weighing alternatives. 'committing' — ready to act. When omitted, the server infers from query verbs (e.g. 'book'/'reserve' → committing)."New value: +"Optional buyer stage: browsing | comparing | committing"
    • Changedrequest_callback12 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / agent_id / description
        Previous value: -"Optional caller-asserted agent identifier; recorded for attribution"New value: +"Optional agent identifier"
      • removedInput schema / properties / contact
        Removed value: -{
        -  "additionalProperties": false,
        -  "properties": {
        -    "email": {
        -      "description": "end-user's email — at least one of email/phone required",
        -      "format": "email",
        -      "type": "string"
        -    },
        -    "name": {
        -      "description": "end-user's name",
        -      "maxLength": 120,
        -      "type": "string"
        -    },
        -    "phone": {
        -      "description": "end-user's phone number — at least one of email/phone required",
        -      "maxLength": 40,
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / contact_email
        Added value: +{
        +  "description": "End-user's email",
        +  "type": "string"
        +}
      • addedInput schema / properties / contact_name
        Added value: +{
        +  "description": "End-user's name",
        +  "maxLength": 120,
        +  "type": "string"
        +}
      • addedInput schema / properties / contact_phone
        Added value: +{
        +  "description": "End-user's phone",
        +  "maxLength": 40,
        +  "type": "string"
        +}
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Idempotency key — same key returns the same callback_request_id without dup-creating"New value: +"Idempotency key"
      • changedInput schema / properties / preferred_channel / description
        Previous value: -"channel the user prefers to be contacted on (default: any)"New value: +"Channel the user prefers (default: any)"
      • changedInput schema / properties / reason / description
        Previous value: -"Why the user wants the callback — passed verbatim to the business so they can prep"New value: +"Why the user wants the callback"
      • changedInput schema / properties / slug / description
        Previous value: -"business slug"New value: +"Business slug identifier"
      • changedInput schema / properties / urgency / description
        Previous value: -"how time-sensitive the request is (default: normal)"New value: +"How time-sensitive (default: normal)"
      • changedInput schema / required
        Previous value: -[
        -  "slug",
        -  "contact",
        -  "idempotency_key"
        -]New value: +[
        +  "slug",
        +  "idempotency_key"
        +]
    • Changedreserve_slot10 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / agent_id / description
        Added value: +"Optional agent identifier"
      • removedInput schema / properties / customer_contact / additionalProperties
        Removed value: -false
      • addedInput schema / properties / customer_contact / description
        Added value: +"Customer contact information"
      • addedInput schema / properties / idempotency_key / description
        Added value: +"Unique key for idempotent reservation"
      • addedInput schema / properties / slug / description
        Added value: +"Business slug identifier"
      • addedInput schema / properties / window_end / description
        Added value: +"Slot end (Unix seconds)"
      • addedInput schema / properties / window_end / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / window_start / description
        Added value: +"Slot start (Unix seconds)"
      • addedInput schema / properties / window_start / maximum
        Added value: +9007199254740991
    • Changedsearch_businesses3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / search / description
        Previous value: -"Search term — matched against business name, description, and services"New value: +"Search term — matched against business name, description, services, and category"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "category": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "location": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "slug": {
        +            "type": "string"
        +          },
        +          "website": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "slug",
        +          "name",
        +          "description",
        +          "category",
        +          "location",
        +          "website"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results"
        +  ],
        +  "type": "object"
        +}
    • Changedsubscribe_to_updates9 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / agent_id / description
        Previous value: -"Optional caller-asserted agent identifier; recorded for attribution"New value: +"Optional agent identifier"
      • changedInput schema / properties / contact_email / description
        Previous value: -"Email to subscribe — must be confirmed via the returned token before any updates send"New value: +"Email to subscribe — confirmed via returned token"
      • removedInput schema / properties / contact_email / format
        Removed value: -"email"
      • addedInput schema / properties / contact_email / minLength
        Added value: +1
      • addedInput schema / properties / idempotency_key
        Added value: +{
        +  "description": "Idempotency key",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / properties / slug / description
        Previous value: -"business slug"New value: +"Business slug identifier"
      • changedInput schema / properties / topics / description
        Previous value: -"Topic tags the user wants updates on (e.g., ['deals', 'schedule_changes', 'new_services'])"New value: +"Topic tags (e.g., ['deals', 'schedule_changes'])"
      • changedInput schema / required
        Previous value: -[
        -  "slug",
        -  "contact_email",
        -  "topics"
        -]New value: +[
        +  "slug",
        +  "contact_email",
        +  "topics",
        +  "idempotency_key"
        +]
  16. 10 tool updates
    • Changedget_availability5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / slug / description
        Previous value: -"Business slug identifier"New value: +"business slug"
      • removedInput schema / properties / window_end / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / window_start / maximum
        Removed value: -9007199254740991
      • changedOutput schema / (root)
        Previous value: -{
        -  "$schema": "http://json-schema.org/draft-07/schema#",
        -  "additionalProperties": false,
        -  "properties": {
        -    "generated_at": {
        -      "type": "number"
        -    },
        -    "slots": {
        -      "items": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "capacity": {
        -            "type": "number"
        -          },
        -          "end": {
        -            "type": "number"
        -          },
        -          "start": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "start",
        -          "end",
        -          "capacity"
        -        ],
        -        "type": "object"
        -      },
        -      "type": "array"
        -    },
        -    "source": {
        -      "type": "string"
        -    },
        -    "timezone": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "slots",
        -    "source",
        -    "timezone",
        -    "generated_at"
        -  ],
        -  "type": "object"
        -}New value: +null
    • Changedget_cancellation_policy3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / slug / description
        Previous value: -"Business slug identifier"New value: +"business slug"
      • changedOutput schema / (root)
        Previous value: -{
        -  "$schema": "http://json-schema.org/draft-07/schema#",
        -  "additionalProperties": false,
        -  "properties": {
        -    "guidance_for_agent": {
        -      "type": "string"
        -    },
        -    "has_policy": {
        -      "type": "boolean"
        -    },
        -    "policy_text": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    },
        -    "slug": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "slug",
        -    "has_policy",
        -    "policy_text",
        -    "guidance_for_agent"
        -  ],
        -  "type": "object"
        -}New value: +null
    • Changedget_credentials3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / slug / description
        Previous value: -"Business slug identifier"New value: +"business slug"
      • changedOutput schema / (root)
        Previous value: -{
        -  "$schema": "http://json-schema.org/draft-07/schema#",
        -  "additionalProperties": false,
        -  "properties": {
        -    "bonded": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    },
        -    "certifications": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "has_credentials": {
        -      "type": "boolean"
        -    },
        -    "insured": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    },
        -    "licenses": {
        -      "items": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "expires_at": {
        -            "type": "string"
        -          },
        -          "jurisdiction": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "number": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "name"
        -        ],
        -        "type": "object"
        -      },
        -      "type": "array"
        -    },
        -    "slug": {
        -      "type": "string"
        -    },
        -    "summary": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "slug",
        -    "has_credentials",
        -    "licenses",
        -    "insured",
        -    "bonded",
        -    "certifications",
        -    "summary"
        -  ],
        -  "type": "object"
        -}New value: +null
    • Changedget_quote6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / params / description
        Previous value: -"Optional service parameters (e.g., {size:'large'})"New value: +"optional service parameters (e.g., {size:'large'})"
      • removedInput schema / properties / params / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • changedInput schema / properties / service / description
        Previous value: -"Requested service name to quote"New value: +"requested service name"
      • changedInput schema / properties / slug / description
        Previous value: -"Business slug identifier"New value: +"business slug"
      • changedOutput schema / (root)
        Previous value: -{
        -  "$schema": "http://json-schema.org/draft-07/schema#",
        -  "additionalProperties": false,
        -  "properties": {
        -    "quote": {
        -      "anyOf": [
        -        {
        -          "additionalProperties": false,
        -          "properties": {
        -            "basis": {
        -              "enum": [
        -                "pricing_json_v2",
        -                "llm_estimate"
        -              ],
        -              "type": "string"
        -            },
        -            "confidence": {
        -              "enum": [
        -                "exact",
        -                "range",
        -                "estimate"
        -              ],
        -              "type": "string"
        -            },
        -            "currency": {
        -              "type": "string"
        -            },
        -            "disclaimer": {
        -              "type": "string"
        -            },
        -            "high": {
        -              "type": "number"
        -            },
        -            "low": {
        -              "type": "number"
        -            }
        -          },
        -          "required": [
        -            "low",
        -            "high",
        -            "currency",
        -            "confidence",
        -            "basis"
        -          ],
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    },
        -    "reason": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "quote"
        -  ],
        -  "type": "object"
        -}New value: +null
    • Changedinitiate_handoff10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / agent_id
        Removed value: -{
        -  "description": "Optional agent identifier",
        -  "type": "string"
        -}
      • removedInput schema / properties / idempotency_key
        Removed value: -{
        -  "description": "Unique key for idempotent handoff",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • removedInput schema / properties / message
        Removed value: -{
        -  "description": "Message body for human-mode notification",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • removedInput schema / properties / mode / description
        Removed value: -"Handoff mode: human (SMS/email) or agent (continuation URL)"
      • addedInput schema / properties / payload
        Added value: +{
        +  "additionalProperties": {},
        +  "type": "object"
        +}
      • removedInput schema / properties / purpose
        Removed value: -{
        -  "description": "Purpose description for agent-mode continuation",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • removedInput schema / properties / reservation_id / description
        Removed value: -"Optional link to a prior reservation"
      • removedInput schema / properties / slug / description
        Removed value: -"Business slug identifier"
      • changedInput schema / required
        Previous value: -[
        -  "slug",
        -  "mode",
        -  "idempotency_key"
        -]New value: +[
        +  "slug",
        +  "mode",
        +  "payload"
        +]
    • Changedquery_business_agent6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / agent_id / description
        Previous value: -"Optional self-asserted calling-agent id — used for logging/tuning only, never auth"New value: +"Optional caller-asserted agent identifier (e.g. 'claude-desktop', 'cursor', 'gpt-agent'). Used to tune the response shape. May be overridden by the x-agent-identity header. Self-asserted only in v1 — not used for auth or rate limiting."
      • changedInput schema / properties / query / description
        Previous value: -"The visitor's question about this business"New value: +"The user's question about this business"
      • removedInput schema / properties / query / maxLength
        Removed value: -2000
      • changedInput schema / properties / slug / description
        Previous value: -"Business slug identifier"New value: +"The business slug identifier (e.g. 'joes-pizza-austin'). Use search_businesses first if you don't know the slug."
      • changedInput schema / properties / stage / description
        Previous value: -"Optional buyer stage: browsing | comparing | committing"New value: +"Optional buyer stage. 'browsing' (default) — exploring options. 'comparing' — weighing alternatives. 'committing' — ready to act. When omitted, the server infers from query verbs (e.g. 'book'/'reserve' → committing)."
    • Changedrequest_callback12 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / agent_id / description
        Previous value: -"Optional agent identifier"New value: +"Optional caller-asserted agent identifier; recorded for attribution"
      • addedInput schema / properties / contact
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "email": {
        +      "description": "end-user's email — at least one of email/phone required",
        +      "format": "email",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "end-user's name",
        +      "maxLength": 120,
        +      "type": "string"
        +    },
        +    "phone": {
        +      "description": "end-user's phone number — at least one of email/phone required",
        +      "maxLength": 40,
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / contact_email
        Removed value: -{
        -  "description": "End-user's email",
        -  "type": "string"
        -}
      • removedInput schema / properties / contact_name
        Removed value: -{
        -  "description": "End-user's name",
        -  "maxLength": 120,
        -  "type": "string"
        -}
      • removedInput schema / properties / contact_phone
        Removed value: -{
        -  "description": "End-user's phone",
        -  "maxLength": 40,
        -  "type": "string"
        -}
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Idempotency key"New value: +"Idempotency key — same key returns the same callback_request_id without dup-creating"
      • changedInput schema / properties / preferred_channel / description
        Previous value: -"Channel the user prefers (default: any)"New value: +"channel the user prefers to be contacted on (default: any)"
      • changedInput schema / properties / reason / description
        Previous value: -"Why the user wants the callback"New value: +"Why the user wants the callback — passed verbatim to the business so they can prep"
      • changedInput schema / properties / slug / description
        Previous value: -"Business slug identifier"New value: +"business slug"
      • changedInput schema / properties / urgency / description
        Previous value: -"How time-sensitive (default: normal)"New value: +"how time-sensitive the request is (default: normal)"
      • changedInput schema / required
        Previous value: -[
        -  "slug",
        -  "idempotency_key"
        -]New value: +[
        +  "slug",
        +  "contact",
        +  "idempotency_key"
        +]
    • Changedreserve_slot10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / agent_id / description
        Removed value: -"Optional agent identifier"
      • addedInput schema / properties / customer_contact / additionalProperties
        Added value: +false
      • removedInput schema / properties / customer_contact / description
        Removed value: -"Customer contact information"
      • removedInput schema / properties / idempotency_key / description
        Removed value: -"Unique key for idempotent reservation"
      • removedInput schema / properties / slug / description
        Removed value: -"Business slug identifier"
      • removedInput schema / properties / window_end / description
        Removed value: -"Slot end (Unix seconds)"
      • removedInput schema / properties / window_end / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / window_start / description
        Removed value: -"Slot start (Unix seconds)"
      • removedInput schema / properties / window_start / maximum
        Removed value: -9007199254740991
    • Changedsearch_businesses3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / search / description
        Previous value: -"Search term — matched against business name, description, services, and category"New value: +"Search term — matched against business name, description, and services"
      • changedOutput schema / (root)
        Previous value: -{
        -  "$schema": "http://json-schema.org/draft-07/schema#",
        -  "additionalProperties": false,
        -  "properties": {
        -    "results": {
        -      "items": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "category": {
        -            "anyOf": [
        -              {
        -                "type": "string"
        -              },
        -              {
        -                "type": "null"
        -              }
        -            ]
        -          },
        -          "description": {
        -            "anyOf": [
        -              {
        -                "type": "string"
        -              },
        -              {
        -                "type": "null"
        -              }
        -            ]
        -          },
        -          "location": {
        -            "anyOf": [
        -              {
        -                "type": "string"
        -              },
        -              {
        -                "type": "null"
        -              }
        -            ]
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "slug": {
        -            "type": "string"
        -          },
        -          "website": {
        -            "anyOf": [
        -              {
        -                "type": "string"
        -              },
        -              {
        -                "type": "null"
        -              }
        -            ]
        -          }
        -        },
        -        "required": [
        -          "slug",
        -          "name",
        -          "description",
        -          "category",
        -          "location",
        -          "website"
        -        ],
        -        "type": "object"
        -      },
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "results"
        -  ],
        -  "type": "object"
        -}New value: +null
    • Changedsubscribe_to_updates9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / agent_id / description
        Previous value: -"Optional agent identifier"New value: +"Optional caller-asserted agent identifier; recorded for attribution"
      • changedInput schema / properties / contact_email / description
        Previous value: -"Email to subscribe — confirmed via returned token"New value: +"Email to subscribe — must be confirmed via the returned token before any updates send"
      • addedInput schema / properties / contact_email / format
        Added value: +"email"
      • removedInput schema / properties / contact_email / minLength
        Removed value: -1
      • removedInput schema / properties / idempotency_key
        Removed value: -{
        -  "description": "Idempotency key",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • changedInput schema / properties / slug / description
        Previous value: -"Business slug identifier"New value: +"business slug"
      • changedInput schema / properties / topics / description
        Previous value: -"Topic tags (e.g., ['deals', 'schedule_changes'])"New value: +"Topic tags the user wants updates on (e.g., ['deals', 'schedule_changes', 'new_services'])"
      • changedInput schema / required
        Previous value: -[
        -  "slug",
        -  "contact_email",
        -  "topics",
        -  "idempotency_key"
        -]New value: +[
        +  "slug",
        +  "contact_email",
        +  "topics"
        +]

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    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.
    1
    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
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A3.9/5.0
Disambiguation3/5

The booking and quote lifecycles are generally separated well, but some boundaries are blurry: query_business_agent explicitly covers 'policies,' overlapping with get_cancellation_policy, and initiate_handoff/request_callback both route notifications through lead routing. The detailed descriptions help, but an agent could still misselect between those pairs.

Naming Consistency5/5

Every tool uses snake_case with an imperative verb + noun object pattern (get_*, list_*, request_*, reserve_*, confirm_*, submit_*, etc.). The few longer names like get_payment_handoff_url and subscribe_to_updates still follow the same predictable style.

Tool Count4/5

Fifteen tools is at the high end of the typical range, but each maps to a distinct workflow step across discovery, quotes, booking, handoff, and subscription. It feels slightly heavy because several notification/contact tools could potentially be consolidated, but it is not bloated.

Completeness3/5

The quote and booking flows are well covered from search through reserve and confirm, but there is no way to cancel or reschedule a booking, and no direct booking-status lookup beyond repeating confirm_booking. Discovery, payment handoff, and subscription flows are otherwise reasonably complete.