SMS and WhatsApp Messaging
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Send WhatsApp, SMS, email or voice to a business with the compliance gate enforced.
| Author | dev.hatchloop |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 966 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"SMS and WhatsApp Messaging": {
"url": "https://hatchloop.dev/mcp/sms-whatsapp-messaging",
"transport": "streamable-http"
}
}
}
Measured tools (10)
find_businessread-onlyFind real businesses near a place, sorted by distance (nearest of those examined; see result.search). Data: OpenStreetMap (ODbL, (c) OSM contributors); phone, website, hours only when mapped. Coverage varies; community-mapped, NOT verified by us; source=openstreetmap rows cannot be booked. Answers within about 5 s: status partial (search_in_progress) means repeat the call. If OSM is down: retriable 'temporarily unavailable', never invented rows. [free, no key] [beta]
Parameters:
location(required) — object — City/town or ZIP, optionally with country ('Nizwa, Oman'). Geocoded by OSM.city— string — Instead of location: a city, e.g. 'Muscat, Oman'.region— string — With city: a state or region.vertical— stringcapability— string — Kind of business: 'dentist', 'cafe', 'plumber'. Use it or vertical.price_band— object — Supply-network rows only (OpenStreetMap has no prices).max_results— integeravailability_window— object — Accepted but NOT APPLIED: it does not narrow results (no live calendars). The…
Hints: read-only yes · destructive no · idempotent yes · open-world no
verify_businessread-onlyLook up what we know about a business in our supply network: contact channels, capabilities, last verification. A DIRECTORY LOOKUP - it does not contact the business. Supply-network ids only, not osm:... ids. [free, no key] [limited]
Parameters:
smb_id(required) — stringcapability_to_verify— string
Hints: read-only yes · destructive no · idempotent yes · open-world no
send_messagedestructiveSend a message on behalf of an agent's user or an SMB across WhatsApp (free during launch), SMS, email, or voice, sent immediately, no scheduling. Every send passes a non-bypassable gate: TCPA, GDPR, CASL where modeled, else the service's own opt-in default (the Gulf included). Marketing on SMS, voice, WhatsApp and non-US email without recorded opt-in is rejected (compliance_violation receipt). US marketing email follows CAN-SPAM opt-out rules. [from $0.02/call, variable, not charged while no payment rail is on] [async→get_outcome] [Not available on this deployment: SMS, Voice.]
Parameters:
recipient(required) — objectmessage_type(required) — string — 'marketing' needs recorded opt-in, except US email (CAN-SPAM opt-out rules).…content(required) — objectbusiness_id— string — Stable id for the recipient business; used for global demand shaping.on_behalf_of— string — Who this message is FOR (your end-user's name/label). On WhatsApp this opens a…idempotency_key— string — Retry key: a 24h replay returns the original receipt, not re-run or charged.preferred_channel— string
Hints: read-only no · destructive yes · idempotent no · open-world yes
send_transactional_confirmationdestructiveIdempotent 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. [$0.02/per_call, not charged while no payment rail is on] [async→get_outcome] [Not available on this deployment: SMS.]
Parameters:
recipient(required) — objectconfirmation_type(required) — stringdata(required) — object — Type-specific payload; e.g., {otp_code} for otp, {appointment_time, smb_name}…idempotency_key— string — Retry key: a 24h replay returns the original receipt, not re-run or charged.preferred_channel— string
Hints: read-only no · destructive yes · idempotent no · open-world no
get_statusread-onlyQuery the current state of any in-flight async operation by operation_id. [free, no key]
Parameters:
operation_id(required) — string
Hints: read-only yes · destructive no · idempotent yes · open-world no
get_outcomeread-onlyRetrieve the final OutcomeReceipt for a completed operation. [free, no key]
Parameters:
operation_id(required) — string
Hints: read-only yes · destructive no · idempotent yes · open-world no
preview_costread-onlyReturn 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. [free, no key]
Parameters:
operation(required) — stringparams(required) — object — The same request body you would pass to the operation
Hints: read-only yes · destructive no · idempotent yes · open-world no
self_testread-onlyService 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. [free, no key]
Hints: read-only yes · destructive no · idempotent yes · open-world no
check_complianceread-onlyFree, instant pre-flight for the compliance gate: runs the SAME TCPA/GDPR/CASL/CAN-SPAM/10DLC checks as send_message and call_business, in preview mode -- nothing is sent, nothing changes. Tells you whether a send would be permitted before you pay, and if not, names the exact rule and how to fix it. De-risks a paid send the way check_booking_link de-risks a paid booking. [free, no key]
Parameters:
recipient_id(required) — string — Phone in E.164 (e.g. '+14045550100') or email address the message would go to.content(required) — string — The actual message body you intend to send. The gate classifies the real text,…channel— string — Delivery channel. Omit to auto-infer sms/email from recipient_id; set 'voice'…state_code— string — US state code (e.g. 'CA') for state-specific rules.country_code— string — ISO 3166-1 alpha-2 (e.g. 'US', 'DE', 'CA'). Auto-inferred from phone if…message_type— string — One of transactional, marketing, reminder, follow_up, notification (any case).…
Hints: read-only yes · destructive no · idempotent yes · open-world no
get_conversationread-onlyRead a two-way conversation thread you started: its state, every message exchanged, and how many replies the business has sent. [free, requires key]
Parameters:
reference— string — The 4-digit request reference, e.g. '4821'. Requires business_number.business_number— string — Scopes a `reference` to one business (references are reused across businesses).conversation_id— string — From the send_message receipt (preferred).
Hints: read-only yes · destructive no · idempotent no · open-world no
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.