{"name":"dev.hatchloop/sms-whatsapp-messaging","slug":"hatchloop-sms-whatsapp-messaging","title":"SMS and WhatsApp Messaging","description":"Send WhatsApp, SMS, email or voice to a business with the compliance gate enforced.","url":"https://mcp.market/server/hatchloop-sms-whatsapp-messaging","rating":null,"grade":"B","score":81,"certified":false,"status":"active","category":"email","tags":["email"],"presence":{"score":23,"stars":0,"forks":1,"downloads_week":null,"last_push_at":"2026-10-09T15:59:29.000Z","license":"MIT"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T04:51:09.286Z","last_ok_at":"2026-11-04T04:51:09.286Z","latency_ms":190},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/basilalshukaili/agentbroker","website":"https://hatchloop.dev/agent-broker/","version":"0.2.13","remotes":[{"type":"streamable-http","url":"https://hatchloop.dev/mcp/sms-whatsapp-messaging"}],"packages":[],"tools":[{"name":"check_compliance","description":"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]","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"recipient_id":{"type":"string","description":"Phone in E.164 (e.g. '+14045550100') or email address the message would go to."},"content":{"type":"string","description":"The actual message body you intend to send. The gate classifies the real text,…"},"channel":{"type":"string","enum":["sms","email","voice"],"description":"Delivery channel. Omit to auto-infer sms/email from recipient_id; set 'voice'…"},"message_type":{"type":"string","description":"One of transactional, marketing, reminder, follow_up, notification (any case).…","default":"transactional"},"country_code":{"type":"string","description":"ISO 3166-1 alpha-2 (e.g. 'US', 'DE', 'CA'). Auto-inferred from phone if…"},"state_code":{"type":"string","description":"US state code (e.g. 'CA') for state-specific rules."}},"required":["recipient_id","content"]}},{"name":"find_business","description":"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]","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"vertical":{"type":"string","enum":["personal_services","home_services","professional_services"]},"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."},"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)."},"availability_window":{"type":"object","properties":{"start_iso":{"type":"string","format":"date-time"},"end_iso":{"type":"string","format":"date-time"}},"description":"Accepted but NOT APPLIED: it does not narrow results (no live calendars). The…"},"max_results":{"type":"integer","default":5,"maximum":20,"minimum":1},"city":{"type":"string","description":"Instead of location: a city, e.g. 'Muscat, Oman'."},"region":{"type":"string","description":"With city: a state or region."}},"required":["location"]}},{"name":"get_conversation","description":"Read a two-way conversation thread you started: its state, every message exchanged, and how many replies the business has sent. [free, requires key]","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"conversation_id":{"type":"string","description":"From the send_message receipt (preferred)."},"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)."}}}},{"name":"get_outcome","description":"Retrieve the final OutcomeReceipt for a completed operation. [free, no key]","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"operation_id":{"type":"string"}},"required":["operation_id"]}},{"name":"get_status","description":"Query the current state of any in-flight async operation by operation_id. [free, no key]","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"operation_id":{"type":"string"}},"required":["operation_id"]}},{"name":"preview_cost","description":"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]","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"operation":{"type":"string"},"params":{"type":"object","description":"The same request body you would pass to the operation"}},"required":["operation","params"]}},{"name":"self_test","description":"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]","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"send_message","description":"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.]","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"recipient":{"type":"object","required":["id_type","id_value"],"properties":{"id_type":{"type":"string","enum":["phone","email","smb_id","customer_id"]},"id_value":{"type":"string"},"country_code":{"type":"string","description":"ISO 3166-1 alpha-2, required for compliance routing"}}},"message_type":{"type":"string","description":"'marketing' needs recorded opt-in, except US email (CAN-SPAM opt-out rules).…","enum":["transactional","marketing","reminder","follow_up","notification"]},"content":{"type":"object","required":["body"],"properties":{"body":{"type":"string"},"subject":{"type":"string","description":"For email channel"},"template_id":{"type":"string"},"template_vars":{"type":"object"}}},"preferred_channel":{"type":"string","enum":["whatsapp","sms","email","voice","auto"],"default":"auto"},"on_behalf_of":{"type":"string","description":"Who this message is FOR (your end-user's name/label). On WhatsApp this opens a…"},"business_id":{"type":"string","description":"Stable id for the recipient business; used for global demand shaping."},"idempotency_key":{"type":"string","maxLength":128,"description":"Retry key: a 24h replay returns the original receipt, not re-run or charged."}},"required":["recipient","message_type","content"]}},{"name":"send_transactional_confirmation","description":"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.]","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"recipient":{"type":"object","required":["phone_or_email"],"properties":{"phone_or_email":{"type":"string"},"name":{"type":"string"}}},"confirmation_type":{"type":"string","enum":["otp","booking_confirmation","payment_receipt","cancellation_notice","reminder"]},"data":{"type":"object","description":"Type-specific payload; e.g., {otp_code} for otp, {appointment_time, smb_name}…"},"preferred_channel":{"type":"string","enum":["sms","email","auto"],"default":"sms"},"idempotency_key":{"type":"string","maxLength":128,"description":"Retry key: a 24h replay returns the original receipt, not re-run or charged."}},"required":["recipient","confirmation_type","data"]}},{"name":"verify_business","description":"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]","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"smb_id":{"type":"string"},"capability_to_verify":{"type":"string"}},"required":["smb_id"]}}],"scan":{"score":81,"grade":"B","scanned_at":"2026-10-16T11:52:49.045Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-16T11:52:49.003Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 807ms"]},"poisoning":{"score":15,"max":15,"notes":["10 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 2 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 7 days ago"]},"identity":{"score":8,"max":10,"notes":["endpoint served from the registry-verified namespace domain"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://hatchloop.dev/mcp/sms-whatsapp-messaging","reachable":true,"authRequired":false,"latencyMs":807,"serverInfo":{"name":"sms-whatsapp-messaging","version":"0.2.16"}}],"packages":[],"repo":{"found":true,"owner":"basilalshukaili","repo":"agentbroker","archived":false,"pushedAt":"2026-10-09T15:59:29Z","stars":0,"forks":1,"openIssues":12,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/189737461?v=4","ownerCreatedAt":"2024-11-26T11:57:49Z","license":"MIT"},"icon":{"url":"https://hatchloop.dev/icon.png?icon.03a62_e3b0jbn.png","source":"registry","width":512,"height":512},"presence":{"stars":0,"forks":1,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-10-09T15:59:29.000Z","score":23}}}},"grade_history":[],"reviews":[]}