Send WhatsApp, SMS, email or voice to a business with the compliance gate enforced.
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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]
The actual message body you intend to send. The gate classifies the real text,…
Phone in E.164 (e.g. '+14045550100') or email address the message would go to.
Delivery channel. Omit to auto-infer sms/email from recipient_id; set 'voice'…
US state code (e.g. 'CA') for state-specific rules.
ISO 3166-1 alpha-2 (e.g. 'US', 'DE', 'CA'). Auto-inferred from phone if…
One of transactional, marketing, reminder, follow_up, notification (any case).…
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]
| Argument | Type | Description |
|---|---|---|
| channel | string | Delivery channel. Omit to auto-infer sms/email from recipient_id; set 'voice'… |
| content* | string | The actual message body you intend to send. The gate classifies the real text,… |
| state_code | string | US state code (e.g. 'CA') for state-specific rules. |
| country_code | string | ISO 3166-1 alpha-2 (e.g. 'US', 'DE', 'CA'). Auto-inferred from phone if… |
| message_type | string | One of transactional, marketing, reminder, follow_up, notification (any case).… |
| recipient_id* | string | Phone in E.164 (e.g. '+14045550100') or email address the message would go to. |
{
"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": "One of transactional, marketing, reminder, follow_up, notification (any case).…"
},
"recipient_id": {
"type": "string",
"description": "Phone in E.164 (e.g. '+14045550100') or email address the message would go to."
}
}
}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]
| Argument | Type | Description |
|---|---|---|
| city | string | Instead of location: a city, e.g. 'Muscat, Oman'. |
| region | string | With city: a state or region. |
| location* | object | City/town or ZIP, optionally with country ('Nizwa, Oman'). Geocoded by OSM. |
| vertical | string | |
| capability | string | Kind of business: 'dentist', 'cafe', 'plumber'. Use it or vertical. |
| price_band | object | Supply-network rows only (OpenStreetMap has no prices). |
| max_results | integer | |
| availability_window |
Read a two-way conversation thread you started: its state, every message exchanged, and how many replies the business has sent. [free, requires key]
| Argument | Type | Description |
|---|---|---|
| reference | string | The 4-digit request reference, e.g. '4821'. Requires business_number. |
| business_number | string | Scopes a `reference` to one business (references are reused across businesses). |
| conversation_id | string | From the send_message receipt (preferred). |
{
"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)."
}
}
}Retrieve the final OutcomeReceipt for a completed operation. [free, no key]
| Argument | Type | Description |
|---|---|---|
| operation_id* | string |
{
"type": "object",
"required": [
"operation_id"
],
"properties": {
"operation_id": {
"type": "string"
}
}
}Query the current state of any in-flight async operation by operation_id. [free, no key]
| Argument | Type | Description |
|---|---|---|
| operation_id* | string |
{
"type": "object",
"required": [
"operation_id"
],
"properties": {
"operation_id": {
"type": "string"
}
}
}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]
| Argument | Type | Description |
|---|---|---|
| params* | object | The same request body you would pass to the operation |
| operation* | string |
{
"type": "object",
"required": [
"operation",
"params"
],
"properties": {
"params": {
"type": "object",
"description": "The same request body you would pass to the operation"
},
"operation": {
"type": "string"
}
}
}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]
No arguments.
{
"type": "object",
"properties": {}
}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.]
| Argument | Type | Description |
|---|---|---|
| content* | object | |
| recipient* | object | |
| business_id | string | Stable id for the recipient business; used for global demand shaping. |
| message_type* | string | 'marketing' needs recorded opt-in, except US email (CAN-SPAM opt-out rules).… |
| on_behalf_of | string | Who this message is FOR (your end-user's name/label). On WhatsApp this opens a… |
| idempotency_key | string | Retry key: a 24h replay returns the original receipt, not re-run or charged. |
| preferred_channel |
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.]
| Argument | Type | Description |
|---|---|---|
| data* | object | Type-specific payload; e.g., {otp_code} for otp, {appointment_time, smb_name}… |
| recipient* | object | |
| idempotency_key | string | Retry key: a 24h replay returns the original receipt, not re-run or charged. |
| confirmation_type* | string | |
| preferred_channel | string |
{
"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"
}
}
}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]
| Argument | Type | Description |
|---|---|---|
| smb_id* | string | |
| capability_to_verify | string |
{
"type": "object",
"required": [
"smb_id"
],
"properties": {
"smb_id": {
"type": "string"
},
"capability_to_verify": {
"type": "string"
}
}
}| object |
| Accepted but NOT APPLIED: it does not narrow results (no live calendars). The… |
{
"type": "object",
"required": [
"location"
],
"properties": {
"city": {
"type": "string",
"description": "Instead of location: a city, e.g. 'Muscat, Oman'."
},
"region": {
"type": "string",
"description": "With city: a state or region."
},
"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."
},
"vertical": {
"enum": [
"personal_services",
"home_services",
"professional_services"
],
"type": "string"
},
"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)."
},
"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 (no live calendars). The…"
}
}
}| string |
{
"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": "'marketing' needs recorded opt-in, except US email (CAN-SPAM opt-out rules).…"
},
"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"
}
}
}