Place phone calls, send SMS, search contacts, and run agent dispatches via Voxrn. Bridges any OpenClaw-bridged chat (Slack, Telegram, iMessage, WhatsApp, Dis...
---
name: voxrn
description: Place phone calls, send SMS, search contacts, and run agent dispatches via Voxrn. Bridges any OpenClaw-bridged chat (Slack, Telegram, iMessage, WhatsApp, Discord, more) to a real PSTN.
metadata: {"clawdbot":{"emoji":"📞","requires":{"bins":["openclaw"]},"links":{"home":"https://voxrn.com","docs":"https://voxrn.com/docs/integrations/openclaw"}}}
---
# Voxrn 📞
Voxrn is a browser-native voice + SMS platform with an MCP-driven agent runtime. This skill registers Voxrn as an outbound MCP server in your OpenClaw workspace, so the agent can place calls, send messages, manage contacts, and watch live agent sessions from any bridged chat.
## When to use this skill
Reach for these tools when the user asks to:
- **place a phone call** — "call my plumber", "ring the front desk", "dial +1 415 555 0188"
- **send a text message** — "text Mina that I'm running 5 min late"
- **find a contact** — "what's the number for Atlas Freight?"
- **save someone to contacts** — "save +1 415 555 0188 as Front Desk"
- **see what's on the wire** — "are any agent calls running?"
- **end a runaway agent call** — "kill the call to Mina"
- **check the balance** — "what's my Voxrn balance"
## Tool catalog
| Tool | Args | Use it for |
|---|---|---|
| `call.place` | `{ to: E.164, taskBrief?: string, voiceProfileId?: string }` | Dial out — agent runs the call following the task brief |
| `call.list_active` | none | Show currently-live calls in the workspace |
| `call.end` | `{ callSid: string }` | Hard-kill an active call by SID |
| `transcript.stream` | `{ callSid: string }` | Subscribe to live captions for a call |
| `message.send` | `{ to: E.164, body: string }` | Send an SMS |
| `contact.search` | `{ q: string }` | Free-text search across name, number, tag |
| `contact.upsert` | `{ name, number, tags?, notes? }` | Create or update a contact |
| `balance.check` | none | Read the workspace balance in USD |
## Configuration
Set these env vars (or use OpenClaw's secrets manager):
```bash
export VOXRN_API_KEY="vxk_..." # mint at https://voxrn.com/enterprise/dashboard/agents
export VOXRN_BASE_URL="https://voxrn.com" # optional; defaults to prod
```
Or:
```bash
openclaw config secrets set voxrn_api_key vxk_...
```
The skill's `mcp.json` reads `${VOXRN_API_KEY}` at MCP-registration time so the secret never reaches the agent's prompt window.
## Conventions the agent should follow
- **Confirm the destination first.** If the user says "call Atlas", run `contact.search { q: "Atlas" }` and ask which match before placing the call.
- **Quote the cost before running `call.place`.** Default rate-card multiplier is 1.25× over carrier; international calls can be more. Either ask "ok if this costs ~$X for a 2-minute call?" or run `balance.check` first.
- **Pass the user's prose into `taskBrief`.** Don't reformat — the brief travels straight to the agent runtime.
- **Confirm before `call.end`** unless the user explicitly said "kill it now". Action is destructive and audit-logged.
- **Never echo the API key.** The skill registers the server with `${VOXRN_API_KEY}` so the agent never sees the secret.
## Examples
### Place a call
> *User:* call my plumber and ask if Thursday morning works for the kitchen sink
```text
agent: contact.search { q: "plumber" }
→ [{ id: "c-12", name: "Atlas Plumbing", number: "+14155551234", tags: ["plumber"] }]
agent: balance.check {}
→ { usd: 23.40 }
agent: "Calling Atlas Plumbing at +1 415 555 1234 to ask about Thursday morning availability. Estimated cost: ~$0.04. Going ahead."
agent: call.place {
to: "+14155551234",
taskBrief: "Call Atlas Plumbing on the user's behalf. Ask if Thursday morning is available to fix a kitchen sink leak. If yes, confirm a 9am window. If no, ask what's their next opening this week."
}
→ { callSid: "CAabc...", reservedUsd: 0.04 }
agent: "Call placed. SID CAabc... — I'll let you know when it ends."
```
### End a call
> *User:* kill the call to Mina, the agent's stuck
```text
agent: call.list_active {}
→ [{ callSid: "CAxyz...", to: "+14155557890", durationSeconds: 142, billedUsd: 0.05 }]
agent: "I see one active call to +1 415 555 7890 — duration 2:22, $0.05 spent. End it?"
user: yes
agent: call.end { callSid: "CAxyz..." } → { ok: true }
```
### Send an SMS follow-up
> *User:* text Mina that the meeting moved to 2pm tomorrow
```text
agent: contact.search { q: "Mina" }
→ [{ id: "c-1", name: "Mina Hart", number: "+14155557890" }]
agent: message.send { to: "+14155557890", body: "Hey Mina — meeting moved to 2pm tomorrow. — Sent via Voxrn" }
→ { messageSid: "SMabc...", segments: 1, billedUsd: 0.0079 }
agent: "Sent."
```
## Troubleshooting
- **`401 Unauthorized` from a Voxrn tool** — your API key is wrong, expired, or the workspace it belongs to has been removed. Mint a fresh key at https://voxrn.com/enterprise/dashboard/agents → API keys.
- **Calls succeed but the agent says nothing** — destination might have hit voicemail or returned `caller_audio_failed`. Check `call.list_active` for state. The Voxrn live monitor mirrors this view at `https://voxrn.com/enterprise/dashboard/agents`.
- **`balance.check` returns 0** — top up the workspace via Stripe or USDC at `https://voxrn.com/account → Billing`.
## See also
- [Voxrn docs — MCP overview](https://voxrn.com/docs/agents/mcp)
- [Voxrn docs — OpenClaw integration](https://voxrn.com/docs/integrations/openclaw)
- [Voxrn API reference](https://voxrn.com/docs/mcp)
- [OpenClaw — outbound MCP servers](https://docs.openclaw.ai/cli/mcp)
don't have the plugin yet? install it then click "run inline in claude" again.
added explicit inputs with env var and connection setup, broke out all 8 tools as numbered procedure steps with inputs and outputs, extracted implicit decision logic for contact ambiguity and balance checks, added edge cases like rate limits and auth expiry, defined output contracts for each tool endpoint, and clarified outcome signals for each operation.
Voxrn registers a browser-native voice and SMS platform as an outbound MCP server in your OpenClaw workspace. Use this skill when the user needs to place outbound phone calls, send text messages, manage contacts, check account balance, or inspect live agent call sessions from any bridged chat (Slack, Telegram, iMessage, WhatsApp, Discord, etc.). The skill bridges those chat platforms directly to the real PSTN, so the agent can execute the full call or message lifecycle on behalf of the user.
Required environment variables:
VOXRN_API_KEY (string): API key in format vxk_.... Mint at https://voxrn.com/enterprise/dashboard/agents. Store via env var or use openclaw config secrets set voxrn_api_key vxk_... to avoid exposing the secret in the agent prompt window.Optional environment variables:
VOXRN_BASE_URL (string): defaults to https://voxrn.com. Override only if using a self-hosted or staging instance.External connection:
Input context from user:
+1 415 555 0188), or contact names to search.VOXRN_API_KEY env var.${VOXRN_API_KEY} at MCP-registration time. Do not echo or log the key. Confirm registration by running any read-only tool (e.g., balance.check).contact.search { q: string }balance.check {}{ usd: number } representing workspace balance in USD.call.place { to: string (E.164), taskBrief?: string, voiceProfileId?: string }{ callSid: string, reservedUsd: number }taskBrief without reformatting. The brief travels to the agent runtime. Confirm the destination number and estimated cost with the user before execution. Monitor the call via call.list_active or direct the user to https://voxrn.com/enterprise/dashboard/agents for live view.message.send { to: string (E.164), body: string }{ messageSid: string, segments: number, billedUsd: number }call.list_active {}call.list_active output).call.end { callSid: string }{ ok: boolean }transcript.stream { callSid: string }contact.upsert { name, number, tags?, notes? }{ id: string, name, number, tags, notes, created_at, updated_at }If the user provides a contact name instead of a phone number:
contact.search { q: name }.If the user asks to place a call but the account balance is low (< $0.10):
balance.check first.If the user asks to end a call and does not explicitly say "now" or "immediately":
call.list_active.call.end after explicit user approval.If call.place succeeds but the agent responds with silence or voicemail:
caller_audio_failed or hit voicemail. Call call.list_active to inspect the call state.If a Voxrn tool returns 401 Unauthorized:
If balance.check returns 0:
If a call or SMS request is to a number outside the workspace's approved regions:
403 Forbidden or region-lock error.For call.place:
callSid (string, unique identifier) and reservedUsd (number, estimated cost).For message.send:
messageSid, segments (number of SMS segments), and billedUsd.For contact.search:
For contact.upsert:
For call.list_active:
For balance.check:
usd (number, decimal to 2 places).For call.end:
ok (boolean).ok is true. Call is terminated immediately and audit-logged.For transcript.stream:
call.list_active within 1-2 seconds and is marked "ended" in audit logs.contact.search for future calls and messages.Author: robit-man (clawhub)
Additional references: