Skip to main content
Glama

Server Details

AI agents find, message & book SMBs; pay per call in USDC on Base via x402. 14 tools, compliant.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
basilalshukaili/agentbroker
GitHub Stars
1
Server Listing
Agent Broker

Available Tools

23 tools
call_businessA
Destructive
Inspect

Place a conversational voice-AI phone call to a business on a consumer's behalf and return a structured answer. THE differentiated capability: reach the tens of millions of long-tail SMBs that have NO API and NO booking page — only a phone number. An AI agent cannot pick up a phone and hold a conversation; this tool does. Give a plain-language objective; the voice AI navigates the call and extracts the answer. Business-directed (B2B), far less restricted than calling consumers — but the compliance gate still enforces recording consent per jurisdiction. Async: returns a call handle; poll get_outcome for the transcript + extracted fields.

WHEN TO USE: Use when the target business has NO booking URL and NO API — only a phone number — and the consumer asked the agent to reach them (e.g. 'call this plumber and ask if they can come Tuesday', 'ask the salon if they take walk-ins this afternoon'). Also use to confirm details a booking page doesn't expose (real-time availability, custom quotes). WHEN NOT TO USE: Do NOT use when the business has a booking URL — use import_booking_url + schedule_appointment (cheaper, faster, deterministic). Do NOT use for calls to consumers/individuals (this tool is for reaching businesses). Do NOT use for marketing or telemarketing — the compliance gate and the B2B-only framing reject that. COST: $0.2 per_call LATENCY: ~45000ms EXECUTION: async_by_default (use get_outcome to retrieve result)

ParametersJSON Schema
NameRequiredDescriptionDefault
smb_idNoKnown SMB identifier with a phone on record. Provide this OR business_phone.
objectiveYesWhat the call should accomplish, in plain language.
country_codeNoISO 3166-1 alpha-2 for compliance + recording-consent routing.
on_behalf_ofNoName of the consumer the call is placed for.
business_phoneNoBusiness phone in E.164 (e.g. +14045550123). Provide this OR smb_id.
extract_fieldsNoStructured fields to pull from the answer, e.g. ['available_tomorrow','price_quote','earliest_slot'].
idempotency_keyNoOptional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged.
max_duration_secondsNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, and the description adds rich behavioral context: async execution by default, polling via get_outcome, compliance recording-consent routing, B2B-framing restrictions, cost per call, and latency. This goes well beyond the structured fields and gives the agent a clear model of side effects and operational behavior.

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

Conciseness5/5

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

The description is well-structured with clear sections for purpose, usage, cost, latency, and execution mode. The most important differentiator is front-loaded, examples are short and illustrative, and every section earns its place despite the length.

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

Completeness5/5

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

For a tool with 8 parameters, no output schema, and notable compliance and cost implications, the description is complete: it explains the call flow, how results are obtained, when to avoid the tool, and the operational constraints. An agent has enough information to decide whether and how to invoke this tool correctly.

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

Parameters3/5

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

Schema description coverage is 88%, so the parameter burden is mostly carried by the schema. The tool description adds a little context around plain-language objectives and that results are retrieved as transcript plus extracted fields, but it does not materially explain individual parameters beyond what the schema already provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific action and resource: placing a conversational voice-AI call to a business on a consumer's behalf and returning a structured answer. It further distinguishes itself by emphasizing the unique capability to reach long-tail SMBs with no API or booking page, clearly separating it from sibling tools like schedule_appointment and import_booking_url.

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

Usage Guidelines5/5

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

WHEN TO USE and WHEN NOT TO USE sections explicitly define the target scenario, give concrete examples, and name exact alternative tools (import_booking_url + schedule_appointment) to avoid. It also excludes consumer calls and marketing use cases, leaving no ambiguity about appropriate invocation.

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

capture_leadAInspect

Structured intake of a prospect into an SMB's funnel with validation and deduplication on (smb_id, phone or email). Stores the prospect in the SMB's AgentBroker lead funnel — this is AgentBroker's own lead store, NOT a write into the business's own CRM.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Tell smb_xyz I'm interested and want a callback" -> call capture_lead({"smb_id": "smb_xyz", "prospect": {"name": "Jane", "phone": "+15551234567", "email": "jane@example.com"}, "source": "agent"})

WHEN TO USE: Use when a potential customer has expressed interest in an SMB's service and you want to ensure they are registered in the SMB's pipeline for follow-up. WHEN NOT TO USE: Do not use for confirmed bookings — use schedule_appointment. Do not use for bulk list imports. COST: $0.05 per_call LATENCY: ~600ms EXECUTION: sync_fast (use get_outcome to retrieve result)

ParametersJSON Schema
NameRequiredDescriptionDefault
smb_idYes
sourceNoWhere the consumer-initiated request originated (e.g., 'consumer_request', 'inbound_quote_form', 'agent_referral_from_find_business').
prospectYes
idempotency_keyNoOptional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the skeletal annotations, the description discloses storage semantics (AgentBroker lead store, not CRM), dedup/validation behavior, cost ($0.05), latency (~600ms), and async-style result retrieval via get_outcome. No contradiction with annotations; the write behavior matches readOnlyHint=false.

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

Conciseness4/5

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

The description is well-structured with purposeful sections: core purpose, example, when to use/not use, then cost/latency/execution. Each section earns its place, though the example JSON adds length; overall it is appropriately sized and front-loaded.

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

Completeness4/5

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

With no output schema, the description compensates by referencing get_outcome for results and giving cost, latency, and execution mode. It covers the critical distinction from the SMB's own CRM and the primary routing rules; the only minor gap is a precise description of the response receipt, which is delegated to get_outcome.

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

Parameters4/5

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

The example call maps a natural-language request to concrete values for smb_id, prospect, and source, and the dedup note clarifies the role of smb_id/phone/email. Schema descriptions cover source and idempotency_key, so the description adds value without needing to repeat them; some prospect subfields remain undocumented but are self-explanatory.

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

Purpose5/5

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

Description uses specific verb 'intake'/'stores' with resource 'prospect into SMB's funnel,' and adds key differentiators: validation, deduplication on (smb_id, phone/email), and explicit note that it writes to AgentBroker's own lead store, not the business's CRM. This clearly distinguishes it from siblings like schedule_appointment.

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

Usage Guidelines5/5

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

Explicit WHEN TO USE and WHEN NOT TO USE sections state the triggering condition (prospect expressed interest) and exclusions (confirmed bookings -> schedule_appointment; bulk imports). Also notes follow-up retrieval via get_outcome, which guides the call flow.

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

check_complianceA
Read-onlyIdempotent
Inspect

Free, instant pre-flight for the compliance gate. Runs the SAME TCPA / GDPR / CASL / CAN-SPAM / 10DLC gate that send_message and call_business run — but in preview mode, so NO message is sent and NO state changes. Tells you whether a (recipient, channel, message_type, content) send would be permitted BEFORE you pay for it, and if not, names the exact rule and how to remediate. Use it to de-risk a paid send the same way check_booking_link de-risks a paid booking. Attaches a compliance_receipt: an Ed25519-signed, hash-bound record of what was checked, when, against which sources, and what it returned - verifiable OFFLINE against the public key published at https://hatchloop.dev/agents.md, so you can hand it to an auditor as evidence the check really ran.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Is it legal to text this US number a 20%-off promo?" -> call check_compliance({"recipient_id": "+14045550200", "content": "20% off this week only!", "channel": "sms", "message_type": "marketing", "country_code": "US"}) user: "Before you email the dentist, make sure it's allowed" -> call check_compliance({"recipient_id": "office@dentist.example", "content": "Do you accept Cigna? Following up on my request.", "message_type": "follow_up"}) -> then send_message({"recipient": {"id_type": "email", "id_value": "office@dentist.example"}, "message_type": "follow_up", "content": {"body": "Do you accept Cigna? Following up on my request."}})

WHEN TO USE: Call this the moment before send_message or call_business when there is any chance the send is regulated — anything tagged marketing, any SMS to a US number (10DLC), any message to an EU/UK (GDPR) or Canadian (CASL) recipient, or any content you are unsure about. It is free and sub-100ms, so run it as a guard: if legal=true, proceed to send_message with confidence; if legal=false, fix the cited blocker instead of burning a paid, rejected send. WHEN NOT TO USE: Do not treat a legal=true as a permanent license — the gate re-runs at send time, so a fresh opt-out between preview and send still blocks. Do not use it to check two-party voice recording consent (that is evaluated at call time in the voice adapter, not here). It is not a substitute for send_message; it never delivers anything. COST: free - no key required LATENCY: ~15ms

ParametersJSON Schema
NameRequiredDescriptionDefault
channelNoDelivery channel. Omit to auto-infer sms/email from recipient_id; set 'voice' explicitly.
contentYesThe actual message body you intend to send. The gate classifies the real text, so a meaningful preview needs the real content.
state_codeNoUS state code (e.g. 'CA') for state-specific rules.
country_codeNoISO 3166-1 alpha-2 (e.g. 'US', 'DE', 'CA'). Auto-inferred from phone if omitted; drives which jurisdiction rules apply.
message_typeNoIntent tag: transactional, marketing, reminder, follow_up, notification. 'marketing' triggers the consent checks. Defaults to transactional.transactional
recipient_idYesPhone in E.164 (e.g. '+14045550100') or email address the message would go to.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses no state changes, free execution, sub-100ms latency, and the generation of a signed, hash-bound compliance_receipt verifiable offline. It also clarifies that the gate re-runs at send time and that two-party voice recording consent is out of scope. 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.

Conciseness4/5

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

The description is long but well-structured and front-loaded with the core purpose. Example queries, WHEN TO USE, and WHEN NOT TO USE all earn their place. Minor redundancy exists because 'free' and 'fast' appear in the description, Cost, and Latency sections, but overall density is high.

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

Completeness5/5

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

With no output schema, the description explains what the tool returns: whether the send is permitted, the exact rule if blocked, remediation, and a signed receipt. It also covers cost, latency, trigger conditions, exclusions, and a verification URL. Nothing essential for correct tool selection and invocation is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics: marketing triggers consent checks, channel and country_code can be auto-inferred, and content must be the real message body. The example queries map natural-language requests to concrete parameter values, which helps an agent construct valid calls.

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

Purpose5/5

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

The description states a specific verb and resource: it is a 'pre-flight' compliance check that runs the same TCPA/GDPR/CASL/CAN-SPAM/10DLC gate as send_message and call_business, but in preview mode. It clearly differentiates itself from sibling tools by emphasizing that no message is sent and no state changes.

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

Usage Guidelines5/5

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

The description includes explicit WHEN TO USE and WHEN NOT TO USE sections. It tells the agent to call it immediately before send_message or call_business for regulated sends, gives concrete triggers such as marketing messages, US SMS, GDPR, and CASL, and warns against treating legal=true as a permanent license or substituting it for delivery.

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

check_quotaA
Read-onlyIdempotent
Inspect

Returns the caller's current quota state: how many operations have been used today, how many remain, the daily limit, the tier (free / credits / unlimited), and when the quota resets. Read-only and free. Works with any valid X-Agent-Identity token; returns tier='anonymous' for keyless callers with the anonymous daily limits.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "How many API calls do I have left today?" -> call check_quota({}) user: "Check my quota before sending messages" -> call check_quota({}) user: "When does my rate limit reset?" -> call check_quota({})

WHEN TO USE: Call at session start or before a batch of write operations to confirm you have enough remaining quota. Use when a user asks how many API calls they have left today. Also useful after a rate_limited error to understand when the quota resets. WHEN NOT TO USE: Do not call on every single tool invocation — quota is also injected into every write-tool response in the 'quota' field. Only call proactively when you need the current state without performing an operation. COST: free - no key required LATENCY: ~5ms

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint and idempotentHint annotations, the description adds meaningful behavioral context: the tool is free, requires no API key, accepts any valid X-Agent-Identity token, and returns tier='anonymous' for keyless callers with anonymous limits. It also discloses cost and latency, giving the agent a fuller operational picture.

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

Conciseness5/5

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

Although longer than average, every section earns its place: clear function summary, motivating example queries, explicit usage guidance, and cost/latency notes. The information is front-loaded and organized, with no redundant filler.

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

Completeness5/5

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

With no output schema, the description compensates by listing the exact return fields and reset behavior. It also covers authentication edge cases, cost, latency, and usage frequency, making it complete for an agent to decide when and how to invoke the tool.

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

Parameters4/5

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

The input schema has zero parameters, so there is no semantic ambiguity to resolve. The description reinforces the empty call shape with check_quota({}) examples, matching the baseline of 4 for parameterless tools.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Returns the caller's current quota state', and enumerates the exact fields returned (operations used, remaining, daily limit, tier, reset time). This clearly differentiates it from siblings like check_compliance and get_status.

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

Usage Guidelines5/5

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

Provides explicit WHEN TO USE and WHEN NOT TO USE sections, including when to call proactively and after a rate_limited error. It also tells the agent not to call on every invocation because quota is already injected into write-tool responses, which serves as an alternative source of the information.

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

escalate_to_humanA
Destructive
Inspect

Hand off an in-flight task to a human operator with a full context bundle: transcript, prior actions, identifiers, and a recommended next step.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "I'm stuck — get a human at smb_xyz to call me back" -> call escalate_to_human({"smb_id": "smb_xyz", "reason": "automation_failed", "context": {"original_operation": "schedule_appointment", "recommended_next_step": "Call the business directly to confirm the slot"}, "priority": "urgent"})

WHEN TO USE: Use when automated resolution has failed after channel-fallback exhaustion, when the task requires human judgment, or when the customer has explicitly requested human contact. WHEN NOT TO USE: Do not use as a first resort. Escalate only after automated resolution attempts. COST: $0.2 per_call LATENCY: ~2000ms EXECUTION: async_by_default (use get_outcome to retrieve result)

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYes
smb_idYes
contextYes
priorityNonormal
idempotency_keyNoOptional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already signal destructiveHint and non-read-only behavior. The description adds useful behavioral context: async execution by default, the need to use get_outcome for the result, cost, and latency. It could further explain the irreversible or externally visible side effects of escalation, but the hand-off framing plus annotations cover the essential safety profile.

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

Conciseness5/5

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

The description is longer than average, but every section—example, when to use, when not to use, cost, latency, execution mode—earns its place and is front-loaded with the core purpose. There is no redundant filler.

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

Completeness5/5

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

For a complex async tool with no output schema, the description supplies the critical operational details: async execution, result retrieval via get_outcome, cost, latency, when to escalate, and when not to. An agent has enough information to invoke it correctly.

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

Parameters4/5

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

Schema description coverage is low, but the description compensates by naming the context fields, showing a full example call, and indicating how reason, context, priority, and smb_id are used. It does not define every enum value or nested subfield, but the schema enumerations and example fill most gaps; idempotency_key is well documented in the schema itself.

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

Purpose5/5

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

States a specific verb and resource: hand off an in-flight task to a human operator with a context bundle. Includes the exact bundle contents and a concrete example query, which makes the tool's purpose unmistakable and distinguishes it from sibling tools like get_outcome or send_message.

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

Usage Guidelines5/5

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

Explicitly provides WHEN TO USE and WHEN NOT TO USE guidance, including the key exclusion 'Do not use as a first resort.' This directly helps the agent decide between this tool and automated alternatives.

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

find_businessA
Read-onlyIdempotent
Inspect

Given criteria (vertical, location, capability, price band, availability window), return ranked candidate businesses from our supply network. THE NETWORK IS SMALL AND STILL MOSTLY SAMPLE DATA: entries that are not real are named [DEMO] and flagged is_demo - check that field before acting on a result.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Find me a salon in Tokyo that does color" -> call find_business({"vertical": "personal_services", "location": {"zip_or_city": "Tokyo"}, "capability": "color"}) user: "I need a plumber near 30309" -> call find_business({"vertical": "home_services", "location": {"zip_or_city": "30309"}, "capability": "plumbing"}) user: "Show me dentists in London" -> call find_business({"vertical": "professional_services", "location": {"zip_or_city": "London"}, "capability": "dentist"})

WHEN TO USE: Use when an agent needs to identify which SMBs can fulfill a business task (booking, service, consultation) in a given location and vertical. Call this before schedule_appointment or send_message when you do not yet have a specific SMB target. WHEN NOT TO USE: Do not use as a general directory or browsing surface. Do not use when you already have a specific verified SMB identifier. Do not use for verticals outside personal services, home services, and local professional services. COST: free - no key required LATENCY: ~200ms

ParametersJSON Schema
NameRequiredDescriptionDefault
locationYes
verticalYesService vertical to search within
capabilityNoSpecific service capability required, e.g. 'haircut', 'plumbing', 'tax_consultation'
price_bandNo
max_resultsNo
availability_windowNoAccepted but NOT APPLIED - it does not narrow results. We do not hold live calendars for the supply network. The response carries availability_window_applied: false when you send one. To book a specific slot use schedule_appointment with requested_time, which checks real availability.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses critical behavior: the supply network is mostly sample data, [DEMO] entries must be checked via is_demo, and availability_window is accepted but NOT APPLIED, with the response indicating availability_window_applied false. It also notes cost and latency.

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

Conciseness5/5

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

The description is long but well-structured, front-loaded with purpose and critical warnings, followed by examples, usage guidance, and constraints. Every section earns its place, especially the sample-data warning and the availability_window caveat.

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

Completeness5/5

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

For a tool with nested objects, no output schema, and several behavioral traps, the description is nearly complete: it covers inputs, result caveats, when to use, when not to use, follow-up routing, and key output fields like is_demo and availability_window_applied. The only minor gap is a full response field list, which is not essential for correct invocation.

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

Parameters4/5

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

Schema coverage is only 50%, so the description compensates with concrete query-to-parameter examples for vertical, location, and capability, and it explicitly warns about the non-applied availability_window. Price_band and max_results/radius are less detailed, though their schema names and defaults make them reasonably self-explanatory.

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

Purpose5/5

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

The description states a clear action—'return ranked candidate businesses from our supply network'—with explicit search criteria and a defined result type. It also distinguishes itself from related siblings by saying when it should not be used, e.g., when a verified SMB identifier already exists.

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

Usage Guidelines5/5

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

The WHEN TO USE and WHEN NOT TO USE sections explicitly name alternatives: call this before schedule_appointment or send_message when no specific SMB is known, and do not use it as a general directory or when a verified SMB is already in hand. It also restricts valid verticals, which prevents misuse.

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

get_conversationA
Read-only
Inspect

Read a two-way conversation thread you started: its state, every message exchanged, and how many replies the business has sent.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Did the salon reply about Sara's booking?" -> call get_conversation({"conversation_id": "conv_1a2b3c4d"}) user: "Check request 4821 with that barber" -> call get_conversation({"reference": "4821", "business_number": "96890000001"})

WHEN TO USE: After send_message with on_behalf_of returns a conversation_id, poll this to read the business's reply. Replies are matched to the right thread exactly (never guessed), so what you read here belongs to YOUR end-user. WHEN NOT TO USE: Do not poll more often than every 10 seconds. COST: free - no key required LATENCY: ~300ms

ParametersJSON Schema
NameRequiredDescriptionDefault
referenceNoThe 4-digit request reference, e.g. '4821'. Requires business_number.
business_numberNoScopes a `reference` to one business (references are reused across businesses).
conversation_idNoFrom the send_message receipt (preferred).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the tool as read-only and non-destructive, and the description adds valuable behavioral context beyond that: it reveals the polling use-case, the exact thread-matching guarantee, the 10-second rate constraint, and cost/latency characteristics. This goes well beyond the structured annotations.

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

Conciseness5/5

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

The description is well-structured with a front-loaded purpose, concrete examples, explicit usage rules, and concise cost/latency notes. Every section earns its place and the length is appropriate for the tool's complexity.

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

Completeness5/5

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

Despite having no output schema, the description tells the agent what the tool returns (state, messages, reply count), when to call it, how to identify the correct conversation, and operational constraints. An agent has enough information to select and invoke this tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters. The description adds realistic example mappings and clarifies that reference requires business_number, but most of that is also present in the schema. It is acceptable but does not meaningfully expand on the structured parameter definitions.

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

Purpose5/5

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

The description states a specific verb ('Read'), a specific resource ('a two-way conversation thread you started'), and the exact content returned (state, every message, reply count). It clearly distinguishes this from generic status/outcome tools among the siblings by emphasizing the two-way thread and the business's replies.

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

Usage Guidelines5/5

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

Provides explicit WHEN TO USE guidance: after send_message returns a conversation_id, poll this tool to read the business's reply. Also gives a clear WHEN NOT TO USE restriction (do not poll more often than every 10 seconds), and adds a safety guarantee that replies are matched to the exact thread. This is strong contextual routing for an agent.

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

get_outcomeA
Read-onlyIdempotent
Inspect

Retrieve the final OutcomeReceipt for a completed operation.

WHEN TO USE: Use after get_status returns success/failure/partial to retrieve the full result with cost and reason codes. WHEN NOT TO USE: Do not use for operations still in pending/executing state — use get_status first. COST: free - no key required LATENCY: ~50ms

ParametersJSON Schema
NameRequiredDescriptionDefault
operation_idYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description's job is lighter. It adds useful behavioral context beyond annotations: the operation is free, requires no key, has ~50ms latency, and returns cost and reason codes. No contradiction exists.

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

Conciseness5/5

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

The description is compact, front-loaded with the core purpose, and uses labeled sections for usage, cost, and latency. Every line adds practical value with no fluff or repetition of schema/annotation data.

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

Completeness4/5

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

For a one-parameter tool with no output schema, the description covers the key operational context: when to call, when not to call, what the result contains, and operational constraints like cost and latency. It stops just short of stating error/not-found behavior, but this is a minor gap.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It implies operation_id refers to a completed operation's ID and ties it to get_status, but it never explicitly explains how to obtain or format operation_id. The single parameter is self-explanatory by name, but the low coverage keeps this at a moderate score.

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

Purpose5/5

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

The description clearly states the action ('Retrieve'), the specific resource ('final OutcomeReceipt'), and the condition ('for a completed operation'). It distinguishes itself from get_status by defining the exact state transition point, so an agent can confidently select it.

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

Usage Guidelines5/5

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

Explicit 'WHEN TO USE' and 'WHEN NOT TO USE' sections provide direct routing: use after get_status returns a terminal state, and avoid for pending/executing operations. It even names the alternative (get_status), making the decision boundary unambiguous.

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

get_statusA
Read-onlyIdempotent
Inspect

Query the current state of any in-flight async operation by operation_id.

WHEN TO USE: Use to poll the state of a pending_async operation when no webhook callback has arrived or to check progress. WHEN NOT TO USE: Do not poll more frequently than once per 10 seconds — use webhook delivery for real-time updates instead. COST: free - no key required LATENCY: ~50ms

ParametersJSON Schema
NameRequiredDescriptionDefault
operation_idYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavioral context: it mentions latency (~50ms), cost (free), and the nature of the operation (polling for in-flight async ops). It does not contradict annotations. While it doesn't detail response structure, the description goes beyond annotations by adding usage constraints and performance characteristics.

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

Conciseness5/5

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

The description is concise and logically structured with headers. The primary purpose is stated first, followed by usage guidelines, cost, and latency. Every sentence provides actionable information without redundancy or filler.

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

Completeness4/5

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

Given the tool's simplicity (single parameter, no nested objects, no output schema), the description provides sufficient context for an agent to use it correctly. It covers when to use, constraints, and operational characteristics. The only minor gap is the lack of explicit mention of what response fields to expect, but since it's a status query and the description names the resource, agents can reasonably infer it returns status information. Overall, it's highly complete for a polling tool.

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

Parameters4/5

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

The input schema has no description for operation_id (0% coverage), so the description must compensate. It explicitly states that operation_id identifies the async operation, which adds meaning beyond the schema's type-only definition. Since there is only one parameter and its purpose is clear, the description adequately compensates for the low schema coverage.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Query the current state of any in-flight async operation by operation_id.' It uses a specific verb (query) and resource (state of async operation) with a clear parameter. This distinguishes it from sibling tools like get_outcome which likely deals with different data, and it is not a tautology.

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

Usage Guidelines5/5

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

Explicitly provides 'WHEN TO USE' and 'WHEN NOT TO USE' sections. It advises polling for pending operations and warns against excessive polling ('Do not poll more frequently than once per 10 seconds'), suggesting webhook delivery for real-time updates. This gives clear conditions and alternatives, which is exemplary guidance.

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

handle_inboundAInspect

Classify an inbound message on behalf of an SMB and get a recommended next action. Classifies intent (booking request, cancellation, opt-out, inquiry, complaint) and returns a suggested_action for YOUR agent to act on - opt-outs are recorded durably; nothing else is auto-routed or auto-executed by this tool.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Process this customer reply for me: 'Yes I want to book Tuesday'" -> call handle_inbound({"smb_id": "smb_xyz", "inbound_channel": "sms", "raw_message": "Yes I want to book Tuesday"})

WHEN TO USE: Use when an SMB needs inbound message triage — classifying incoming contact-form submissions, SMS replies, voicemails, or email inquiries. WHEN NOT TO USE: Do not use for outbound communications. Do not use for compliance-flagged recipient lists without verified opt-in records. COST: $0.03 per_call LATENCY: ~3000ms EXECUTION: async_by_default (use get_outcome to retrieve result)

ParametersJSON Schema
NameRequiredDescriptionDefault
senderNo
smb_idYes
raw_messageYes
routing_rulesNoOptional override routing policy for this SMB
idempotency_keyNoOptional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged.
inbound_channelYes
received_at_isoNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only provide generic hints (readOnlyHint=false, idempotentHint=false), so the description carries the behavioral burden. It discloses that opt-outs are recorded durably, no other action is auto-executed, execution is async by default, results must be retrieved via get_outcome, and it adds cost and latency details. This is strong context beyond what annotations and schema provide.

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

Conciseness5/5

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

The description is well-structured with clear headings, front-loads the core purpose, and uses a runnable example that earns its place. Cost, latency, and execution mode each get a single concise line, and no content feels redundant with the schema.

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

Completeness4/5

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

For a tool with no output schema and seven parameters, the description covers required call shape, intents, use cases, exclusions, async result retrieval, and operational characteristics. The main gap is the lack of detail about the exact shape or possible values of suggested_action beyond the intent list, but the definition is sufficient for safe invocation.

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

Parameters4/5

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

Schema description coverage is only 29%, but the description compensates with a concrete example call that maps a natural-language request to the three required parameters: smb_id, inbound_channel, and raw_message. The WHEN TO USE section also clarifies channel semantics. Optional parameters like sender and received_at_iso are left to self-evident names and schema structure, so it is helpful but not exhaustive.

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

Purpose5/5

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

The opening sentence states a specific verb-resource pair ('Classify an inbound message on behalf of an SMB') and defines the output ('recommended next action'), while explicitly listing the intents it handles. It also distinguishes itself from send-style tools by noting that nothing is auto-routed or auto-executed except durable opt-out recording.

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

Usage Guidelines5/5

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

The description provides explicit WHEN TO USE and WHEN NOT TO USE sections, naming concrete inbound contexts (contact forms, SMS replies, voicemails, emails) and exclusions (outbound communications, compliance-flagged recipient lists without verified opt-in records). This gives an agent direct decision criteria without needing to inspect sibling tools.

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

import_booking_urlA
Idempotent
Inspect

Turn ANY public booking URL (Cal.com, Calendly, Doctolib, Booksy, Fresha, OpenTable, Setmore, Square, Acuity, Schedulista, Squarespace, BookMyCity) into a callable smb_id you can immediately use with schedule_appointment, send_message, or capture_lead. Idempotent — calling twice returns the same smb_id.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Book me a haircut at https://cal.com/jane-salon" -> call import_booking_url({"booking_url": "https://cal.com/jane-salon", "vertical": "personal_services"}) -> then schedule_appointment({"smb_id": "", "action": "book"}) user: "Schedule with this dentist: https://www.doctolib.fr/dentiste/paris/jean-dupont" -> call import_booking_url({"booking_url": "https://www.doctolib.fr/dentiste/paris/jean-dupont"}) user: "Reserve a table at https://www.opentable.com/r/acme-bistro" -> call import_booking_url({"booking_url": "https://www.opentable.com/r/acme-bistro", "vertical": "restaurants"})

WHEN TO USE: Call this FIRST whenever the user provides a specific booking URL (cal.com/handle, calendly.com/handle/event, doctolib.fr/..., booksy.com/..., opentable.com/r/..., etc.). User patterns that match: 'book me at https://cal.com/...', 'schedule with calendly.com/jane/intro', 'reserve a table at opentable.com/r/...', 'I want to book this dentist: https://www.doctolib.fr/...'. After importing, the returned smb_id can be passed straight to schedule_appointment. WHEN NOT TO USE: Do not use if the user only describes a business by name without a URL — call find_business instead. Do not use for arbitrary websites that are not on the supported booking-platform list (use /supply/platforms to see all 12). COST: free (no credits) - but requires a free email-verified key LATENCY: ~600ms

ParametersJSON Schema
NameRequiredDescriptionDefault
verticalNoBest-guess vertical. If omitted, inferred from the platform (e.g., Doctolib -> healthcare, OpenTable -> restaurants).
booking_urlYesFull URL the user supplied. Must point at one of the 12 supported booking platforms; auto-detected from the host.
capabilitiesNoFree-form capability tags (e.g., ['haircut','color','blowdry']).
country_codeNoISO 3166-1 alpha-2 (e.g. 'US', 'FR'). Used for compliance routing on later send_message calls.
business_nameNoOptional override. If omitted, the business name is auto-extracted from the page's <title> or og:title.
contact_emailNoOptional.
contact_phoneNoOptional. If omitted, the platform integration handles outreach.
idempotency_keyNoOptional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the idempotentHint annotation, the description discloses cost implications (free but requires email-verified key), approximate latency, auto-detection of platform from host, and automatic extraction of vertical/business name when omitted. These are behavioral details not present in annotations or schema.

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

Conciseness5/5

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

The description is long but each section earns its place: opening summary, realistic examples, explicit usage criteria, cost, and latency. It is front-loaded with the core transformation and output, with supporting details structured under clear headings.

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

Completeness4/5

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

For a tool with no output schema, the description conveys the key output (smb_id), the idempotent receipt behavior, and downstream usage, which covers the critical integration handoff. It stops short of specifying the exact response field structure, but the examples and 'returns the same smb_id' language are sufficient for an agent to proceed.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all parameters thoroughly, including vertical inference, country_code compliance use, business_name extraction fallback, and idempotency_key replay semantics. The description reinforces this with usage examples but does not add new parameter meaning beyond the schema.

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

Purpose5/5

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

The description names the exact operation ('Turn ANY public booking URL ... into a callable smb_id'), enumerates supported platforms, and frames the tool as the import step before schedule_appointment, send_message, or capture_lead. It also explicitly contrasts with find_business in the WHEN NOT TO USE section, removing ambiguity among siblings.

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

Usage Guidelines5/5

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

The description contains dedicated WHEN TO USE and WHEN NOT TO USE sections, gives concrete user-query patterns that match, and names the alternative (find_business) for the non-URL case. This is explicit routing guidance, not just implied context.

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

lookup_us_contractsA
Read-onlyIdempotent
Inspect

Search US federal contract awards by company (recipient) name using the free USASpending.gov public API. Returns the top awards sorted by dollar amount: award ID, recipient name, award amount USD, awarding agency, NAICS code/description, and period of performance. Zero upstream cost, no key required. Data covers 2020-2026 procurement contracts.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Does Palantir have US government contracts?" -> call lookup_us_contracts({"company_name": "Palantir Technologies"}) user: "What federal contracts does Booz Allen Hamilton have?" -> call lookup_us_contracts({"company_name": "Booz Allen Hamilton", "max_results": 5}) user: "Find US import supplier data for Lockheed Martin" -> call lookup_us_contracts({"company_name": "Lockheed Martin"}) user: "Which government agencies are customers of SAIC?" -> call lookup_us_contracts({"company_name": "SAIC", "max_results": 10})

WHEN TO USE: Use when you need to know whether a company is a US federal contractor, which government agencies have awarded it contracts, the dollar value and NAICS sector of those contracts, and the period of performance. Useful for supplier due-diligence, vendor qualification, competitive intelligence, and import/trade research. The target demand: "us import data api", "supplier lookup api", "company trade records", "who has government contracts", "federal contractor search". WHEN NOT TO USE: Do not use for non-US companies (USASpending.gov only covers US federal contracts). Do not use as an exhaustive financial-risk or sanctions screen -- use verify_company_record and screen_sanctions for those. Do not use for state/local government contracts (federal only). COST: free - no key required LATENCY: ~1200ms

ParametersJSON Schema
NameRequiredDescriptionDefault
max_resultsNoMaximum number of contract awards to return (sorted by award amount descending). Default: 5, max: 10.
company_nameYesCompany or recipient name to search for in US federal contract awards (e.g. "Lockheed Martin", "Booz Allen Hamilton", "Palantir Technologies").

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the bar for extra value is met by the description's additions: data source (USASpending.gov), coverage years (2020-2026), zero cost/no key, latency, and output fields. It does not contradict the annotations. Minor gap: no statement about exact-match vs fuzzy matching or empty-result behavior.

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

Conciseness4/5

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

The description is longer than average but well structured with clear sections (purpose, examples, when to use, when not, cost, latency). Main purpose is front-loaded. Minor redundancy exists between 'Zero upstream cost, no key required' and the COST section.

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

Completeness4/5

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

Given the low parameter count and lack of an output schema, the description compensates well by specifying the returned award fields, data source, date range, sort order, and constraints. It is complete enough for an agent to invoke correctly, though details about no-result responses or name-matching behavior are absent.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are already clearly documented in the input schema. The description reinforces company_name via examples and max_results via the sort order, but does not add significant new meaning beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description names a specific verb and resource ('Search US federal contract awards by company name') and lists the exact returned fields (award ID, recipient, amount, agency, NAICS, period). It clearly distinguishes itself from related tools like verify_company_record and screen_sanctions by stating what it covers and what it does not.

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

Usage Guidelines5/5

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

The tool has an explicit WHEN TO USE section with concrete scenarios and a WHEN NOT TO USE section that names alternative tools (verify_company_record, screen_sanctions) and exclusions (non-US, state/local, financial-risk screening). This is exactly the guidance an agent needs to select between siblings.

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

map_trade_restrictionA
Read-onlyIdempotent
Inspect

Free cross-border trade screening of the DESTINATION and the PARTIES. IT DOES NOT CLASSIFY THE PRODUCT: the product argument is recorded and echoed back, never checked against any export-control list, so a controlled item to an unrestricted destination returns no findings and reason_code 'partial' -- never 'clear'. This is not an export-control clearance; classify the item (HS/ECCN) against BIS/EU/UK controls yourself. Given a product and destination country (and optionally an HS code, origin country, and a list of parties to screen), returns: (a) whether the destination or any party hits an export-control or sanctions restriction, (b) the destination risk level (comprehensive_embargo / sectoral_sanctions / elevated_scrutiny / standard), (c) HS code hint if the caller provided one, (d) honest tariff guidance + official links without fabricated rates, and (e) party sanctions screening against OFAC SDN (US Treasury), the EU Consolidated list (European Commission) and the UK Sanctions List (FCDO). Acts as a MIDDLEMAN -- unifies the OFAC comprehensive-embargo map, our own indexed copies of the EU and UK lists, and OFAC SDN into one clean call. Never fabricates a tariff rate, a clear, or a restricted status.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Can we ship laptops to Iran?" -> call map_trade_restriction({"product": "laptop computers", "destination_country": "IR"}) user: "Screen this supplier before we import from them: Mahan Air, Iran" -> call map_trade_restriction({"product": "aircraft parts", "destination_country": "US", "parties": ["Mahan Air"]}) user: "Is exporting hydraulic pumps to Russia restricted?" -> call map_trade_restriction({"product": "hydraulic pumps", "hs_code": "8413.50", "destination_country": "RU"}) user: "Check if we can sell medical devices to Germany, supplier is ACME GmbH" -> call map_trade_restriction({"product": "medical devices", "origin_country": "US", "destination_country": "DE", "parties": ["ACME GmbH"]})

WHEN TO USE: Use before any cross-border trade to flag embargoed destinations, screen exporters/importers/freight forwarders against sanctions lists, and get authoritative links to the applicable tariff databases. Call this as a pre-flight check before quoting, invoicing, or shipping internationally. Covers OFAC comprehensively-embargoed countries (Iran, North Korea, Cuba, Syria) and significant advisory countries (Russia, Belarus, Ukraine Crimea/DNR/LNR regions). WHEN NOT TO USE: Do NOT use as a substitute for a licensed export compliance review. Do NOT use to obtain authoritative tariff rates (this tool returns guidance links, never fabricated rates). Do NOT use for purely domestic shipments where no cross-border movement is involved. COST: free within the daily quota, then $0.02 per call LATENCY: ~3000ms

ParametersJSON Schema
NameRequiredDescriptionDefault
hs_codeNoOptional Harmonized System code (e.g. '8471.30' for laptops). If provided, echoed back and included in tariff guidance. Not derived -- caller must supply the official HS code.
partiesNoOptional list of party names to screen (exporter, importer, freight forwarder, end-user, etc.). Each name is screened against OFAC SDN (US Treasury), the EU Consolidated list (European Commission) and the UK Sanctions List (FCDO). At most 20 parties per call - a longer list is refused outright (bad_input) rather than partially screened; split it across calls.
productYesProduct name or description, e.g. 'laptop computers', 'crude oil', 'medical devices'. Used in the tariff guidance note.
origin_countryNoOptional ISO 3166-1 alpha-2 code for the exporting country (e.g. 'US', 'DE'). Used in the tariff guidance note.
destination_countryYesISO 3166-1 alpha-2 code for the importing country (e.g. 'IR', 'CA', 'DE'). Required. Checked against the OFAC comprehensive-embargo map and sectoral-sanctions advisory list.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond readOnly/idempotent annotations, it discloses the non-classification behavior, the 'partial' reason_code for controlled items, a policy never to fabricate rates/clear/restricted status, and cost/latency. 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.

Conciseness4/5

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

Highly structured with front-loaded limitation, examples, and usage rules, but it is long and contains some redundancy (e.g., middleman unification repeated). Still every major section contributes.

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

Completeness4/5

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

Covers return categories (a)-(e), error behavior for party-list size, country coverage, and commercial conditions; with no output schema this is enough to know what will happen. It could specify exact JSON response shape, but isn't needed for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds behavioral detail (product is echoed and never classified; parties must be split if >20; destination checked against OFAC lists) and provides four concrete example invocations that map user wording to parameter values.

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

Purpose5/5

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

States a specific action ('cross-border trade screening of DESTINATION and PARTIES') with a clear boundary that it does not classify product, and it distinguishes its consolidated middleman behavior from export-control/product classification. The examples reinforce the tool's role.

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

Usage Guidelines5/5

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

Has labeled WHEN TO USE and WHEN NOT TO USE sections with explicit pre-flight use, coverage list, and exclusions (licensed review, authoritative tariff rates, domestic shipments). This is the clearest possible routing guidance for an agent.

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

mint_keyAInspect

Agent self-serve API key issuance. An autonomous agent that has no email inbox can obtain a free-tier API key by proving it holds the MACHINE_MINT_SECRET via HMAC-SHA256. Returns a usable key immediately with no human action required. If the operator has not activated a mint secret on the server, this returns an honest not_configured failure rather than a key - call it once and branch on that before planning around it.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "I need an API key to call AgentBroker tools" -> call mint_key({"agent_id": "my-agent-abc123", "timestamp": 1725100000, "nonce": "4f8a2c1d", "signature": "<HMAC-SHA256(agent_id+timestamp+nonce, MACHINE_MINT_SECRET)>"})

WHEN TO USE: Use when an AI agent needs to self-provision a write-capable API key without a human email address. The caller must know the MACHINE_MINT_SECRET (available from hatchloop.dev/docs/#machine-mint). WHEN NOT TO USE: Do not use if the agent has a human operator who can complete the email flow at /keys/request. Do not use for paid plans — this endpoint issues free-tier keys (100 ops/day) only. COST: free - no key required LATENCY: ~100ms

ParametersJSON Schema
NameRequiredDescriptionDefault
nonceYesRandom value (UUID or hex). Prevents replay attacks — use a fresh nonce each call.
agent_idYesA stable unique identifier for this agent (e.g. a UUID). The issued key is deterministically tied to this ID.
signatureYesHMAC-SHA256(agent_id + str(timestamp) + nonce, MACHINE_MINT_SECRET) as lowercase hex. The HMAC input is the raw concatenation with no separators.
timestampYesUnix epoch seconds at signing time. Must be within 60s of server time.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the minimal annotations, the description reveals key behaviors: returns a usable key immediately, returns an honest not_configured failure if no mint secret is activated, and advises calling it once and branching on the result. It also discloses cost, latency, and the free-tier operation limit, giving the agent a full picture of the tool's behavior.

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

Conciseness4/5

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

The description is longer than average but well-organized into labeled sections (WHEN TO USE, WHEN NOT TO USE, COST, LATENCY) with the core purpose front-loaded. The example query is somewhat detailed but earns its place by showing exact parameter usage. Minor redundancy in phrases like 'no email inbox'/'without a human email address' prevents a perfect score.

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

Completeness4/5

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

With no output schema, the description adequately covers the primary return behavior: a usable key or a not_configured failure. It also mentions the free-tier limit. However, it does not mention other possible failure modes such as invalid signature or expired timestamp, which would be useful for an agent but are partially inferable from the schema. Otherwise it is fairly complete.

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

Parameters4/5

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

The input schema already covers all four parameters with 100% coverage, so the baseline is 3. The description adds extra value by giving a concrete example matching the parameter set, clarifying that the caller must know MACHINE_MINT_SECRET, and reinforcing the raw-concatenation HMAC format. This lifts it above baseline.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Agent self-serve API key issuance' and immediately explains that an agent can 'obtain a free-tier API key' via HMAC proof. It clearly distinguishes itself from sibling tools by focusing on self-provisioning without an email inbox, making its unique role obvious.

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

Usage Guidelines5/5

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

The 'WHEN TO USE' and 'WHEN NOT TO USE' sections explicitly state when to use this tool (agent with no email, knows MACHINE_MINT_SECRET) and when to avoid it (human operator can complete email flow at /keys/request, paid plans). It also notes the free-tier limit, leaving no ambiguity about applicability.

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

preview_costA
Read-onlyIdempotent
Inspect

Return an expected cost estimate, latency estimate, and success-probability estimate for a proposed call before execution. Returns the exact price when it is fixed, and a min/max range when the cost depends on channel or outcome. It does not promise an accuracy percentage - check cost_range.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "How much will this SMS cost me?" -> call preview_cost({"operation": "send_message", "params": {"preferred_channel": "sms"}}) user: "Estimate the cost of booking via voice fallback" -> call preview_cost({"operation": "schedule_appointment", "params": {"preferred_channel": "voice"}})

WHEN TO USE: Use before any operation when the agent is operating under a budget constraint and needs to decide whether to proceed. WHEN NOT TO USE: Do not use in a hot loop — cache the result for at least 60 seconds if repeating the same preview. COST: free - no key required LATENCY: ~100ms

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYesThe same request body you would pass to the operation
operationYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint/idempotentHint annotations, the description adds meaningful behavioral detail: it returns exact price when fixed, a min/max range when cost depends on channel or outcome, does not promise an accuracy percentage, and warns the agent to check cost_range. It also discloses operational characteristics: 'COST: free - no key required' and 'LATENCY: ~100ms.' No contradiction with annotations exists.

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

Conciseness5/5

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

The description is well-structured and front-loaded: the first sentence states the core purpose, followed by pricing behavior, an accuracy caveat, and practical usage guidance. The examples are compact but illustrative, and every section (WHEN TO USE, WHEN NOT TO USE, COST, LATENCY) adds operational value without padding.

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

Completeness5/5

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

With no output schema, the description carries the burden of explaining return values, and it does so clearly: cost estimate with exact/range behavior, latency estimate, success-probability estimate, and the cost_range field to check. It also covers when to call, when not to, cost, latency, and parameter examples. For a simple two-parameter preview tool, nothing essential is missing.

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

Parameters4/5

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

The schema description covers only params ('The same request body you would pass to the operation'), leaving operation undocumented. The tool description compensates with concrete examples mapping operation values like 'send_message' and 'schedule_appointment' to realistic params, clarifying that operation names the target call and params mirror its request body. Still, the operation parameter semantics remain partially implicit.

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

Purpose4/5

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

The description uses a specific verb-resource pair: 'Return an expected cost estimate, latency estimate, and success-probability estimate for a proposed call before execution.' It clearly identifies the tool as a pre-execution preview, which separates it from execution tools like send_message or schedule_appointment. However, it does not explicitly differentiate from closely related sibling tools such as check_quota, so it stops just short of full sibling distinction.

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

Usage Guidelines5/5

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

WHEN TO USE and WHEN NOT TO USE are explicit: 'Use before any operation when the agent is operating under a budget constraint and needs to decide whether to proceed' and 'Do not use in a hot loop — cache the result for at least 60 seconds.' This provides clear context and exclusion criteria, including a caching strategy instead of repeated calls.

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

schedule_appointmentA
Destructive
Inspect

Availability lookup, hold, confirm, reschedule, or cancel appointments with an SMB. Routes through the SMB's native booking system if available, falls back to voice AI or web form.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Book the haircut for next Tuesday at 3pm" -> call schedule_appointment({"smb_id": "smb_imp_abc", "action": "book", "service": "haircut"}) user: "Cancel my Friday appointment at smb_xyz" -> call schedule_appointment({"smb_id": "smb_xyz", "action": "cancel"}) user: "Reschedule my dental cleaning to next week" -> call schedule_appointment({"smb_id": "smb_imp_xyz", "action": "reschedule"})

WHEN TO USE: Use when an agent needs to book, reschedule, or cancel a specific appointment with a specific SMB. Requires a verified smb_id. WHEN NOT TO USE: Do not use for bulk scheduling. Do not use without a verified SMB — call find_business and verify_business first if needed. COST: from $0.15 per_call_variable (see preview_cost for exact) LATENCY: ~5000ms EXECUTION: async_by_default (use get_outcome to retrieve result)

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNo
actionYes
smb_idYes
serviceNo
customerNo
requested_timeNo
idempotency_keyNoOptional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged.
existing_appointment_idNoRequired for reschedule/cancel

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true, but the description adds substantial behavioral context: async_by_default execution with 'use get_outcome to retrieve result', approximate cost and latency, and the fallback routing through the SMB's native booking system, voice AI, or web form. There is no contradiction with 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.

Conciseness5/5

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

The description is front-loaded with purpose, followed by compact example queries, then labeled WHEN TO USE/WHEN NOT TO USE, cost, latency, and execution sections. Every section earns its place and the formatting makes it easy for an agent to scan.

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

Completeness4/5

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

For an 8-parameter tool with nested objects, multiple actions, async execution, and no output schema, this description covers prerequisites, exclusions, routing, and result retrieval via get_outcome. However, it does not specify what a successful call returns or how actions must be paired with action-critical parameters, leaving a modest but real completeness gap.

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

Parameters2/5

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

Schema description coverage is only 25%, so the description needed to compensate, but it only demonstrates smb_id, action, and service in examples. Critically, the reschedule and cancel examples omit existing_appointment_id even though the schema marks it 'Required for reschedule/cancel', and requested_time/customer are never explained. An agent cannot reliably construct complete calls from this description.

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

Purpose5/5

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

The description opens with a specific verb+resource statement: 'Availability lookup, hold, confirm, reschedule, or cancel appointments with an SMB.' It maps cleanly to the action enum and clearly differentiates this tool from sibling tools like find_business and get_outcome. The only minor wrinkle is that 'hold' and 'confirm' appear in prose but not in the enum, yet the purpose is still unambiguous.

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

Usage Guidelines5/5

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

WHEN TO USE and WHEN NOT TO USE are explicit: use for booking/rescheduling/canceling a specific appointment with a specific SMB, avoid bulk scheduling, and do not use without a verified smb_id — with direct pointers to find_business and verify_business. This gives the agent clear decision criteria and even names alternatives.

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

screen_sanctionsA
Read-onlyIdempotent
Inspect

Free screening of a name or entity against official sanctions lists, each fetched from the authority that issues it: the OFAC SDN list from the US Treasury (SDN.CSV plus ALT.CSV for alternate spellings), the EU consolidated financial sanctions list from the European Commission, and the UK Sanctions List from the FCDO. THE UN CONSOLIDATED LIST IS NOT SCREENED -- it carries no licence permitting commercial redistribution, so we do not claim it. ALWAYS check lists_screened on the response: it names the lists that actually ran ON THAT CALL, and a list that failed to load appears in sources_unavailable instead. reason_code is 'partial_screening' whenever any source was unavailable, never 'clear'. Returns screening_status ('hit' | 'clean' | 'candidates' | 'not_screened' -- branch on THIS, not on matched, because matched:false is also false when nothing could be screened), matched: bool, a list of matches with score, program, and source URL, and which lists were screened. Never fabricates a match or a clear -- if no match is found, explicitly names which lists were checked. Attaches a compliance_receipt: an Ed25519-signed, hash-bound record of what was checked, when, against which sources, and what it returned - verifiable OFFLINE against the public key published at https://hatchloop.dev/agents.md, so you can hand it to an auditor as evidence the check really ran.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Screen this vendor before we pay them: ACME Trading LLC, Russia" -> call screen_sanctions({"name": "ACME Trading LLC", "country": "RU", "type": "entity"}) user: "Is Kim Jong-un on the OFAC list?" -> call screen_sanctions({"name": "Kim Jong-un", "country": "KP", "type": "person"}) user: "Run a sanctions check on this person before onboarding" -> call screen_sanctions({"name": "Ivan Petrov", "country": "RU", "type": "person"}) user: "Do a compliance check -- is this company sanctioned?" -> call screen_sanctions({"name": "Mahan Air", "country": "IR", "type": "entity"})

WHEN TO USE: Use before onboarding a counterparty, processing a payment, engaging a vendor, or doing any due-diligence step that requires knowing whether a person or entity appears on official sanctions lists. Essential for agents doing business formation, vendor qualification, payments onboarding, trade compliance, or any workflow where a sanctioned counterparty is a legal or reputational risk. WHEN NOT TO USE: Do not use as a substitute for full KYC/AML screening -- this covers sanctions lists only, not PEP (Politically Exposed Person) databases, adverse media, or credit risk. Do not treat a negative result as a compliance clearance; it is informational only. Do not use for bulk screening of large lists -- each call is a live API query. COST: free within the daily quota, then $0.02 per call LATENCY: ~2000ms

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFull name of the person or entity to screen, e.g. 'Kim Jong-un' or 'ACME Trading LLC'. Use the most complete name available for best accuracy.
typeNoOptional entity type hint. 'person' for individuals, 'entity' for organizations/companies. Omit to screen both.
countryNoOptional ISO 3166-1 alpha-2 country code or country name (e.g. 'IR', 'Iran'). It ANNOTATES AND RANKS results; it never removes any. Each EU/UK match carries country_match: true, false, or null when the listing records no country. Nothing is dropped on a mismatch, because the country we hold is the address/nationality on the listing rather than everywhere a party operates - excluding on it would return a clean screen for someone who IS listed.

TDQS

A5/5.0
Behavior5/5

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

Goes far beyond annotations by disclosing critical behaviors: the UN list is deliberately excluded, lists_screened must be checked, reason_code is 'partial_screening' when sources fail, screening_status should be branched on rather than matched, and a verifiable compliance_receipt is attached. It also warns that country never removes results and that a negative result is not clearance. No contradiction with readOnly/idempotent hints.

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

Conciseness5/5

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

The description is long but every section earns its place: purpose, source details, response interpretation warnings, compliance receipt, examples, use cases, cost, and latency. It is well-structured and front-loaded with the essential purpose before detailed caveats.

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

Completeness5/5

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

Despite having no output schema, the description thoroughly explains return fields (screening_status, matched, matches, lists_screened, sources_unavailable, reason_code) and edge cases. It also includes cost/latency context, making it fully sufficient for an agent to select and invoke the tool correctly.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds substantial meaning beyond the schema. For the country parameter it explains that the value 'ANNOTATES AND RANKS results; it never removes any' and describes country_match semantics. Example user queries map arguments to calls, enriching all parameters.

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

Purpose5/5

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

Opens with a specific verb and resource: 'Free screening of a name or entity against official sanctions lists.' It names the exact lists screened (OFAC, EU, UK), explicitly excludes the UN list, and distinguishes itself from broader compliance tools by stating it covers sanctions only, not KYC/AML.

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

Usage Guidelines5/5

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

Contains dedicated WHEN TO USE and WHEN NOT TO USE sections with concrete scenarios (onboarding, payment, vendor qualification) and exclusions (not for PEP/adverse media/credit risk, not for bulk screening). It clearly tells an agent when to invoke this tool and when to avoid it.

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

self_testA
Read-onlyIdempotent
Inspect

Service health probe: runs 6 internal checks and reports how many passed. Confirms the server is up and responding - it does NOT probe each tool individually. Use to verify connectivity before production use.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Run a health check before I send the broadcast" -> call self_test({})

WHEN TO USE: Use at agent startup, before high-stakes task sequences, or after receiving unexpected errors to check if the service is degraded. WHEN NOT TO USE: Do not call more than once per minute in production. COST: free - no key required LATENCY: ~200ms

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark it read-only and idempotent, but the description adds valuable behavior beyond that: exactly 6 internal checks, reports how many passed, does not probe each tool individually, requires no key, has ~200ms latency, and carries a rate limit. These operational details help the agent understand side effects and constraints.

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

Conciseness5/5

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

The description is well-structured and front-loaded: core behavior first, then an example, then usage guidance, cost, and latency. Every section contributes practical information without redundant filler or excessive length.

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

Completeness5/5

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

For a zero-parameter health probe with rich annotations, the description covers everything needed to invoke it correctly: purpose, result shape, timing, rate limit, authentication requirement, and performance expectation. The absence of an output schema is acceptable because the description states what the tool reports.

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

Parameters4/5

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

The tool takes zero parameters, and the schema description coverage is 100%, so there is no parameter ambiguity. The example call self_test({}) reinforces that no arguments are needed, which is the appropriate baseline for a parameterless tool.

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

Purpose5/5

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

States a specific verb and resource: 'runs 6 internal checks and reports how many passed'. It also explicitly clarifies the tool's scope by saying it 'does NOT probe each tool individually', which distinguishes it from sibling tools that verify or probe individual business entities.

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

Usage Guidelines5/5

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

Provides explicit WHEN TO USE and WHEN NOT TO USE sections: at startup, before high-stakes task sequences, after unexpected errors, and no more than once per minute in production. The example user query also shows a concrete matching scenario, leaving little ambiguity for the agent.

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

send_messageA
Destructive
Inspect

Send a message on behalf of an agent's user or an SMB across WhatsApp (free during launch), SMS, email, or voice. Five message types: transactional, reminder, follow_up, notification, marketing. Every send routes through a non-bypassable compliance gate (TCPA, GDPR, CASL, PDPL across 26 jurisdictions) that enforces opt-in consent for marketing/promotional content — marketing without recorded consent is rejected at runtime with a structured compliance_violation receipt. Channel is abstracted: specify intent and recipient; the service selects and falls back across channels.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Text the salon I'll be 10 minutes late" -> call send_message({"recipient": {"id_type": "smb_id", "id_value": "smb_xyz"}, "message_type": "notification", "content": {"body": "Running about 10 minutes late for my appointment."}, "preferred_channel": "sms"}) user: "Email the dentist about insurance" -> call send_message({"recipient": {"id_type": "email", "id_value": "front-desk@example-dental.com"}, "message_type": "transactional", "content": {"body": "Do you accept Cigna insurance?"}, "preferred_channel": "email"})

WHEN TO USE: Use to: (a) confirm a booking the agent just made, (b) reply to a customer who messaged the SMB first, (c) follow up on a quote the user requested, (d) send appointment reminders the SMB owes its customer, (e) send marketing messages to recipients who have opted in (with consent_record_id). The gate verifies consent on every send. WHEN NOT TO USE: Do NOT use for OTPs or critical transactional confirmations — use send_transactional_confirmation. Do NOT attempt to send marketing without a consent_record_id pointing at a real opt-in — the gate will reject the send and log a compliance_violation. Do NOT attempt bulk / list-based / drip / cold outreach — those are out of scope and the rate limiter will throttle abuse. COST: from $0.02 per_call_variable (see preview_cost for exact) LATENCY: ~800ms EXECUTION: sync_fast (use get_outcome to retrieve result)

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes
recipientYes
business_idNoOptional stable id for the recipient business. Enables global demand shaping (we rate-limit total inbound across ALL agents so businesses stay responsive instead of blocking us).
send_at_isoNoNOT SUPPORTED YET. We do not schedule messages. Supplying a time more than 2 minutes in the future is REFUSED (reason_code scheduling_not_supported) rather than sent immediately, which is what used to happen. Call send_message at the moment you want delivery, or omit this field.
message_typeYesIntent tag for the message. Five permitted types. 'marketing' is allowed only when paired with a valid consent_record_id; the compliance gate verifies the consent at send time and rejects (compliance_violation receipt) if it's missing, expired, or revoked.
on_behalf_ofNoWho this message is FOR (your end-user's name/label). On WhatsApp this opens a tracked conversation and travels in-message as '#4821 for Sara (via HatchLoop)', so the business knows who it is talking to and their reply is matched back to this exact request instead of guessed. Strongly recommended for two-way channels.
idempotency_keyNoOptional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged.
preferred_channelNoauto

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already signal a mutating, non-idempotent, open-world operation, but the description goes far beyond: it discloses the non-bypassable compliance gate, consent enforcement, channel fallback, rate limiting, scheduling refusal, idempotency replay behavior, cost, latency, and execution model. It even names the failure receipt type (compliance_violation).

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

Conciseness4/5

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

The description is long but well-structured with headers, examples, and a front-loaded core statement. There is some repetition of the marketing-consent rule, but it reinforces a critical constraint rather than padding.

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

Completeness4/5

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

For a complex 8-parameter mutation tool with no output schema, the description covers when to use, when not to use, compliance behavior, cost, latency, scheduling limits, and result retrieval via get_outcome. It does not fully specify the success response shape beyond mentioning receipts, so an agent still has to infer part of the return contract.

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

Parameters4/5

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

With only 63% schema description coverage, the description compensates well: it explains message_type consent coupling, preferred_channel as an abstraction/fallback, send_at_iso refusal behavior, and on_behalf_of rationale. The two examples map recipient and content to realistic values, though parameters like template_id, template_vars, and business_id still rely on schema descriptions.

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

Purpose5/5

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

The opening sentence names the action (send), the resource (message), the beneficiaries (agent's user or SMB), and the channels (WhatsApp, SMS, email, voice). It clearly distinguishes the tool from send_transactional_confirmation by explicitly excluding OTPs and critical transactional confirmations.

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

Usage Guidelines5/5

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

The description provides an explicit WHEN TO USE list with five concrete scenarios and a WHEN NOT TO USE section that names the alternative tool and prohibitions. This gives an agent unambiguous routing guidance, including consent requirements and bulk-outreach restrictions.

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

send_transactional_confirmationA
Destructive
Inspect

Idempotent transactional messages: OTPs, booking confirmations, payment receipts, cancellation notices. Falls back across configured channels; an unconfigured channel fails honestly rather than reporting a delivery that did not happen.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Send the booking confirmation receipt to my email" -> call send_transactional_confirmation({"recipient": {"id_type": "email", "id_value": "customer@example.com"}, "confirmation_type": "booking_confirmation", "data": {"appointment_time": "2026-09-03T15:00:00Z", "business_name": "Salon 718"}, "preferred_channel": "email"})

WHEN TO USE: Use for any message that MUST be delivered reliably — OTPs, booking confirmations, receipts. Do not use for marketing. WHEN NOT TO USE: Do not use for marketing or promotional messages. Do not use for conversational messages. COST: $0.02 per_call LATENCY: ~500ms EXECUTION: sync_fast (use get_outcome to retrieve result)

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesType-specific payload; e.g., {otp_code} for otp, {appointment_time, smb_name} for booking_confirmation
recipientYes
idempotency_keyNoOptional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged.
confirmation_typeYes
preferred_channelNosms

TDQS

A3.9/5.0
Behavior1/5

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

The description explicitly claims 'Idempotent transactional messages' and details idempotency key behavior, but the annotation `idempotentHint: false` directly contradicts this. The description also mentions fallback and honest failure, but the idempotency contradiction is critical and violates the annotation contract.

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

Conciseness4/5

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

The description is structured with a core paragraph, an example, and explicit usage sections. It is front-loaded with purpose and behavior, but includes extra metadata (cost, latency, execution) that, while useful, could be placed more concisely. Overall, it earns its length.

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

Completeness4/5

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

The description covers fallback behavior, execution mode, cost, latency, and how to retrieve results via get_outcome. Despite lacking an output schema, it explains the execution flow completely. The idempotency contradiction and lack of explicit return value rationale slightly reduce completeness, but the tool is well-contextualized.

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

Parameters4/5

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

Schema coverage is only 40%, so the description must compensate. It provides an example payload structure and explains the idempotency_key semantics (replay behavior, 24-hour window, no re-execution/re-charge), which adds value beyond the schema. However, it doesn't detail all parameters, but the schema already covers recipient and enumeration values adequately.

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

Purpose5/5

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

The description opens with 'Idempotent transactional messages: OTPs, booking confirmations, payment receipts, cancellation notices,' which names a specific resource type and scope. It differentiates from siblings like send_message by explicitly excluding marketing and conversational use. The example query further anchors the purpose.

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

Usage Guidelines5/5

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

The 'WHEN TO USE' and 'WHEN NOT TO USE' sections clearly state the intended scenarios (OTPs, confirmations, receipts) and explicitly exclude marketing and conversational messages. This provides direct guidance on when to select this tool over alternatives like send_message.

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

verify_businessA
Read-onlyIdempotent
Inspect

Look up what we know about a business in our supply network: its contact channels, capabilities, and when the record was last verified. This is a DIRECTORY LOOKUP - it does not contact the business.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Confirm smb_imp_abc actually does emergency plumbing" -> call verify_business({"smb_id": "smb_imp_abc", "capability_to_verify": "emergency_plumbing"})

WHEN TO USE: Use before sending communications or scheduling if you have an unverified SMB identifier, or if the agent's task requires confirmed capability (e.g., 'I need to be sure they do emergency plumbing'). WHEN NOT TO USE: Do not use if the SMB was returned from find_business within the last 24 hours — those results are already verified. COST: free - no key required LATENCY: ~500ms

ParametersJSON Schema
NameRequiredDescriptionDefault
smb_idYes
capability_to_verifyNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds crucial behavioral context beyond those: it does not contact the business, it is a directory lookup, it costs nothing, and typical latency is ~500ms. This is exactly the kind of non-obvious behavior an agent needs to know before invoking.

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

Conciseness5/5

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

The description is organized into clear labeled sections and front-loads the core behavior. The example query, usage guidance, cost, and latency each earn their place and no section is redundant. The formatting makes 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.

Completeness5/5

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

Despite having no output schema, the description covers what the tool returns, when to use it, when not to use it, cost, latency, and the critical 'does not contact the business' caveat. An agent has enough context to select and correctly invoke the tool with the right parameters.

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

Parameters4/5

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

Schema description coverage is 0%, so the description carries the burden. It adds meaning to both parameters: smb_id is an 'SMB identifier' and capability_to_verify is demonstrated in the example query ('emergency_plumbing') and in WHEN TO USE ('confirmed capability'). It does not fully specify allowed capability values or behavior when omitted, but the example and context provide strong compensation.

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

Purpose5/5

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

The description states a specific verb ('Look up') and resource ('a business in our supply network') and lists the exact data returned: contact channels, capabilities, and last verification time. It explicitly distinguishes itself as a DIRECTORY LOOKUP that does not contact the business, which separates it from sibling tools like call_business and verify_company_record.

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

Usage Guidelines5/5

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

The description provides explicit WHEN TO USE and WHEN NOT TO USE sections, plus a concrete user query example. It names find_business as the sibling alternative and gives a clear condition ('returned from find_business within the last 24 hours') under which this tool should not be used.

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

verify_company_recordA
Read-onlyIdempotent
Inspect

Free, live lookup of a company official registry record. Queries the GLEIF global LEI registry (primary, 2.6 million legal entities worldwide) and SEC EDGAR (US public companies) to return the official legal name, LEI, entity status, jurisdiction, registered address, and registry authority. Never fabricates: if the company is not found in these free registries, returns an honest not_found with the sources that were queried.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL: user: "Is Apple Inc a real registered company?" -> call verify_company_record({"name": "Apple Inc", "country": "US"}) user: "Look up the LEI for Volkswagen AG" -> call verify_company_record({"name": "Volkswagen AG", "country": "DE"}) user: "Verify this LEI: 529900HNOAA1KXQJUQ27" -> call verify_company_record({"name": "Volkswagen AG", "lei": "529900HNOAA1KXQJUQ27"})

WHEN TO USE: Use when you need to verify that a company exists as a registered legal entity and retrieve its official registry details -- before signing a contract, qualifying a vendor, validating a counterparty, or populating a due-diligence record. Accepts a legal name plus optional country filter or a direct LEI for a precise lookup. WHEN NOT TO USE: Do not use to verify private companies not registered with GLEIF or SEC. Do not use as an exhaustive fraud-detection tool; this is a first-pass existence check against free public registries, not a full KYC screen. COST: free within the daily quota, then $0.02 per call LATENCY: ~800ms

ParametersJSON Schema
NameRequiredDescriptionDefault
leiNoOptional 20-character Legal Entity Identifier for a direct, precise lookup.
nameYesLegal company name to look up, e.g. Apple Inc or Volkswagen AG.
countryNoOptional ISO 3166-1 alpha-2 country filter (e.g. US, DE, GB). Narrows GLEIF results to one jurisdiction.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description's 'Never fabricates' and 'honest not_found' statement add behavioral guarantees beyond the schema. It also discloses cost (free within quota, then $0.02/call) and latency (~800ms), which are not implied by annotations. It does not describe any error cases beyond not_found, but that's covered. Overall, it adds meaningful context without contradicting 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.

Conciseness4/5

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

The description is longer than typical but is well-structured with bullet-like sections (WHEN TO USE, WHEN NOT TO USE, COST, LATENCY) and example queries. It front-loads the core purpose and then adds usage context. Slight redundancy exists ('Free' appears twice), but it's not verbose enough to detract seriously. Every section adds value.

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

Completeness5/5

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

With 3 parameters, no output schema, and no nested objects, the description must convey the return format and behavior. It does so by listing the returned fields, stating the not_found behavior with the queried sources, and covering cost and latency. It also anticipates edge cases (private companies, fraud detection) via the exclusions. 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.

Parameters5/5

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

Schema coverage is 100%, but the description enhances each parameter: it explains 'name' works with a legal name, 'lei' is a 20-character identifier for a direct precise lookup, and 'country' narrows GLEIF results to a jurisdiction. The examples show how to combine name+country and name+LEI, giving agents concrete usage patterns that the schema alone lacks.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Free, live lookup of a company official registry record,' and enumerates exactly what it returns (legal name, LEI, status, jurisdiction, address, authority). It also differentiates itself from siblings by naming the data sources (GLEIF and SEC EDGAR) and clarifying it is a first-pass existence check, not a full KYC screen. Example queries further cement its purpose.

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

Usage Guidelines5/5

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

Contains explicit WHEN TO USE and WHEN NOT TO USE sections. The WHEN TO USE states clear trigger conditions (contract signing, vendor qualification, counterparty validation, due diligence) and the accepted input forms (name+optional country, or LEI). The WHEN NOT TO USE section explicitly excludes private companies not in GLEIF/SEC and clarifies it is not a fraud-detection tool, steering agents away from misuse, even though it doesn't name a specific sibling alternative.

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

Frequently Asked Questions

Discussions

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

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.2/5.0
Disambiguation4/5

Most tools have clearly differentiated targets (e.g., check_booking_link vs import_booking_url, get_status vs get_outcome), and the descriptions are unusually thorough. However, send_message and send_transactional_confirmation overlap because send_message already includes a 'transactional' message type, and verify_business vs verify_company_record are easy to confuse despite different scopes.

Naming Consistency5/5

All 23 tools use a consistent verb_noun snake_case pattern (check_*, get_*, send_*, verify_*), with no camelCase or stylistic drift. The verb uniformly precedes the object, making the surface predictable and easy to navigate.

Tool Count3/5

23 tools is on the heavy side for a single MCP server, spanning SMB communications, booking, compliance screening, trade lookup, and platform utilities. Each tool has a purpose, but the count pushes the set into the 16-25 borderline range and suggests scope creep.

Completeness3/5

Core workflows for booking, messaging, and compliance pre-flight are well covered, including async polling and cost preview. However, there are lifecycle gaps: capture_lead has no way to list/update/retrieve leads, and business records support import/verify but no update/delete. The trade/company-verification tools also feel disconnected from the main SMB flow.