SMS and WhatsApp Messaging

Send WhatsApp, SMS, email or voice to a business with the compliance gate enforced.

사용해야 할까요

품질 및 안전성

A
설명 품질
100%
스키마 완전성
82%
이름 품질
96%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

발견 사항 (1)

  • LOWTool 'send_transactional_confirmation' name length outside 3-30 rangesend_transactional_confirmation에서

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~2,127토큰 (도구 정의)
~1.4 KB일반적인 응답 크기
중간 정도의 주의 영향 (128k 컨텍스트의 1.66%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`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)."
    }
  }
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 10개
검증됨버전이 기록되지 않음도구 10개