SMS and WhatsApp Messaging
Server Details
Send WhatsApp, SMS, email or voice to a business with the compliance gate enforced.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- basilalshukaili/agentbroker
- GitHub Stars
- 1
- Server Listing
- Agent Broker
Available Tools
10 toolscheck_complianceARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| channel | No | Delivery channel. Omit to auto-infer sms/email from recipient_id; set 'voice' explicitly. | |
| content | Yes | The actual message body you intend to send. The gate classifies the real text, so a meaningful preview needs the real content. | |
| state_code | No | US state code (e.g. 'CA') for state-specific rules. | |
| country_code | No | ISO 3166-1 alpha-2 (e.g. 'US', 'DE', 'CA'). Auto-inferred from phone if omitted; drives which jurisdiction rules apply. | |
| message_type | No | Intent tag: transactional, marketing, reminder, follow_up, notification. 'marketing' triggers the consent checks. Defaults to transactional. | transactional |
| recipient_id | Yes | Phone in E.164 (e.g. '+14045550100') or email address the message would go to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds substantial behavioral context: preview mode sends nothing, makes no state changes, incurs no cost, re-runs at actual send time, and produces an Ed25519-signed offline-verifiable compliance_receipt. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: purpose, examples, when to use, when not to use, cost, and latency. Key differentiators are front-loaded in the opening sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explains what the tool returns (legal decision, exact rule, remediation, signed receipt) and covers failure/edge cases. Combined with the full input schema and annotations, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents all six parameters. The examples and prose reinforce usage but do not add new parameter-level semantics beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise verb and resource: a compliance pre-flight that runs the same gate as send_message/call_business but in preview mode. It explicitly contrasts itself with those siblings and with check_booking_link, so an agent can distinguish it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It has dedicated WHEN TO USE and WHEN NOT TO USE sections with concrete triggers (marketing, US SMS/10DLC, EU/UK GDPR, Canadian CASL, uncertain content) and explicit exclusions (not for recording consent, not a substitute for send_message). It also tells the agent how to act on legal=true vs legal=false.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_businessARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | ||
| vertical | Yes | Service vertical to search within | |
| capability | No | Specific service capability required, e.g. 'haircut', 'plumbing', 'tax_consultation' | |
| price_band | No | ||
| max_results | No | ||
| availability_window | No | Accepted 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description is not needed for basic safety. It adds substantial behavioral context: the network is small and mostly sample data, demo entries are named [DEMO] and flagged is_demo, and availability_window is accepted but not applied and the response carries availability_window_applied: false. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but well-organized and every section earns its place: core function, critical demo-data warning, example mappings, explicit usage rules, and operational notes. Important caveats are front-loaded before the examples and when-to-use guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema and non-trivial nested parameters, the description covers the essential invocation context, demo-data caveat, and non-applied availability_window semantics. It could go slightly further by describing the shape of a ranked result beyond the is_demo flag, but the guidance is sufficient for an agent to call and interpret results correctly in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is only 50%, the description's example queries add concrete mappings from natural-language requests to JSON arguments for vertical, location, and capability. The schema already explains availability_window's non-applied behavior and provides defaults/constraints for max_results and radius_miles; remaining params like price_band are self-explanatory from their schema structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'return ranked candidate businesses from our supply network' given explicit criteria. It also distinguishes itself from a general directory/browsing tool and from tools like verify_business by explicitly ruling out use when a verified SMB identifier is already held.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides both explicit WHEN TO USE and WHEN NOT TO USE guidance, along with three example user queries mapped directly to call arguments. It names alternatives such as schedule_appointment and send_message and states conditions for preferring them, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversationARead-onlyInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| reference | No | The 4-digit request reference, e.g. '4821'. Requires business_number. | |
| business_number | No | Scopes a `reference` to one business (references are reused across businesses). | |
| conversation_id | No | From the send_message receipt (preferred). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=false; the description adds valuable context by promising that replies are matched exactly and never guessed, so the data belongs to the end-user. Costs and latency are also disclosed. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with distinct sections: overview, examples, WHEN TO USE, WHEN NOT TO USE, cost, and latency. The core purpose is front-loaded and each section earns its place with actionable information, though the example queries add some length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with three well-described parameters and no output schema, it adequately states what data is returned, when to call it, and a rate limiting caution. It doesn't detail return structure or errors, but gives the agent enough to select and use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents each parameter. The description contributes a usage example and notes conversation_id is preferred, but it does not add substantial meaning beyond what the schema already says about reference, business_number, and conversation_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Read a two-way conversation thread you started,' and enumerates exactly what it returns: state, every message exchanged, and reply count. This clearly differentiates it from siblings like get_status or get_outcome because it is uniquely about conversation threads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
An explicit WHEN TO USE section states it should be called after send_message returns a conversation_id, in order to poll for the business's reply. The WHEN NOT TO USE section adds a real constraint: don't poll more often than every 10 seconds. It doesn't explicitly recommend an alternative sibling, but the trigger condition is concrete and sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_outcomeARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| operation_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so safety is covered. The description adds useful non-safety behavior: free/no key required, ~50ms latency, and that the result includes cost and reason codes. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, usage conditions, cost, and latency are each given a labeled line. The description is short and front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only tool, the description covers purpose, when to use, cost, and latency. It partially covers return contents (cost and reason codes), and since there is no output schema, a bit more detail on the OutcomeReceipt shape would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description does not explicitly explain operation_id beyond naming it. The WHEN TO USE section indirectly implies it comes from get_status, but the parameter format/source is left to inference, so the description does not fully compensate for the missing schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Retrieve the final OutcomeReceipt for a completed operation.' It clearly distinguishes this from get_status by framing it as the follow-up that retrieves the full result once status reaches success/failure/partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit WHEN TO USE and WHEN NOT TO USE sections name get_status as the alternative and state the exact state condition. This leaves no ambiguity about when the tool should be invoked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| operation_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context beyond annotations: polling rate limits, cost, latency, and the requirement that the operation be in-flight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly structured with labeled sections: purpose, when to use, when not to use, cost, and latency. Every sentence contributes operational guidance, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter, rich annotations, and simple polling use case, the description covers the main operational concerns: usage context, throttling, cost, and latency. It does not enumerate possible status values or error behavior, but the core information needed to call and poll is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only a bare operation_id string with no description, and the description adds that it identifies an in-flight async operation. This is some added meaning, but it does not explain how to obtain the operation_id, expected format, or what qualifies as a valid pending operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Query the current state of any in-flight async operation by operation_id.' This clearly distinguishes the tool from siblings like get_conversation or get_outcome by scoping it to async operation polling rather than business entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit 'WHEN TO USE' and 'WHEN NOT TO USE' sections, including the polling frequency cap and the webhook alternative for real-time updates. This gives an agent actionable decision criteria for selecting this tool over other mechanisms.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_costARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | The same request body you would pass to the operation | |
| operation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive; the description adds behavior beyond that by explaining exact vs min/max pricing and explicitly disclaiming an accuracy guarantee ('does not promise an accuracy percentage - check cost_range'). It also states cost and latency characteristics, which the agent would otherwise have to discover by calling it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information is front-loaded and segmented into examples and usage rules, with each section earning its place. Despite covering behavior, examples, when/not-to-use, and cost/latency, it avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description tells the agent what the response contains (cost estimate, latency, success probability, exact vs range, cost_range caveat) and how to invoke it with both required parameters. The inclusion of examples, caching guidance, and operational characteristics makes it a complete quick-reference for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes params as 'the same request body you would pass to the operation' but leaves operation undefined. The description compensates with concrete examples mapping user intent to operation and params values. It still doesn't enumerate valid operation names, so the agent must rely on context or other operation knowledge.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Return') and names the three outputs (cost estimate, latency estimate, success-probability estimate) for a proposed call before execution. It also clarifies exact vs range pricing, so the agent knows what kind of answer to expect. This clearly differentiates it from execution-oriented sibling tools like send_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
WHEN TO USE explicitly ties the tool to budget-constrained decisions before any operation. WHEN NOT TO USE warns against hot-loop calls and gives a concrete cache duration of 60 seconds. This is direct guidance with no reliance on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
self_testARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior, but the description adds valuable context: it runs 6 internal checks, reports pass count, does not probe each tool individually, has ~200ms latency, is free, and has a rate-limit caution. No contradictions with annotations; description enriches them substantially.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main description is front-loaded with the essential purpose, and each additional section (example, when to use, when not to use, cost, latency) earns its place by helping an agent decide and call correctly. No filler or redundant repetition of schema data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, no output schema, and rich annotations, the description is fully complete. It explains what the tool checks, how to call it, when to use it, and its operational constraints, so an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema already covers everything. The description adds an example call 'self_test({})' and clarifies that no arguments are needed, which is sufficient for this parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'runs 6 internal checks and reports how many passed,' and explicitly distinguishes itself from sibling tools with 'it does NOT probe each tool individually.' This makes it immediately clear what self_test does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit WHEN TO USE guidance: 'at agent startup, before high-stakes task sequences, or after receiving unexpected errors,' and a clear WHEN NOT TO USE constraint: 'Do not call more than once per minute in production.' Also gives a matching example user query, 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.
send_messageADestructiveInspect
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)
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| recipient | Yes | ||
| business_id | No | Optional 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_iso | No | NOT 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_type | Yes | Intent 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_of | No | Who 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_key | No | Optional 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_channel | No | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the basic annotations (readOnlyHint=false, destructiveHint=true): every send passes a non-bypassable compliance gate, marketing without consent is rejected with a compliance_violation receipt, channel selection is abstracted with automatic fallback, future scheduling more than 2 minutes out is refused, and execution is sync_fast with results fetched via get_outcome. These behavioral traits materially shape how an agent should invoke the tool and are not present in the annotations. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with labeled sections (EXAMPLE USER QUERIES, WHEN TO USE, WHEN NOT TO USE, COST, LATENCY, EXECUTION) and front-loads the core function. Most sections earn their place, though the compliance gate is described twice and the 'free during launch' phrasing may age poorly. For a tool with this compliance complexity, the length is largely justified rather than bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, nested objects, no output schema, and significant compliance constraints, the description is thorough: it covers acceptable use, forbidden use, cost, latency, execution mode, and failure behavior (compliance_violation receipt), and points to preview_cost and get_outcome for follow-up. The primary gap is the missing consent_record_id in the schema despite the description making it essential for marketing sends, which creates actionable confusion for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 63%, so the description must add semantic value, and it does: it explains message_type intent and the consent requirement for 'marketing', clarifies that preferred_channel can be 'auto' with channel fallback, and documents send_at_iso as unsupported/refused. The two example invocations map real parameter values to user queries. However, the description references a consent_record_id that is not present in the input schema, leaving the agent uncertain how to supply it, and some parameters (template_id, template_vars, idempotency_key) rely solely on schema descriptions. It compensates meaningfully but not completely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Send a message on behalf of an agent's user or an SMB across WhatsApp... SMS, email, or voice'), enumerates five message types, and includes concrete example invocations. It also implicitly distinguishes itself from send_transactional_confirmation by explicitly excluding OTPs/critical transactional confirmations, leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There are dedicated 'WHEN TO USE' and 'WHEN NOT TO USE' sections. The former lists five concrete scenarios (booking confirmation, replying to a customer, follow-up, reminders, opted-in marketing); the latter explicitly names send_transactional_confirmation for OTPs/critical confirmations, forbids un-consented marketing, and excludes bulk/cold outreach. This is exactly the explicit when/when-not/alternatives guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_transactional_confirmationBDestructiveInspect
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)
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Type-specific payload; e.g., {otp_code} for otp, {appointment_time, smb_name} for booking_confirmation | |
| recipient | Yes | ||
| idempotency_key | No | Optional 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_type | Yes | ||
| preferred_channel | No | sms |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims idempotency ('Idempotent transactional messages') and details 24-hour replay semantics, but the annotation idempotentHint is explicitly false. This is a direct contradiction. The description does add useful behavioral context (channel fallback, honest failure, cost, latency, execution model), but the contradiction mandates a score of 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with labeled sections and front-loaded intent, making it easy to scan. It repeats 'Do not use for marketing' in both WHEN TO USE and WHEN NOT TO USE, and the example/schema mismatch detracts, but overall structure is strong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description includes cost, latency, execution mode, and points to get_outcome for retrieving results, which helps compensate for the lack of an output schema. However, the idempotency contradiction and the mismatch between the example and the input schema leave important gaps in an agent's ability to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 40% schema description coverage, the description needed to compensate, but its example uses recipient.id_type/id_value while the schema requires recipient.phone_or_email, and data.business_name while the schema example mentions smb_name. These conflicting field names mislead rather than clarify, so the description adds little positive value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's scope by enumerating concrete message types (OTPs, booking confirmations, payment receipts, cancellation notices) and distinguishes it from marketing/conversational messaging. It relies somewhat on the tool name for the verb, but the example query and 'MUST be delivered reliably' phrasing make the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides WHEN TO USE and WHEN NOT TO USE sections, stating when it is appropriate ('MUST be delivered reliably') and when it should not be used (marketing, promotional, conversational). This clearly routes the agent away from siblings 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_businessARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| smb_id | Yes | ||
| capability_to_verify | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/idempotent/non-destructive behavior. The description adds value by stating the tool performs no external contact, lists the kinds of data returned, and notes that no key is required. There is no contradiction with the readOnlyHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then uses compact labeled sections for example, usage, cost, and latency. Every section adds decision-relevant information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only lookup, the description covers what the tool returns, when to call it, when not to call it, and even cost/latency. No output schema exists, but the description gives enough return-value context for an agent to act.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It provides one clear example mapping a user request to smb_id and capability_to_verify, but it does not formally define the expected values or optionality of capability_to_verify beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description begins with a specific verb and resource ('Look up what we know about a business in our supply network'), clarifies it is a directory lookup that does not contact the business, and includes a concrete example query. This makes it easy to distinguish from the contact-oriented siblings and from find_business.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit WHEN TO USE and WHEN NOT TO USE sections give actionable selection criteria, including the exact condition under which find_business should be used instead (results returned within last 24 hours). This is stronger than typical usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
10 tool updates
- First observed
check_compliance - First observed
find_business - First observed
get_conversation - First observed
get_outcome - First observed
get_status - First observed
preview_cost - First observed
self_test - First observed
send_message - First observed
send_transactional_confirmation - First observed
verify_business
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Send and receive across email, SMS, WhatsApp, and voice. One API, one contract.
Run WhatsApp Business campaigns from any AI assistant: contacts, segments, and broadcasts.
Send and schedule SMS and WhatsApp messages, manage contacts and templates, and track delivery.
Instagram, WhatsApp and Messenger DMs through official Meta Business APIs.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with WhatsApp by sending messages, triaging urgent conversations, scheduling messages, and managing automated replies with safety controls and human approval.47MIT

SendAPI MCP Serverofficial
AlicenseAqualityBmaintenanceEnables any MCP-compatible AI agent to send WhatsApp messages, SMS, OTP codes, and email through a single REST API.18MIT- FlicenseNot gradedqualityCmaintenanceCompliance intelligence layer for AI agents sending WhatsApp Business messages. Prevents account suspensions by validating Meta's rules (care windows, opt-outs, rate limits) in real-time before every send.1-
- AlicenseAqualityBmaintenanceGoverns and automates WhatsApp messaging for AI agents with security controls like recipient allowlisting, secret scanning, rate limiting, and audit logging.5MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Most tools have clearly distinct roles: compliance preflight, messaging, transactional sends, directory lookup, conversation/status/outcome retrieval, cost preview, and health check. The main ambiguity is between send_message and send_transactional_confirmation, both of which can handle booking confirmations and transactional message types, though the descriptions do provide guardrails.
All tool names follow a consistent snake_case verb_noun pattern: check_compliance, find_business, get_conversation, get_outcome, get_status, preview_cost, send_message, verify_business. Even longer names like send_transactional_confirmation stay within the same convention. No mixed casing or inconsistent verb styles.
10 tools is well-scoped for a business messaging platform. Each tool covers a distinct aspect: search/verify businesses, check compliance, send messages, preview costs, and inspect async results. The count is neither bloated nor thin for the stated purpose.
The core workflows are covered: find/verify a business, check compliance, send messages, retrieve conversations, and get operation outcomes. Minor gaps exist, such as no explicit tool for managing consent records and no webhook configuration tool, but agents can still complete primary messaging tasks without dead ends.