MCP Tools Reference
All tools are called via the MCP protocol over SSE transport. Each tool requires authentication unless running in demo mode.
Tokens
Two token types pass over the wire — both are bearer tokens, only the
scope differs:
teamToken(org-admin) — the workspace-wide credential returned by
and admin tools. The same value used to be called team_token,
owner_token, or ownerToken — those names are deprecated; use
teamToken.
agentToken(per-agent runtime) — the bearer minted when a host
agent. Used for runtime tools (send-message, make-call, etc.). The
agentId parameter is auto-detected from this token.
Each tool's description starts with a [scope: ...] prefix indicating
which token tier may call it. The four scopes form a strict hierarchy
— a higher scope subsumes every lower scope:
[scope: any]— no auth required (e.g.comms_ping). Anyone.[scope: agent]— agent-runtime token, org-admin token, or super-admin
channel-status, etc.
[scope: org-admin]— org-admin token or super-admin token. Workspace
[scope: super-admin]— super-admin token only. Cross-org / system-level
A super-admin token can call every tool. An org-admin token can call
agent and org-admin tools but not super-admin ones. An agent
token can call only agent tools (and any).
Tool name convention
Every Butt-Dial tool starts with the comms_ prefix (e.g. comms_send_message,
comms_get_channel_status). The prefix is a stable namespace, not a wart
— it de-conflicts our tools from other MCP servers an agent may have
mounted alongside ours. The prefix is intentional and will not be removed.
Naming convention
All input and output fields are camelCase (agentId, displayName,
callbackUrl, retryAfter). Some legacy snake_case keys are still
accepted on input and emitted on output for backward compatibility, but
they are marked deprecated and will be removed in a future release.
Gendered Languages
Languages like Hebrew, Arabic, French, Spanish, Portuguese, Italian, German, Russian, Polish, and Hindi conjugate verbs and adjectives by gender. For these languages:
- Client gender (
agentGender) — set during provisioning (male/female/neutral). Determines how the AI refers to itself. - Target gender (
targetGender) — set per-interaction on outbound tools (male/female/unknown). Determines how the AI addresses the recipient.
For voice calls, gender conjugation instructions are automatically appended to the system prompt. For text messages, gender context is returned as metadata in the response so your AI can conjugate correctly.
Non-gendered languages (English, Chinese, Japanese, etc.) are unaffected — the gender parameters are accepted but produce no instructions.
comms_ping
Health check and connectivity test.
| Parameter | Type | Required | Description |
|---|---|---|---|
message | string | No | Echo message |
{
"status": "ok",
"server": "agentos-comms",
"version": "0.1.0",
"echo": "hello"
}
comms_send_message
Send SMS, email, or WhatsApp message.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | No | Auto-detected from agent token |
to | string | Yes | Recipient: E.164 phone, WhatsApp group ID (120363...@g.us), or email |
body | string | No | Message text (required unless media is provided) |
channel | enum | No | sms, email, whatsapp, or line (default: sms) |
subject | string | No | Email subject (required for email) |
html | string | No | HTML body for email |
media | string[] | No | Media URLs to attach. WhatsApp: one message per file (body sent as caption). Email: fetched and attached. SMS: first URL sent as MMS. |
templateId | string | No | WhatsApp template SID |
templateVars | object | No | Template variables |
targetGender | enum | No | male, female, or unknown — gender of the message recipient. Used for gendered languages (Hebrew, Arabic, French, etc.). Returns gender context metadata in the response so your AI can conjugate correctly. |
{
"type": "status",
"status": "accepted",
"messageId": "uuid",
"channel": "sms",
"to": "+15559876543"
}
After sending, delivery status updates (sent, delivered, failed) are POSTed to your callbackUrl.
Compliance checks: Content filter, DNC list, TCPA time-of-day, CAN-SPAM (email).
comms_make_call
Initiate an outbound AI voice call.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | No | Auto-detected from agent token |
to | string | Yes | Phone number in E.164 format |
systemPrompt | string | No | AI instructions for this call |
greeting | string | No | First thing the AI says |
voice | string | No | TTS voice ID |
language | string | No | Language code (e.g. en-US) |
targetGender | enum | No | male, female, or unknown — gender of the call recipient. For gendered languages, gender conjugation instructions are automatically appended to the system prompt. |
recipientTimezone | string | No | IANA timezone (e.g. America/New_York). Auto-detected from phone prefix if omitted |
{
"success": true,
"callSid": "CAxxxxxx",
"sessionId": "uuid",
"status": "queued",
"from": "+15551234567",
"to": "+15559876543"
}
comms_send_voice_message
Generate TTS audio and deliver via phone call.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | No | Auto-detected from agent token |
to | string | Yes | Phone number in E.164 |
text | string | Yes | Text to speak |
voice | string | No | TTS voice ID |
targetGender | enum | No | male, female, or unknown — gender of the call recipient |
comms_get_waiting_messages
Fetch messages that couldn't be delivered while your client was offline (dead letters). Fetching automatically acknowledges them — no separate step needed.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | Yes | Agent ID |
{
"success": true,
"messages": [
{
"id": 1,
"channel": "sms",
"direction": "inbound",
"from": "+15559876543",
"to": "+15551234567",
"body": "Are you there?",
"reason": "callback_failed",
"createdAt": "2026-02-22T10:00:00Z"
}
],
"count": 1
}
Dead letters are stored when: client is offline (inbound), send fails (outbound), or provider errors. Acknowledged messages are auto-purged after 7 days.
comms_transfer_call
Transfer a live voice call to a human or another client.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | No | Auto-detected from agent token |
callSid | string | Yes | Active call SID |
to | string | Yes | Destination phone or client ID |
announcementText | string | No | Text to say before transfer |
comms_get_group_members
List participants of a WhatsApp group. Returns phone numbers so you can DM any member directly.
| Parameter | Type | Required | Description |
|---|---|---|---|
groupId | string | Yes | WhatsApp group ID (e.g. 120363XXXXX@g.us) |
agentId | string | No | Auto-detected from agent token |
{
"success": true,
"groupId": "120363XXXXX@g.us",
"participantCount": 5,
"participants": [
{ "phone": "+15551234567", "isAdmin": true, "displayName": "John" },
{ "phone": "+15559876543", "isAdmin": false, "displayName": "Jane" }
]
}
comms_call_on_behalf
Secretary call — calls someone on your behalf. An AI asks if they're available, and if yes, bridges you into the call.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | No | Auto-detected from agent token |
target | string | Yes | Phone number to call (E.164) |
requesterPhone | string | Yes | Your phone number — where to bridge if they say yes |
targetName | string | No | Name of the person being called |
requesterName | string | No | Your name |
message | string | No | Reason for the call |
targetGender | enum | No | male, female, or unknown — gender of the person being called |
recipientTimezone | string | No | IANA timezone. Auto-detected from phone prefix if omitted |
comms_bridge_call
Manage call bridges — route inbound local calls to outbound local numbers via VoIP.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | enum | Yes | setup, remove, list, or call |
fromNumber | string | No | (setup) Caller ID to match, or * for any |
localNumber | string | No | (setup) Twilio number that receives the call |
destinationNumber | string | No | (setup/call) Number to dial outbound |
label | string | No | (setup) Human-readable label |
bridgeId | string | No | (remove/call) Bridge route ID |
callerNumber | string | No | (call) Number to call first |
comms_send_otp
Send a one-time verification code via SMS, email, or WhatsApp. Code expires in 5 minutes.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | No | Auto-detected from agent token |
to | string | Yes | Recipient (phone E.164 or email) |
channel | enum | Yes | sms, email, or whatsapp |
purpose | string | No | Description like "account verification" |
comms_verify_otp
Verify a one-time code. Returns whether the code is valid.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | No | Auto-detected from agent token |
contactAddress | string | Yes | Phone or email that received the code |
code | string | Yes | The 6-digit code to verify |
comms_record_consent
Record that a contact has given consent to be contacted on a channel.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | No | Auto-detected from agent token |
contactAddress | string | Yes | Phone number or email |
channel | enum | Yes | sms, voice, email, or whatsapp |
consentType | enum | No | express, implied, or transactional (default: express) |
source | string | No | How consent was obtained (web_form, verbal, etc.) |
comms_revoke_consent
Revoke a contact's consent on a channel. No further outbound allowed.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | No | Auto-detected from agent token |
contactAddress | string | Yes | Phone number or email |
channel | enum | Yes | sms, voice, email, or whatsapp |
comms_check_consent
Check whether a contact has granted consent on a channel.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | No | Auto-detected from agent token |
contactAddress | string | Yes | Phone number or email |
channel | enum | Yes | sms, voice, email, or whatsapp |
comms_expand_client_pool
Resize the client pool. Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
maxAgents | number | Yes | New maximum client count (1–10000) |
comms_provision_channels
Provision phone/SMS/WhatsApp/email/voice for a new client.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | Yes | Agent ID to provision |
agentName | string | Yes | Display name |
callbackUrl | string | Yes | Webhook URL for inbound messages and delivery status |
capabilities | array | Yes | Channels: sms, voice, whatsapp, email, line |
country | string | No | Country code for phone number |
emailDomain | string | No | Custom email domain |
agentGender | enum | No | male, female, or neutral (default: male). Used for gendered languages — the client's grammatical gender when speaking/writing in Hebrew, Arabic, French, Spanish, etc. |
comms_deprovision_channels
Tear down all channels for a client. Releases phone number and WhatsApp pool slot.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | Yes | Agent ID to deprovision |
comms_get_channel_status
Check provisioning and health status of all channels for a client.
comms_onboard_customer
*Enterprise/SaaS edition only.*
Full automated onboarding: provisions all channels, generates DNS records, returns setup package.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | Yes | Agent ID |
agentName | string | Yes | Display name |
capabilities | array | Yes | Channels to provision |
emailDomain | string | No | Custom email domain |
greeting | string | No | Voice greeting |
systemPrompt | string | No | Voice system prompt |
comms_register_provider
Register or update third-party provider credentials. Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | enum | Yes | twilio, vonage, resend, elevenlabs, openai, deepgram, s3, r2, turso, convex |
credentials | object | Yes | Provider-specific credential fields |
verify | boolean | No | Test before saving (default: true) |
comms_set_client_limits
Configure rate limits and spending caps. Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | Yes | Agent ID to configure |
limits.maxActionsPerMinute | number | No | Per-minute burst limit |
limits.maxActionsPerHour | number | No | Hourly limit |
limits.maxActionsPerDay | number | No | Daily limit |
limits.maxSpendPerDay | number | No | Daily spending cap |
limits.maxSpendPerMonth | number | No | Monthly spending cap |
comms_get_usage_dashboard
Usage statistics, costs, and rate limits per client.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentId | string | No | Specific client (omit for all, admin only) |
period | enum | No | today, week, month, or all |
comms_get_billing_summary
*Enterprise/SaaS edition only.*
Billing summary with provider costs, markup, and billed costs.
comms_set_billing_config
*Enterprise/SaaS edition only.*
Set billing tier, markup, and billing email. Admin only.
| Tier | Actions/min | Actions/day | Spend/month |
|---|---|---|---|
| Free | 5 | 100 | $10 |
| Starter | 10 | 500 | $100 |
| Pro | 30 | 5,000 | $1,000 |
| Enterprise | 100 | 50,000 | $50,000 |
comms_whatsapp_action
WhatsApp-specific actions (13): send_location, send_contact, typing, mark_read, react, edit, delete, forward, send_poll, send_buttons, post_status, set_chat_ttl, send_view_once.
comms_create_session / comms_get_session / comms_list_sessions / comms_close_session
Session management — isolated communication tunnels. Auto-created on inbound messages.
comms_find_agent / comms_message_agent
Agent-to-Agent directory and messaging within your team.
The system agent
Every org has one indelible Butt-Dial System agent (is_system=1).
- Purpose: outbound system messages (verification emails, billing
delete or reassign it.
- Where you'll see it:
comms_find_agentreturns it alongside the
excludes it (we count user-registered agents only).
- Channels: seeded with an
email_addressfor outbound delivery.
- Authorship: ID format is the same UUID as any agent; recipients
You cannot register a new agent named "Butt-Dial System" — the name is
reserved per-org. You also cannot deregister the system agent —
attempts return code: SYSTEM_AGENT_PROTECTED.
comms_rotate_token
Rotate your security token. 30-second grace period to reconnect.
comms_update_profile
Update name, greeting, system prompt, voice, language, or gender.
comms_manage_inbound_filter
Add/list/delete keyword or contact-based filters for inbound messages.
Voice Services
Butt-Dial provides 5 voice modes — all work across any voice-capable provider (phone, WhatsApp, LINE, Viber, Telegram):
| Mode | What happens | Direction |
|---|---|---|
| Voice Message | One-way audio. Agent text → TTS → audio delivered. Inbound audio → STT → text | In + Out |
| Secretary | Built-in LLM answers/makes calls when agent is offline. Context queued for agent | In + Out |
| Agent (Live) | Agent controls call in real-time. Human ↔ STT/TTS ↔ Agent | In + Out |
| Bridge | Connect two+ parties: human+human, human+agent, conference | Out (phone only) |
| Impersonator | LLM uses agent's prompt & personality. Forwards text to agent live | In + Out |
Voice Notes: Add voiceNote: true to comms_send_message. Smart voice selection: pass a voice ID or description like "warm female narrator". 16 languages auto-detected.
Cross-Channel OTP
Verify identity across channels: comms_send_otp, comms_verify_otp, comms_check_trust. Unknown caller on voice → OTP via SMS → verified.