Minimal plugin that lets Claude Code call you on the phone.
Start a task, walk away. Your phone/watch rings when Claude is done, stuck, or needs a decision.
- Minimal plugin - Does one thing: call you on the phone. No crazy setups.
- Multi-turn conversations - Talk through decisions naturally.
- Works anywhere - Smartphone, smartwatch, or even landline!
- Tool-use composable - Claude can e.g. do a web search while on a call with you.
You'll need:
- Phone provider: Telnyx or Twilio
- OpenAI API key: For speech-to-text and text-to-speech
- ngrok account: Free at ngrok.com (for webhook tunneling)
Choose one of the following:
Option A: Telnyx (Recommended - 50% cheaper)
- Create account at portal.telnyx.com and verify your identity
- Buy a phone number (~$1/month)
- Create a Voice API application:
- Set webhook URL to
https://your-ngrok-url/twimland API version to v2- You can see your ngrok URL on the ngrok dashboard
- Note your Application ID and API Key
- Set webhook URL to
- Verify the phone number you want to receive calls at
- (Optional but recommended) Get your Public Key from Account Settings > Keys & Credentials for webhook signature verification
Environment variables for Telnyx:
CALLME_PHONE_PROVIDER=telnyx
CALLME_PHONE_ACCOUNT_SID=<Application ID>
CALLME_PHONE_AUTH_TOKEN=<API Key>
CALLME_TELNYX_PUBLIC_KEY=<Public Key> # Optional: enables webhook securityOption B: Twilio (Not recommended - need to buy $20 of credits just to start and more expensive overall)
- Create account at twilio.com/console
- Use the free number your account comes with or buy a new phone number (~$1.15/month)
- Find your Account SID and Auth Token on the Console Dashboard
Environment variables for Twilio:
CALLME_PHONE_PROVIDER=twilio
CALLME_PHONE_ACCOUNT_SID=<Account SID>
CALLME_PHONE_AUTH_TOKEN=<Auth Token>Add these to ~/.claude/settings.json (recommended) or export them in your shell:
{
"env": {
"CALLME_PHONE_PROVIDER": "telnyx",
"CALLME_PHONE_ACCOUNT_SID": "your-connection-id-or-account-sid",
"CALLME_PHONE_AUTH_TOKEN": "your-api-key-or-auth-token",
"CALLME_PHONE_NUMBER": "+15551234567",
"CALLME_USER_PHONE_NUMBER": "+15559876543",
"CALLME_OPENAI_API_KEY": "sk-...",
"CALLME_NGROK_AUTHTOKEN": "your-ngrok-token"
}
}| Variable | Description |
|---|---|
CALLME_PHONE_PROVIDER |
telnyx (default) or twilio |
CALLME_PHONE_ACCOUNT_SID |
Telnyx Connection ID or Twilio Account SID |
CALLME_PHONE_AUTH_TOKEN |
Telnyx API Key or Twilio Auth Token |
CALLME_PHONE_NUMBER |
Phone number Claude calls from (E.164 format) |
CALLME_USER_PHONE_NUMBER |
Your phone number to receive calls |
CALLME_OPENAI_API_KEY |
OpenAI API key (for TTS and realtime STT) |
CALLME_NGROK_AUTHTOKEN |
ngrok auth token for webhook tunneling |
| Variable | Default | Description |
|---|---|---|
CALLME_TTS_VOICE |
onyx |
OpenAI voice: alloy, echo, fable, onyx, nova, shimmer |
CALLME_PORT |
3333 |
Local HTTP server port |
CALLME_NGROK_DOMAIN |
- | Custom ngrok domain (paid feature) |
CALLME_TRANSCRIPT_TIMEOUT_MS |
180000 |
Timeout for user speech (3 minutes) |
CALLME_STT_SILENCE_DURATION_MS |
800 |
Silence duration to detect end of speech |
CALLME_TELNYX_PUBLIC_KEY |
- | Telnyx public key for webhook signature verification (recommended) |
/plugin marketplace add ZeframLou/call-me
/plugin install callme@callmeRestart Claude Code. Done!
Claude Code CallMe MCP Server (local)
│ │
│ "I finished the feature..." │
▼ ▼
Plugin ────stdio──────────────────► MCP Server
│
├─► ngrok tunnel
│
▼
Phone Provider (Telnyx/Twilio)
│
▼
Your Phone rings
You speak
Text returns to Claude
The MCP server runs locally and automatically creates an ngrok tunnel for phone provider webhooks.
Start a phone call.
const { callId, response } = await initiate_call({
message: "Hey! I finished the auth system. What should I work on next?"
});Continue with follow-up questions.
const response = await continue_call({
call_id: callId,
message: "Got it. Should I add rate limiting too?"
});Speak to the user without waiting for a response. Useful for acknowledging requests before time-consuming operations.
await speak_to_user({
call_id: callId,
message: "Let me search for that information. Give me a moment..."
});
// Continue with your long-running task
const results = await performSearch();
// Then continue the conversation
const response = await continue_call({
call_id: callId,
message: `I found ${results.length} results...`
});End the call.
await end_call({
call_id: callId,
message: "Perfect, I'll get started. Talk soon!"
});| Service | Telnyx | Twilio |
|---|---|---|
| Outbound calls | ~$0.007/min | ~$0.014/min |
| Phone number | ~$1/month | ~$1.15/month |
Plus OpenAI costs (same for both providers):
- Speech-to-text: ~$0.006/min (Whisper)
- Text-to-speech: ~$0.02/min (TTS)
Total: ~$0.03-0.04/minute of conversation
- Check all required environment variables are set (ideally in
~/.claude/settings.json) - Restart Claude Code after installing the plugin
- Try explicitly: "Call me to discuss the next steps when you're done."
- Check the MCP server logs (stderr) with
claude --debug - Verify your phone provider credentials are correct
- Make sure ngrok can create a tunnel
- Ensure your phone number is verified with your provider
- Check that the webhook URL in your provider dashboard matches your ngrok URL
- Verify your
CALLME_NGROK_AUTHTOKENis correct - Check if you've hit ngrok's free tier limits
- Try a different port with
CALLME_PORT=3334
cd server
bun install
bun run devMIT
