HandledIQ: find and book home service
Server Details
Find a home service shop near a US house: its book price, real open times, a held time.
- Status
- Healthy
- Uptime
- 99.9% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 8 tools
Most tools map to clearly distinct lifecycle steps: find shops, get prices, hold a time, check status, cancel, move, or verify a record. The boundary between get_quote and request_service is somewhat subtle because both involve showing one shop's prices/times, though the descriptions distinguish automated quote retrieval from opening a user-facing quote window.
Names consistently use snake_case and are mostly verb_noun or verb_object patterns such as find_help, get_quote, hold_time, cancel_booking, move_booking, request_service, and verify_record. booking_status is the main deviation, being noun_status rather than a verb-led action name, but it remains readable and predictable.
Eight tools is well-scoped for a home-service booking workflow. Each tool covers a meaningful step or check without excessive fragmentation.
The surface covers the core lifecycle: discovery, pricing, holding a time, status tracking, cancellation, rescheduling, and verification. Booking itself is intentionally completed by the user via a texted link, but there are minor gaps around listing all bookings or retrieving richer account history beyond the current status flow.
Available Tools
8 toolsbooking_statusCheck the bookingARead-onlyIdempotentInspect
Says where a quote stands: priced, waiting on the person (with minutes left on the hold), booked (when, and with which tech), they said it was not them, or the hold ran out. Once booked, it also says whether the tech is on the way, arrived (and whether inside the time promised), finished, or the visit was cancelled. Use it after hold_time, or later, to tell the person how it went. Reads only; sends nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| quote_id | Yes | The quote_id price gave. |
Output Schema
| Name | Required | Description |
|---|---|---|
| said | Yes | |
| state | Yes | |
| visit | No | The booked visit as it stands now: its time, its tech, and what has happened since the yes. |
| change | No | A change the person's assistant asked for once booked: a cancel (done at once, free under the shop's terms), or a move (the shop texted the person a link, and done once they picked a new time). |
| quote_id | Yes | |
| held_until | No | |
| minutes_left | 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 description's 'Reads only; sends nothing' mostly echoes them. It does add genuine behavioral context beyond annotations: the state machine of a quote (hold minutes remaining, whether the arrival was inside the promised window, cancellation outcomes), which tells the agent what the response will report.
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 core action and packs a lot of state information into three tight sentences. The colloquial phrasing ('they said it was not them') and one long enumerative first sentence cost it a point, but nothing is wasted.
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 needn't be spelled out, yet the description usefully characterizes the status progression an agent will see. Combined with annotations covering safety and a fully documented single param, the definition is complete enough to invoke correctly; only explicit alternative-routing guidance is absent.
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?
Single required parameter with 100% schema description coverage, so the schema already documents quote_id ('The quote_id price gave'). The description never mentions parameters or adds format/sourcing detail beyond the schema, so the baseline of 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?
States a specific verb+resource ('says where a quote stands') and enumerates the concrete states it reports (priced, waiting on person with hold minutes, booked with tech, cancelled by customer, hold expired) plus post-booking states (on the way, arrived, finished, cancelled). This distinguishes it clearly from siblings like cancel_booking, move_booking, and hold_time.
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 says when to call it: 'Use it after hold_time, or later, to tell the person how it went,' which ties it to a specific sibling and lifecycle point. It does not state when NOT to use it (e.g., prefer move_booking/cancel_booking for changes), so it stops just short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_bookingCancel the visitADestructiveIdempotentInspect
Cancels a booked visit when the person asks and confirms in this conversation, free under the shop's own terms: within 3 days of booking, and before the visit; nothing is owed. Side effects: the visit comes off the shop's schedule, and the shop texts the person that their assistant cancelled it. It cannot be undone here: to book again, get a new quote. Past those terms the person calls the shop. Calling again sends no second text.
| Name | Required | Description | Default |
|---|---|---|---|
| quote_id | Yes | The quote_id find_help or get_quote gave, for a booked visit. |
Output Schema
| Name | Required | Description |
|---|---|---|
| said | Yes | |
| state | Yes | |
| visit | No | The booked visit as it stands now: its time, its tech, and what has happened since the yes. |
| change | No | A change the person's assistant asked for once booked: a cancel (done at once, free under the shop's terms), or a move (the shop texted the person a link, and done once they picked a new time). |
| quote_id | Yes | |
| held_until | No | |
| minutes_left | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: names the side effects (visit removed from the shop's schedule, person receives a cancellation text), states the action is irreversible here, and clarifies idempotency behavior ('calling again sends no second text'). Confirms destructive/open-world nature declared in 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?
Front-loaded with the core action and its condition, and every sentence carries distinct information (terms, side effects, irreversibility, no-second-text). The single dense paragraph is slightly run-on, but there is no 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?
Covers preconditions, terms, side effects, reversibility, and repeat-call behavior for a destructive one-param mutation. With an output schema and full annotations also present, nothing needed 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?
Schema coverage is 100% and the quote_id description already explains its origin (find_help/get_quote for a booked visit), so the description adds nothing about the parameter. Baseline 3 applies when the schema carries the semantic load.
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 (cancels) and resource (a booked visit) plus the triggering condition (person asks and confirms in this conversation). An agent can distinguish it from siblings like move_booking, hold_time, or get_quote without inspecting schemas.
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 scopes when cancellation is free (within 3 days of booking, before the visit) and what to do otherwise (the person calls the shop). It also routes the re-booking case to the get_quote sibling and notes that repeat calls are a no-op.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_helpFind a shop near the personAInspect
Finds up to 3 shops on HandledIQ near a US ZIP code that do what the person needs, soonest open time first: each with its own book prices (all in, US dollars), their terms, its soonest open times, its service record and a quote_id for hold_time. Use it when the person needs home service at a US house: heating and cooling, plumbing, electrical, roofing, pest control, junk removal, demolition and more. An empty list means no shop on HandledIQ takes that work near that ZIP yet. Sends nothing to anyone.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | Optional. The first day that works for the person, YYYY-MM-DD. | |
| zip | Yes | The house's 5-digit US ZIP code. | |
| need | Yes | What the person needs, in a line, like: AC not cooling, a roof leak, ants in the kitchen, or a couch to haul away. | |
| assistant | Yes | Your own name, as the person you act for knows you, like ChatGPT, Claude or Muse. It goes in the text the shop sends them. | |
| budget_dollars | No | Optional. The most the person wants to pay, in dollars. | |
| include_signed_records | No | Optional. true adds each shop's signed record and the keys to check it with verify_record, a few thousand characters per shop. Leave it out unless the person asks for proof. |
Output Schema
| Name | Required | Description |
|---|---|---|
| zip | Yes | |
| next | Yes | |
| shops | Yes | |
| check_records | No | Only with include_signed_records: how to check each signed_record, every shop's key by its issuer's address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description makes an explicit side-effect claim ('Sends nothing to anyone'), yet the annotations declare readOnlyHint=false, which tells the agent the call may modify state. Those two signals pull in opposite directions, and the annotation set also looks boilerplate (idempotentHint=false and openWorldHint=false for a pure lookup). The rich disclosure of what is returned (prices, terms, open times, service record, quote_id) is genuinely useful, but the read-only conflict is a real defect.
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 core behavior (what is found, how many, in what order) before the when-to-use sentence. The first sentence is a long run-on and 'and more' is vague, but every sentence carries information and nothing is padded.
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 needn't enumerate return fields, yet it still covers the empty-result case, the US-household domain, and the no-notification behavior. It stops short of naming the follow-up tools (hold_time, get_quote) as next steps, which would have completed the workflow picture.
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 every parameter (need, zip, assistant, day, budget_dollars, include_signed_records) is already documented in the schema. The description adds little parameter-level detail beyond restating the ZIP/US-house scope and hinting at quote_id, so the baseline of 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?
States a specific verb and resource ('Finds up to 3 shops on HandledIQ near a US ZIP code that do what the person needs') plus ordering and scope. It is clearly distinguishable from siblings like get_quote, request_service, and booking_status, which all operate on an already-selected shop.
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?
Gives a concrete when-to-use condition ('the person needs home service at a US house: heating and cooling, plumbing, electrical...') and an edge case ('An empty list means no shop... takes that work near that ZIP yet'). It does not name alternatives or when-not-to-use, but the entry-point role is clear from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quoteGet one shop's price and open timesAInspect
Gets this shop's own book prices for what the person needs and its next real open times. Use it when the person wants a price or a time from this shop. Returns a quote_id for hold_time, the prices (all in, US dollars), their terms and up to 6 open times. visit true means no fixed price fits exactly, so the price is the shop's visit to find the problem. A price over the owner's limit waits for the owner; work outside the shop's trade gets no quote. Sends nothing to anyone. The shop is the one business_id names; kind is one of the kinds request_service gave, or leave it out and say the need in words.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | Optional. The first day that works for the person, YYYY-MM-DD; times start that day. | |
| kind | No | Optional. One of the shop's kinds of work, as request_service gave them (work[].kind). | |
| need | Yes | What the person needs, in a line, like: AC check, a roof leak, ants in the kitchen, or a couch to haul away. | |
| assistant | Yes | Your own name, as the person you act for knows you, like ChatGPT, Claude or Muse. It goes in the text the shop sends them. | |
| business_id | Yes | The shop's business_id: its provider_business_id in HandledIQ's business feed, or a find_help answer's. | |
| budget_dollars | No | Optional. The most the person wants to pay, in dollars. |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | Yes | |
| shop | Yes | |
| terms | Yes | The terms every price here comes with: all in with no fees, paid after the work, and free to cancel within cancel_free_days of booking, before the visit. |
| times | Yes | |
| visit | No | |
| prices | Yes | |
| currency | Yes | Every amount is US dollars. |
| quote_id | Yes | Holds a time with hold_time. Null when the shop does not do that kind of work. |
| holds_times | Yes | |
| waits_for_owner | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, destructiveHint=false, openWorldHint=false, idempotentHint=false; the description goes well beyond that by disclosing side effects and business rules: a quote_id is produced for later hold_time, visit=true means no fixed price fits and the price becomes an on-site visit, prices over the owner's limit wait for the owner, out-of-trade work returns no quote, and nothing is sent to anyone. That is the kind of context an agent cannot get from structured fields.
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?
Purpose is front-loaded in sentence one and every following sentence carries a distinct rule (visit semantics, owner-limit, trade scope, no notifications, parameter sourcing). It is dense and uses some clipped fragments, but no sentence is 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?
An output schema exists, yet the description still frames the important returns (quote_id for hold_time, all-in USD prices, terms, up to 6 open times) and explains the visit flag, which is the non-obvious part. Combined with the annotations, an agent has everything needed to call and interpret it.
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 baseline is 3, but the description adds relational meaning: business_id identifies the target shop, `kind` should mirror what request_service returned or be omitted, and `need` in words is the fallback when kind is left out. That clarifies the interplay between the two conceptually overlapping parameters beyond their individual schema blurbs.
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 first sentence names a specific verb (Gets) and resource (this shop's book prices and next real open times), scoped to one business. It distinguishes itself from siblings by referencing request_service (source of `kind`), find_help (source of business_id) and hold_time (consumer of the returned quote_id).
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?
"Use it when the person wants a price or a time from this shop" gives a clear positive trigger, and the mention that `kind` comes from request_service implies the pipeline context. It stops short of explicitly naming a sibling to prefer in other cases (e.g., find_help when the shop isn't known yet), so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hold_timeHold a time and text the linkADestructiveIdempotentInspect
Holds one open time from a quote for 10 minutes and has the shop text the person one link to book it. Use it only once the person has picked a price and a time, given their name and US mobile number, and said to go ahead. Side effect: the shop sends one text to that number. Nothing is booked until the person taps Book on the shop's page, where they also type their street address; you cannot book for them. Calling again with the same choice while the time is held sends no second text. The quote_id may come from any shop find_help or get_quote gave.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The person's name, as they gave it. | |
| mobile | Yes | The person's US mobile number, with its area code, as they gave it. The shop texts it once. | |
| time_id | Yes | One of the quote's times, by its time_id. | |
| quote_id | Yes | The quote_id price gave. | |
| option_id | Yes | One of the quote's prices, by its option_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| said | Yes | |
| state | Yes | |
| visit | No | The booked visit as it stands now: its time, its tech, and what has happened since the yes. |
| change | No | A change the person's assistant asked for once booked: a cancel (done at once, free under the shop's terms), or a move (the shop texted the person a link, and done once they picked a new time). |
| quote_id | Yes | |
| held_until | No | |
| minutes_left | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, so the mutation/safety profile is partly given. The description adds real context beyond them: exactly one text is sent, nothing is actually booked until the person taps Book and enters their own address, and re-calling with the same choice sends no second text. It does not explain what the destructiveHint actually entails (e.g. the time is blocked from others during the hold), which is the one remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and duration, then preconditions, then side effects and edge cases. Every sentence carries distinct information; nothing is filler or repeated from the schema.
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 five required params, full schema coverage, an output schema, and annotations, the description fills the remaining gaps an agent needs: preconditions, the one-text side effect, the idempotent repeat behavior, and the fact that booking happens outside this tool. Nothing material 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?
Schema coverage is 100%, so the baseline is 3, but the description adds provenance the schema lacks: quote_id may come from any shop find_help or get_quote returned, and option_id/time_id are framed as selections from that quote. This meaningfully helps cross-tool chaining rather than restating field 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?
States a specific verb, resource and scope: hold one open time from a quote for 10 minutes and trigger a single booking-link text. It is immediately distinguishable from siblings like get_quote, booking_status, or cancel_booking, and it names those related tools when explaining where quote_id comes from.
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 preconditions: use only once the person has picked a price and time, supplied name and US mobile, and said to go ahead. It also states a hard exclusion ('you cannot book for them') and explains the repeat-call case, so the agent knows both when and when not to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_bookingAsk to move the visitADestructiveIdempotentInspect
For a booked visit the person wants at another time: the shop texts the person one link to pick a new time when the same tech is free, and the visit moves only when they pick one. Side effect: one text to the person. Nothing changes on your word; booking_status shows the new time once they pick. Asked again within 10 minutes, it sends no second text.
| Name | Required | Description | Default |
|---|---|---|---|
| quote_id | Yes | The quote_id find_help or get_quote gave, for a booked visit. |
Output Schema
| Name | Required | Description |
|---|---|---|
| said | Yes | |
| state | Yes | |
| visit | No | The booked visit as it stands now: its time, its tech, and what has happened since the yes. |
| change | No | A change the person's assistant asked for once booked: a cancel (done at once, free under the shop's terms), or a move (the shop texted the person a link, and done once they picked a new time). |
| quote_id | Yes | |
| held_until | No | |
| minutes_left | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the exact side effect (one text), the fact that nothing changes until the person picks, where the new state surfaces (booking_status), and the 10-minute no-duplicate-text window. This explains the idempotentHint and destructiveHint in operational terms an agent can act on.
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-loads the scenario, then layers side effect, state behavior, and dedup window with no filler. The dense compound first sentence is slightly run-on but every clause earns its place.
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 an output schema exists, return values needn't be explained; the description covers trigger, side effects, and idempotency well. It leaves a minor gap in not routing the agent to cancel_booking or booking_status for adjacent intents, but is otherwise sufficient for correct invocation.
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% with a single documented quote_id, so the schema carries parameter meaning. The description adds no syntax or format detail beyond what the schema already states, matching the baseline 3.
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 ('move' a booked visit) and explains the two-step flow precisely, so an agent knows exactly what the tool initiates. It doesn't explicitly name a sibling (e.g., cancel_booking) as the alternative, so sibling differentiation relies on the reader inferring it.
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 opening clause gives a clear when-to-use condition ('For a booked visit the person wants at another time'), and the 10-minute dedup note implies a re-invocation context. No explicit when-not or named alternative is provided, so it falls 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_serviceGet a quoteARead-onlyIdempotentInspect
Opens HandledIQ's quote window on one shop for the person to use themselves: they pick what they need, see the shop's own book price and real open times, and hold a time. Use it when the person wants to see one shop's prices and pick a time on screen, given its business_id. Returns who the shop is and the work it prices. Sends nothing; a text goes only if the person holds a time in the window.
| Name | Required | Description | Default |
|---|---|---|---|
| business_id | Yes | The shop's business_id: its provider_business_id in HandledIQ's business feed, or a find_help answer's. |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| shop | Yes | |
| work | Yes | The shop's kinds of work, the three it prices most first, then Something else (visit). |
| phone | No | |
| rules | No | |
| trade | No | |
| price_page | Yes | |
| business_id | Yes | |
| holds_times | Yes | |
| prices_answer_now | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world scope, so the safety profile is covered. The description adds genuinely useful behavior beyond that: it opens an interactive window the person drives, returns who the shop is and what it prices, and crucially sends nothing unless the person holds a time. That side-effect clarification is the kind of context annotations cannot express.
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 front-loaded with what happens (window opens, person drives it) and then the usage trigger and side-effect guarantee, with no filler sentences. It is dense but every clause carries information; only the run-on comma structure costs it a point.
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 and annotations cover safety, so return values and idempotence need little prose, and the description closes the biggest ambiguity by stating nothing is sent unless the person acts. The remaining gap is the unaddressed relationship to the sibling get_quote, which an agent must disambiguate on its own.
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?
There is a single parameter with 100% schema description coverage, and the schema already explains where business_id comes from (provider_business_id in the feed or a find_help answer). The description only says 'given its business_id', adding no syntax or sourcing detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb and resource: it opens HandledIQ's quote window for a single shop and lets the person browse prices and hold a time. This clearly separates it from hold_time and from the sibling get_quote's likely programmatic return, but it never names or contrasts those siblings directly, so the differentiation must be inferred.
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 states the triggering condition explicitly: use it when the person wants to see one shop's prices and pick a time on screen, given its business_id. There is no explicit when-not clause or named alternative (e.g., get_quote for a non-interactive quote), which is the main gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_recordCheck a signed recordARead-onlyIdempotentInspect
Checks a signed record from any HandledIQ shop (a house's, a technician's or a shop's): valid, with who signed it and the record it holds, or not valid and why. Anyone can make the same check with the key at the issuer's id.
| Name | Required | Description | Default |
|---|---|---|---|
| signed | Yes | The signed form a record came with (signed, or signed_record): a compact JWS, up to a million characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| why | No | |
| valid | Yes | |
| issuer | No | |
| record | No | |
| trusted | No | |
| key_status | 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 goes beyond them by disclosing the result shape (valid vs. not valid with a reason, plus signer and payload) and the scope of accepted issuers, which is genuinely additive behavioral context.
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?
Two sentences with the outcome front-loaded; little waste. The parenthetical enumerating issuer types ('a house's, a technician's or a shop's') is slightly clunky and could be trimmed without losing meaning.
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 one-parameter verification tool with an output schema and rich annotations, the description covers the operation, the accepted input provenance, and the result semantics. Nothing an agent needs in order to invoke it correctly appears to be 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?
Schema description coverage is 100% for the single 'signed' parameter, including the JWS format and size limit, so the schema does the heavy lifting. The description reinforces that the input is a signed form attached to a record but adds nothing about format or constraints beyond 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?
States a specific verb (checks/verifies) and resource (a signed record), plus the outcome: validity, the signer, and the record it holds, or the reason for invalidity. The scope ('from any HandledIQ shop — a house's, a technician's or a shop's') clearly separates it from unrelated siblings like booking_status and get_quote.
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?
Usage is only implied: you pass a signed form to check it. The note that 'anyone can make the same check with the key at the issuer's id' gives useful context about reproducibility, but there is no explicit when-to-use, when-not-to, or routing against an alternative verification path.
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.
2 tool updates
- Changed
find_help4 fields changed- added
Output schema / properties / shops / items / properties / soonest / properties / time_zoneAdded value: +{ + "description": "The shop's time zone, like: America/Chicago.", + "type": "string" +} - added
Output schema / properties / shops / items / properties / soonest / properties / when / descriptionAdded value: +"The time in the shop's own time zone (time_zone), like: Today, 8 to 10 AM or Thu, Oct 22, 8 to 10 AM. Today is the shop's today." - added
Output schema / properties / shops / items / properties / times / items / properties / time_zoneAdded value: +{ + "description": "The shop's time zone, like: America/Chicago.", + "type": "string" +} - added
Output schema / properties / shops / items / properties / times / items / properties / when / descriptionAdded value: +"The time in the shop's own time zone (time_zone), like: Today, 8 to 10 AM or Thu, Oct 22, 8 to 10 AM. Today is the shop's today."
- Changed
get_quote2 fields changed- added
Output schema / properties / times / items / properties / time_zoneAdded value: +{ + "description": "The shop's time zone, like: America/Chicago.", + "type": "string" +} - added
Output schema / properties / times / items / properties / when / descriptionAdded value: +"The time in the shop's own time zone (time_zone), like: Today, 8 to 10 AM or Thu, Oct 22, 8 to 10 AM. Today is the shop's today."
3 tool updates
- Changed
find_help3 fields changed- changed
Input schema / properties / assistant / descriptionPrevious value: -"Your own name, as the person you act for knows you, like Muse. It goes in the text the shop sends them."New value: +"Your own name, as the person you act for knows you, like ChatGPT, Claude or Muse. It goes in the text the shop sends them." - added
Input schema / properties / include_signed_recordsAdded value: +{ + "description": "Optional. true adds each shop's signed record and the keys to check it with verify_record, a few thousand characters per shop. Leave it out unless the person asks for proof.", + "type": "boolean" +} - changed
Output schema / properties / check_records / descriptionPrevious value: -"How to check each signed_record: every shop's key, by its issuer's address."New value: +"Only with include_signed_records: how to check each signed_record, every shop's key by its issuer's address."
- Changed
get_quote1 field changed- changed
Input schema / properties / assistant / descriptionPrevious value: -"Your own name, as the person you act for knows you, like Muse. It goes in the text the shop sends them."New value: +"Your own name, as the person you act for knows you, like ChatGPT, Claude or Muse. It goes in the text the shop sends them."
- Changed
hold_time5 fields changed- changed
Input schema / properties / mobile / descriptionPrevious value: -"The person's US mobile number, with its area code. The shop texts it once."New value: +"The person's US mobile number, with its area code, as they gave it. The shop texts it once." - changed
Input schema / properties / name / descriptionPrevious value: -"The person's name."New value: +"The person's name, as they gave it." - removed
Input schema / properties / streetRemoved value: -{ - "description": "The street address of the house, with its number.", - "type": "string" -} - removed
Input schema / properties / unitRemoved value: -{ - "description": "Optional. The unit or apartment.", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "quote_id", - "option_id", - "time_id", - "name", - "mobile", - "street" -]New value: +[ + "quote_id", + "option_id", + "time_id", + "name", + "mobile" +]
6 tool updates
- Changed
booking_status1 field changed- added
Output schema / properties / changeAdded value: +{ + "description": "A change the person's assistant asked for once booked: a cancel (done at once, free under the shop's terms), or a move (the shop texted the person a link, and done once they picked a new time).", + "properties": { + "asked": { + "enum": [ + "cancel", + "move" + ], + "type": "string" + }, + "asked_at": { + "format": "date-time", + "type": "string" + }, + "done": { + "type": "boolean" + }, + "texted_at": { + "format": "date-time", + "type": "string" + } + }, + "required": [ + "asked", + "asked_at", + "done" + ], + "type": "object" +}
- Added
cancel_booking - Changed
find_help3 fields changed- added
Output schema / properties / shops / items / properties / currencyAdded value: +{ + "description": "Every amount is US dollars.", + "enum": [ + "USD" + ], + "type": "string" +} - added
Output schema / properties / shops / items / properties / termsAdded value: +{ + "description": "The terms every price here comes with: all in with no fees, paid after the work, and free to cancel within cancel_free_days of booking, before the visit.", + "properties": { + "all_in": { + "type": "boolean" + }, + "cancel_free_days": { + "type": "integer" + }, + "fees_cents": { + "type": "integer" + }, + "pay": { + "enum": [ + "after_the_work" + ], + "type": "string" + }, + "words": { + "type": "string" + } + }, + "required": [ + "all_in", + "fees_cents", + "pay", + "cancel_free_days", + "words" + ], + "type": "object" +} - changed
Output schema / properties / shops / items / requiredPrevious value: -[ - "shop", - "business_id", - "quote_id", - "prices", - "soonest", - "door" -]New value: +[ + "shop", + "business_id", + "quote_id", + "currency", + "prices", + "terms", + "soonest", + "door" +]
- Changed
get_quote3 fields changed- added
Output schema / properties / currencyAdded value: +{ + "description": "Every amount is US dollars.", + "enum": [ + "USD" + ], + "type": "string" +} - added
Output schema / properties / termsAdded value: +{ + "description": "The terms every price here comes with: all in with no fees, paid after the work, and free to cancel within cancel_free_days of booking, before the visit.", + "properties": { + "all_in": { + "type": "boolean" + }, + "cancel_free_days": { + "type": "integer" + }, + "fees_cents": { + "type": "integer" + }, + "pay": { + "enum": [ + "after_the_work" + ], + "type": "string" + }, + "words": { + "type": "string" + } + }, + "required": [ + "all_in", + "fees_cents", + "pay", + "cancel_free_days", + "words" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "quote_id", - "shop", - "prices", - "times", - "holds_times", - "next" -]New value: +[ + "quote_id", + "shop", + "currency", + "prices", + "terms", + "times", + "holds_times", + "next" +]
- Changed
hold_time1 field changed- added
Output schema / properties / changeAdded value: +{ + "description": "A change the person's assistant asked for once booked: a cancel (done at once, free under the shop's terms), or a move (the shop texted the person a link, and done once they picked a new time).", + "properties": { + "asked": { + "enum": [ + "cancel", + "move" + ], + "type": "string" + }, + "asked_at": { + "format": "date-time", + "type": "string" + }, + "done": { + "type": "boolean" + }, + "texted_at": { + "format": "date-time", + "type": "string" + } + }, + "required": [ + "asked", + "asked_at", + "done" + ], + "type": "object" +}
- Added
move_booking
6 tool updates
- First observed
booking_status - First observed
find_help - First observed
get_quote - First observed
hold_time - First observed
request_service - First observed
verify_record
Related MCP Connectors
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.
Quote, hold and book US house cleaning jobs on a customer's behalf, at each business's own prices.
Find, compare, and book local service businesses: live availability, prices, reviews, booking.
Related MCP Servers
- 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 gradedqualityBmaintenanceEnables voice assistants to find nearby service providers, connect users to live video representatives for natural conversation, and handle appointment booking. It also returns confirmed bookings so the assistant can add them to its calendar.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to submit and track local household-service requests such as house cleaning or pest control, validating details and passing each as a routed opportunity to external providers or buyer networks. Exposes service-discovery, submission, and status-check tools so those requests flow through one consistent intake pipeline.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to place real phone calls to US businesses in plain English — booking, canceling or rescheduling tables and appointments, verifying details, checking stock and requesting quotes — with IVR navigation and hold handling done automatically. Returns a labeled outcome, full transcript and recording, and can find candidate businesses when no phone number is known.110MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.