HireNimbus home services MCP
Server Details
Find and book verified local home service professionals through AI agents.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- Hire-Nimbus/nimbus-mcp-server
- GitHub Stars
- 0
- Server Listing
- HireNimbus home services MCP
TDQS
Scored across 20 tools
The find_* and book_* pairs are clearly separated by read-only search vs. booking workflow, and create_booking is explicitly positioned as the underlying step after a specific pro is chosen. search_providers vs. find_* tools has some overlap, but descriptions route matching categories to find_* and everything else to search_providers, so ambiguity is minimal.
Most tools follow a predictable verb_noun pattern (book_electrician, find_hvac, get_provider_details, cancel_booking). Minor deviations exist: search_providers uses 'search' while the category tools use 'find', and book_same_pro_again / get_more_tools are phrasal outliers, but the convention is still readable and consistent overall.
At 20 tools, the set is heavy. The five find_* and five book_* pairs account for 10 near-formulaic tools that could have been consolidated into generic tools with a category parameter. Still, each tool maps to a recognizable need, and 20 is not unmanageably large for a multi-category home services platform.
The core domain is well covered: provider search, details, reviews, booking workflows, cancellation, status checks, profile, and job history. The main gap is no update/reschedule booking tool, but agents can work around it by canceling and rebooking, so it is a minor rather than critical gap.
Available Tools
20 toolsbook_electricianBook electricianARead-onlyIdempotentInspect
Use when the user wants to book or hire a electrician — including when they describe a problem to fix, such as a dead outlet or outlet not working, breaker that keeps tripping, electrical panel upgrade, light fixture or ceiling fan installation, dimmer or switch replacement, EV charger installation, flickering lights, GFCI outlets, recessed lighting, hardwired smoke detectors, or exterior and landscape lighting. Runs the provider search first (query='electrician' prefilled); after results, ask which pro they would like to book, then use create_booking. Do not start OTP until create_booking returns auth_required after they chose a pro. Do not use for DIY how-to advice or price research with no hiring intent. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | Yes | Prefer a 5-digit US ZIP for location (e.g. "22307" or "94114"). This is the primary and preferred location input. After get_my_profile, if address.postalCode exists and the user confirmed the saved street address is the job site, pass that postalCode. Do not pass search_location when it is City, ST and a ZIP is available on the address. Never pass a street address, formattedAddress, or address1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already signal read-only, open-world, idempotent, and non-destructive behavior. The description adds valuable behavioral context beyond that: it runs the provider search first with query='electrician' prefilled, it should not start OTP until create_booking returns auth_required, and omitting the context parameter does not fail the call. These details give the agent a clearer model of side effects and sequencing.
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 long but dense; it front-loads the core intent and example triggers before procedural guidance. Almost every sentence adds unique information, though the same point about context is made both in the description and the schema, slightly inflating 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 the output schema exists and the annotations cover safety semantics, the description is nearly complete. It explains the full workflow, when to stop for OTP, exclusions, and the required context format. The only minor gap is pagination behavior (page/limit), but defaults exist and the main flow is fully specified.
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 covers location and context with detailed descriptions, but page and limit have only defaults and no explanation. With 50% schema coverage, the description partially compensates by restating and expanding context requirements (15-25 words, third person, no PII, omit is allowed) and by emphasizing location should be a 5-digit ZIP. It does not add any semantics for page or limit, leaving pagination behavior implicit.
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 use case ('book or hire a electrician') and enumerates many example problems (dead outlet, breaker tripping, EV charger, etc.), making the tool's purpose unmistakable. It clearly distinguishes itself from siblings by explaining that it runs a provider search and then defers actual booking to create_booking.
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 conditions for use, including a long list of qualifying scenarios and an explicit exclusion: 'Do not use for DIY how-to advice or price research with no hiring intent.' It also outlines the sequence of steps (provider search → ask which pro → create_booking). It doesn't explicitly name find_electrician as the alternative for search-only intent, which would make it even clearer, but the exclusion plus process guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
book_handymanBook handymanARead-onlyIdempotentInspect
Use when the user wants to book or hire a handyman — including when they describe a problem to fix, such as TV mounting, furniture assembly, a hole in the drywall, a door that won't close or latch, sticking or squeaky doors, caulking or grout repair, shelving or picture hanging, weatherstripping, fence or gate repair, loose deck boards, gutter cleaning or minor gutter repair, trim and baseboard work, small tile fixes, or paint touch-ups. Runs the provider search first (query='handyman' prefilled); after results, ask which pro they would like to book, then use create_booking. Do not start OTP until create_booking returns auth_required after they chose a pro. Do not use for DIY how-to advice or price research with no hiring intent. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | Yes | Prefer a 5-digit US ZIP for location (e.g. "22307" or "94114"). This is the primary and preferred location input. After get_my_profile, if address.postalCode exists and the user confirmed the saved street address is the job site, pass that postalCode. Do not pass search_location when it is City, ST and a ZIP is available on the address. Never pass a street address, formattedAddress, or address1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint; the description adds important behavioral context beyond those: the tool only runs the provider search, booking is delegated to create_booking, and OTP must not be started until auth_required is returned. This is consistent with the read-only annotation and clarifies the division of labor between the tools.
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 long and the first sentence is a run-on, but the extensive list of handyman tasks serves a real routing purpose. The key workflow points are front-loaded and each sentence contributes either a usage condition, a behavioral step, or a context-handling instruction.
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 and detailed annotations, the description covers when to use the tool, how to proceed after results, what to avoid, and how to handle context. It is slightly incomplete in not addressing how this tool relates to find_handyman or book_electrician, but an agent has enough information to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents location and context in detail, and the description adds useful non-obvious context semantics ('Omitting it does not fail the call; do not send an empty string'). However, page and limit have no schema description and no description-level explanation, leaving their semantics to be inferred from names and defaults, which is a meaningful gap at 50% schema 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 clearly identifies the trigger ('wants to book or hire a handyman') and gives a long, concrete list of example jobs. It also states that the tool runs a provider search with query='handyman'. However, it never explicitly frames the primary output as returning providers and does not contrast itself with sibling find_handyman or book_electrician, so differentiation is mostly implicit.
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 conditions, a when-not-to-use condition ('Do not use for DIY how-to advice or price research with no hiring intent'), and precise workflow instructions: ask which pro, then use create_booking, and do not start OTP until auth_required. This is strong routing guidance that leaves little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
book_hvacBook HVACARead-onlyIdempotentInspect
Use when the user wants to book or hire a HVAC — including when they describe a problem to fix, such as AC not cooling or blowing warm air, furnace won't turn on or no heat, heat pump repair or installation, thermostat or smart-thermostat installation, refrigerant recharge, seasonal HVAC tune-up or maintenance, mini-split installation, duct sealing or cleaning, strange noises or smells from the unit, or uneven temperatures between rooms. Runs the provider search first (query='hvac' prefilled); after results, ask which pro they would like to book, then use create_booking. Do not start OTP until create_booking returns auth_required after they chose a pro. Do not use for DIY how-to advice or price research with no hiring intent. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | Yes | Prefer a 5-digit US ZIP for location (e.g. "22307" or "94114"). This is the primary and preferred location input. After get_my_profile, if address.postalCode exists and the user confirmed the saved street address is the job site, pass that postalCode. Do not pass search_location when it is City, ST and a ZIP is available on the address. Never pass a street address, formattedAddress, or address1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals that the tool itself only runs the provider search (read-only), and the actual booking is delegated to create_booking. It also discloses the OTP timing, the requirement to always pass context (with 15-25 word format), and that omitting context does not fail the call. This adds significant value beyond the readOnlyHint annotation, clarifying the non-destructive nature and the intended sequence.
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 long but every sentence is purposeful: it enumerates problem types, gives workflow steps, and specifies parameter details. It is well-structured, starting with the primary use case and then proceeding to constraints and execution. A minor deduction for verbosity—the list of scenarios could be trimmed without loss—but it remains highly functional.
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 tool that orchestrates a multi-step booking flow, the description covers all essential aspects: when to invoke, what the tool returns (provider list), how to proceed (ask which pro, then create_booking), OTP handling, and parameter specifics. The presence of an output schema relieves the need to describe return values. Nothing 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?
The description gives detailed, actionable guidance for the two complex parameters: location (prefer ZIP, never street address, use postalCode from profile) and context (15-25 words, third person, no PII, with examples). Page and limit have defaults and are self-explanatory, so the lack of description is acceptable. This compensates well for the 50% schema 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 clearly states the tool's purpose: booking or hiring an HVAC pro, with a long list of concrete problem scenarios (AC not cooling, furnace won't turn on, etc.). It distinguishes itself from sibling tools by focusing on HVAC and explicitly naming the alternative workflow (create_booking) for the actual booking.
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 explicitly states when to use ('Use when the user wants to book or hire a HVAC') and when not to ('Do not use for DIY how-to advice or price research with no hiring intent'). It also provides a step-by-step workflow (run provider search, ask which pro, then create_booking) and specifies not to start OTP prematurely. This is exemplary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
book_plumberBook plumberARead-onlyIdempotentInspect
Use when the user wants to book or hire a plumber — including when they describe a problem to fix, such as a leaky or dripping faucet, clogged drain or toilet, running toilet, low water pressure, water heater repair or replacement (including tankless), a leak under the sink, burst or frozen pipes, sump pump issues, garbage disposal repair, sewer line backup, shower valve replacement, or toilet installation. Runs the provider search first (query='plumber' prefilled); after results, ask which pro they would like to book, then use create_booking. Do not start OTP until create_booking returns auth_required after they chose a pro. Do not use for DIY how-to advice or price research with no hiring intent. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | Yes | Prefer a 5-digit US ZIP for location (e.g. "22307" or "94114"). This is the primary and preferred location input. After get_my_profile, if address.postalCode exists and the user confirmed the saved street address is the job site, pass that postalCode. Do not pass search_location when it is City, ST and a ZIP is available on the address. Never pass a street address, formattedAddress, or address1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by revealing the tool is an orchestration step: it runs a prefilled provider search, asks which pro to book, and then delegates to create_booking. It also discloses OTP sequencing ('Do not start OTP until create_booking returns auth_required'), which is critical given the readOnlyHint annotation and the 'book' name.
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 long but well-organized: trigger scenarios, workflow, OTP timing, exclusions, and context instructions are each addressed. The extensive list of plumbing problems is useful for intent classification but makes it slightly verbose; still, every sentence contributes.
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 and annotations, the description is nearly complete for invocation. It covers the full workflow, OTP handling, exclusions, and context requirements. The only minor gap is no explicit guidance on page/limit parameters, though their defaults make this non-blocking.
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 thorough descriptions for location and context. The description adds only a small nuance about context ('Omitting it does not fail the call; do not send an empty string') but adds nothing for page and limit, which lack schema descriptions. With 50% schema coverage, it partially compensates but not fully.
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 is for booking/hiring a plumber and gives a concrete list of trigger scenarios (leaky faucet, clogged drain, water heater, etc.). It also distinguishes itself from siblings by explicitly routing the agent to create_booking after search and excluding no-hiring-intent uses.
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 explicitly says when to use the tool ('when the user wants to book or hire a plumber'), when not to use it ('Do not use for DIY how-to advice or price research with no hiring intent'), and names the next step (create_booking) after the user picks a pro. This gives clear decision rules versus alternatives like find_plumber.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
book_renovationBook renovationARead-onlyIdempotentInspect
Use when the user wants to book or hire a renovation — including when they describe a problem to fix, such as a kitchen remodel, bathroom remodel, basement finishing, flooring installation (hardwood, LVP, or tile), deck build, room addition, wall removal or open-floor-plan conversion, full interior painting, countertop replacement, or cabinet installation or refacing. Runs the provider search first (query='renovation' prefilled); after results, ask which pro they would like to book, then use create_booking. Do not start OTP until create_booking returns auth_required after they chose a pro. Do not use for DIY how-to advice or price research with no hiring intent. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | Yes | Prefer a 5-digit US ZIP for location (e.g. "22307" or "94114"). This is the primary and preferred location input. After get_my_profile, if address.postalCode exists and the user confirmed the saved street address is the job site, pass that postalCode. Do not pass search_location when it is City, ST and a ZIP is available on the address. Never pass a street address, formattedAddress, or address1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, or description discloses the operational flow: it runs a prefilled provider search, does not create the booking itself, and instructs to wait for create_booking to return auth_required before starting OTP. It also explains the analytics-driven context requirement and its tolerances, adding substantial behavioral context the annotations do not provide.
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 the use case and then delivers action steps, exclusions, and parameter guidance in compact, purposeful sentences. Every sentence adds either a selection criterion or a behavioral requirement, so the length is justified by the operational detail.
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 tool that coordinates provider search and subsequent booking, the description covers the trigger scenarios, the negative cases, the required next step (create_booking), the OTP sequencing, and the context parameter rules. The output schema is present, so returning value details are not needed in the description, and nothing essential for correct invocation 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 documents location and context in detail, and the description reinforces the context requirements with guidance about length, third-person wording, and not sending empty strings. However, page and limit are left undocumented in both schema and description, and the description does not add semantic guidance for the required location parameter beyond what the schema provides.
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 bundle: use when the user wants to book or hire a renovation, and it enumerates concrete project types (kitchen remodel, basement finishing, flooring, deck build, painting, etc.). It also clearly separates this tool from DIY or price-research intenthebdomad, which distinguishes it from non-booking siblings like find_renovation or search_providers.
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 says when to use the tool ('when the user wants to book or hire a renovation') and when not to ('Do not use for DIY how-to advice or price research with no hiring intent'). It also gives a clear follow-on workflow: run the search, ask which pro, then call create_booking, with precise OTP timing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
book_same_pro_againBook same pro againAInspect
Rebook a HireNimbus provider the homeowner has used before, by job ID. Requires authentication. Call with confirm_booking=false to preview the rebooking, then confirm_booking=true after homeowner approval. This tool may create a real booking request, including for an out-of-market address, because the provider is verified against the homeowner's owned prior job. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional name override; omit to use authenticated homeowner profile | |
| phone | No | Optional phone override; omit to use authenticated homeowner profile | |
| job_id | Yes | Job ID from get_previous_jobs for the prior booking to rehire | |
| source | No | AI Assistant | |
| address | No | Optional street-level address override. Omit to use profile or prior-job address. Pass structured fields only (address1, city, region, postalCode, etc.) — never formattedAddress. | |
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | No | Optional geocoding hint when address lacks coordinates. Omit in normal flows. When needed, pass exactly one of: lat+lng, zip, or text. | |
| confirm_booking | No | false (default): return a rebooking preview; does NOT submit. true: submit the rebooking after the homeowner explicitly confirms. | |
| job_description | No | Description of the new work; omit to reuse the prior job description |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (mutation allowed). The description explicitly discloses that the tool 'may create a real booking request,' including out-of-market addresses, and requires homeowner approval before confirmation. It also details the context parameter's optional nature and warns against empty strings. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, safety warning, preview/confirm flow, context requirement, and parameter clarifications. The structure is front-loaded with the core action and then details, making it easy for an agent 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?
The tool has 9 parameters (1 required) and an output schema, but the description covers all critical behavior: rebooking flow, side effects, out-of-market handling, context usage, and address overrides. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89%, so most parameters are self-explanatory. The description adds extra meaning for `context` (always include, 15-25 words, third person, no PII) and `confirm_booking` (false=preview, true=submit). It also clarifies the address override and location hints, going 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?
The description states a specific verb and resource: 'Rebook a HireNebula provider the homeowner has used before, by job ID.' It clearly distinguishes from sibling book_* tools by targeting a prior provider, not a trade. The preview/confirm flow adds precision.
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 explains when to use it (rebooking a previously used provider) and provides a clear two-step flow (preview with confirm_booking=false, then confirm after homeowner approval). It also warns about out-of-market addresses. It doesn't explicitly name alternatives or state when NOT to use it, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_bookingCancel bookingADestructiveIdempotentInspect
Cancel one of the authenticated homeowner's bookings. First call with confirm_cancellation=false to present the booking and reason for review; call again with true only after explicit approval. The cancellation reason is delivered to the provider.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Booking ID from get_previous_jobs | |
| reason | Yes | Short homeowner-provided cancellation reason | |
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| confirm_cancellation | No | false (default): return a cancellation preview without changing the booking; true: cancel after the homeowner explicitly confirms |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds crucial behavioral context: the first call is a non-destructive preview, and the second call actually cancels. It also discloses that the cancellation reason is sent to the provider, a side effect beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with the core action and two-step flow front-loaded. It conveys all essential operational details without redundancy or filler, achieving high information density in a compact format.
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 destructive two-step action, the description covers the entire workflow: preview, approval, cancellation, and side effect. The presence of an output schema handles return values, so nothing an agent needs to invoke this tool 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%, but the description adds significant value by emphasizing that the context parameter is mandatory on every call and explaining its purpose and format. It also clarifies the semantic difference between confirm_cancellation=false (preview) and true (cancel), which the schema's default description implies but the description makes explicit.
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 ('Cancel') and resource ('one of the authenticated homeowner's bookings'), and it distinguishes itself from all sibling tools (no other cancel tool exists). It also clarifies the two-step process, 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 instructs the agent to first call with confirm_cancellation=false to present a preview, then call again with true only after explicit approval. It also mandates the always-include context argument and warns that the reason is delivered to the provider, giving clear usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_bookingCreate bookingAInspect
Secured booking after the homeowner has chosen a specific pro from search or book_* results. Do not call this to start discovery, and do not start OTP before the homeowner has seen and picked a pro. Agents should prefer book_handyman, book_hvac, book_plumber, book_electrician, or book_renovation for standard booking workflows when the category matches; those tools search first. Requires authentication to submit. If unauthenticated, returns status "auth_required" so you can trigger phone/OTP connect gracefully at book time. Default confirm_booking=false returns a preview. confirm_booking=true submits the request. Confirmed calls are not idempotent and may create duplicate requests. HireNimbus is currently active in Washington DC Metro, San Francisco Bay Area, and Austin Metro; providers found elsewhere may still be booked when returned by search, with the active-market disclosure shown to the homeowner. For an out-of-market booking, pass the search_result_id from that provider search. Do not call on ambiguous intent such as 'find and book someone' — the user must first pick a specific pro from search results. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional override of profile name; omit to use authenticated homeowner profile | |
| phone | No | Optional override of profile phone; omit to use authenticated homeowner profile | |
| source | No | AI Assistant | |
| address | No | Optional street-level address override. Omit to use the authenticated homeowner profile address. When overriding, pass only structured fields (address1, address2, city, region, postalCode, country) — never formattedAddress. | |
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | No | Optional geocoding hint when address lacks coordinates. Omit in normal flows (profile address is used). When needed, pass exactly one of: lat+lng, zip, or text (e.g. {"text": "Alexandria, VA"}). | |
| confirm_booking | No | false (default): return booking_summary for user review; does NOT submit. true: submit the booking after the user explicitly confirms that summary. | |
| job_description | Yes | ||
| search_result_id | No | Search result ID returned by the provider search that produced the selected provider. Required for confirmed out-of-market bookings. | |
| serviceProviderSlug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and idempotentHint=false, and the description goes well beyond those by disclosing that confirmed calls are not idempotent and may create duplicate requests, that unauthenticated calls return auth_required, that default confirm_booking=false only previews, and that marketplace availability varies by region. This is rich, non-obvious behavioral context that an agent needs before invoking the tool.
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 longer than ideal but front-loads the core purpose and selection criteria, followed by auth, preview, duplicate, market, and context notes in roughly logical order. Some points are repeated (do not call before a pro is picked), but nearly every sentence contributes a distinct operational fact, so the length is justified.
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 — auth, preview vs. confirm, non-idempotency, market restrictions, sibling routing, and an output schema an agent can rely on for return values — the description is complete. It covers the main failure modes, edge cases, and required invocation pattern, leaving little an agent needs to infer 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?
Schema description coverage is 70%, and the description meaningfully supplements several parameters: confirm_booking's preview-vs-submit effect, search_result_id's role in out-of-market bookings, and the context parameter's analytics purpose plus the warning not to send an empty string. It does not describe all parameters (e.g., serviceProviderSlug, job_description, address), but the schema covers those adequately, and the description adds value where ambiguity is highest.
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 identifies a specific action — creating a secured booking after the homeowner has picked a specific pro from search or book_* results — and explicitly distinguishes it from discovery and the category-specific booking siblings. It names the sibling tools it is not, so an agent can select it correctly 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?
The description gives explicit when-to-use context (only after the homeowner has seen and picked a specific pro), explicit when-not-to-use guidance (do not call to start discovery, do not call on ambiguous intent), and names concrete alternatives (book_handyman, book_hvac, etc.) for standard workflows. It also explains auth handling, preview vs. submit behavior, and out-of-market requirements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_electricianFind electricianARead-onlyIdempotentInspect
Use when the user wants to find, search, or compare electrician professionals, or describes a problem a electrician solves — such as a dead outlet or outlet not working, breaker that keeps tripping, electrical panel upgrade, light fixture or ceiling fan installation, dimmer or switch replacement, EV charger installation, flickering lights, GFCI outlets, recessed lighting, hardwired smoke detectors, or exterior and landscape lighting. Do not use for DIY how-to advice, cost research with no hiring intent, auto or appliance retail questions, or emergencies requiring 911 or the utility company. Read-only; does not create a booking. Showcase matching pros before any booking or OTP. If already signed in, get_my_profile may load the saved ZIP; otherwise search with the ZIP they provide. Prefer a 5-digit ZIP for location. If this ZIP returns no providers, keep the empty result; do not fill with providers from another area. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | Yes | Prefer a 5-digit US ZIP for location (e.g. "22307" or "94114"). This is the primary and preferred location input. After get_my_profile, if address.postalCode exists and the user confirmed the saved street address is the job site, pass that postalCode. Do not pass search_location when it is City, ST and a ZIP is available on the address. Never pass a street address, formattedAddress, or address1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only, non-destructive, idempotent behavior, and the description reinforces this with 'Read-only; does not create a booking.' It adds useful behavioral context: how to handle empty results, when get_my_profile may supply the ZIP, and the requirement to pass context for analytics.
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?
Although long, the description is tightly packed and front-loaded with use cases, then exclusions, then behavioral rules. Every sentence adds decision-relevant information; none merely restates the title or 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?
Given the output schema exists and annotations cover safety, the description fully covers when to call, what to pass, how to handle edge cases, and how to behave with results. An agent has enough context to invoke this tool correctly in a variety of user-intent situations.
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 description adds value for location and context beyond the schema, like 'never pass a street address' and '15-25 words, third person, abstract purpose only.' Page and limit are not explained, but they are self-explanatory with defaults, and schema coverage for the other two parameters is detailed.
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 clearly that the tool finds, searches, or compares electrician professionals and gives a concrete list of electrician-specific problems. This differentiates it from sibling tools like find_plumber or find_hvac without needing to open their 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?
It explicitly tells when to use the tool, what not to use it for (DIY advice, cost research, emergencies), and when to use get_my_profile. The guidance about preferring a 5-digit ZIP and keeping empty results instead of substituting nearby providers gives clear, actionable decision rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_handymanFind handymanARead-onlyIdempotentInspect
Use when the user wants to find, search, or compare handyman professionals, or describes a problem a handyman solves — such as TV mounting, furniture assembly, a hole in the drywall, a door that won't close or latch, sticking or squeaky doors, caulking or grout repair, shelving or picture hanging, weatherstripping, fence or gate repair, loose deck boards, gutter cleaning or minor gutter repair, trim and baseboard work, small tile fixes, or paint touch-ups. Do not use for DIY how-to advice, cost research with no hiring intent, auto or appliance retail questions, or emergencies requiring 911 or the utility company. Read-only; does not create a booking. Showcase matching pros before any booking or OTP. If already signed in, get_my_profile may load the saved ZIP; otherwise search with the ZIP they provide. Prefer a 5-digit ZIP for location. If this ZIP returns no providers, keep the empty result; do not fill with providers from another area. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | Yes | Prefer a 5-digit US ZIP for location (e.g. "22307" or "94114"). This is the primary and preferred location input. After get_my_profile, if address.postalCode exists and the user confirmed the saved street address is the job site, pass that postalCode. Do not pass search_location when it is City, ST and a ZIP is available on the address. Never pass a street address, formattedAddress, or address1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds meaningful behavior: it does not create a booking, results should be shown before booking or OTP, empty ZIP results must remain empty rather than filling from another area, and the `context` parameter should be provided but omitting it will not fail the call. These details materially shape an agent's invocation and expectations.
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 longer than average, but almost every sentence earns its place by stating a use case, an exclusion, a location rule, or a behavioral guardrail. The example list of handyman tasks is extensive yet useful for classification; only slight redundancy with the schema's context description keeps it from a 5.
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 finder tool with a rich output schema and safety annotations, the description covers invocation scenarios, location handling, empty results, booking behavior, and the context parameter requirement. It is complete enough for correct use, though page and limit semantics are not addressed and no sibling alternative is named for broader search scenarios.
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 documents location and context well, and the description reinforces key constraints like preferring a 5-digit ZIP and using third-person, non-PII context. However, page and limit are left without any semantic explanation in either the schema or description, and schema coverage is only 50%, so the description does not fully compensate for the undocumented parameters.
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 ('find, search, or compare handyman professionals') and enriches it with concrete example tasks like TV mounting and drywall repair. It distinguishes this tool from book_handyman by explicitly noting it is read-only and from find_electrician/find_plumber etc. by focusing on handyman work.
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 'Use when' and 'Do not use for' guidance, including exclusions like DIY advice, cost research without hiring intent, and emergencies. It also provides sequencing advice involving get_my_profile and ZIP-based search, but it does not explicitly name alternative sibling tools for the excluded cases, so it stops just 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.
find_hvacFind HVACARead-onlyIdempotentInspect
Use when the user wants to find, search, or compare HVAC professionals, or describes a problem a HVAC solves — such as AC not cooling or blowing warm air, furnace won't turn on or no heat, heat pump repair or installation, thermostat or smart-thermostat installation, refrigerant recharge, seasonal HVAC tune-up or maintenance, mini-split installation, duct sealing or cleaning, strange noises or smells from the unit, or uneven temperatures between rooms. Do not use for DIY how-to advice, cost research with no hiring intent, auto or appliance retail questions, or emergencies requiring 911 or the utility company. Read-only; does not create a booking. Showcase matching pros before any booking or OTP. If already signed in, get_my_profile may load the saved ZIP; otherwise search with the ZIP they provide. Prefer a 5-digit ZIP for location. If this ZIP returns no providers, keep the empty result; do not fill with providers from another area. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | Yes | Prefer a 5-digit US ZIP for location (e.g. "22307" or "94114"). This is the primary and preferred location input. After get_my_profile, if address.postalCode exists and the user confirmed the saved street address is the job site, pass that postalCode. Do not pass search_location when it is City, ST and a ZIP is available on the address. Never pass a street address, formattedAddress, or address1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the annotations: it clarifies the tool is read-only, does not create bookings, should not fabricate providers when the ZIP returns no results, and should preserve empty results. It also documents the optional-but-expected context parameter behavior, including that omitting it won't fail the call and that an empty string should not be sent.
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 long but dense and well organized, front-loading user intent and exclusions before behavioral details. Some redundancy exists—'Prefer a 5-digit ZIP' and the context-passing rule appear in both the description and the schema—but each sentence otherwise earns its place given the tool's complexity.
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 a tool of this complexity, covering use cases, exclusions, profile/ZIP integration, empty-result behavior, and the required analytics context. Since an output schema exists, not detailing the return shape is acceptable. No material guidance an agent needs to call the tool 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?
With only 50% schema description coverage, the description compensates well for the two semantically important parameters: location (ZIP preference, postalCode from get_my_profile, never a street address) and context (15-25 words, third person, no PII, always passed). The page and limit parameters are not explained in the description, though their defaults in the schema make them largely self-explanatory.
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 verb and resource ('find, search, or compare HVAC professionals') and gives concrete problem examples, which makes the tool's purpose unmistakable. It also implies a clear distinction from booking tools by noting that it is read-only and does not create a booking.
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 the tool ('Use when the user wants to find...') and when not to use it ('Do not use for DIY how-to advice... emergencies...'). It also names get_my_profile as a complementary tool and positions this tool as the pre-booking search step, providing strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_plumberFind plumberARead-onlyIdempotentInspect
Use when the user wants to find, search, or compare plumber professionals, or describes a problem a plumber solves — such as a leaky or dripping faucet, clogged drain or toilet, running toilet, low water pressure, water heater repair or replacement (including tankless), a leak under the sink, burst or frozen pipes, sump pump issues, garbage disposal repair, sewer line backup, shower valve replacement, or toilet installation. Do not use for DIY how-to advice, cost research with no hiring intent, auto or appliance retail questions, or emergencies requiring 911 or the utility company. Read-only; does not create a booking. Showcase matching pros before any booking or OTP. If already signed in, get_my_profile may load the saved ZIP; otherwise search with the ZIP they provide. Prefer a 5-digit ZIP for location. If this ZIP returns no providers, keep the empty result; do not fill with providers from another area. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | Yes | Prefer a 5-digit US ZIP for location (e.g. "22307" or "94114"). This is the primary and preferred location input. After get_my_profile, if address.postalCode exists and the user confirmed the saved street address is the job site, pass that postalCode. Do not pass search_location when it is City, ST and a ZIP is available on the address. Never pass a street address, formattedAddress, or address1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint and idempotentHint, and the description reinforces 'Read-only; does not create a booking' and 'Showcase matching pros before any booking or OTP.' It adds non-obvious behavior: if the ZIP returns no providers, keep the empty result and do not substitute providers from another area. This is exactly the kind of context beyond annotations that helps an agent avoid a common mistake.
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 every sentence carries information: use cases, exclusions, read-only status, ZIP handling, empty-result behavior, and context policy. It is longer than a one-liner but well organized with signposts. Slight redundancy with annotations (read-only) costs a point, though it is not enough to harm usability.
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 moderate complexity — four parameters, one required, an optional analytics context field, and conditional ZIP sourcing — the description covers every operational aspect an agent needs: what triggers the call, what input to prefer, what to do on empty results, and what the read-only side effect is. The output schema exists, and the description properly avoids re-explaining return values.
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 has 50% description coverage, and the description compensates by explaining the location semantics ('Prefer a 5-digit US ZIP', 'Never pass a street address') and how to populate it after get_my_profile. The context parameter is also explained with length, person, and PII constraints. The page and limit parameters are not discussed in the description, but their integer defaults and idiomatic meaning are self-evident from the schema, so the compensation is adequate.
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 verb-resource pair ('find, search, or compare plumber professionals') and goes on to enumerate concrete scenarios (leaky faucet, clogged drain, water heater repair) that map directly to user intents. It is clearly differentiated from sibling find_electrician, find_hvac, and find_handyman tools by naming the plumber-specific domain.
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 explicit when-to-use criteria (user wants plumber professionals or describes a plumber-solved problem) and explicit exclusions (DIY advice, cost research without hiring intent, auto/appliance retail, emergencies needing 911). It also provides a conditional branching rule involving get_my_profile and ZIP input, leaving no ambiguity about when this tool should be invoked over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_renovationFind renovationARead-onlyIdempotentInspect
Use when the user wants to find, search, or compare renovation professionals, or describes a problem a renovation solves — such as a kitchen remodel, bathroom remodel, basement finishing, flooring installation (hardwood, LVP, or tile), deck build, room addition, wall removal or open-floor-plan conversion, full interior painting, countertop replacement, or cabinet installation or refacing. Do not use for DIY how-to advice, cost research with no hiring intent, auto or appliance retail questions, or emergencies requiring 911 or the utility company. Read-only; does not create a booking. Showcase matching pros before any booking or OTP. If already signed in, get_my_profile may load the saved ZIP; otherwise search with the ZIP they provide. Prefer a 5-digit ZIP for location. If this ZIP returns no providers, keep the empty result; do not fill with providers from another area. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | Yes | Prefer a 5-digit US ZIP for location (e.g. "22307" or "94114"). This is the primary and preferred location input. After get_my_profile, if address.postalCode exists and the user confirmed the saved street address is the job site, pass that postalCode. Do not pass search_location when it is City, ST and a ZIP is available on the address. Never pass a street address, formattedAddress, or address1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 safety profile is covered. The description adds valuable behavioral context beyond annotations: it explicitly says 'Read-only; does not create a booking', instructs to keep empty results rather than filling with providers from another area, and mandates passing the optional context parameter for analytics. These are behavioral traits an agent needs to know and are 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 dense but well-organized: it front-loads the primary use case and examples, then exclusions, then behavioral notes, then parameter guidance. Every sentence earns its place, though it is longer than strictly necessary and could be tightened without losing information. The structure is logical and scannable.
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 read-only search tool with a rich output schema, the description covers the core decision (when to call), the location input rules, the empty-result behavior, the analytics context requirement, and the relationship to siblings. The output schema exists, so return values need not be described. Nothing an agent needs to invoke this tool 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 description coverage is 50%, so the schema documents location and context but not page or limit. The description compensates by explaining the location preference (5-digit ZIP, use postalCode from get_my_profile, never pass a street address) and by explaining the context parameter's purpose, length, third-person requirement, and PII prohibition. It does not add detail about page/limit, but those are self-explanatory pagination parameters with defaults, so the gap is minor.
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 verb ('find, search, or compare') and a clear resource ('renovation professionals'), then enumerates concrete example projects (kitchen remodel, bathroom remodel, basement finishing, flooring, deck build, room addition, wall removal, painting, countertop, cabinets). This distinguishes it from sibling find_* tools by domain and from book_renovation by explicitly stating it is read-only and does not create a booking.
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 guidance ('Use when the user wants to find, search, or compare renovation professionals, or describes a problem a renovation solves'), explicit when-not-to-use guidance ('Do not use for DIY how-to advice, cost research with no hiring intent, auto or appliance retail questions, or emergencies'), and names the sibling alternative (book_renovation) by stating this tool does not create a booking. It also instructs to use get_my_profile for a saved ZIP, which is a clear routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_booking_statusGet booking statusARead-onlyIdempotentInspect
Check the current status of a HireNimbus booking by ID. Requires authentication. Read-only; does not create a booking.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| booking_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds 'Requires authentication,' which is beyond the annotations, and reinforces 'does not create a booking.' However, it does not describe the specific status values returned or any potential failure modes. Since annotations cover safety and idempotency, the extra auth note adds some value but not rich 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?
The description is very concise: three short clauses that front-load the purpose ('Check the current status...'), then add authentication and read-only notes. Every sentence earns its place, and there is no filler. It is well-structured and immediately readable.
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, the description need not explain return values. However, it lacks guidance on when to use this tool versus sibling tools like cancel_booking or get_provider_details, and it does not mention the context parameter or its mandatory nature. For a tool with many siblings, this is a notable gap, though the core purpose is covered.
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 50% (context has a detailed description, booking_id has none). The tool description only says 'by ID,' which adds minimal semantic value to booking_id. It does not compensate for the missing parameter documentation, nor does it address the discrepancy that context is described as always required but not listed in the required array. The description fails to clarify parameter expectations 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?
The description states a clear, specific action: 'Check the current status of a HireNimbus booking by ID.' This uses a strong verb and identifies the resource, and the phrase 'does not create a booking' explicitly differentiates it from create_booking and other mutation tools among the siblings. It is immediately evident what this tool does.
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 implies its use case by saying it checks status and is read-only, but it does not explicitly state when to prefer it over alternatives like cancel_booking or get_provider_details. There is no 'use this when...' guidance or explicit exclusion of other tools. The read-only note provides a weak hint, but the context is not fully developed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_more_toolsARead-onlyIdempotentInspect
Check for additional tools whenever your task might benefit from specialized capabilities - even if existing tools could work as a fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds only purpose and usage context, not additional behavioral details like return shape or side effects; 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 a single focused sentence with no filler. The key trigger condition is front-loaded, and every word 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?
For a simple tool with one well-documented parameter and strong annotations, the description covers the essential 'when to call' guidance. However, it does not clarify what happens after the call (e.g., that new tool definitions are returned or injected), and with no output schema this could leave some ambiguity.
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 input schema fully documents the 'context' parameter with examples and a clear explanation, so the description does not need to repeat parameter details. Baseline 3 applies because schema coverage is 100%.
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 action ('Check for additional tools') and a resource ('tools'), which clearly positions it as a meta-tool rather than a domain-specific sibling. It doesn't fully spell out the exact mechanics, but it is enough to distinguish it from the find/book siblings.
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 a clear trigger: use it 'whenever your task might benefit from specialized capabilities - even if existing tools could work as a fallback.' This is explicit about when to call it, though it doesn't describe exclusions or name alternative tools directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_profileGet my profileARead-onlyIdempotentInspect
Load the authenticated homeowner profile. Use this only when the HireNimbus account is already connected, to fill the saved service address before search. Do not call this to start discovery for an anonymous user, and do not start phone/OTP just to search or compare pros. If this returns status "auth_required", continue with ZIP + search and show pros; trigger connect/OTP only when create_booking returns auth_required after the homeowner chose a pro.
Returns GetMyProfileResult (structured JSON):
status (string, required): "ok", "error", or "auth_required"
name (string|null): homeowner full name when status is ok
phone (string|null): homeowner phone when status is ok
address (object|null): service street address with address1, address2, city, region, postalCode, country, formattedAddress
search_location (string|null): 5-digit ZIP from address.postalCode for search_providers.location (after user confirms the saved street address is the job site; never City, ST, the street line, formattedAddress, or address1)
error_code (string|null): "AUTH_REQUIRED" when status is auth_required
message (string|null): error or auth_required explanation
If address.postalCode exists: show the saved street address, confirm it is the job site, then pass that postalCode as location. If address.postalCode is missing: ask once "What's the ZIP for the job?" Do not ask for city/state first. Name, street, and phone can wait until preview/book.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Homeowner full name from profile (present when status is ok) |
| phone | No | Homeowner phone from profile (present when status is ok) |
| status | Yes | Outcome: "ok" when profile loaded, "auth_required" when unsigned-in, "error" otherwise |
| address | No | Full service street address on file with fields address1, address2, city, region, postalCode, country, formattedAddress |
| message | No | Error or auth_required explanation |
| error_code | No | Stable code such as "AUTH_REQUIRED" when status is auth_required |
| next_action | No | When status is auth_required: "continue_discovery" means search and show pros without OTP; "connect_to_book" means start phone/OTP connect now |
| search_location | No | 5-digit US ZIP from address.postalCode (e.g. "22307" or "94114") — pass to search_providers.location after the user confirms the saved street address is the job site. Never City, ST, a street line, formattedAddress, or address1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already marking the call read-only, idempotent, and non-destructive, the description adds meaningful behavioral detail: it can return ok, error, or auth_required, and prescribes what to do on auth_required. This goes beyond the annotations and matches the read-only safety profile without 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?
The description is front-loaded with purpose and usage, and the later field list is mostly actionable (e.g., search_location must be a ZIP, never City or street). It is longer than strictly necessary because it restates return fields that an output schema would cover, but each section earns its place with operational guidance.
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 tool with one well-documented parameter, strong annotations, and an output schema, the description supplies the missing orchestration: when to call, how to interpret auth_required, how to turn address.postalCode into search_providers.location, and what to do when postalCode is absent. An agent has everything needed to invoke it 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?
The only parameter, context, is fully specified by the input schema (always include, 15-25 words, third person, no PII), so schema coverage is 100%. The tool description itself adds no new parameter-level semantics, so the 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 opens with a specific action and resource: 'Load the authenticated homeowner profile.' It then states the exact niche (fill saved service address before search) and explicitly what not to use it for (anonymous discovery, phone/OTP), so it is easily distinguished from siblings like search_providers and create_booking.
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 and when-not-to-use conditions: only when the HireNimbus account is already connected, only to fill the saved service address before search, never for anonymous discovery or OTP. It also names the alternative flow with create_booking for the auth_required case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_previous_jobsGet previous jobsARead-onlyIdempotentInspect
Return past and active jobs for the authenticated homeowner. Requires authentication. Use after search when augmenting recommendations, or when the user asks about job history. Read-only; does not create a booking.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 safety profile is covered. The description adds value by stating 'Requires authentication' and 'does not create a booking,' which are behavioral traits not present in the annotations. It could go further by describing pagination or return format, but the output schema exists and the description is sufficient for a read-only list operation.
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 sentences with no wasted words. It front-loads the core function, then adds authentication and usage context, then clarifies read-only behavior. Every sentence 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?
For a read-only list tool with a full output schema and annotations covering safety, the description is nearly complete. It covers authentication, read-only behavior, and usage timing. The only minor gap is that it doesn't mention whether results are ordered or limited, but the output schema likely covers return structure, and the tool is simple enough that this is not a significant omission.
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 fully documents the single 'context' parameter. The description does not add parameter-specific meaning beyond the schema, but it doesn't need to because the schema already provides detailed guidance including examples and PII restrictions. 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 states a specific verb ('Return') and resource ('past and active jobs for the authenticated homeowner'), and clearly distinguishes this from sibling tools by noting it is read-only and does not create a booking. It also names the intended use case (augmenting recommendations, job history), which differentiates it from booking/search tools.
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 says when to use this tool: 'Use after search when augmenting recommendations, or when the user asks about job history.' It also implicitly excludes booking creation by stating 'does not create a booking,' which helps an agent avoid confusing it with book_* siblings. This is clear, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_provider_detailsGet provider detailsARead-onlyIdempotentInspect
Fetch the full profile for a HireNimbus service provider by slug. Use after find_handyman, find_hvac, find_plumber, find_electrician, find_renovation, or search_providers when the homeowner wants more detail about a specific provider. Returns ratings, reviews, past work, and availability where available. Read-only; does not create a booking. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as readOnly, idempotent, and non-destructive, lowering the bar. The description adds useful behavioral context beyond annotations: it 'does not create a booking,' returns ratings/reviews/past work/availability 'where available,' and explains that omitting context does not fail the call and that an empty string should not be sent. No contradictions with annotations exist.
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 sentences that are each purposeful, with the core 'fetch full profile' statement front-loaded. The context instructions are detailed and somewhat repetitive of the schema, but they earn their place by clarifying non-failure and empty-string constraints.
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 the description needn't detail the return structure. It explains what the call returns, when to call it, and the analytics context policy. It does not mention invalid-slug behavior or pagination, but those are minor for a read-only detail lookup.
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 50% (context documented, slug not). The description compensates by explaining the slug is the provider identifier and by giving detailed semantics for context: 15-25 words, third person, abstract purpose only, no PII, always pass even though technically optional, and never empty.
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?
Description opens with a specific verb and object: 'Fetch the full profile for a HireNimbus service provider by slug.' It also names the preceding sibling tools (find_handyman, find_hvac, etc.) and positions itself as a detail drill-down, clearly distinguishing it from search/find tools.
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 it: after any find_* or search_providers call 'when the homeowner wants more detail about a specific provider.' It also rules out booking by stating 'does not create a booking,' though it does not explicitly name alternative read-heavy tools like get_provider_reviews.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_provider_reviewsGet provider reviewsARead-onlyIdempotentInspect
Fetch reviews for a HireNimbus service provider by slug. Use when the homeowner wants to see what other homeowners have said about a provider before booking. Read-only; does not create a booking. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| slug | Yes | ||
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 description's reinforcement of 'Read-only; does not create a booking' adds little. However, the description discloses the context parameter's optional-yet-required nature ('Always pass optional context', 'Omitting it does not fail the call; do not send an empty string') which is not covered by annotations. This is valuable behavioral nuance for the agent.
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, tightly packed with the core action, usage context, and a behavioral note about the context parameter. It is front-loaded with the primary function and avoids any filler or redundant wording. Every clause contributes to agent decision-making.
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 covered), the description sufficiently explains the tool's purpose, when to use it, and the critical context parameter behavior. It does not describe pagination limits or results ordering, but those are inferable from parameter names and the output schema. The context quirk is well documented, making the tool callable correctly without additional assumptions.
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 description clarifies that `slug` identifies the provider ('by slug'), but the schema already provides a detailed description for `context` (which the description echoes). The pagination parameters `page` and `page_size` are not described in either the schema or the description, relying only on their names. With schema coverage at 25%, the description partially compensates for the missing parameter explanations but does not fully address pagination semantics.
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 explicitly states 'Fetch reviews for a HireNimbus service provider by slug,' which is a specific verb (fetch), resource (reviews), and identifier (slug). It is clearly distinguishable from sibling tools like booking (book_plumber) or provider info (get_provider_details) because it focuses solely on reviews. The purpose is unambiguous and action-oriented.
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 a clear use case ('Use when the homeowner wants to see what other homeowners have said about a provider before booking') and explicitly notes it is read-only and 'does not create a booking,' which helps avoid confusion with booking tools. However, it does not explicitly name alternative tools such as get_provider_details or search_providers, leaving some inference required about when to use those instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_providersSearch providersARead-onlyIdempotentInspect
Use this when the user needs a home service outside the five dedicated find_* categories — such as house cleaning or deep cleaning, landscaping, lawn care or mowing, tree trimming, roofing or roof leak repair, gutter installation, pressure washing, junk removal, moving help, painting, or pest-adjacent cleanup — or when the service category is ambiguous. Prefer a 5-digit US ZIP for location (e.g. "22307", "94114"); never a street address, formattedAddress, or address1. Read-only; does not create a booking. Prefer the dedicated find_* tools (find_handyman, find_hvac, find_plumber, find_electrician, find_renovation) when the request matches those categories. Search results outside the supported launch markets can still be booked when returned by search; tell the homeowner about the active launch markets and the available provider. If the ZIP search returns no providers, keep that empty result — do not substitute providers from another area. The response includes a search_result_id; pass it to create_booking when booking a selected provider. Always pass optional context on this call (15-25 words, third person, abstract purpose only, no PII) so analytics can record why the tool was called. Omitting it does not fail the call; do not send an empty string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| query | Yes | Service keyword for non-top categories (e.g. cleaning, landscaping, roofing). For handyman, HVAC, plumber, electrician, or renovation, use the dedicated find_* tools instead. | |
| context | No | Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP." | |
| location | Yes | Prefer a 5-digit US ZIP for location (e.g. "22307" or "94114"). This is the primary and preferred location input. After get_my_profile, if address.postalCode exists and the user confirmed the saved street address is the job site, pass that postalCode. Do not pass search_location when it is City, ST and a ZIP is available on the address. Never pass a street address, formattedAddress, or address1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior, but the description adds valuable behavioral context: no booking creation, launch-market booking caveats, preserving empty results, the search_result_id contract for create_booking, and the context analytics requirement. This goes well beyond annotation coverage.
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 well organized, front-loading the use case before caveats. Some statements repeat information already in the schema or annotations, such as read-only status and ZIP preference, so it is not maximally concise, but every sentence carries useful decision or safety content.
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 and the sibling set is rich, the description covers the critical decisions: when to use this tool, when to defer to find_* tools, location constraints, empty-result behavior, booking integration, and analytics context. An agent has enough to call it correctly and avoid common mistakes.
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 60% schema description coverage, the description adds meaningful parameter context: it reinforces the preferred 5-digit ZIP format, forbids street addresses, and clarifies that context should always be passed but that omitting it will not fail the call. It doesn't detail page or limit, but those have schema defaults and are lower-risk.
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 defines the tool as the general home-services search for anything outside the five dedicated find_* categories, with concrete examples like cleaning, landscaping, and roofing. It also names the sibling find_* tools it is not, so an agent can disambiguate without opening 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?
It explicitly states when to use this tool versus the find_* alternatives, including the ambiguous-category case. It also gives specific location guidance, warns against street addresses, and instructs not to substitute providers for empty results—strong, actionable routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
get_my_profile6 fields changed- changed
Output schema / examplesPrevious value: -[ - { - "address": { - "address1": "123 Main St", - "address2": null, - "city": "Alexandria", - "country": "US", - "formattedAddress": "123 Main St, Alexandria, VA 22314", - "postalCode": "22314", - "region": "VA" - }, - "message": null, - "name": "Jane Doe", - "phone": "+15551234567", - "search_location": "22314", - "status": "ok" - }, - { - "address": null, - "message": "No authenticated homeowner profile found.", - "name": null, - "phone": null, - "search_location": null, - "status": "error" - } -]New value: +[ + { + "address": { + "address1": "123 Main St", + "address2": null, + "city": "Alexandria", + "country": "US", + "formattedAddress": "123 Main St, Alexandria, VA 22314", + "postalCode": "22314", + "region": "VA" + }, + "message": null, + "name": "Jane Doe", + "phone": "+15551234567", + "search_location": "22314", + "status": "ok" + }, + { + "address": null, + "message": "No authenticated homeowner profile found.", + "name": null, + "phone": null, + "search_location": null, + "status": "error" + }, + { + "address": null, + "error_code": "AUTH_REQUIRED", + "message": "No HireNimbus account is connected. Searching and browsing pros works without an account.", + "name": null, + "next_action": "continue_discovery", + "phone": null, + "search_location": null, + "status": "auth_required" + } +] - added
Output schema / properties / error_codeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Stable code such as \"AUTH_REQUIRED\" when status is auth_required", + "title": "Error Code" +} - changed
Output schema / properties / message / descriptionPrevious value: -"Error explanation when status is error"New value: +"Error or auth_required explanation" - added
Output schema / properties / next_actionAdded value: +{ + "anyOf": [ + { + "enum": [ + "continue_discovery", + "connect_to_book" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "When status is auth_required: \"continue_discovery\" means search and show pros without OTP; \"connect_to_book\" means start phone/OTP connect now", + "title": "Next Action" +} - changed
Output schema / properties / status / descriptionPrevious value: -"Outcome: \"ok\" when profile loaded, \"error\" otherwise"New value: +"Outcome: \"ok\" when profile loaded, \"auth_required\" when unsigned-in, \"error\" otherwise" - changed
Output schema / properties / status / enumPrevious value: -[ - "ok", - "error" -]New value: +[ + "ok", + "error", + "auth_required" +]
20 tool updates
- Changed
book_electrician7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "location", - "context" -]New value: +[ + "location" +]
- Changed
book_handyman7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "location", - "context" -]New value: +[ + "location" +]
- Changed
book_hvac7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "location", - "context" -]New value: +[ + "location" +]
- Changed
book_plumber7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "location", - "context" -]New value: +[ + "location" +]
- Changed
book_renovation7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "location", - "context" -]New value: +[ + "location" +]
- Changed
book_same_pro_again7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "job_id", - "context" -]New value: +[ + "job_id" +]
- Changed
cancel_booking3 fields changed- changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - changed
Input schema / requiredPrevious value: -[ - "job_id", - "reason", - "context" -]New value: +[ + "job_id", + "reason" +]
- Changed
create_booking7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "serviceProviderSlug", - "job_description", - "context" -]New value: +[ + "serviceProviderSlug", + "job_description" +]
- Changed
find_electrician7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "location", - "context" -]New value: +[ + "location" +]
- Changed
find_handyman7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "location", - "context" -]New value: +[ + "location" +]
- Changed
find_hvac7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "location", - "context" -]New value: +[ + "location" +]
- Changed
find_plumber7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "location", - "context" -]New value: +[ + "location" +]
- Changed
find_renovation7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "location", - "context" -]New value: +[ + "location" +]
- Changed
get_booking_status3 fields changed- changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - changed
Input schema / requiredPrevious value: -[ - "booking_id", - "context" -]New value: +[ + "booking_id" +]
- Changed
get_more_tools3 fields changed- changed
Input schema / properties / context / descriptionPrevious value: -"A description of your goal and what kind of tool would help accomplish it."New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - changed
Input schema / requiredPrevious value: -[ - "context" -]New value: +[]
- Changed
get_my_profile3 fields changed- changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - changed
Input schema / requiredPrevious value: -[ - "context" -]New value: +[]
- Changed
get_previous_jobs3 fields changed- changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - changed
Input schema / requiredPrevious value: -[ - "context" -]New value: +[]
- Changed
get_provider_details7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "slug", - "context" -]New value: +[ + "slug" +]
- Changed
get_provider_reviews7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "slug", - "context" -]New value: +[ + "slug" +]
- Changed
search_providers7 fields changed- added
Input schema / properties / context / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / context / defaultAdded value: +null - changed
Input schema / properties / context / descriptionPrevious value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"Always include this argument on every call — do not omit it (analytics / Agent Intent). Write 15-25 words in third person explaining why this tool is being called. Abstract purpose only: never names, phones, emails, street addresses, IDs, or other PII. Example: \"Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.\"" - added
Input schema / properties / context / examplesAdded value: +[ + "Homeowner wants vetted local plumbers for a leaking kitchen faucet within the previously confirmed ZIP.", + "Homeowner is comparing HVAC pros after a no-cool air conditioner at the confirmed job site." +] - added
Input schema / properties / context / titleAdded value: +"Context" - removed
Input schema / properties / context / typeRemoved value: -"string" - changed
Input schema / requiredPrevious value: -[ - "query", - "location", - "context" -]New value: +[ + "query", + "location" +]
20 tool updates
- First observed
book_electrician - First observed
book_handyman - First observed
book_hvac - First observed
book_plumber - First observed
book_renovation - First observed
book_same_pro_again - First observed
cancel_booking - First observed
create_booking - First observed
find_electrician - First observed
find_handyman - First observed
find_hvac - First observed
find_plumber - First observed
find_renovation - First observed
get_booking_status - First observed
get_more_tools - First observed
get_my_profile - First observed
get_previous_jobs - First observed
get_provider_details - First observed
get_provider_reviews - First observed
search_providers
Related MCP Connectors
Book local tradespeople — plumber, electrician, HVAC, and 7 more — via your AI agent. All US.
Verified local businesses, bookable by AI agents: services, prices, availability and appointments.
Discover and book businesses via AI agents.
Find participating local service providers and book live appointment times.
Related MCP Servers
AlicenseAqualityCmaintenanceEnables AI assistants to discover and book local service businesses like barbers, plumbers, and mechanics directly through MCP-compatible tools.945 npmMIT- AlicenseAqualityAmaintenanceFindAgent — the vetted, cross-LLM marketplace of doer agents.42MIT
- FlicenseNot gradedqualityFmaintenanceThe owner-verified local business data + service & menu-price layer for AI agents. Owner-authored business profiles where every response carries provenance — verification level, completeness score, freshness timestamps, and upstream sources. * Search & profiles — find businesses by name, category, city, or geo-radius; full profiles with contacts, hours, media, ratings. * Price layer-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to match users with licensed, rated contractors in Miami, providing pricing and direct contact details.2 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.