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 range在 send_transactional_confirmation 中

根據工具定義與協定合規性的自動化分析。

上下文成本

~2,127Token(工具定義)
~1.4 KB典型回應大小
中等的注意力影響(128k 上下文的 1.66%)

這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。

安裝

一鍵安裝

將以下內容加入你的 `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 個工具