Give your AI assistant a phone — OpenClaw plugin for real phone calls via Twilio + OpenAI Realtime, with in-call tools, transcripts, and call screening
# Add to your Claude Code skills
git clone https://github.com/TristanBrotherton/openclaw-voice-call-realtimeGuides for using ai agents skills like openclaw-voice-call-realtime.
openclaw-voice-call-realtime is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by TristanBrotherton. Give your AI assistant a phone — OpenClaw plugin for real phone calls via Twilio + OpenAI Realtime, with in-call tools, transcripts, and call screening. It has 51 GitHub stars.
openclaw-voice-call-realtime's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/TristanBrotherton/openclaw-voice-call-realtime" and add it to your Claude Code skills directory (see the Installation section above).
openclaw-voice-call-realtime is primarily written in TypeScript. It is open-source under TristanBrotherton on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh openclaw-voice-call-realtime against similar tools.
No comments yet. Be the first to share your thoughts!
Unlocks once the catalog security scan passes (runs nightly).
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Give your AI assistant a phone.
This OpenClaw plugin lets your assistant place and receive real phone calls and hold natural, full-duplex voice conversations — powered by Twilio Programmable Voice and the OpenAI Realtime API. It books your table, checks the store's hours, navigates the phone menu, gets a human on the line, wraps up politely, hangs up on its own, and reports back with a structured outcome, an AI-written summary, and the full transcript.
You: "Call Luigi's and book a table for two on Friday at 7."
Assistant: *dials, talks past the IVR, negotiates with the host, confirms details*
Assistant: "Booked — table for 2, Friday 7pm, under your name.
They said parties over 15 minutes late lose the table."
Every "AI agent" can send an email. Almost none of them can call the dry cleaner. The real world still runs on phone calls — restaurants, doctors' offices, contractors, that one store whose website hasn't been updated since 2019. This plugin closes that gap: your assistant gets a phone number, a voice, ears, a keypad, and the judgment to end the call when the job is done.
press_phone_keys — synthesized DTMF touch-tones for navigating IVR menus ("press 2 for reservations")report_call_outcome — structured result capture (status + every fact gathered: times, prices, confirmation numbers)end_call — graceful hangup: speaks a closing line, waits for it to actually play out on the line (Twilio mark echo), then disconnects. No clipped goodbyes, no lingering dead air.ask_assistant (optional) — the killer feature for scheduling: mid-call, the voice AI relays a question to your OpenClaw agent ("is Wednesday 2pm free?") and speaks the answer. Your agent answers with its full toolset — calendar, search, smart home, anything — so the phone persona stays thin and your agent stays the brain.check_calendar (optional) — zero-dependency alternative: free/busy straight from a secret iCal feed URL (Google Calendar, iCloud, Outlook, Fastmail). Only busy windows are exposed — never event titles or details.check_home / control_home (optional) — direct Home Assistant backend: read device status ("are the doors locked?") and, when enabled, control devices ("turn off the porch light") in ~1 second, bypassing the agent. Offered only on verified owner/trusted calls.ask_owner (optional) — mid-call text escalation: the AI messages you ("7pm is taken — is 8pm OK?"), you reply by text, and your answer flows back into the live call while the other party holds. Far lighter than a transfer.transfer_to_owner (optional) — when the other party genuinely needs a human (payment details, authorization), the AI announces the handoff and transfers the call to your real phone.get_transcript tool action.semantic_vad understands when a speaker has finished a thought rather than just paused, for fewer interruptions and more natural conversations.talking_points and call_party (first-party vs third-party) and the AI stays on task: cover the points, collect the answers, confirm out loud, wrap up. Phone network Your machine OpenAI
┌─────────────┐ webhooks ┌──────────────────────┐
│ Twilio │ ───────────► │ Plugin webhook │
│ Programmable│ │ server (HTTP) │
│ Voice │ ◄─────────── │ · TwiML <Connect> │
│ │ TwiML │ <Stream> │
│ │ │ │
│ Media │ WebSocket │ Media stream │ WebSocket ┌──────────┐
│ Streams │ ◄══════════► │ handler (μ-law 8kHz) │ ◄═════════► │ Realtime │
└─────────────┘ audio └──────────────────────┘ audio │ API │
└──────────┘
The plugin runs an HTTP server inside the OpenClaw gateway. Twilio fetches TwiML from it and opens a bidirectional audio WebSocket; the plugin bridges that audio to an OpenAI Realtime session which does STT, reasoning, tool calls, and TTS in one loop.
gpt-realtime-2.1 recommended)mkdir -p ~/.openclaw/plugins-src
git clone https://github.com/TristanBrotherton/openclaw-voice-call-realtime.git \
~/.openclaw/plugins-src/voice-call-realtime
cd ~/.openclaw/plugins-src/voice-call-realtime
npm install --omit=dev
+15551234567).AC…Twilio must reach the plugin's webhook server (default port 3336) over HTTPS. Cloudflare Tunnel (free, stable hostname) is recommended:
brew install cloudflared # or apt/pacman equivalent
cloudflared tunnel login # authorize against your Cloudflare-managed domain
cloudflared tunnel create voice
cloudflared tunnel route dns voice voice.yourdomain.com
Create ~/.cloudflared/config.yml:
tunnel: voice
credentials-file: /Users/you/.cloudflared/<tunnel-id>.json
ingress:
- hostname: voice.yourdomain.com
service: http://localhost:3336
- service: http_status:404
Run it: cloudflared tunnel run voice
Make it survive reboots. A dead tunnel silently breaks all calls. On macOS, install a LaunchAgent (~/Library/LaunchAgents/com.you.cloudflared-voice.plist):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>com.you.cloudflared-voice</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/cloudflared</string>
<string>tunnel</string><string>--config</string>
<string>/Users/you/.cloudflared/config.yml</string>
<string>run</string><string>voice</string>
</array>
<key>Ru