Skip to main content
Glama

Server Details

Johnson Bros. Plumbing: check coverage, services, pricing, availability, and book by SMS.

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

TDQS

A4.1/5.0

Scored across 16 tools

Disambiguation4/5

Tools are mostly well-separated by stage and resource, with explicit disambiguation guidance (e.g., get_quote vs get_services_pricing, search vs fetch, request_callback vs request_out_of_area_callback). A few pairs still overlap conceptually—business_info/get_services_pricing/get_quote and customer_lookup/search_service_history—but the descriptions give clear boundaries.

Naming Consistency4/5

All tool names use snake_case, which is consistent. Most follow a verb_noun pattern, but a few are noun phrases (business_info, customer_lookup, emergency_help) or single verbs (fetch, search), creating minor deviations from the otherwise predictable convention.

Tool Count4/5

16 tools is slightly above the ideal 3–15 range but feels well-scoped for a booking and customer-service domain, with each tool handling a distinct stage or information need. No obvious redundant or filler tools.

Completeness3/5

The surface covers discovery, service-area check, pricing, availability, booking request/confirmation, customer lookup/history, emergency guidance, and callbacks, which is strong lifecycle coverage. However, there is no explicit cancel/reschedule or appointment-management tool, leaving a notable gap for post-booking workflows.

Available Tools

16 tools
business_infoGet Business InformationA
Read-onlyIdempotent
Inspect

Start here for a self-contained Johnson Bros. business briefing: locations, services, hours, service area, dispatch fee, pricing and booking policies, credentials, payment methods, and how to get further information through MCP without browsing the website. Not live availability or private customer records.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
hoursYes
bookingYes
successYes
businessYes
agent_contextNo
facts_updatedNo
review_sandboxNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive and closed-world, so the safety profile is covered. The description adds real behavioral value by characterizing the content as static ('self-contained', 'without browsing the website') and by stating a negative boundary (not live availability, not private records), telling the agent this is a safe orientation call rather than a live-data probe.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence leads with 'Start here' and the payload scope, then closes with the exclusion. The middle content list is long but each item is load-bearing for routing decisions; nothing is redundant with the title or annotations.

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?

An output schema exists, so return-value detail is unnecessary, and the description still tells the agent what the return covers and, importantly, what it does not cover. For a zero-param entry-point tool among 15 siblings, the routing boundary and content inventory make this 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 tool takes zero parameters, so there is nothing schema-wise for the description to compensate for; the 0-parameter baseline of 4 applies. The description correctly implies a parameterless, whole-business call by describing the payload as one self-contained briefing.

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 ('Get Business Information' / 'self-contained business briefing') and enumerates the concrete content buckets: locations, services, hours, service area, dispatch fee, pricing, booking policies, credentials, payment methods. The enumeration also implicitly separates it from siblings like get_services_pricing and check_service_area, which cover only a subset.

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?

'Start here' establishes this as the entry-point tool, and the closing clause 'Not live availability or private customer records' explicitly rules out the domains owned by get_availability and customer_lookup. No sibling is named directly, so routing is inferred rather than stated, which keeps it 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.

check_service_areaCheck Service AreaA
Read-onlyIdempotent
Inspect

Check a service ZIP, or a Massachusetts town, city or neighborhood name on its own, against the coverage database for Norfolk, Suffolk and Plymouth counties. Answer "do you serve ?" directly with town (no ZIP needed): covered = yes; partially_covered = yes for the listed covered_zips, confirm the customer's ZIP only then; outside_service_area = not in the automatic-booking area (offer request_out_of_area_callback and the office number); unknown_town = ask for the ZIP. During new-customer intake run this check silently; never announce that you are checking the service area. Unavailable coverage is unknown, not outside-area. This never proves that a particular appointment is available.

NameRequiredDescriptionDefault
zipNoFive-digit service ZIP (ZIP+4 accepted). Town name alone is enough; pass a ZIP only when the town result is partially_covered or unknown_town, or when the customer already gave the full address. Send zip or town; an empty call returns LOCATION_REQUIRED.
townNoMassachusetts town, city or neighborhood name on its own, e.g. "Quincy" or "Dorchester". Answers "do you serve <town>?" directly; do not demand a ZIP first.
stateNoTwo-letter state code; defaults to MA. Any state other than MA is outside the service area.

Output Schema

NameRequiredDescription
zipNo
townNo
errorNo
statusNo
messageNo
successYes
countiesNo
next_stepNo
error_codeNo
matched_byNo
covered_zipsNoTown lookups only: the town ZIPs inside the automatic-booking area.
outside_zipsNoTown lookups only: the town ZIPs outside the automatic-booking area.
resolved_townNoTown lookups only: the Massachusetts place the name was matched to.
missing_fieldsNo
review_sandboxNo
in_service_areaNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already establish that this is a read-only, idempotent, non-destructive lookup, and the description adds important behavioral context beyond that: unknown coverage is not outside-area, the result never proves appointment availability, and intake checks should be silent. These are meaningful constraints an agent would not infer from the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and every clause carries operational meaning, but it is dense and packs multiple decision rules into long sentences. It is appropriately sized for the complexity, though slightly tighter structure would improve readability.

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 tool has an output schema, complete parameter descriptions, and clear annotations, so the description need not explain return values. It completes the contextual picture by defining outcome handling, silent intake behavior, and the relationship to out-of-area callback flow.

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

Parameters4/5

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

Schema description coverage is 100%, so the parameter-level baseline is 3. The description adds useful semantic guidance by emphasizing that a town name alone is sufficient and that a ZIP should only be used when the town result is partially_covered or unknown_town, or when the customer already provided a full address.

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

Purpose5/5

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

The description states a specific verb and resource: checking a service ZIP or Massachusetts town/city/neighborhood against a defined coverage database for Norfolk, Suffolk and Plymouth counties. It also distinguishes the tool from the callback sibling by naming request_out_of_area_callback for outside-service-area cases.

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

Usage Guidelines5/5

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

It gives explicit operational rules for each outcome: covered means yes, partially_covered means yes for listed ZIPs then confirm ZIP, outside_service_area means offer request_out_of_area_callback and the office number, and unknown_town means ask for ZIP. It also states when to run it silently during new-customer intake and when not to treat unknown coverage as outside-area.

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

confirm_bookingConfirm a Booking with the SMS CodeA
DestructiveIdempotent
Inspect

Use this after the customer supplies the six-digit SMS code from request_booking. It can create customer and job records or an office-review lead, notify the office, and send transactional customer or referral-status texts. Only status:confirmed with booked:true means the visit is scheduled. status:callback_pending with booked:false means the office must follow up and must never be described as an appointment. Replaying the same valid confirmation is safe and returns the stored result.

NameRequiredDescriptionDefault
codeYesThe 6-digit code the customer received by SMS after request_booking. Ask the customer for it; never guess or reuse a customer_lookup code.
booking_idYesThe booking_id (UUID) returned by request_booking for this pending booking.

Output Schema

NameRequiredDescription
bookedYes
statusYes
messageYes
successYes
replayedNo
timezoneNo
next_stepYes
error_codeNo
needs_manualYes
service_cityNo
customer_nameNo
scheduled_endNo
business_phoneYes
review_sandboxNo
scheduled_startNo
location_summaryNo
attempts_remainingNo
business_phone_hrefYes
confirmation_numberNo
service_descriptionNo
formatted_arrival_windowNo

TDQS

A4.4/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false, destructiveHint=true, idempotentHint=true, openWorldHint=true; the description adds substantial context beyond that: it creates customer/job records or an office-review lead, notifies the office, sends transactional and referral-status texts, and states that replaying a valid confirmation is safe (consistent with idempotentHint). It also defines what status:confirmed/booked:true and status:callback_pending/booked:false mean operationally, which no annotation conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the trigger condition ('Use this after...') before the behavioral and status semantics, and every sentence carries distinct information. It is dense but not redundant, though the status semantics could be marginally tightened.

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 confirmation tool with an output schema, the description covers side effects, idempotency behavior, and the two outcome statuses an agent must interpret correctly. Nothing essential for correct invocation or interpretation of results is missing.

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

Parameters3/5

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

Schema description coverage is 100%, with both booking_id and code fully documented including their format and origin, so the baseline is 3. The description adds no additional parameter syntax or constraint 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+resource ('Confirm a Booking') and immediately ties it to the six-digit SMS code produced by request_booking. An agent can distinguish it from request_booking, request_callback, and customer_lookup without opening any schema.

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

Usage Guidelines4/5

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

Explicitly gates usage on the customer supplying the six-digit SMS code from request_booking, and distinguishes this code from a customer_lookup code in the schema. It does not name explicit when-not conditions or alternative siblings, but the prerequisite and status-driven follow-up rules give clear operational guidance.

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

customer_lookupVerify Returning Customer and Retrieve HistoryA
Destructive
Inspect

For a returning customer: first call with phone and confirmed:true to request a code. Next call with the returned challenge_id and customer-supplied code. Saved details and recent service history are returned only after successful verification. If lookup fails, offer the new-customer form or office assistance. Never claim a match from the initial response.

NameRequiredDescriptionDefault
codeNoThe 6-digit verification code the customer received by SMS; send it together with challenge_id. Keep it separate from booking codes.
phoneYesPhone number on the customer account, any common US format; the verification code is texted to it.
confirmedYesTrue only after the customer agreed to receive a verification code at this number.
challenge_idNoThe challenge_id returned by the first call; send it together with code on the second call.

Output Schema

NameRequiredDescription
statusYes
historyNo
messageYes
successYes
customerNo
next_stepYes
record_idNoSaved office lead reference, when applicable.
request_idYesPublic operation receipt for support; never a provider customer ID.
challenge_idNo
history_statusNo
review_sandboxNo

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the annotations, the description discloses the crucial behavioral fact that sensitive data is only returned after successful verification and that the first response must not be treated as a match. It does not explain the destructive/openWorld annotation implications (e.g. SMS cost, rate limits, why the tool is flagged destructive), leaving a modest gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the primary workflow and followed by the failure and guardrail rules. Every sentence carries operational information, though the final two sentences could be merged without loss.

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 a full output schema and 100% parameter coverage, the description covers the workflow, guardrails, and fallback. The only omission is guidance on repeated attempts or code expiry, which matters for a destructive-flagged, non-idempotent tool.

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 field meanings are already documented, but the description adds real value by mapping parameters to call order: phone+confirmed on the first call, challenge_id+code on the second. That sequencing is not inferable from the schema alone.

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 concrete two-step verification workflow for looking up a returning customer, naming both the action (request code, then verify) and the resource (customer details and service history). It clearly distinguishes this tool from siblings like search_service_history or open_customer_portal, which the agent could otherwise confuse with a lookup.

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

Usage Guidelines5/5

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

It gives explicit sequencing ('first call' / 'next call'), the precondition ('For a returning customer'), and a failure path ('offer the new-customer form or office assistance'), plus a guardrail ('Never claim a match from the initial response'). This tells the agent both when to use the tool and how to behave on the negative path.

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

emergency_helpEmergency Plumbing HelpA
Read-onlyIdempotent
Inspect

Use this immediately when the user describes an urgent plumbing safety or damage situation. Give bounded mitigation guidance and direct them to call Johnson Bros.; for gas, fire, or immediate danger, direct them to leave and call 911 first. Do not treat this tool as monitored emergency dispatch or create an online emergency appointment.

WHEN TO USE: Immediately when a customer mentions an emergency situation like:

  • Burst pipe, flooding, or water damage

  • Gas smell or suspected gas leak (CRITICAL - may need to call 911)

  • Sewage backup or overflow

  • No water or sudden loss of water

  • Water heater leaking or not working

PRIORITY ORDER:

  1. First ensure customer safety (especially for gas leaks)

  2. Provide immediate mitigation steps (how to shut off water, etc.)

  3. Then tell the user to call Johnson Bros. for emergency service

RETURNS: Step-by-step immediate actions, safety warnings, things NOT to do, urgency level, and whether emergency dispatch is recommended.

IMPORTANT: For gas leaks, always advise leaving the house and calling 911 first.

NameRequiredDescriptionDefault
emergency_typeYesType of plumbing emergency (required). Examples: 'burst pipe', 'flooding', 'gas leak', 'sewage backup', 'no hot water', 'no water'
additional_detailsNoAdditional context about the emergency (optional). Include location, duration, actions already taken.

Output Schema

NameRequiredDescription
errorNo
successYes
call_nowNo
urgency_levelNo
emergency_typeNo
recommendationNo
review_sandboxNo
immediate_stepsNo
safety_warningsNo
emergency_contactNo

TDQS

A4.7/5.0
Behavior5/5

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

The description aligns with annotations (readOnly, idempotent) and adds behavioral context: it describes the nature of the tool as giving bounded guidance and the output through the 'RETURNS' section. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a clear directive, specific conditions, and a 'RETURNS' summary. It avoids unnecessary verbosity while covering essential aspects.

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 is complete for the tool's scope: it covers purpose, usage, parameters, output, and edge cases (gas/fire). Given the tool's simplicity and existing schema coverage, no critical information is missing.

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

Parameters3/5

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

The schema already provides descriptions for both parameters, including examples for emergency_type and guidance for additional_details. The description does not add further semantic detail beyond the schema, so it meets the baseline without enhancement.

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

Purpose5/5

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

The description clearly states a specific verb ('Use this immediately') and the resource ('urgent plumbing safety or damage situation'), and distinguishes it from sibling tools like booking and info tools by focusing on emergency guidance. It also provides explicit conditions for gas/fire/immediate danger, making the purpose unambiguous.

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

Usage Guidelines5/5

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

The description explicitly states when to use (for urgent plumbing safety/damage) and what to do (bounded mitigation guidance, direct to call Johnson Bros., and for gas/fire/immediate danger, leave and call 911). It also excludes using it for monitored emergency dispatch or online appointment creation, clarifying boundaries relative to siblings.

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

fetchFetch Johnson Bros. DocumentA
Read-onlyIdempotent
Inspect

Use this to read the full text of a document returned by search. Takes the exact id from a search result. Returns public business information only -- it never returns customer records.

NameRequiredDescriptionDefault
idYesDocument id from a search result, e.g. 'faq:pricing-service-fee'

Output Schema

NameRequiredDescription
idNo
urlNo
textNo
errorNo
titleNo
successYes
metadataNo
error_codeNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe read operation. The description adds the valuable constraint that it never returns customer records, which is a significant behavioral limit not evident from annotations. However, it does not disclose any other behaviors like rate limits or error handling. No contradiction; it aligns with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loads the primary action and input requirement, and includes a crucial limitation in the second sentence. Every word earns its place with no redundancy.

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 is simple (1 param, no nesting) and the schema and annotations cover safety and parameters. The description adds the key scoping that it only returns public business info, not customer records. With an output schema present, the return format is handled. Minor gaps like whether it can return null or how errors are presented are not critical given the 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?

The schema description provides 100% coverage for the single parameter 'id', clearly explaining it is a document id from a search result with an example. The description restates the requirement to use the exact id, which adds minimal extra value but is not harmful. Baseline 3 is appropriate because the schema already carries the explanatory burden.

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

Purpose4/5

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

The description clearly states the verb 'read' and the resource 'full text of a document', and specifies the input is the exact id from a search result. It distinguishes from siblings like search (which returns results) and business_info (which likely returns broader info), but does not name these alternatives explicitly.

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: use when you have a document id from a search result. It implies not to use for customer records by stating it never returns them. It does not explicitly mention alternative tools, but the context is sufficient given the sibling list.

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

get_availabilityGet Open Booking WindowsA
Read-onlyIdempotent
Inspect

Use this when the user wants live Johnson Bros. appointment availability. Include zip and any known town/state for a customer booking inquiry. Outside-area or unresolved locations receive no windows. Without a location, this returns general capacity only, not eligibility to book; coverage_status is not_checked. Never call for a customer already found outside coverage. Do not promise or create an appointment; use request_booking and confirm_booking.

NameRequiredDescriptionDefault
zipNoService ZIP when known. Always include the customer location for a booking inquiry; outside-area requests receive no windows.
daysNoHow many calendar days to search from start_date (or today), 1 to 14; default 7.
townNoService town when known, e.g. "Quincy", sent alongside zip. A town without a ZIP returns needs_more_information; use check_service_area for town-only coverage questions.
stateNoTwo-letter state code, normally MA; send only together with zip or town.
start_dateNoFirst day to search as YYYY-MM-DD in the company time zone; omit for today. Past dates are rejected.
time_preferenceNoPart of day to keep: any (default), morning, afternoon or evening.any

Output Schema

NameRequiredDescription
statusNo
privacyYes
successYes
windowsYes
has_moreNo
timezoneYes
next_stepNo
error_codeNo
booking_flowYes
open_windowsYes
total_windowsYes
missing_fieldsNo
requested_daysYes
review_sandboxNo
coverage_statusNo
time_preferenceYes
returned_windowsNo
total_matching_windowsNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), but the description goes further and discloses outcome behavior not present in any structured field: outside-area or unresolved locations receive no windows, and a location-less call returns general capacity only with coverage_status not_checked. These failure-mode semantics are exactly what an agent needs to avoid misreporting availability as bookability.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the trigger condition, then constraints, then exclusions; every clause carries real routing or behavior information and none is filler. It is dense to the point of being slightly clipped (three constraint sentences stacked without connective tissue), which keeps it just below 5.

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?

An output schema exists, so return-value documentation is unnecessary; the description instead supplies the coverage/eligibility caveats and the routing to sibling tools that the schema cannot express. For a 6-parameter, zero-required lookup tool with a rich schema, nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3; the description earns an extra point by stating which parameters matter most for the primary use case ('Include zip and any known town/state for a customer booking inquiry') and the consequence of omitting location. It does not add format or syntax detail beyond the schema, so it stops short of 5.

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 (retrieve live Johnson Bros. appointment availability) and immediately distinguishes itself from the write-path siblings by warning not to create or promise appointments and pointing to request_booking/confirm_booking. An agent can tell this apart from check_service_area and the booking tools without opening any schema.

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?

Gives explicit when-to-use (customer booking inquiry with a location), when-not (never for a customer already found outside coverage), and named alternatives (request_booking, confirm_booking, plus check_service_area for town-only questions in the schema). No condition is left to inference.

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

get_quoteGet Plumbing Service QuoteA
Read-onlyIdempotent
Inspect

Use this when the user wants a non-binding estimate for a specific plumbing issue. Returns a price range, typical duration, and next step. Do not present the range as a guaranteed repair price; final pricing is confirmed on-site before work begins.

WHEN TO USE: When a customer asks "How much does it cost?", "What's the price?", or wants to know pricing before booking. Use this early in the conversation to set expectations.

PRICING NOTES:

  • Estimates are ranges; final price depends on on-site assessment

  • Do not invent urgency, after-hours, or commercial surcharges

  • The office or technician confirms any timing- or property-related pricing before work

  • The $99 service fee covers sending a technician out to diagnose the problem and give you an estimate before repair work starts. If you approve the repair, we waive the service fee and you pay only the price the technician quoted. If you decline the repair, the $99 service fee is due.

WORKFLOW:

  1. Use this tool when customer asks about pricing

  2. Share the estimate with appropriate caveats

  3. If they want to proceed, use get_availability, request_booking, and confirm_booking

RETURNS: Service name, price range (min/max in USD), estimated duration, urgency notes, and suggested next steps.

NameRequiredDescriptionDefault
urgencyNoHow urgent is the repair?
service_typeYesType of plumbing service (required). Examples: 'drain cleaning', 'water heater repair', 'toilet repair'
property_typeNoType of property (default: 'residential')
issue_descriptionYesDescription of the plumbing problem (required). Be specific about symptoms and location.

Output Schema

NameRequiredDescription
errorNo
notesNo
serviceNo
successYes
next_stepNo
error_codeNo
next_stepsNo
descriptionNo
service_feeNo
property_typeNo
urgency_levelNo
review_sandboxNo
service_supportedNo
estimated_durationNo
estimated_price_rangeNo

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent and non-destructive, so the remaining burden is policy disclosure, which the description carries: the estimate is non-binding, final pricing is confirmed on-site, surcharges must not be invented, and the $99 fee is waived on approval. These are substantive operational facts an agent could not infer from the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core scope and the non-binding caveat are front-loaded, and the labeled sections make the policy and workflow easy to scan. The $99 service-fee paragraph is longer than strictly needed for tool selection, but it is genuine customer-facing policy rather than filler.

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, the description need not restate return values, and it still summarizes them. Combined with complete annotation coverage and a fully described four-parameter schema, an agent has everything needed to select and invoke this 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 coverage is 100%, so the schema already documents all four parameters including the urgency and property_type enums; the description adds no format or selection guidance beyond the indirect warning against inventing urgency or commercial surcharges. This is the baseline case 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: a 'non-binding estimate for a specific plumbing issue', and enumerates the return contents (price range, duration, next step). It is clearly distinct from booking tools, but it never distinguishes itself from the sibling get_services_pricing, which also covers pricing, leaving that ambiguity for the agent to resolve.

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

Usage Guidelines5/5

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

It gives explicit trigger conditions ('How much does it cost?', 'What's the price?'), the conversational timing ('use this early'), and a workflow that names the follow-up alternatives (get_availability, request_booking, confirm_booking). It also states a usage restriction: do not present the range as a guaranteed price.

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

get_services_pricingGet Services & PricingA
Read-onlyIdempotent
Inspect

Use this when the user wants to browse Johnson Bros. services or general non-binding price ranges. Do not use it for an issue-specific estimate; use get_quote. Final pricing is confirmed on-site before work begins.

NameRequiredDescriptionDefault
searchNoSearch term, e.g. "water heater", "drain"
categoryNoFilter by category: 'emergency', 'maintenance', 'repair', 'installation', 'specialty'

Output Schema

NameRequiredDescription
errorNo
successYes
servicesYes
next_stepNo
categoriesYes
error_codeNo
service_feeYes
review_sandboxNo
total_servicesYes
service_supportedNo
pricing_disclaimerYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior the annotations cannot: prices are non-binding and final pricing is confirmed on-site before work begins. It stops short of return-format or coverage scope details, but the added pricing caveat is material.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: use case, exclusion with alternative, and a pricing caveat. The routing information 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?

An output schema exists (return values need no prose) and annotations cover the safety profile, so the description's job is usage framing — which it fully delivers via the trigger, exclusion, and pricing caveat.

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 both parameters (search, category) are already documented with examples and enum-like values. The description adds no syntax or filtering guidance beyond that, 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?

Uses a specific verb+resource ('browse services or general non-binding price ranges') and explicitly separates itself from the estimate-oriented sibling get_quote. An agent can route between this and get_quote without opening either schema.

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?

States both the positive trigger (user wants to browse services or price ranges) and the exclusion ('Do not use it for an issue-specific estimate; use get_quote'), naming the alternative outright. This is the explicit when/when-not/alternative pattern.

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

open_customer_portalBook a Visit or Search My Service HistoryA
Read-onlyIdempotent
Inspect

Use this when the customer wants to book Johnson Bros. service or search their own past visits. Opens a compact card that expands into a customer form without sending a message or creating a booking. History requires SMS verification and the customer card’s private, short-lived proof. Booking requires reviewing details and the customer-supplied SMS code.

NameRequiredDescriptionDefault
viewNoChoose booking for a new service visit, or history for the customer’s own previous and upcoming visits.booking

Output Schema

NameRequiredDescription
viewYes
messageYes
successYes
business_phoneYes
review_sandboxNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so safety is covered. The description adds valuable behavioral detail beyond that: it does not send a message or create a booking, and it discloses auth requirements for each path (SMS verification plus a private short-lived proof for history; SMS code and detail review for booking). The only gap is what happens after the form is submitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the usage trigger and then the behavior and auth requirements. No filler, though it could be slightly tighter by merging the booking/history requirement sentences.

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

Completeness4/5

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

Given one optional enum parameter, full schema coverage, and an output schema, the description covers when to invoke, what the tool does and does not do, and per-path auth requirements. It omits post-submission behavior and how it relates to sibling booking tools, which prevents a 5.

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% and the enum already documents 'booking' vs 'history'. The description mentions the two paths but doesn't add syntax or defaults beyond the schema, so baseline 3 is appropriate.

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 names a specific verb/resource ('book Johnson Bros. service or search their own past visits') and clarifies what the tool actually renders – a compact card that expands into a customer form. It distinguishes itself from siblings like request_booking and search_service_history by describing an interactive UI surface rather than a backend action.

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?

Clear when-to-use framing ('Use this when the customer wants to book... or search their own past visits') and it separates the two modes. It doesn't explicitly rule out when NOT to use this versus siblings like request_booking or customer_lookup, which keeps it 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.

request_bookingRequest a Booking (sends SMS confirmation code)A
Destructive
Inspect

Use this only after the user explicitly asks to start a Johnson Bros. booking and confirms their own contact details, service address, issue, and preferred windows. It sends a six-digit SMS code and does not schedule a visit. Do not claim an appointment exists until confirm_booking returns status:confirmed and booked:true.

NameRequiredDescriptionDefault
nameYesCustomer full name
emailNoCustomer email as given. Required when customer_type is new; optional for returning customers. Never invent it.
notesNoIssue description / anything the technician should know
phoneYesCustomer mobile number — receives the 6-digit confirmation code
addressYesFull service address: street, optional unit, city, two-letter state (default MA) and five-digit ZIP. The ZIP decides service-area eligibility; the booking is placed at this address.
serviceYesRequested service, e.g. "water heater replacement"
confirmedYesTrue only after the user explicitly asks to start this booking request and send the SMS code
customer_typeNoRequired for booking: answer to Have you used us before?
referral_codeNoReferral code the customer supplied, exactly as given; omit when none was offered.
heard_about_usNoRequired for new customers: where they found us
time_preferenceNoFallback time-of-day preference if none of the preferred windows is openany
preferred_windowsNoPreferred arrival windows from get_availability (start_time/end_time ISO strings)
promotion_review_requestedNoTrue only when the customer asked for a current promotion to be reviewed with this visit; the office reviews it, nothing is applied automatically.

Output Schema

NameRequiredDescription
errorNo
statusYes
successYes
next_stepYes
booking_idNo
error_codeNo
expires_atNo
code_sent_toNo
review_sandboxNo
in_service_areaNo
attempts_allowedNo
service_area_noticeNo
sandbox_verification_codeNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false and openWorldHint=true. The description goes further by disclosing the SMS-code side effect, asserting no visit is scheduled, and defining the correct post-call claim state until confirm_booking confirms. It does not mention rate limits or what happens on a repeated request, which keeps this from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the usage gate, each carrying distinct information: precondition, side effect/limitation, and the correctness guardrail. No filler or repetition of schema content.

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

Completeness4/5

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

For a 13-parameter mutation tool with an output schema, the description covers the critical workflow semantics an agent needs: when it is legal to call, what it actually does (SMS, no scheduling), and how to interpret downstream state. It omits any mention of prerequisite tools like get_availability/check_service_area that feed preferred_windows and address eligibility, which is a minor gap given the schema and output schema already carry much of the load.

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 every one of the 13 parameters is already documented in the input schema, including the nested address object, enum values, and the confirmed const:true guard. The description adds workflow meaning (what must be confirmed before calling) but no additional per-parameter syntax or format detail, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb+resource (request a booking), names the concrete side effect (sends a six-digit SMS code) and explicitly distinguishes it from scheduling ('does not schedule a visit'). It also clearly separates this tool from the sibling confirm_booking, so an agent can route correctly without opening either schema.

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?

Gives an explicit precondition ('only after the user explicitly asks to start a Johnson Bros. booking and confirms their own contact details, service address, issue, and preferred windows'), an exclusion ('does not schedule a visit'), and names the alternative/gate (confirm_booking returning status:confirmed and booked:true). Nothing is left to inference.

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

request_callbackRequest a Johnson Bros. CallbackA
Destructive
Inspect

Use this only after the user explicitly asks Johnson Bros. to call them about a plumbing need and provides their own contact details. This creates a callback lead, not an appointment, and can notify the office and send a transactional SMS acknowledgment. Do not use it for emergency dispatch; tell emergency users to call (617) 479-9911.

NameRequiredDescriptionDefault
nameYesCustomer full name, for example "Jane Smith"
emailNoCustomer email, only when the customer offered it; never invent one.
phoneYesCustomer phone number for the callback
urgencyNoHow soon the customer needs the call: routine (default), soon or urgent. A callback is never emergency dispatch; life-safety situations go through emergency_help first.routine
confirmedYesTrue only after the user explicitly asks Johnson Bros. to contact them
issue_descriptionYesShort description of the plumbing issue
preferred_callback_timeNoOptional preference such as "weekday morning"

Output Schema

NameRequiredDescription
statusYes
messageYes
successYes
next_stepYes
record_idNo
error_codeNo
request_idYes
phone_last4No
review_sandboxNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare the write/destructive, non-idempotent, open-world profile, so the bar is lower; the description still adds real substance by disclosing the side effects (office notification, transactional SMS acknowledgment) and clarifying that a lead is not an appointment. It does not address duplicate submissions or what data is persisted, which is the only remaining gap.

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, zero filler, and the hard precondition is front-loaded before the side effects and the emergency exclusion. Each sentence carries a distinct, load-bearing instruction.

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?

An output schema exists so return values need no explanation, and the description covers prerequisites, side effects, and the emergency escape hatch, which is sufficient for a 7-parameter lead-creation tool. The only omission is any routing cue versus the sibling request_out_of_area_callback, which matters given the open-world hint.

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 every parameter including the confirmed const and urgency enum is already documented in the schema itself. The description reinforces the confirmed precondition ('explicitly asks') and the ownership requirement on contact details, but adds no new syntax, format, or default semantics beyond what the schema provides. 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 and resource ('creates a callback lead, not an appointment') and immediately scopes it against the appointment flow and emergency dispatch. An agent can distinguish it from request_booking and emergency_help without opening either schema.

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

Usage Guidelines5/5

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

It gives an explicit precondition ('use this only after the user explicitly asks Johnson Bros. to call them and provides their own contact details') and an explicit exclusion with a redirect ('do not use it for emergency dispatch; tell emergency users to call (617) 479-9911'). This is textbook when/when-not/alternative guidance.

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

request_out_of_area_callbackRequest Out-of-Area Office CallbackA
DestructiveIdempotent
Inspect

Use as soon as a caller is found to be outside the automatic-booking service area and agrees to a call from the office. Requires name, phone, city, state, service ZIP, issue_description and confirmed:true. The server rechecks coverage: in_service_area means continue normal booking (no callback is created). For a Massachusetts address it flags the office to call back ASAP (status office_callback_requested); tell the caller the office will call them soon and that they are also welcome to call (617) 479-9911. Outside Massachusetts returns outside_massachusetts and creates nothing. It never books an appointment. Retries within 30 minutes return the same request (duplicate:true).

NameRequiredDescriptionDefault
nameYesCaller full first and last name
phoneYesCallback number. On phone calls the channel supplies the caller ID; confirm it with the caller.
addressYesService address: city, two-letter state and five-digit ZIP are required; street and unit are optional.
confirmedYesTrue only after the caller agreed to the office calling them back
issue_descriptionYesWhat the caller needs, in their words

Output Schema

NameRequiredDescription
bookedYes
statusYes
messageYes
successYes
duplicateNoTrue when this callback was already requested recently; no second office task was created.
next_stepYes
record_idNoSaved office lead reference, when a callback was requested.
error_codeNo
request_idYesPublic operation receipt for support; never a provider customer ID.
review_sandboxNo
in_service_areaYes
in_massachusettsNo
coverage_verifiedNoFalse when the coverage database could not be read; the office will confirm.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare idempotentHint, destructiveHint, and openWorldHint, but the description goes well beyond them: it discloses the server-side coverage recheck, the three outcome states (in_service_area, office_callback_requested, outside_massachusetts), that nothing is created outside Massachusetts, that no appointment is ever booked, and the 30-minute duplicate window. It also supplies caller-facing script content, which annotations cannot 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?

Dense but well-structured: trigger condition first, then required inputs, then outcome branching, then the idempotency caveat. Every sentence carries operational information and nothing is padding.

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?

Despite a nested 5-parameter schema and a mutation side effect, the description covers the trigger, required inputs, all outcome branches, and duplicate behavior. An output schema exists, so return-value documentation is unnecessary, and nothing an agent needs to call or report back correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the params are already documented, and the description's parameter content is mostly a restatement of the required list. It adds only the ordering nuance that confirmed:true must come after the caller agrees and that the ZIP drives the coverage and Massachusetts determination, neither of which is a large semantic addition.

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 ('Request Out-of-Area Office Callback') and immediately scopes it to callers outside the automatic-booking service area who agree to an office call. An agent can distinguish this from siblings like request_callback, check_service_area, or request_booking without opening a schema.

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 first sentence gives an explicit trigger condition ('as soon as a caller is found to be outside the automatic-booking service area and agrees to a call'), and it routes the in-area case back to normal booking ('in_service_area means continue normal booking (no callback is created)'). This is explicit when-to-use and when-not-to-use guidance.

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

search_service_historySearch My Verified Service HistoryA
Read-onlyIdempotent
Inspect

Use this from the customer card or browser bridge after customer_lookup verifies SMS and supplies private proof. Shared agents must use the history returned by customer_lookup or open the customer portal; an MCP connection alone never authorizes history. Searches the authenticated account records available from the customer portal by repair keywords, date text, and status. No customer IDs or portal bearer tokens are accepted. If verification expires, use customer_lookup again. Results cover only the records loaded by the portal, not a guaranteed lifetime archive.

NameRequiredDescriptionDefault
limitNoMaximum records to return, from 1 to 50.
queryNoRepair keywords or date text, for example drain or 2025. Empty searches all available records.
statusNoFilter the verified customer’s available visits by status.all
history_access_tokenNoPrivate verification proof attached automatically by the customer card or browser bridge. Never ask the customer for it or invent it.

Output Schema

NameRequiredDescription
historyYes
messageYes
successYes
review_sandboxNo
records_searchedYes
returned_recordsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds real behavioral context beyond them: the authorization model, that no customer IDs or portal bearer tokens are accepted, that results are limited to records the portal has loaded rather than a lifetime archive, and what to do when verification lapses. That is exactly the extra layer annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the authorization gate, then scope, then failure mode; every sentence is substantive and none is filler. The authorization theme is restated a few times ('an MCP connection alone never authorizes history', 'no customer IDs or portal bearer tokens'), which is defensible emphasis for a high-risk operation but trims a point for density.

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, the description need not explain return values, and it covers everything else an agent needs: who may call it, what proof is required, what the result set covers, and how to recover from expired verification. Nothing material is left to inference for a 4-parameter, zero-required-parameter tool.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents limit, query, status, and history_access_token, making 3 the baseline. The description goes slightly beyond by stating the token is private proof attached automatically and by rejecting customer IDs and bearer tokens, which steers the agent away from inventing or substituting parameters — marginal but genuine added meaning.

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

Purpose5/5

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

States a precise verb+resource — searching the authenticated account's service records by repair keywords, date text, and status — and immediately separates itself from customer_lookup and open_customer_portal. An agent can tell what this does and what it does not do 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 Guidelines5/5

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

Explicitly names the triggering context ('from the customer card or browser bridge after customer_lookup verifies SMS'), the required precondition (private proof), the alternatives for shared agents (history from customer_lookup, or open the customer portal), and the recovery path when verification expires (use customer_lookup again). It even states a negative rule: an MCP connection alone never authorizes history.

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

submit_customer_infoSubmit New Customer FormA
Destructive
Inspect

After asking Have you used us before?, use for NEW customers only after they approve full name, address, email, phone and where they found us. Include the customer-approved issue_description when the service or symptoms are already known. Saves an in-area customer; outside database coverage saves a lead with the supplied description for office review and never books a job. For a Massachusetts address outside the area that lead is also flagged for an ASAP office callback (office_callback_requested:true), so do not call request_out_of_area_callback afterwards. Say the description was saved only when issue_description_saved is true; in-area booking notes are saved later with request_booking. Lead submissions can notify the office and send a transactional SMS acknowledgment; they do not authorize marketing texts.

NameRequiredDescriptionDefault
nameYesFull first and last name
emailYesCustomer email address as given; never invent it.
phoneYesCustomer mobile number in any common US format; the booking SMS code goes here later.
addressYesFull service address: street, optional unit, city, two-letter state and five-digit ZIP (ZIP+4 accepted). The ZIP decides service-area coverage.
confirmedYesCustomer submitted or approved the new customer form, including any supplied issue description
heard_about_usYesWhere the customer found Johnson Bros; ask, never infer from the platform
issue_descriptionNoCustomer-approved service and reported symptoms, if already provided. Preserved in outside-area office lead notes; do not invent a diagnosis. Optional so contact-only intake still works.

Output Schema

NameRequiredDescription
bookedYes
statusYes
messageYes
successYes
next_stepYes
record_idNoSaved office lead reference, when applicable.
error_codeNo
request_idYesPublic operation receipt for support; never a provider customer ID.
review_sandboxNo
in_service_areaYes
in_massachusettsNoOutside-area leads only: whether the service ZIP is in Massachusetts.
issue_description_savedNoTrue only after a supplied issue description was saved with an office-review lead. Customer creation alone does not save booking notes.
office_callback_requestedNoTrue when the outside-area lead was flagged for an ASAP office callback (Massachusetts addresses).

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare a destructive, open-world, non-idempotent write, and the description adds substantial context beyond that: it never books a job on outside-area leads, flags MA leads with office_callback_requested:true, triggers an office notification and transactional SMS acknowledgment without marketing consent, and conditions the 'saved' message on issue_description_saved being true. This is exactly the behavioral detail an agent needs and cannot get 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense with actionable conditionals and is front-loaded with the key eligibility rule. Most sentences carry distinct operational information (coverage branch, callback flag, SMS vs marketing, save confirmation), though it borders on over-packed.

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 an output schema exists, return values need not be explained, yet the description still ties the agent to a specific output flag (issue_description_saved). For a complex multi-branch intake tool with nested address and 6 required params, nothing material is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents every field and its format. The description adds workflow meaning to issue_description ('include when the service or symptoms are already known') and the approval gate on confirmed, but it does not extend field-level semantics much 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?

States a specific verb and resource ('Saves an in-area customer; outside database coverage saves a lead') and scopes it precisely to NEW customers after the 'Have you used us before?' question. It distinguishes itself from siblings by naming request_booking and request_out_of_area_callback and explaining how this tool relates to them.

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?

Explicit when-to-use ('for NEW customers only after they approve...'), when to include the optional field, and when NOT to use the alternative ('do not call request_out_of_area_callback afterwards' for MA out-of-area leads). The routing between booking, lead, and callback paths is fully spelled out.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updates
    • Changedcheck_service_area3 fields changed
      • addedInput schema / properties / state / description
        Added value: +"Two-letter state code; defaults to MA. Any state other than MA is outside the service area."
      • addedInput schema / properties / town / description
        Added value: +"Massachusetts town, city or neighborhood name on its own, e.g. \"Quincy\" or \"Dorchester\". Answers \"do you serve <town>?\" directly; do not demand a ZIP first."
      • addedInput schema / properties / zip / description
        Added value: +"Five-digit service ZIP (ZIP+4 accepted). Town name alone is enough; pass a ZIP only when the town result is partially_covered or unknown_town, or when the customer already gave the full address. Send zip or town; an empty call returns LOCATION_REQUIRED."
    • Changedconfirm_booking2 fields changed
      • addedInput schema / properties / booking_id / description
        Added value: +"The booking_id (UUID) returned by request_booking for this pending booking."
      • addedInput schema / properties / code / description
        Added value: +"The 6-digit code the customer received by SMS after request_booking. Ask the customer for it; never guess or reuse a customer_lookup code."
    • Changedcustomer_lookup4 fields changed
      • addedInput schema / properties / challenge_id / description
        Added value: +"The challenge_id returned by the first call; send it together with code on the second call."
      • addedInput schema / properties / code / description
        Added value: +"The 6-digit verification code the customer received by SMS; send it together with challenge_id. Keep it separate from booking codes."
      • addedInput schema / properties / confirmed / description
        Added value: +"True only after the customer agreed to receive a verification code at this number."
      • addedInput schema / properties / phone / description
        Added value: +"Phone number on the customer account, any common US format; the verification code is texted to it."
    • Changedget_availability5 fields changed
      • addedInput schema / properties / days / description
        Added value: +"How many calendar days to search from start_date (or today), 1 to 14; default 7."
      • addedInput schema / properties / start_date / description
        Added value: +"First day to search as YYYY-MM-DD in the company time zone; omit for today. Past dates are rejected."
      • addedInput schema / properties / state / description
        Added value: +"Two-letter state code, normally MA; send only together with zip or town."
      • addedInput schema / properties / time_preference / description
        Added value: +"Part of day to keep: any (default), morning, afternoon or evening."
      • addedInput schema / properties / town / description
        Added value: +"Service town when known, e.g. \"Quincy\", sent alongside zip. A town without a ZIP returns needs_more_information; use check_service_area for town-only coverage questions."
    • Changedrequest_booking4 fields changed
      • addedInput schema / properties / address / description
        Added value: +"Full service address: street, optional unit, city, two-letter state (default MA) and five-digit ZIP. The ZIP decides service-area eligibility; the booking is placed at this address."
      • addedInput schema / properties / email / description
        Added value: +"Customer email as given. Required when customer_type is new; optional for returning customers. Never invent it."
      • addedInput schema / properties / promotion_review_requested / description
        Added value: +"True only when the customer asked for a current promotion to be reviewed with this visit; the office reviews it, nothing is applied automatically."
      • addedInput schema / properties / referral_code / description
        Added value: +"Referral code the customer supplied, exactly as given; omit when none was offered."
    • Changedrequest_callback2 fields changed
      • addedInput schema / properties / email / description
        Added value: +"Customer email, only when the customer offered it; never invent one."
      • addedInput schema / properties / urgency / description
        Added value: +"How soon the customer needs the call: routine (default), soon or urgent. A callback is never emergency dispatch; life-safety situations go through emergency_help first."
    • Changedrequest_out_of_area_callback1 field changed
      • addedInput schema / properties / address / description
        Added value: +"Service address: city, two-letter state and five-digit ZIP are required; street and unit are optional."
    • Changedsubmit_customer_info3 fields changed
      • addedInput schema / properties / address / description
        Added value: +"Full service address: street, optional unit, city, two-letter state and five-digit ZIP (ZIP+4 accepted). The ZIP decides service-area coverage."
      • addedInput schema / properties / email / description
        Added value: +"Customer email address as given; never invent it."
      • addedInput schema / properties / phone / description
        Added value: +"Customer mobile number in any common US format; the booking SMS code goes here later."
  2. 3 tool updates
    • Changedcheck_service_area4 fields changed
      • addedOutput schema / properties / covered_zips
        Added value: +{
        +  "description": "Town lookups only: the town ZIPs inside the automatic-booking area.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / outside_zips
        Added value: +{
        +  "description": "Town lookups only: the town ZIPs outside the automatic-booking area.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / resolved_town
        Added value: +{
        +  "description": "Town lookups only: the Massachusetts place the name was matched to.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / status / enum
        Previous value: -[
        -  "covered",
        -  "outside_service_area",
        -  "needs_more_information",
        -  "unavailable"
        -]New value: +[
        +  "covered",
        +  "partially_covered",
        +  "outside_service_area",
        +  "unknown_town",
        +  "needs_more_information",
        +  "unavailable"
        +]
    • Addedrequest_out_of_area_callback
    • Changedsubmit_customer_info2 fields changed
      • addedOutput schema / properties / in_massachusetts
        Added value: +{
        +  "description": "Outside-area leads only: whether the service ZIP is in Massachusetts.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / office_callback_requested
        Added value: +{
        +  "description": "True when the outside-area lead was flagged for an ASAP office callback (Massachusetts addresses).",
        +  "type": "boolean"
        +}
  3. 5 tool updates
    • Changedcheck_service_area3 fields changed
      • addedOutput schema / properties / missing_fields
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "covered",
        +    "outside_service_area",
        +    "needs_more_information",
        +    "unavailable"
        +  ],
        +  "type": "string"
        +}
    • Changedcustomer_lookup10 fields changed
      • changedOutput schema / properties / customer / additionalProperties
        Previous value: -{}New value: +false
      • addedOutput schema / properties / customer / properties
        Added value: +{
        +  "addresses": {
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "city": {
        +          "type": "string"
        +        },
        +        "country": {
        +          "type": "string"
        +        },
        +        "state": {
        +          "type": "string"
        +        },
        +        "street": {
        +          "type": "string"
        +        },
        +        "street_line_2": {
        +          "type": "string"
        +        },
        +        "zip": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "email": {
        +    "type": "string"
        +  },
        +  "firstName": {
        +    "type": "string"
        +  },
        +  "lastName": {
        +    "type": "string"
        +  },
        +  "phone": {
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / customer / required
        Added value: +[
        +  "phone",
        +  "addresses"
        +]
      • changedOutput schema / properties / history / items / additionalProperties
        Previous value: -{}New value: +false
      • addedOutput schema / properties / history / items / properties
        Added value: +{
        +  "description": {
        +    "type": "string"
        +  },
        +  "scheduledStart": {
        +    "type": "string"
        +  },
        +  "workStatus": {
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / history / items / required
        Added value: +[
        +  "description",
        +  "workStatus"
        +]
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / record_id
        Added value: +{
        +  "description": "Saved office lead reference, when applicable.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "description": "Public operation receipt for support; never a provider customer ID.",
        +  "format": "uuid",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "success",
        -  "status",
        -  "message"
        -]New value: +[
        +  "request_id",
        +  "next_step",
        +  "success",
        +  "status",
        +  "message"
        +]
    • Changedget_availability8 fields changed
      • addedInput schema / properties / state
        Added value: +{
        +  "maxLength": 2,
        +  "minLength": 2,
        +  "type": "string"
        +}
      • addedInput schema / properties / town
        Added value: +{
        +  "maxLength": 60,
        +  "minLength": 2,
        +  "type": "string"
        +}
      • addedInput schema / properties / zip
        Added value: +{
        +  "description": "Service ZIP when known. Always include the customer location for a booking inquiry; outside-area requests receive no windows.",
        +  "maxLength": 10,
        +  "minLength": 3,
        +  "type": "string"
        +}
      • addedOutput schema / properties / coverage_status
        Added value: +{
        +  "enum": [
        +    "verified",
        +    "not_checked",
        +    "outside_service_area",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / error_code
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / missing_fields
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "available",
        +    "needs_more_information",
        +    "outside_service_area",
        +    "unavailable"
        +  ],
        +  "type": "string"
        +}
    • Changedrequest_callback3 fields changed
      • addedOutput schema / properties / record_id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "format": "uuid",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "success",
        -  "status",
        -  "message",
        -  "next_step"
        -]New value: +[
        +  "request_id",
        +  "success",
        +  "status",
        +  "message",
        +  "next_step"
        +]
    • Changedsubmit_customer_info4 fields changed
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / record_id
        Added value: +{
        +  "description": "Saved office lead reference, when applicable.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "description": "Public operation receipt for support; never a provider customer ID.",
        +  "format": "uuid",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "success",
        -  "status",
        -  "in_service_area",
        -  "booked",
        -  "message"
        -]New value: +[
        +  "request_id",
        +  "next_step",
        +  "success",
        +  "status",
        +  "in_service_area",
        +  "booked",
        +  "message"
        +]
  4. 1 tool update
    • Changedsubmit_customer_info3 fields changed
      • changedInput schema / properties / confirmed / description
        Previous value: -"Customer submitted or approved the new customer form"New value: +"Customer submitted or approved the new customer form, including any supplied issue description"
      • addedInput schema / properties / issue_description
        Added value: +{
        +  "description": "Customer-approved service and reported symptoms, if already provided. Preserved in outside-area office lead notes; do not invent a diagnosis. Optional so contact-only intake still works.",
        +  "maxLength": 4000,
        +  "type": "string"
        +}
      • addedOutput schema / properties / issue_description_saved
        Added value: +{
        +  "description": "True only after a supplied issue description was saved with an office-review lead. Customer creation alone does not save booking notes.",
        +  "type": "boolean"
        +}
  5. 1 tool update
    • Changedbusiness_info3 fields changed
      • addedOutput schema / properties / agent_context / properties / availability
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "creates_appointment": {
        +      "type": "boolean"
        +    },
        +    "kind": {
        +      "type": "string"
        +    },
        +    "tool": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "kind",
        +    "creates_appointment"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / agent_context / properties / writes
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "confirm_booking": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "requires_sms_code": {
        +          "type": "boolean"
        +        },
        +        "success_requires": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "booked": {
        +              "type": "boolean"
        +            },
        +            "status": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "status",
        +            "booked"
        +          ],
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "requires_sms_code",
        +        "success_requires"
        +      ],
        +      "type": "object"
        +    },
        +    "request_booking": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "creates_appointment": {
        +          "type": "boolean"
        +        },
        +        "requires_explicit_user_consent": {
        +          "type": "boolean"
        +        },
        +        "sends_sms_code": {
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "requires_explicit_user_consent",
        +        "sends_sms_code",
        +        "creates_appointment"
        +      ],
        +      "type": "object"
        +    },
        +    "request_callback": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "creates_appointment": {
        +          "type": "boolean"
        +        },
        +        "requires_explicit_user_consent": {
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "requires_explicit_user_consent",
        +        "creates_appointment"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "request_callback",
        +    "request_booking",
        +    "confirm_booking"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / agent_context / required
        Previous value: -[
        -  "instructions",
        -  "timezone",
        -  "locations",
        -  "services",
        -  "service_area",
        -  "pricing",
        -  "scheduling",
        -  "knowledge",
        -  "customer_records"
        -]New value: +[
        +  "instructions",
        +  "timezone",
        +  "locations",
        +  "services",
        +  "service_area",
        +  "pricing",
        +  "scheduling",
        +  "knowledge",
        +  "availability",
        +  "writes",
        +  "customer_records"
        +]
  6. 2 tool updates
    • Changedopen_customer_portal1 field changed
      • addedInput schema / properties / view / description
        Added value: +"Choose booking for a new service visit, or history for the customer’s own previous and upcoming visits."
    • Changedsearch_service_history3 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum records to return, from 1 to 50."
      • addedInput schema / properties / query / description
        Added value: +"Repair keywords or date text, for example drain or 2025. Empty searches all available records."
      • addedInput schema / properties / status / description
        Added value: +"Filter the verified customer’s available visits by status."
  7. 10 tool updates
    • Changedbusiness_info2 fields changed
      • addedOutput schema / properties / agent_context
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "customer_records": {
        +      "type": "string"
        +    },
        +    "instructions": {
        +      "type": "string"
        +    },
        +    "knowledge": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "instructions": {
        +          "type": "string"
        +        },
        +        "missing_information": {
        +          "type": "string"
        +        },
        +        "read_tool": {
        +          "type": "string"
        +        },
        +        "search_tool": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "search_tool",
        +        "read_tool",
        +        "instructions",
        +        "missing_information"
        +      ],
        +      "type": "object"
        +    },
        +    "locations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "city": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "state": {
        +            "type": "string"
        +          },
        +          "street": {
        +            "type": "string"
        +          },
        +          "zip": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "street",
        +          "city",
        +          "state",
        +          "zip"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "pricing": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "currency": {
        +          "type": "string"
        +        },
        +        "dispatch_fee": {
        +          "type": "number"
        +        },
        +        "estimates": {
        +          "type": "string"
        +        },
        +        "policy": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "currency",
        +        "dispatch_fee",
        +        "policy",
        +        "estimates"
        +      ],
        +      "type": "object"
        +    },
        +    "scheduling": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "after_hours": {
        +          "type": "string"
        +        },
        +        "emergency": {
        +          "type": "string"
        +        },
        +        "regular": {
        +          "type": "string"
        +        },
        +        "routine": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "regular",
        +        "after_hours",
        +        "routine",
        +        "emergency"
        +      ],
        +      "type": "object"
        +    },
        +    "service_area": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "exact_coverage_tool": {
        +          "type": "string"
        +        },
        +        "summary": {
        +          "type": "string"
        +        },
        +        "towns": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "summary",
        +        "towns",
        +        "exact_coverage_tool"
        +      ],
        +      "type": "object"
        +    },
        +    "services": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "summary": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "summary"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "timezone": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "instructions",
        +    "timezone",
        +    "locations",
        +    "services",
        +    "service_area",
        +    "pricing",
        +    "scheduling",
        +    "knowledge",
        +    "customer_records"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / facts_updated
        Added value: +{
        +  "type": "string"
        +}
    • Changedcheck_service_area1 field changed
      • addedInput schema / properties / state
        Added value: +{
        +  "maxLength": 2,
        +  "minLength": 2,
        +  "type": "string"
        +}
    • Addedcustomer_lookup
    • Changedget_availability3 fields changed
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / returned_windows
        Added value: +{
        +  "type": "integer"
        +}
      • addedOutput schema / properties / total_matching_windows
        Added value: +{
        +  "type": "integer"
        +}
    • Changedget_quote3 fields changed
      • addedOutput schema / properties / error_code
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / service_supported
        Added value: +{
        +  "type": "boolean"
        +}
    • Changedget_services_pricing4 fields changed
      • addedOutput schema / properties / error
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / error_code
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / service_supported
        Added value: +{
        +  "type": "boolean"
        +}
    • Addedopen_customer_portal
    • Changedrequest_booking2 fields changed
      • addedInput schema / properties / customer_type
        Added value: +{
        +  "description": "Required for booking: answer to Have you used us before?",
        +  "enum": [
        +    "new",
        +    "returning"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / heard_about_us
        Added value: +{
        +  "description": "Required for new customers: where they found us",
        +  "maxLength": 200,
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Addedsearch_service_history
    • Addedsubmit_customer_info
  8. 1 tool update
    • Changedget_availability5 fields changed
      • addedOutput schema / properties / windows / items / properties / arrival_end
        Added value: +{
        +  "description": "Customer-facing two-hour arrival promise.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / windows / items / properties / arrival_start
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / windows / items / properties / end_time / description
        Added value: +"Reserved three-hour job-block end; pass unchanged to request_booking."
      • addedOutput schema / properties / windows / items / properties / start_time / description
        Added value: +"Selected job-block start; pass unchanged to request_booking."
      • changedOutput schema / properties / windows / items / required
        Previous value: -[
        -  "start_time",
        -  "end_time",
        -  "start_local",
        -  "end_local",
        -  "part_of_day",
        -  "available"
        -]New value: +[
        +  "start_time",
        +  "end_time",
        +  "arrival_start",
        +  "arrival_end",
        +  "start_local",
        +  "end_local",
        +  "part_of_day",
        +  "available"
        +]
  9. 1 tool update
    • Changedrequest_booking1 field changed
      • addedInput schema / properties / referral_code
        Added value: +{
        +  "maxLength": 300,
        +  "type": "string"
        +}
  10. 11 tool updates
    • First observedbusiness_info
    • First observedcheck_service_area
    • First observedconfirm_booking
    • First observedemergency_help
    • First observedfetch
    • First observedget_availability
    • First observedget_quote
    • First observedget_services_pricing
    • First observedrequest_booking
    • First observedrequest_callback
    • First observedsearch

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Validates SMS-capable phone numbers via x402 pay-per-call, detecting mobile vs landline, carrier type, and E.164 format.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A deterministic preflight checker for outbound SMS/iMessage that catches silent filtering, segment blowups, and dropped iMessage features before sending.
    1
    17 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Home Services MCP by HireNimbus lets AI agents find, compare, and book verified local pros for handyman, renovation, HVAC, plumbing, electrical, and landscaping jobs in supported US metro markets.
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI applications to send and receive real iMessage/SMS messages through a local MCP service, with tools for sending texts, checking new messages, browsing history, and querying line status.
    155 npm
    3
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources