plumbing-booking
Server Details
Johnson Bros. Plumbing: check coverage, services, pricing, availability, and book by SMS.
- Status
- Healthy
- Uptime
- 98.9% over 46 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 16 tools
Each tool has a clearly distinct purpose with explicit guidance on when to use it. Overlapping tools like get_quote vs get_services_pricing are disambiguated by description, and booking steps (request vs confirm) are unambiguous.
Most tools follow a snake_case verb_noun pattern (check_service_area, request_booking, get_availability). A few outliers like business_info, fetch, and search break the pattern, but the overall convention is consistent and readable.
16 tools is on the higher end but each covers a distinct aspect of the booking workflow: service area, pricing, availability, booking, confirmation, customer lookup, history, emergency, and callbacks. No redundant tools exist.
The tool surface covers the full customer journey from intake to booking and post-service history, including out-of-area and emergency handling. The only notable gap is the lack of explicit booking cancellation/update tools, which may be out of scope.
Available Tools
16 toolsbusiness_infoGet Business InformationARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| hours | Yes | |
| booking | Yes | |
| success | Yes | |
| business | Yes | |
| agent_context | No | |
| facts_updated | No | |
| review_sandbox | No |
TDQS
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.
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.
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.
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.
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.
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 AreaARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | ||
| town | No | ||
| state | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| zip | No | |
| town | No | |
| error | No | |
| status | No | |
| message | No | |
| success | Yes | |
| counties | No | |
| next_step | No | |
| error_code | No | |
| matched_by | No | |
| covered_zips | No | Town lookups only: the town ZIPs inside the automatic-booking area. |
| outside_zips | No | Town lookups only: the town ZIPs outside the automatic-booking area. |
| resolved_town | No | Town lookups only: the Massachusetts place the name was matched to. |
| missing_fields | No | |
| review_sandbox | No | |
| in_service_area | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and idempotent, so the bar for added behavioral context is lower, but the description still adds important nuances: 'Unavailable coverage is unknown, not outside-area', 'run this check silently; never announce that you are checking', and 'This never proves that a particular appointment is available.' These go beyond the annotations and prevent real misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but each sentence earns its place: it front-loads the purpose, then lays out the status semantics in a compact list, and closes with critical caveats. Despite its length, it avoids redundancy and is well organized for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, return-value documentation is not required; the description still enumerates all four statuses and their follow-up actions. It also covers edge cases (unavailable coverage vs. outside area) and explicitly disclaims appointment availability, so nothing call-critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0% description coverage, so the description must compensate. It explains that either a ZIP or a town/city/neighborhood can be used independently, and it maps response states to customer actions. The one minor gap is that the 'state' parameter is never explicitly discussed, though Massachusetts is strongly implied and the parameter is optional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action ('Check a service ZIP, or a Massachusetts town, city or neighborhood name... against the coverage database') and names the exact geographic scope (Norfolk, Suffolk, Plymouth counties). It clearly differentiates this from sibling tools like request_out_of_area_callback by defining the tool's decision role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use instructions: run silently during new-customer intake, use town or ZIP appropriately, and when outside_service_area is returned, offer request_out_of_area_callback and the office number. It also states what this tool does NOT prove (appointment availability), effectively steering the agent away from using it for availability checks.
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 CodeADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| booking_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| booked | Yes | |
| status | Yes | |
| message | Yes | |
| success | Yes | |
| replayed | No | |
| timezone | No | |
| next_step | Yes | |
| error_code | No | |
| needs_manual | Yes | |
| service_city | No | |
| customer_name | No | |
| scheduled_end | No | |
| business_phone | Yes | |
| review_sandbox | No | |
| scheduled_start | No | |
| location_summary | No | |
| attempts_remaining | No | |
| business_phone_href | Yes | |
| confirmation_number | No | |
| service_description | No | |
| formatted_arrival_window | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and idempotent behavior; the description adds valuable context about side effects (creating customer/job records, sending notifications) and idempotency (replaying is safe and returns stored result). It doesn't detail error cases or authentication requirements, but with annotations covering the safety profile, this is a strong addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, front-loading the primary precondition and followed by side effects and outcome interpretations. Every sentence adds essential information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (side effects, idempotency, status interpretation), the description covers key aspects. An output schema exists, so return values needn't be described. However, it doesn't mention what happens on invalid codes or missing booking, which could be useful for error handling. Mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains that the 'code' is a six-digit SMS code from request_booking and implies 'booking_id' identifies the booking. However, it doesn't clarify the format of booking_id (UUID is in schema) or any other parameter details. Baseline 3 is appropriate given the schema has some structure but no descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: confirming a booking using a six-digit SMS code obtained after request_booking. It explicitly differentiates from sibling request_booking, and the title reinforces the specific action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit timing: 'Use this after the customer supplies the six-digit SMS code from request_booking.' It also gives clear interpretation rules for status codes and booked flag, distinguishing confirmed appointments from callback_pending follow-ups. No alternative tools are suggested, but the context is precise.
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 HistoryADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | ||
| phone | Yes | ||
| confirmed | Yes | ||
| challenge_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| history | No | |
| message | Yes | |
| success | Yes | |
| customer | No | |
| next_step | Yes | |
| record_id | No | Saved office lead reference, when applicable. |
| request_id | Yes | Public operation receipt for support; never a provider customer ID. |
| challenge_id | No | |
| history_status | No | |
| review_sandbox | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by disclosing the two-call flow, the requirement to provide challenge_id and customer-supplied code, and the hard rule never to claim a match after the initial call. The annotations carry readOnlyHint=false and destructiveHint=true, and while the description does not explicitly explain any destructive side effect, it does not contradict them. Some benefit would come from noting what made the process destructive (e.g., invalidating the challenge code), but the core behavior is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short steps lead the reader from first call to failure handling, with no fluff or filler. The chronology is natural and the final warning reinforces something very easy to get wrong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parametre procedural tool this is remarkably complete: an agent knows exactly how to sequence the two calls and what can be expected in the final response. The output schema covers the return shape, so the description does not need to enumerate fields. A minor gap is not fully specifying that the second call still includes phone, but that is inferred from the required fields in the schema, and it does not explain the destructive annotation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the semantic weight, and it does. It maps phone and confirmed:true to the first call and challenge_id plus code to the second call, adding meaning the schema itself cannot convey. It also clarifies that the code is customer-supplied and that saved details/history are returned only after successful verification.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific, sensible purpose: verifying a returning customer and retrieving saved details/service history only after successful two-step verification. It clearly differentiates from siblings like search_service_history because it explicitly describes the verification protocol and warns not to treat the initial response as confirmation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger ('For a returning customer') and a failure path ('offer the new-customer form or office assistance'). It never explicitly contrasts with sibling tools like search_service_history, submit_customer_info, or open_customer_portal, but the two-step behavior and failure handling provide enough context for the intended use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
emergency_helpEmergency Plumbing HelpARead-onlyIdempotentInspect
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:
First ensure customer safety (especially for gas leaks)
Provide immediate mitigation steps (how to shut off water, etc.)
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emergency_type | Yes | Type of plumbing emergency (required). Examples: 'burst pipe', 'flooding', 'gas leak', 'sewage backup', 'no hot water', 'no water' | |
| additional_details | No | Additional context about the emergency (optional). Include location, duration, actions already taken. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| success | Yes | |
| call_now | No | |
| urgency_level | No | |
| emergency_type | No | |
| recommendation | No | |
| review_sandbox | No | |
| immediate_steps | No | |
| safety_warnings | No | |
| emergency_contact | No |
TDQS
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.
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.
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.
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.
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.
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. DocumentARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Document id from a search result, e.g. 'faq:pricing-service-fee' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| url | No | |
| text | No | |
| error | No | |
| title | No | |
| success | Yes | |
| metadata | No | |
| error_code | No |
TDQS
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.
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.
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.
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.
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.
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 WindowsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | Service ZIP when known. Always include the customer location for a booking inquiry; outside-area requests receive no windows. | |
| days | No | ||
| town | No | ||
| state | No | ||
| start_date | No | ||
| time_preference | No | any |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| privacy | Yes | |
| success | Yes | |
| windows | Yes | |
| has_more | No | |
| timezone | Yes | |
| next_step | No | |
| error_code | No | |
| booking_flow | Yes | |
| open_windows | Yes | |
| total_windows | Yes | |
| missing_fields | No | |
| requested_days | Yes | |
| review_sandbox | No | |
| coverage_status | No | |
| time_preference | Yes | |
| returned_windows | No | |
| total_matching_windows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is known. The description adds crucial behavioral context beyond annotations: 'Outside-area or unresolved locations receive no windows' and 'Without a location, this returns general capacity only, not eligibility to book; coverage_status is not_checked.' These edge-case behaviors are essential for correct use and are not covered by annotations. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is six sentences long but every sentence carries operational weight—purpose, required inputs, edge-case behavior, exclusions, and sibling routing. It is front-loaded with the purpose and ends with clear guardrails. There is no fluff or redundancy, so it earns a top score for conciseness despite its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists (so return format is specified elsewhere), the description covers the essential operational context: when to call, what inputs to provide, what happens in edge cases, and which sibling tools to use instead. It is complete enough for an agent to invoke this tool correctly without further documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17% (only zip has a description). The description compensates partially by instructing 'Include zip and any known town/state for a customer booking inquiry,' which clarifies the role of location parameters. However, it gives no information about days, start_date, or time_preference, leaving the agent to infer their meaning from names and schema constraints. This is a moderate gap given the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific directive: 'Use this when the user wants live Johnson Bros. appointment availability.' This names the exact resource and action, and immediately distinguishes itself from siblings by explicitly stating 'Do not promise or create an appointment; use request_booking and confirm_booking.' The verb 'get' and resource 'availability' are unambiguous, and the sibling differentiation is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance. It says to call this for booking inquiries and to include zip and town/state, and it warns 'Never call for a customer already found outside coverage.' It also directs the agent away from creating appointments by naming the correct sibling tools. This is exemplary routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quoteGet Plumbing Service QuoteARead-onlyIdempotentInspect
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:
Use this tool when customer asks about pricing
Share the estimate with appropriate caveats
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.
| Name | Required | Description | Default |
|---|---|---|---|
| urgency | No | How urgent is the repair? | |
| service_type | Yes | Type of plumbing service (required). Examples: 'drain cleaning', 'water heater repair', 'toilet repair' | |
| property_type | No | Type of property (default: 'residential') | |
| issue_description | Yes | Description of the plumbing problem (required). Be specific about symptoms and location. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| notes | No | |
| service | No | |
| success | Yes | |
| next_step | No | |
| error_code | No | |
| next_steps | No | |
| description | No | |
| service_fee | No | |
| property_type | No | |
| urgency_level | No | |
| review_sandbox | No | |
| service_supported | No | |
| estimated_duration | No | |
| estimated_price_range | No |
TDQS
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.
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.
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.
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.
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.
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 & PricingARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Search term, e.g. "water heater", "drain" | |
| category | No | Filter by category: 'emergency', 'maintenance', 'repair', 'installation', 'specialty' |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| success | Yes | |
| services | Yes | |
| next_step | No | |
| categories | Yes | |
| error_code | No | |
| service_fee | Yes | |
| review_sandbox | No | |
| total_services | Yes | |
| service_supported | No | |
| pricing_disclaimer | Yes |
TDQS
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.
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.
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.
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.
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.
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 HistoryARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Choose booking for a new service visit, or history for the customer’s own previous and upcoming visits. | booking |
Output Schema
| Name | Required | Description |
|---|---|---|
| view | Yes | |
| message | Yes | |
| success | Yes | |
| business_phone | Yes | |
| review_sandbox | No |
TDQS
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.
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.
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.
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.
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.
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)ADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Customer full name | |
| No | |||
| notes | No | Issue description / anything the technician should know | |
| phone | Yes | Customer mobile number — receives the 6-digit confirmation code | |
| address | Yes | ||
| service | Yes | Requested service, e.g. "water heater replacement" | |
| confirmed | Yes | True only after the user explicitly asks to start this booking request and send the SMS code | |
| customer_type | No | Required for booking: answer to Have you used us before? | |
| referral_code | No | ||
| heard_about_us | No | Required for new customers: where they found us | |
| time_preference | No | Fallback time-of-day preference if none of the preferred windows is open | any |
| preferred_windows | No | Preferred arrival windows from get_availability (start_time/end_time ISO strings) | |
| promotion_review_requested | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| status | Yes | |
| success | Yes | |
| next_step | Yes | |
| booking_id | No | |
| error_code | No | |
| expires_at | No | |
| code_sent_to | No | |
| review_sandbox | No | |
| in_service_area | No | |
| attempts_allowed | No | |
| service_area_notice | No | |
| sandbox_verification_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag openWorld, non-idempotent, destructive, but the description adds substantive behavior the annotations cannot convey: an SMS code is sent, no visit is scheduled, and the booking is not real until confirm_booking confirms. It omits one meaningful trait implied by idempotentHint=false — that repeated calls send additional codes — so it falls just short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: precondition, effect, postcondition. The most decision-relevant facts (SMS-only, not an appointment) are front-loaded rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description covers the gating and post-condition that matter most for a side-effecting tool. It stops short of covering conditional parameter requirements (customer_type/heard_about_us) and error/failure paths, which is a modest gap for a 13-parameter mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 69% across 13 parameters (5 required, 2 enums, nested address), so the schema carries most parameter documentation. The description adds only a workflow-level hint ('confirms their own contact details, service address, issue, and preferred windows') and says nothing about customer_type, heard_about_us, referral_code, or promotion_review_requested.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (request a booking) and immediately clarifies the actual effect: it sends a six-digit SMS code and does not schedule a visit. This distinguishes it from siblings like confirm_booking and get_availability without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use gating ('only after the user explicitly asks to start a Johnson Bros. booking and confirms their own contact details, service address, issue, and preferred windows') plus an explicit when-not: do not claim an appointment exists until confirm_booking returns status:confirmed and booked:true. The alternative tool and its success condition are both named.
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. CallbackADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Customer full name, for example "Jane Smith" | |
| No | |||
| phone | Yes | Customer phone number for the callback | |
| urgency | No | routine | |
| confirmed | Yes | True only after the user explicitly asks Johnson Bros. to contact them | |
| issue_description | Yes | Short description of the plumbing issue | |
| preferred_callback_time | No | Optional preference such as "weekday morning" |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| message | Yes | |
| success | Yes | |
| next_step | Yes | |
| record_id | No | |
| error_code | No | |
| request_id | Yes | |
| phone_last4 | No | |
| review_sandbox | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true, readOnlyHint=false, and openWorldHint=true, which already signal a write operation with side effects. The description adds valuable context by stating it 'creates a callback lead, not an appointment' and that it 'can notify the office and send a transactional SMS acknowledgment', going beyond the annotations to describe specific behavioral outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. It front-loads the primary condition ('only after the user explicitly asks...') and immediately follows with the key exclusions. Every word earns its place, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with side effects, the description covers the essential usage constraints: when to use it, what it creates, what it is not, and the emergency fallback. The output schema exists (per signal), so return values are not required in the description. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for most parameters (name, phone, urgency, confirmed, issue_description, preferred_callback_time), giving a baseline of 3. The description references 'contact details' but does not elaborate on specific parameters or add syntax or formatting details beyond the schema. It also doesn't compensate for the email parameter which lacks a description in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to create a callback lead when the user explicitly requests Johnson Bros. to call them. It specifies the resource (callback lead) and distinguishes it from an appointment, and also explicitly excludes emergency dispatch, so an agent can differentiate it from siblings like request_booking or emergency_help.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance ('only after the user explicitly asks... and provides their own contact details') and when-not-to-use guidance ('Do not use it for emergency dispatch; tell emergency users to call (617) 479-9911'). It also clarifies it is not for appointments, giving clear exclusions and alternatives.
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 CallbackADestructiveIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Caller full first and last name | |
| phone | Yes | Callback number. On phone calls the channel supplies the caller ID; confirm it with the caller. | |
| address | Yes | ||
| confirmed | Yes | True only after the caller agreed to the office calling them back | |
| issue_description | Yes | What the caller needs, in their words |
Output Schema
| Name | Required | Description |
|---|---|---|
| booked | Yes | |
| status | Yes | |
| message | Yes | |
| success | Yes | |
| duplicate | No | True when this callback was already requested recently; no second office task was created. |
| next_step | Yes | |
| record_id | No | Saved office lead reference, when a callback was requested. |
| error_code | No | |
| request_id | Yes | Public operation receipt for support; never a provider customer ID. |
| review_sandbox | No | |
| in_service_area | Yes | |
| in_massachusetts | No | |
| coverage_verified | No | False when the coverage database could not be read; the office will confirm. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present, the bar is lower, and the description adds rich context: the coverage recheck, the three outcome statuses (in_service_area, office_callback_requested, outside_massachusetts), the office phone number, the no-appointment guarantee, and the 30-minute dedup behavior (duplicate:true), which aligns with idempotentHint. Note: destructiveHint:true sits oddly beside claims like 'creates nothing' and 'never books an appointment', but the description never explicitly asserts non-destructiveness, so no hard contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and well-structured: trigger first, then requirements, then the three outcomes, then the dedup rule. Every sentence carries information (statuses, phone number, duplicate behavior) with no filler. Slightly long, but all earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the nested address object, five required parameters, and an output schema, the description is thorough. It covers the full decision tree an agent faces (coverage recheck outcomes, what to tell the caller, the phone number, dedup behavior). Since an output schema exists, not explaining return values is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% (just at the high threshold), so baseline is 3. The description adds value by mapping the nested address to 'city, state, service ZIP' and reinforcing that confirmed must be true, and the schema's zip property already documents its role in coverage/MA decisions. Value-add over the schema is real but modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise trigger and resource: 'Use as soon as a caller is found to be outside the automatic-booking service area and agrees to a call from the office.' This clearly distinguishes it from siblings like request_callback and confirm_booking, and states the negative scope explicitly ('It never books an appointment').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The when-to-use condition is explicit and front-loaded (outside service area + caller agrees), and the confirmed:true requirement is stated. It implies the alternative (in_service_area means continue normal booking) but never names sibling tools like request_callback or confirm_booking as replacements, leaving that routing partially to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch Johnson Bros. KnowledgeARead-onlyIdempotentInspect
Use this to find Johnson Bros. Plumbing pages about services, service area, pricing policy, or common questions. Returns ids, titles and URLs only -- call fetch with an id to read the full text. Do not use it to check live appointment availability (use get_availability) or to look up a customer.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural-language search terms, e.g. 'water heater Quincy' |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the annotations by disclosing the return format ('ids, titles and URLs only') and the limitation that full text requires a separate fetch call. It also clarifies that the tool does not cover live availability or customer data, which is useful behavioral context not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences, each earning its place: purpose, return format plus next step, and exclusions with alternatives. It is front-loaded with the core purpose and contains no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter search tool with full schema coverage and annotations indicating read-only/idempotent behavior, the description covers all necessary invocation details: what to search, what results look like, how to get full content, and when to use a different tool. Nothing an agent needs for correct use is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the query parameter fully with an example, so the baseline is 3. The description enriches it by specifying the domain and scope of valid queries ('Johnson Bros. Plumbing pages about services, service area, pricing policy, or common questions'), helping an agent formulate appropriate queries beyond the generic schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb ('find') and resource ('Johnson Bros. Plumbing pages'), and specifies the topical scope (services, service area, pricing policy, common questions). It also distinguishes itself from sibling tools by noting it returns only ids, titles, and URLs, and that fetch should be used for full text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance (searching knowledge pages) and explicit when-not-to-use guidance with named alternatives ('Do not use it to check live appointment availability (use get_availability) or to look up a customer'). It also directs users to 'call fetch with an id' after searching, providing a clear workflow.
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 HistoryARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum records to return, from 1 to 50. | |
| query | No | Repair keywords or date text, for example drain or 2025. Empty searches all available records. | |
| status | No | Filter the verified customer’s available visits by status. | all |
| history_access_token | No | Private verification proof attached automatically by the customer card or browser bridge. Never ask the customer for it or invent it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| history | Yes | |
| message | Yes | |
| success | Yes | |
| review_sandbox | No | |
| records_searched | Yes | |
| returned_records | Yes |
TDQS
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.
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.
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.
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.
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.
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 FormADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Full first and last name | |
| Yes | |||
| phone | Yes | ||
| address | Yes | ||
| confirmed | Yes | Customer submitted or approved the new customer form, including any supplied issue description | |
| heard_about_us | Yes | Where the customer found Johnson Bros; ask, never infer from the platform | |
| issue_description | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| booked | Yes | |
| status | Yes | |
| message | Yes | |
| success | Yes | |
| next_step | Yes | |
| record_id | No | Saved office lead reference, when applicable. |
| error_code | No | |
| request_id | Yes | Public operation receipt for support; never a provider customer ID. |
| review_sandbox | No | |
| in_service_area | Yes | |
| in_massachusetts | No | Outside-area leads only: whether the service ZIP is in Massachusetts. |
| issue_description_saved | No | True only after a supplied issue description was saved with an office-review lead. Customer creation alone does not save booking notes. |
| office_callback_requested | No | True when the outside-area lead was flagged for an ASAP office callback (Massachusetts addresses). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: outside-area submissions become leads for office review, never book a job, Massachusetts out-of-area leads trigger an office callback flag, and lead submissions may send transactional SMS but do not authorize marketing texts. These side effects are critical for correct agent behavior and are not visible in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the key decision rule, and every clause adds operational value. However, it is a single long paragraph with many embedded conditions, which makes it harder to scan quickly; structured bullets or separate sentences would improve readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main operational paths: in-area customer save, outside-area lead handling, the Massachusetts special case, the interaction with request_booking, and the correct confirmation behavior based on issue_description_saved. With an output schema present, nothing critical is missing for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 57% schema description coverage, the description meaningfully compensates by clarifying that issue_description must be customer-approved, that heard_about_us should be asked rather than inferred, that confirmed represents customer approval, and that address determines in-area versus outside-area handling. This goes well beyond the schema field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('submit new customer form') and clearly scopes it to 'NEW customers only' after asking whether the customer has used the service before. It distinguishes this from related tools by noting it saves in-area customers or creates outside-area leads, and explicitly separates it from request_booking and request_out_of_area_callback.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage conditions: use after the 'Have you used us before?' question, only for new customers, and only after approval of required fields. It also tells the agent when not to call a sibling tool ('do not call request_out_of_area_callback afterwards') and where later booking notes go ('in-area booking notes are saved later with request_booking').
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.
3 tool updates
- Changed
check_service_area4 fields changed- added
Output schema / properties / covered_zipsAdded value: +{ + "description": "Town lookups only: the town ZIPs inside the automatic-booking area.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / outside_zipsAdded value: +{ + "description": "Town lookups only: the town ZIPs outside the automatic-booking area.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / resolved_townAdded value: +{ + "description": "Town lookups only: the Massachusetts place the name was matched to.", + "type": "string" +} - changed
Output schema / properties / status / enumPrevious value: -[ - "covered", - "outside_service_area", - "needs_more_information", - "unavailable" -]New value: +[ + "covered", + "partially_covered", + "outside_service_area", + "unknown_town", + "needs_more_information", + "unavailable" +]
- Added
request_out_of_area_callback - Changed
submit_customer_info2 fields changed- added
Output schema / properties / in_massachusettsAdded value: +{ + "description": "Outside-area leads only: whether the service ZIP is in Massachusetts.", + "type": "boolean" +} - added
Output schema / properties / office_callback_requestedAdded value: +{ + "description": "True when the outside-area lead was flagged for an ASAP office callback (Massachusetts addresses).", + "type": "boolean" +}
5 tool updates
- Changed
check_service_area3 fields changed- added
Output schema / properties / missing_fieldsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / next_stepAdded value: +{ + "type": "string" +} - added
Output schema / properties / statusAdded value: +{ + "enum": [ + "covered", + "outside_service_area", + "needs_more_information", + "unavailable" + ], + "type": "string" +}
- Changed
customer_lookup10 fields changed- changed
Output schema / properties / customer / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / customer / propertiesAdded 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" + } +} - added
Output schema / properties / customer / requiredAdded value: +[ + "phone", + "addresses" +] - changed
Output schema / properties / history / items / additionalPropertiesPrevious value: -{}New value: +false - added
Output schema / properties / history / items / propertiesAdded value: +{ + "description": { + "type": "string" + }, + "scheduledStart": { + "type": "string" + }, + "workStatus": { + "type": "string" + } +} - added
Output schema / properties / history / items / requiredAdded value: +[ + "description", + "workStatus" +] - added
Output schema / properties / next_stepAdded value: +{ + "type": "string" +} - added
Output schema / properties / record_idAdded value: +{ + "description": "Saved office lead reference, when applicable.", + "type": "string" +} - added
Output schema / properties / request_idAdded value: +{ + "description": "Public operation receipt for support; never a provider customer ID.", + "format": "uuid", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "success", - "status", - "message" -]New value: +[ + "request_id", + "next_step", + "success", + "status", + "message" +]
- Changed
get_availability8 fields changed- added
Input schema / properties / stateAdded value: +{ + "maxLength": 2, + "minLength": 2, + "type": "string" +} - added
Input schema / properties / townAdded value: +{ + "maxLength": 60, + "minLength": 2, + "type": "string" +} - added
Input schema / properties / zipAdded 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" +} - added
Output schema / properties / coverage_statusAdded value: +{ + "enum": [ + "verified", + "not_checked", + "outside_service_area", + "unknown" + ], + "type": "string" +} - added
Output schema / properties / error_codeAdded value: +{ + "type": "string" +} - added
Output schema / properties / missing_fieldsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / next_stepAdded value: +{ + "type": "string" +} - added
Output schema / properties / statusAdded value: +{ + "enum": [ + "available", + "needs_more_information", + "outside_service_area", + "unavailable" + ], + "type": "string" +}
- Changed
request_callback3 fields changed- added
Output schema / properties / record_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / request_idAdded value: +{ + "format": "uuid", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "success", - "status", - "message", - "next_step" -]New value: +[ + "request_id", + "success", + "status", + "message", + "next_step" +]
- Changed
submit_customer_info4 fields changed- added
Output schema / properties / next_stepAdded value: +{ + "type": "string" +} - added
Output schema / properties / record_idAdded value: +{ + "description": "Saved office lead reference, when applicable.", + "type": "string" +} - added
Output schema / properties / request_idAdded value: +{ + "description": "Public operation receipt for support; never a provider customer ID.", + "format": "uuid", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "success", - "status", - "in_service_area", - "booked", - "message" -]New value: +[ + "request_id", + "next_step", + "success", + "status", + "in_service_area", + "booked", + "message" +]
1 tool update
- Changed
submit_customer_info3 fields changed- changed
Input schema / properties / confirmed / descriptionPrevious value: -"Customer submitted or approved the new customer form"New value: +"Customer submitted or approved the new customer form, including any supplied issue description" - added
Input schema / properties / issue_descriptionAdded 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" +} - added
Output schema / properties / issue_description_savedAdded 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" +}
1 tool update
- Changed
business_info3 fields changed- added
Output schema / properties / agent_context / properties / availabilityAdded value: +{ + "additionalProperties": false, + "properties": { + "creates_appointment": { + "type": "boolean" + }, + "kind": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "kind", + "creates_appointment" + ], + "type": "object" +} - added
Output schema / properties / agent_context / properties / writesAdded 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" +} - changed
Output schema / properties / agent_context / requiredPrevious 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" +]
2 tool updates
- Changed
open_customer_portal1 field changed- added
Input schema / properties / view / descriptionAdded value: +"Choose booking for a new service visit, or history for the customer’s own previous and upcoming visits."
- Changed
search_service_history3 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum records to return, from 1 to 50." - added
Input schema / properties / query / descriptionAdded value: +"Repair keywords or date text, for example drain or 2025. Empty searches all available records." - added
Input schema / properties / status / descriptionAdded value: +"Filter the verified customer’s available visits by status."
10 tool updates
- Changed
business_info2 fields changed- added
Output schema / properties / agent_contextAdded 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" +} - added
Output schema / properties / facts_updatedAdded value: +{ + "type": "string" +}
- Changed
check_service_area1 field changed- added
Input schema / properties / stateAdded value: +{ + "maxLength": 2, + "minLength": 2, + "type": "string" +}
- Added
customer_lookup - Changed
get_availability3 fields changed- added
Output schema / properties / has_moreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / returned_windowsAdded value: +{ + "type": "integer" +} - added
Output schema / properties / total_matching_windowsAdded value: +{ + "type": "integer" +}
- Changed
get_quote3 fields changed- added
Output schema / properties / error_codeAdded value: +{ + "type": "string" +} - added
Output schema / properties / next_stepAdded value: +{ + "type": "string" +} - added
Output schema / properties / service_supportedAdded value: +{ + "type": "boolean" +}
- Changed
get_services_pricing4 fields changed- added
Output schema / properties / errorAdded value: +{ + "type": "string" +} - added
Output schema / properties / error_codeAdded value: +{ + "type": "string" +} - added
Output schema / properties / next_stepAdded value: +{ + "type": "string" +} - added
Output schema / properties / service_supportedAdded value: +{ + "type": "boolean" +}
- Added
open_customer_portal - Changed
request_booking2 fields changed- added
Input schema / properties / customer_typeAdded value: +{ + "description": "Required for booking: answer to Have you used us before?", + "enum": [ + "new", + "returning" + ], + "type": "string" +} - added
Input schema / properties / heard_about_usAdded value: +{ + "description": "Required for new customers: where they found us", + "maxLength": 200, + "minLength": 1, + "type": "string" +}
- Added
search_service_history - Added
submit_customer_info
1 tool update
- Changed
get_availability5 fields changed- added
Output schema / properties / windows / items / properties / arrival_endAdded value: +{ + "description": "Customer-facing two-hour arrival promise.", + "type": "string" +} - added
Output schema / properties / windows / items / properties / arrival_startAdded value: +{ + "type": "string" +} - added
Output schema / properties / windows / items / properties / end_time / descriptionAdded value: +"Reserved three-hour job-block end; pass unchanged to request_booking." - added
Output schema / properties / windows / items / properties / start_time / descriptionAdded value: +"Selected job-block start; pass unchanged to request_booking." - changed
Output schema / properties / windows / items / requiredPrevious 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" +]
1 tool update
- Changed
request_booking1 field changed- added
Input schema / properties / referral_codeAdded value: +{ + "maxLength": 300, + "type": "string" +}
11 tool updates
- First observed
business_info - First observed
check_service_area - First observed
confirm_booking - First observed
emergency_help - First observed
fetch - First observed
get_availability - First observed
get_quote - First observed
get_services_pricing - First observed
request_booking - First observed
request_callback - First observed
search
Related MCP Connectors
Browse and book local tradespeople in the UK.
Find local services, check live availability, and book real appointments with consent.
Book local tradespeople — plumber, electrician, HVAC, and 7 more — via your AI agent. All US.
Find and book local service businesses (plumbers, HVAC, detailers) at real prices, with approval.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceValidates SMS-capable phone numbers via x402 pay-per-call, detecting mobile vs landline, carrier type, and E.164 format.MIT
- AlicenseAqualityDmaintenanceA deterministic preflight checker for outbound SMS/iMessage that catches silent filtering, segment blowups, and dropped iMessage features before sending.130 npm1MIT
- AlicenseNot gradedqualityBmaintenanceHome 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
- AlicenseNot gradedqualityCmaintenanceEnables 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.339 npm2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.