Claude Code plugin · v0.2.4 · MIT

Give Claude Code a phone number.

A two-way voice bridge for Claude Code. Make outbound calls, get rung when work is done, talk to your agent from anywhere.

$ /plugin marketplace add github.com/PatterAI/awesome-claude-call

Powered by Patter · Twilio · OpenAI Realtime

What it does

Three flows. One plugin install. Real phone calls.

01 · killer feature

Claude → third party

Outbound. Claude dials, negotiates against an objective, and reports back with a structured outcome.

/claude-call:call-me +1555… book a table
02 · autonomous

Claude → you

Stop hook arms when you run /notify-me. When the long task finishes, Claude rings you with a summary you can talk back to.

/claude-call:notify-me +1555…
03 · inbound

You → Claude

Dial your Twilio number from anywhere. Drops you straight into a voice conversation with the active session.

/claude-call:serve-me

Installation

Four steps. Then place a call.

claude code session
# 1. Add the marketplace
> /plugin marketplace add https://github.com/PatterAI/awesome-claude-call

# 2. Install the plugin (registers MCP server, hooks, slash commands)
> /plugin install claude-call@claude-call

# 3. Configure credentials (Twilio + OpenAI)
> /claude-call:setup

# 4. Restart, then place a call
> /exit
> /claude-call:call-me +15555550200 book a table for 2 at 8pm

Dialing… ringing… agent connected.
Confirmed. Sat 20:00, table for 2, under "Smith".
Transcript: 4 turns · Cost: $0.04 · Duration: 28s

Slash commands

The whole API surface.

CommandBehavior
/claude-call:call-me <num> <objective>Outbound call to a third party with autonomous goal pursuit. Returns transcript and structured outcome.
/claude-call:notify-me <num>Arms a Stop hook. Claude calls you when the current task finishes.
/claude-call:notify-me-cancelDisarms /claude-call:notify-me.
/claude-call:dial-me-on-blocked <num>Arms a Notification hook. Claude calls you whenever it stalls on permission or idle prompts.
/claude-call:dial-me-on-blocked-cancelDisarms /claude-call:dial-me-on-blocked.
/claude-call:callsLists recent calls with status, duration, and cost.
/claude-call:serve-meArms the inbound voice agent — callers reach Claude.
/claude-call:serve-me-cancelDisarms inbound.

How it works

Plugin layer plus a bundled MCP server, both small.

Claude Code session /claude-call:* slash commands phone-agent subagent Stop / Notification hooks \ | / \ | / v v v stdio MCP transport | v bundled server (server/, ~800 LOC TS) make_call · call_third_party · get_calls · get_transcript | v Patter SDK + Cloudflare tunnel (lazy, first call) | v Twilio → PSTN

The plugin layer is roughly 700 lines of shell and markdown. The bundled server in server/ is roughly 800 lines of TypeScript that wraps the getpatter SDK directly. Port discovery probes the range [8002, 8099] and picks one that is bindable on 127.0.0.1 and silent on ::1, so a stray Docker container on [::]:8000 can't hijack tunnel audio.

Privacy and security

Boring guarantees that matter.

01

AI disclosure on every outbound call

Hard-coded into outbound system prompts on the first turn. Non-overridable in v0.2.

02

Phone numbers redacted in logs

Every log line that touches a number runs through cc_redact_phone — last 4 digits only.

03

Credentials file mode 0600

Server refuses to start if ~/.claude-call/credentials is world- or group-readable.

04

No surprise outbound HTTP

The plugin only talks to Twilio, OpenAI, and Cloudflare's tunnel control plane. Nothing else leaves the box.

Ship it

Your next call is one slash away.