SMS and WhatsApp Messaging
Send WhatsApp, SMS, email or voice to a business with the compliance gate enforced.
사용해야 할까요
품질 및 안전성
발견 사항 (1)
- LOWsend_transactional_confirmation에서
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"sms-whatsapp-messaging": {
"url": "https://hatchloop.dev/mcp/sms-whatsapp-messaging"
}
}
}원격 엔드포인트
https://hatchloop.dev/mcp/sms-whatsapp-messagingstreamable-http할 수 있는 일
도구 목록
도구 (10)
🟢find_business(vertical, location, capability, price_band, availability_window, ...)
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. [free, no key]
입력 스키마
{
"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"
},
"radius_miles": {
"type": "number",
"minimum": 0,
"description": "Accepted but NOT applied - no coordinates exist, so results are not restricted to this radius. Disclosed back as radius_miles_applied: false."
}
},
"description": "Where to search. Matched against the business's city, state and ZIP as text -…"
},
"capability": {
"type": "string",
"description": "Specific service capability required, e.g. 'haircut', 'plumbing',…"
},
"price_band": {
"type": "object",
"properties": {
"max_usd": {
"type": "number"
}
}
},
"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. We do not hold live…"
},
"max_results": {
"type": "integer",
"default": 5,
"maximum": 20,
"minimum": 1
}
},
"required": [
"vertical",
"location"
]
}🟢verify_business(smb_id, capability_to_verify)
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]
입력 스키마
{
"type": "object",
"properties": {
"smb_id": {
"type": "string"
},
"capability_to_verify": {
"type": "string"
}
},
"required": [
"smb_id"
]
}🔴send_message(recipient, message_type, content, preferred_channel, on_behalf_of, ...)
Send a message on behalf of an agent's user or an SMB via WhatsApp or email — both live. SMS and voice are advertised but NOT wired on this deployment: they always fail honestly (channel_not_configured), uncharged. Sent immediately, no scheduling. Every send passes a non-bypassable gate (TCPA, GDPR, CASL, PDPL, 26 jurisdictions): marketing without recorded consent gets a structured compliance_violation receipt. [from $0.02/call, variable] [async→get_outcome]
입력 스키마
{
"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": "Intent tag for the message. Five permitted types. 'marketing' is allowed only…",
"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"
]
}🔴send_transactional_confirmation(recipient, confirmation_type, data, preferred_channel, idempotency_key)
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]
입력 스키마
{
"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"
]
}🟢get_status(operation_id)
Query the current state of any in-flight async operation by operation_id. [free, no key]
입력 스키마
{
"type": "object",
"properties": {
"operation_id": {
"type": "string"
}
},
"required": [
"operation_id"
]
}🟢get_outcome(operation_id)
Retrieve the final OutcomeReceipt for a completed operation. [free, no key]
입력 스키마
{
"type": "object",
"properties": {
"operation_id": {
"type": "string"
}
},
"required": [
"operation_id"
]
}🟢preview_cost(operation, params)
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",
"properties": {
"operation": {
"type": "string"
},
"params": {
"type": "object",
"description": "The same request body you would pass to the operation"
}
},
"required": [
"operation",
"params"
]
}🟢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": {}
}🟢check_compliance(recipient_id, content, channel, message_type, country_code, ...)
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",
"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": "Intent tag: transactional, marketing, reminder, follow_up, notification.…",
"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"
]
}🟢get_conversation(conversation_id, reference, business_number)
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": {
"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)."
}
}
}커뮤니티
증거