HatchLoop SMS and WhatsApp Messaging MCP
This MCP server enables agents to send messages to businesses via WhatsApp, SMS, email, or voice. It enforces a compliance gate on every send operation to ensure regulatory adherence. The server is part of the HatchLoop agent broker infrastructure, providing a unified interface for multi-channel communication with built-in safety checks.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://hatchloop.dev/mcp/sms-whatsapp-messagingWhat its tools do
10 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (8)
Can change data (2)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to hatchloop.dev ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Send WhatsApp messages to a business
- Send SMS messages to a business
- Send email messages to a business
- Send voice messages to a business
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- sms-whatsapp-messaging 0.2.16
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 10 advertised
- Resources
- 5 advertised
- Resource templates
- 0 advertised
- Prompts
- 4 advertised
{
"tools": {
"listChanged": false
},
"prompts": {
"listChanged": false
},
"resources": {
"subscribe": false,
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
10 advertised
find_business
Find 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]
{
"type": "object",
"required": [
"location"
],
"properties": {
"city": {
"type": "string",
"description": "Instead of location: a city, e.g. 'Muscat, Oman'."
},
"region": {
"type": "string",
"description": "With city: a state or region."
},
"location": {
"type": "object",
"required": [
"zip_or_city"
],
"properties": {
"zip_or_city": {
"type": "string",
"description": "Town, city, address or postal code, with the country if not US: 'Nizwa, Oman'. A bare 5-digit ZIP is a US ZIP; add the country for any other postal code."
},
"radius_miles": {
"type": "number",
"minimum": 0,
"description": "Radius in miles (default 3.1, max 25); applies to OpenStreetMap results only."
}
},
"description": "City/town or ZIP, optionally with country ('Nizwa, Oman'). Geocoded by OSM."
},
"vertical": {
"enum": [
"personal_services",
"home_services",
"professional_services"
],
"type": "string"
},
"capability": {
"type": "string",
"description": "Kind of business: 'dentist', 'cafe', 'plumber'. Use it or vertical."
},
"price_band": {
"type": "object",
"properties": {
"max_usd": {
"type": "number"
}
},
"description": "Supply-network rows only (OpenStreetMap has no prices)."
},
"max_results": {
"type": "integer",
"default": 5,
"maximum": 20,
"minimum": 1
},
"availability_window": {
"type": "object",
"properties": {
"end_iso": {
"type": "string",
"format": "date-time"
},
"start_iso": {
"type": "string",
"format": "date-time"
}
},
"description": "Accepted but NOT APPLIED: it does not narrow results (no live calendars). The…"
}
}
}{
"title": "Find Business",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}verify_business
Look 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]
{
"type": "object",
"required": [
"smb_id"
],
"properties": {
"smb_id": {
"type": "string"
},
"capability_to_verify": {
"type": "string"
}
}
}{
"title": "Verify Business",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}send_message
Send 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.]
{
"type": "object",
"required": [
"recipient",
"message_type",
"content"
],
"properties": {
"content": {
"type": "object",
"required": [
"body"
],
"properties": {
"body": {
"type": "string"
},
"subject": {
"type": "string",
"description": "For email channel"
},
"template_id": {
"type": "string"
},
"template_vars": {
"type": "object"
}
}
},
"recipient": {
"type": "object",
"required": [
"id_type",
"id_value"
],
"properties": {
"id_type": {
"enum": [
"phone",
"email",
"smb_id",
"customer_id"
],
"type": "string"
},
"id_value": {
"type": "string"
},
"country_code": {
"type": "string",
"description": "ISO 3166-1 alpha-2, required for compliance routing"
}
}
},
"business_id": {
"type": "string",
"description": "Stable id for the recipient business; used for global demand shaping."
},
"message_type": {
"enum": [
"transactional",
"marketing",
"reminder",
"follow_up",
"notification"
],
"type": "string",
"description": "'marketing' needs recorded opt-in, except US email (CAN-SPAM opt-out rules).…"
},
"on_behalf_of": {
"type": "string",
"description": "Who this message is FOR (your end-user's name/label). On WhatsApp this opens a…"
},
"idempotency_key": {
"type": "string",
"maxLength": 128,
"description": "Retry key: a 24h replay returns the original receipt, not re-run or charged."
},
"preferred_channel": {
"enum": [
"whatsapp",
"sms",
"email",
"voice",
"auto"
],
"type": "string",
"default": "auto"
}
}
}{
"title": "Send Message",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}send_transactional_confirmation
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. [$0.02/per_call, not charged while no payment rail is on] [async→get_outcome] [Not available on this deployment: SMS.]
{
"type": "object",
"required": [
"recipient",
"confirmation_type",
"data"
],
"properties": {
"data": {
"type": "object",
"description": "Type-specific payload; e.g., {otp_code} for otp, {appointment_time, smb_name}…"
},
"recipient": {
"type": "object",
"required": [
"phone_or_email"
],
"properties": {
"name": {
"type": "string"
},
"phone_or_email": {
"type": "string"
}
}
},
"idempotency_key": {
"type": "string",
"maxLength": 128,
"description": "Retry key: a 24h replay returns the original receipt, not re-run or charged."
},
"confirmation_type": {
"enum": [
"otp",
"booking_confirmation",
"payment_receipt",
"cancellation_notice",
"reminder"
],
"type": "string"
},
"preferred_channel": {
"enum": [
"sms",
"email",
"auto"
],
"type": "string",
"default": "sms"
}
}
}{
"title": "Send Transactional Confirmation",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}get_status
Query the current state of any in-flight async operation by operation_id. [free, no key]
{
"type": "object",
"required": [
"operation_id"
],
"properties": {
"operation_id": {
"type": "string"
}
}
}{
"title": "Get Status",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_outcome
Retrieve the final OutcomeReceipt for a completed operation. [free, no key]
{
"type": "object",
"required": [
"operation_id"
],
"properties": {
"operation_id": {
"type": "string"
}
}
}{
"title": "Get Outcome",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}preview_cost
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. [free, no key]
{
"type": "object",
"required": [
"operation",
"params"
],
"properties": {
"params": {
"type": "object",
"description": "The same request body you would pass to the operation"
},
"operation": {
"type": "string"
}
}
}{
"title": "Preview Cost",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}self_test
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. [free, no key]
{
"type": "object",
"properties": {}
}{
"title": "Self Test",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}check_compliance
Free, 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]
{
"type": "object",
"required": [
"recipient_id",
"content"
],
"properties": {
"channel": {
"enum": [
"sms",
"email",
"voice"
],
"type": "string",
"description": "Delivery channel. Omit to auto-infer sms/email from recipient_id; set 'voice'…"
},
"content": {
"type": "string",
"description": "The actual message body you intend to send. The gate classifies the real text,…"
},
"state_code": {
"type": "string",
"description": "US state code (e.g. 'CA') for state-specific rules."
},
"country_code": {
"type": "string",
"description": "ISO 3166-1 alpha-2 (e.g. 'US', 'DE', 'CA'). Auto-inferred from phone if…"
},
"message_type": {
"type": "string",
"default": "transactional",
"description": "One of transactional, marketing, reminder, follow_up, notification (any case).…"
},
"recipient_id": {
"type": "string",
"description": "Phone in E.164 (e.g. '+14045550100') or email address the message would go to."
}
}
}{
"title": "Check Compliance",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_conversation
Read a two-way conversation thread you started: its state, every message exchanged, and how many replies the business has sent. [free, requires key]
{
"type": "object",
"properties": {
"reference": {
"type": "string",
"description": "The 4-digit request reference, e.g. '4821'. Requires business_number."
},
"business_number": {
"type": "string",
"description": "Scopes a `reference` to one business (references are reused across businesses)."
},
"conversation_id": {
"type": "string",
"description": "From the send_message receipt (preferred)."
}
}
}{
"title": "Get Conversation",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}Prompts
4 advertised
book_from_any_url
PRIMARY FLOW. The user gave you a Cal.com / Calendly / Doctolib / Booksy / Fresha / OpenTable / Setmore / Square / Acuity / Schedulista / Squarespace / BookMyCity URL. Do this: 1) call import_booking_url with the URL. 2) call schedule_appointment with the returned smb_id. 3) (optional) call send_transactional_confirmation. Total: 2 tool calls for a complete booking. Use this whenever the user mentions a booking URL — it is faster and more reliable than find_business + manual lookup.
- booking_url
- Any URL on a supported booking platform. (required)
- preferred_time
- When the user wants to be booked (free-form, e.g. 'next Tuesday at 3pm PT').
find_then_book
Use when the user describes a business by category + location but does not provide a URL. 1) call find_business(vertical, location, capability). 2) if a result has source=supply_network, call schedule_appointment with its smb_id (source=openstreetmap rows cannot be booked - give the user their phone or website instead). 3) if NO results, call import_booking_url with any URL the user CAN provide, then schedule_appointment. Total: 2-3 tool calls.
- vertical
- personal_services | home_services | professional_services | restaurants | healthcare | fitness (required)
- location
- ZIP or city or country. (required)
- capability
- Service needed (e.g. haircut, plumbing, dental cleaning). (required)
compliant_transactional_message
Send a consumer-initiated transactional SMS / email / voice with full TCPA / GDPR / CASL pre-check. ONLY use when the end-user explicitly asked the agent to communicate with a named SMB on their behalf — confirming a booking, replying to a quote, following up on an inbound the SMB sent first. This flow is NOT for marketing, cold outreach, or prospecting; those are rejected at schema validation. 1) (optional) call /compliance/check first to preview legality. 2) call send_message — the gate runs again at send time and blocks any non-compliant send. Use country_code so the right jurisdiction rules apply.
- recipient
- Phone (E.164) or email of the SMB the consumer named, or the consumer themselves for a transactional confirmation. (required)
- message_type
- transactional | marketing | reminder | follow_up | notification. Marketing needs a recorded opt-in, except US marketing email (CAN-SPAM opt-out rules); the gate rejects a send without the opt-in its rule needs. (required)
- country_code
- ISO 3166-1 alpha-2 (e.g. 'US', 'DE'). Auto-inferred from phone if omitted.
cost_estimation
Get a cost estimate before committing to a paid operation. Free.
- operation
- Operation name (any tool from tools/list). (required)
Resources
5 advertised
Capability Manifest
Full manifest with all operations and their schemas.
agent-broker://manifestSupported Booking Platforms
12 booking platforms import_booking_url accepts (Cal.com, Calendly, Doctolib, Booksy, Fresha, OpenTable, Setmore, Square, Acuity, Schedulista, Squarespace, BookMyCity) with regex patterns and example URLs. Use this resource to teach end-users which URL formats are acceptable.
agent-broker://booking_platformsError Code Catalog
All 16 error codes with retry semantics.
agent-broker://errorsJurisdiction Rules
Compliance rules by country/state — TCPA, GDPR, CASL, recording consent. 26 jurisdictions + INTERNATIONAL fallback. Each entry's `statutes` lists the statutes it models; empty means the service's own conservative default applies, not a country-specific law.
agent-broker://compliance/jurisdictionsTool-chain cookbook
Common multi-tool flows: 'book-from-url', 'find-then-book', 'compliant-transactional-message', 'async-poll'. Read this if you are unsure which tool to call first.
agent-broker://cookbook90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 2 of 2 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1426 ms
- 95th percentile latency
- 1426 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1426 ms · metadata changed · 10 tool(s), 5 resource(s), 0 resource template(s), 4 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http sms-and-whatsapp-messaging-mcp https://hatchloop.dev/mcp/sms-whatsapp-messagingCodex
codex mcp add sms-and-whatsapp-messaging-mcp --url https://hatchloop.dev/mcp/sms-whatsapp-messagingCursor
{
"mcpServers": {
"sms-and-whatsapp-messaging-mcp": {
"url": "https://hatchloop.dev/mcp/sms-whatsapp-messaging"
}
}
}Cline
{
"mcpServers": {
"sms-and-whatsapp-messaging-mcp": {
"type": "streamableHttp",
"url": "https://hatchloop.dev/mcp/sms-whatsapp-messaging",
"disabled": false
}
}
}VS Code
{
"servers": {
"sms-and-whatsapp-messaging-mcp": {
"type": "http",
"url": "https://hatchloop.dev/mcp/sms-whatsapp-messaging"
}
}
}Gemini CLI
gemini mcp add --transport http sms-and-whatsapp-messaging-mcp https://hatchloop.dev/mcp/sms-whatsapp-messagingClaude Desktop
https://hatchloop.dev/mcp/sms-whatsapp-messagingWindsurf
{
"mcpServers": {
"sms-and-whatsapp-messaging-mcp": {
"serverUrl": "https://hatchloop.dev/mcp/sms-whatsapp-messaging"
}
}
}Let your agent find its tools
Find servers like HatchLoop SMS and WhatsApp Messaging MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other crm, sales, and marketing servers
Do you run HatchLoop SMS and WhatsApp Messaging MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.