Serveur MCP

SMS and WhatsApp Messaging

dev.hatchloop/sms-whatsapp-messaging
Entreprise et opérations Communication Public et accessible MCP 2026-07-28

Ce que fait ce MCP

Finds and verifies businesses and sends compliant SMS, WhatsApp, email, voice, and transactional confirmation messages.

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]
Lecture seule Idempotent
Schéma d’entrée
{'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': 'Intent tag: transactional, marketing, reminder, follow_up, notification.…'}, 'recipient_id': {'type': 'string', 'description': "Phone in E.164 (e.g. '+14045550100') or email address the message would go to."}}}
find_business
Find real businesses near a place, sorted by distance (nearest of those examined; dense areas are narrowed, see result.search). Data: OpenStreetMap (ODbL, (c) OpenStreetMap contributors, attributed per result); phone, website, hours only when mapped. Coverage varies; community-mapped, NOT verified by us; source=openstreetmap rows cannot be booked. Plus supply-network rows. If OSM is down: retriable 'temporarily unavailable', never invented rows. [free, no key]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['vertical', 'location'], 'properties': {'city': {'type': 'string', 'description': 'Alternative to location: a top-level city, normalised into…'}, 'region': {'type': 'string', 'description': 'Alternative to location: a top-level state/region, normalised into…'}, 'location': {'type': 'object', 'required': ['zip_or_city'], 'properties': {'zip_or_city': {'type': 'string', 'description': "City, town, address or postal code, optionally with the country, e.g. 'Nizwa, Oman'. A bare 5-digit ZIP is read as a US ZIP; give any non-US postal code with its country (e.g. '10115, Germany')."}, '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, e.g. 'haircut', 'plumber', 'dentist'. Mapped to OSM tags."}, '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. We do not hold live…'}}}
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]
Lecture seule
Schéma d’entrée
{'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).'}}}
get_outcome
Retrieve the final OutcomeReceipt for a completed operation. [free, no key]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['operation_id'], 'properties': {'operation_id': {'type': 'string'}}}
get_status
Query the current state of any in-flight async operation by operation_id. [free, no key]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['operation_id'], 'properties': {'operation_id': {'type': 'string'}}}
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]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['operation', 'params'], 'properties': {'params': {'type': 'object', 'description': 'The same request body you would pass to the operation'}, 'operation': {'type': 'string'}}}
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]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'properties': {}}
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 with no scheduling. Every send routes through a non-bypassable gate (TCPA, GDPR, CASL, PDPL across 26 jurisdictions): marketing without recorded consent is rejected at runtime with a structured compliance_violation receipt. [from $0.02/call, variable] [async→get_outcome]
Destructif Accès externe
Schéma d’entrée
{'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': "Intent tag for the message. Five permitted types. 'marketing' is allowed only…"}, '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'}}}
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] [async→get_outcome]
Destructif
Schéma d’entrée
{'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'}}}
verify_business
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. [free, no key]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['smb_id'], 'properties': {'smb_id': {'type': 'string'}, 'capability_to_verify': {'type': 'string'}}}
Modifié
find_business
1 October 2026 02:43
Modifié
send_message
29 September 2026 02:50
Modifié
find_business
29 September 2026 02:50
Modifié
get_conversation
25 September 2026 02:50
Modifié
send_message
25 September 2026 02:50
Modifié
find_business
25 September 2026 02:50
Modifié
check_compliance
23 September 2026 02:41
Modifié
send_transactional_confirmation
23 September 2026 02:41
Modifié
send_message
23 September 2026 02:41
Modifié
find_business
23 September 2026 02:41
Ajouté
get_conversation
17 September 2026 12:39
Ajouté
check_compliance
17 September 2026 12:39
Ajouté
self_test
17 September 2026 12:39
Ajouté
preview_cost
17 September 2026 12:39
Ajouté
get_outcome
17 September 2026 12:39
Ajouté
get_status
17 September 2026 12:39
Ajouté
send_transactional_confirmation
17 September 2026 12:39
Ajouté
send_message
17 September 2026 12:39
Ajouté
verify_business
17 September 2026 12:39
Ajouté
find_business
17 September 2026 12:39