better-call-claude
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@better-call-claudeCall me when the deployment finishes"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Better Call Claude
š "Hey Claude, refactor the auth module and call me when you're done or need a decision."
[20 minutes later, phone rings]
š¤ "I've finished the refactor but found a security issue. Should I fix it now or create a ticket?"
š¬ Or via SMS/WhatsApp:
You: "Claude, how's the deployment going?"
Claude: "Deployment complete. 3 services updated, all health checks passing."
Features
š± Inbound calls - Call Claude Code from your phone to start tasks
š² Outbound calls - Claude calls you when done, stuck, or needs decisions
š¬ SMS messaging - Send and receive text messages with Claude
š± WhatsApp - Full WhatsApp Business integration
š Cross-channel context - Start on voice, continue on WhatsApp seamlessly
š Persistent sessions - Claude stays alive listening for WhatsApp messages
š Secure transport - Tailscale Funnel with guided auto-setup
š£ļø Natural conversations - Multi-turn interactions across all channels
š§ Tool composable - Claude can use other tools while communicating
ā” Auto-webhook updates - Twilio webhooks auto-update when URL changes
š Free WhatsApp via Baileys - Personal WhatsApp with zero API costs, no business verification
ā Works anywhere - Phone, smartwatch, or any device
ā ļø Testing Status
Channel
Provider
Status
Voice
Twilio
ā Tested & Working
Twilio Sandbox
ā Tested & Working
SMS
Twilio
ā³ Pending A2P 10DLC verification
Voice
Telnyx
š¬ Not yet tested
SMS
Telnyx
š¬ Not yet tested
Telnyx
š¬ Not yet tested
Baileys (free)
š¬ New - testing welcome
Contributions welcome for testing other provider/channel combinations!
Related MCP server: phonecall-mcp
Quick Start
1. Choose Your Setup
Setup | What You Get | Cost | Accounts Needed |
Baileys only | WhatsApp messaging | Free | None |
Twilio/Telnyx | Voice + SMS + WhatsApp | ~$1/mo + usage | Twilio/Telnyx + OpenAI |
Hybrid | Voice + SMS (Twilio) + WhatsApp (Baileys) | ~$1/mo + voice usage | Twilio/Telnyx + OpenAI |
Just want WhatsApp? Skip to Option C: Baileys ā no accounts, no API keys, completely free.
2. Set Up Phone Provider
Create account at portal.telnyx.com and verify identity
Buy a phone number (~$1/month)
Create a Voice API application:
Set webhook URL to your tunnel URL +
/webhook/telnyx/inboundSet API version to v2
Enable SMS on your phone number:
Go to Messaging and create a Messaging Profile
Assign your phone number to the profile
Set SMS webhook URL to your tunnel URL +
/webhook/telnyx/sms
Enable WhatsApp (optional):
Go to WhatsApp in portal
Complete WhatsApp Business verification
Set webhook URL to your tunnel URL +
/webhook/telnyx/whatsapp
Verify your phone number for outbound calls
Get your Connection ID (or Messaging Profile ID) and API Key
Create account at twilio.com/console
Configure webhooks for your number:
Voice webhook: your tunnel URL +
/webhook/twilio/inboundSMS webhook: your tunnel URL +
/webhook/twilio/sms
Enable WhatsApp (optional):
Go to WhatsApp Senders
Complete WhatsApp Business setup
Set webhook URL to your tunnel URL +
/webhook/twilio/whatsapp
Get your Account SID and Auth Token
Baileys connects directly to WhatsApp's Web protocol via WebSocket. It uses your personal WhatsApp account ā no business verification, no API costs, no Twilio/Telnyx required.
How it works: Same as WhatsApp Web ā you link a device by scanning a QR code.
Step 1: Clone and install
git clone https://github.com/sns45/better-call-claude
cd better-call-claude
bun installStep 2: Pair your WhatsApp
bun run baileys:pairA QR code will appear in your terminal
Open WhatsApp on your phone > Settings > Linked Devices > Link a Device
Scan the QR code
Wait for "Paired successfully!" message
Your session is saved in data/baileys-auth/ ā you won't need to scan again.
Step 3: Add to Claude Code (~/.claude.json or ~/.claude/settings.json):
{
"mcpServers": {
"better-call-claude": {
"command": "bun",
"args": ["run", "/path/to/better-call-claude/src/index.ts"],
"env": {
"BETTERCALLCLAUDE_WHATSAPP_PROVIDER": "baileys",
"BETTERCALLCLAUDE_USER_PHONE_NUMBER": "+1234567890"
}
}
}
}That's it! No Tailscale, no Twilio, no OpenAI keys needed.
Step 4: Restart Claude Code and test
Send a WhatsApp message to yourself (or have someone message you) ā Baileys receives it and spawns a Claude task. Or ask Claude to send you a WhatsApp:
"Send me a WhatsApp saying hello"
Get the best of both worlds: Twilio/Telnyx handles voice calls and SMS, Baileys handles WhatsApp for free.
Set up Twilio or Telnyx (Options A/B above)
Run
bun run baileys:pairto pair your WhatsAppAdd to your MCP config:
{
"env": {
"BETTERCALLCLAUDE_PHONE_PROVIDER": "twilio",
"BETTERCALLCLAUDE_WHATSAPP_PROVIDER": "baileys",
"BETTERCALLCLAUDE_PHONE_ACCOUNT_SID": "your-account-sid",
"BETTERCALLCLAUDE_PHONE_AUTH_TOKEN": "your-auth-token",
"BETTERCALLCLAUDE_PHONE_NUMBER": "+15551234567",
"BETTERCALLCLAUDE_USER_PHONE_NUMBER": "+15559876543",
"BETTERCALLCLAUDE_OPENAI_API_KEY": "sk-..."
}
}Voice calls and SMS go through Twilio. WhatsApp goes through Baileys (free).
3. Set Up Tailscale Funnel (for webhooks)
Skip this step if you're using Baileys-only mode (Option C). Baileys doesn't need webhooks.
Tailscale Funnel provides free, stable public URLs for receiving webhooks from your phone provider.
Why Tailscale? Free unlimited tunnels, stable URLs (no random subdomains), enterprise-grade security.
Path: Better Call Claude uses
/bccpath (e.g.,https://your-hostname.ts.net/bcc) to avoid conflicts with other services.
First-time setup (automated):
When you first start the MCP server, it will guide you through setup:
Install Tailscale (if not installed):
# macOS brew install tailscale # Linux curl -fsSL https://tailscale.com/install.sh | shAuthenticate - The server will auto-run
tailscale upand open your browserEnable Funnel - Visit the URL shown in the terminal to enable Funnel on your tailnet (one-time admin step)
That's it! The server handles the rest automatically.
4. Install Better Call Claude
# Quick start with bunx (recommended)
bunx better-call-claude
# Or install globally
bun install -g better-call-claude
better-call-claude5. Add to Claude Code
Add to ~/.claude/settings.json:
{
"mcpServers": {
"better-call-claude": {
"command": "bunx",
"args": ["better-call-claude"],
"env": {
"BETTERCALLCLAUDE_PHONE_PROVIDER": "telnyx",
"BETTERCALLCLAUDE_PHONE_ACCOUNT_SID": "your-connection-id",
"BETTERCALLCLAUDE_PHONE_AUTH_TOKEN": "your-api-key",
"BETTERCALLCLAUDE_PHONE_NUMBER": "+15551234567",
"BETTERCALLCLAUDE_USER_PHONE_NUMBER": "+15559876543",
"BETTERCALLCLAUDE_OPENAI_API_KEY": "sk-..."
}
}
}
}Note: Tailscale setup is automatic on first run. The server will guide you through installation and authentication if needed.
Restart Claude Code. Done!
Environment Variables
Required Variables
Variable | Description |
|
|
| Provider account/connection ID |
| Provider API key/auth token |
| Your Telnyx/Twilio phone number (E.164) |
| WhatsApp number if different (e.g., Twilio Sandbox) |
| Your personal phone number |
| OpenAI API key for TTS/STT |
Baileys (Free WhatsApp)
Variable | Default | Description |
| (unset) | Set to |
|
| Session credential directory |
Baileys-only mode: When
WHATSAPP_PROVIDER=baileysand no Twilio/Telnyx credentials are set, onlyUSER_PHONE_NUMBERis required. No Tailscale, no OpenAI key needed.
Tailscale (Optional)
Variable | Default | Description |
| auto-detected | Override Tailscale hostname |
Optional Variables
Variable | Default | Description |
|
| OpenAI voice (alloy, echo, fable, onyx, nova, shimmer) |
|
| Local HTTP server port |
|
| Speech timeout (3 min) |
|
| End-of-speech detection |
Usage
Voice Calls
You ā Claude (Inbound Calls)
Call your Telnyx/Twilio phone number from your personal phone:
š± "Hey Claude, I need you to write unit tests for the payment module. Call me when you're done."
Claude will acknowledge and start working. When done, it calls you back.
Claude ā You (Outbound Calls)
Claude can initiate calls when it needs your input:
š¤ "I found 3 different approaches for the caching layer. Want me to explain them so you can choose?"
Voice Commands During Calls
"Hang up" or "Goodbye" - End the call
"Hold on" - Claude waits for you to continue
"Go ahead" - Claude continues with the task
"Cancel that" - Abort current action
SMS Messaging
You ā Claude (Inbound SMS)
Text your Telnyx/Twilio number:
š¬ "Hey Claude, what's the status of the deployment?"
Claude will respond via SMS:
š¤ "Deployment is 80% complete. Running integration tests now. ETA: 5 minutes."
Claude ā You (Outbound SMS)
Claude can send you text updates:
š¤ "Build failed on line 42 of auth.ts. Reply with 'fix' to auto-fix or 'skip' to continue."
You ā Claude (Inbound WhatsApp)
Send a WhatsApp message to your business number:
š¬ "Show me the error logs from the last hour"
Claude responds in WhatsApp:
š¤ "Found 3 errors:\n1. Connection timeout at 14:32\n2. Auth failure at 14:45\n3. Rate limit at 15:01\n\nWant me to investigate any of these?"
Claude ā You (Outbound WhatsApp)
Claude can send rich WhatsApp messages:
š¤ "Code review complete! Found 2 issues:\n⢠Line 23: Unused variable\n⢠Line 67: Missing error handling\n\nReply 'fix' to auto-fix or 'details' for more info."
Cross-Channel Context
Start a task on voice and seamlessly continue on WhatsApp - Claude remembers everything.
Example Flow
Call Claude:
š "Hey Claude, run the todo app in dev mode and let's continue on WhatsApp"
Claude starts the app and enters WhatsApp listening mode:
š¤ "Todo app running on port 5173. Send me WhatsApp messages for more instructions."
Send WhatsApp message:
š¬ "Expose it via localtunnel and add the URL to allowed hosts"
Claude responds via WhatsApp:
š¤ "Done! Localtunnel URL: https://xyz.loca.lt - I've added it to vite.config.ts allowedHosts"
Continue the conversation:
š¬ "What's the public IP so I can access it remotely?"
š¤ "Your public IP is 203.0.113.42. Access the app at https://xyz.loca.lt"
Key phrases to trigger WhatsApp listening:
"Continue on WhatsApp"
"Let's talk on WhatsApp"
"Listen for my WhatsApp messages"
WhatsApp Sandbox (Twilio)
For testing, you can use Twilio's WhatsApp Sandbox instead of a full WhatsApp Business account.
Send the join code to the sandbox number (+1 415 523 8886)
Set the webhook URL to
{your-tailscale-url}/bcc/webhook/twilio/whatsappAdd to your config:
"BETTERCALLCLAUDE_WHATSAPP_NUMBER": "+14155238886"
Note: Sandbox requires re-joining every 72 hours.
How It Works
āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Your Phone āāāāāāāāā>ā Phone Provider ā
ā š Voice ā<āāāāāāāāā (Telnyx/Twilio) ā
ā š¬ SMS ā ā ā
ā š± WhatsApp ā ā ⢠Voice API ā
āāāāāāāāāāāāāāāāāāā ā ⢠Messaging API ā
ā ⢠WhatsApp Business API ā
āāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāā
ā webhooks
ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Transport Layer ā
ā (Tailscale Funnel) ā
āāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāā
ā
ā¼
āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Claude Code āāāāāāāāāŗ ā Better Call Claude MCP Server ā
ā (your IDE) ā stdio ā (local, port 3333) ā
āāāāāāāāāāāāāāāāāāā ā ā
ā ⢠Voice handling ā
ā ⢠SMS handling ā
ā ⢠WhatsApp handling ā
ā ⢠Conversation management ā
āāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāā
ā
ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā OpenAI API ā
ā (Whisper STT + TTS) ā
ā (Voice calls only) ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāCommunication Flows
Voice:
Inbound: You call ā Provider ā Webhook ā MCP Server ā Claude Code
Outbound: Claude Code ā MCP Server ā Provider ā Your phone rings
Speech: Your voice ā Whisper STT ā Text ā Claude ā TTS ā Audio playback
SMS:
Inbound: You text ā Provider ā Webhook ā MCP Server ā Claude Code
Outbound: Claude Code ā MCP Server ā Provider API ā SMS delivered
WhatsApp:
Inbound: You message ā Provider ā Webhook ā MCP Server ā Claude Code
Outbound: Claude Code ā MCP Server ā Provider API ā WhatsApp delivered
MCP Tools
Voice Tools
receive_inbound_call
Accept and process an incoming call from the user.
initiate_call
Start a phone call to the user.
const { callId, response } = await initiate_call({
message: "Hey! I finished the refactor. What should I work on next?"
});continue_call
Continue an active call with follow-up messages.
const response = await continue_call({
call_id: callId,
message: "Got it. Should I also add the caching layer?"
});speak_to_user
Speak without waiting for a response (for acknowledgments).
await speak_to_user({
call_id: callId,
message: "Let me search for that. One moment..."
});end_call
End an active call.
await end_call({
call_id: callId,
message: "Perfect, I'll get started. Talk soon!"
});get_call_status
Check status of current or recent calls.
const status = await get_call_status({ call_id: callId });
// { state: "active", duration: 45, transcript: [...] }Messaging Tools
receive_inbound_message
Check for incoming SMS or WhatsApp messages.
const result = await receive_inbound_message({
channel: "any", // "sms", "whatsapp", or "any"
timeout_ms: 5000 // How long to wait
});
// { success: true, channel: "sms", conversation_id: "...", message: "Deploy now" }send_sms
Send an SMS message to the user.
const result = await send_sms({
message: "Build complete! 42 tests passed.",
wait_for_reply: true,
timeout_ms: 180000
});
// { success: true, conversation_id: "...", reply: "Great, deploy it" }send_whatsapp
Send a WhatsApp message to the user.
const result = await send_whatsapp({
message: "Found 3 issues in code review:\n⢠Issue 1\n⢠Issue 2\n⢠Issue 3",
wait_for_reply: true
});
// { success: true, conversation_id: "...", reply: "Fix issue 1 first" }reply_to_conversation
Reply to an existing conversation (works for voice, SMS, or WhatsApp).
const result = await reply_to_conversation({
conversation_id: "abc-123",
message: "Got it, fixing issue 1 now.",
wait_for_reply: false
});get_conversation_history
Get the full message history for any conversation.
const history = await get_conversation_history({
conversation_id: "abc-123"
});
// { success: true, channel: "whatsapp", messages: [...], state: "active" }Costs
Voice Calls
Service | Cost |
Telnyx outbound calls | ~$0.007/min |
Twilio outbound calls | ~$0.014/min |
OpenAI Whisper (STT) | ~$0.006/min |
OpenAI TTS | ~$0.015/1K chars |
Typical voice conversation: ~$0.03-0.05/minute
SMS
Service | Cost |
Telnyx SMS (US) | ~$0.004/message |
Twilio SMS (US) | ~$0.0079/message |
Typical SMS exchange: ~$0.01-0.02/exchange
Service | Cost |
Baileys (personal WhatsApp) | Free |
Telnyx WhatsApp | ~$0.005/message |
Twilio WhatsApp | ~$0.005/message + conversation fees |
Typical WhatsApp exchange: Free (Baileys) or ~$0.01-0.02 (Twilio/Telnyx)
Infrastructure
Service | Cost |
Phone number | ~$1/month |
Tailscale Funnel | Free |
Security Considerations
Tailscale Funnel Security
Funnel creates a public endpoint but traffic routes through Tailscale's secure network
Integrates with SSO/SCIM for enterprise use
Audit logs available in Tailscale admin console
Webhook signatures verified by default
General
Phone numbers are never logged
Call transcripts are ephemeral (cleared on restart)
Use environment variables, never hardcode credentials
Troubleshooting
Voice Issues
Claude doesn't answer calls
Check the MCP server is running:
claude --debugVerify webhook URL is configured in provider dashboard
Ensure Tailscale Funnel is active
Can't make outbound calls
Verify
BETTERCALLCLAUDE_USER_PHONE_NUMBERis correctCheck phone number is verified with provider
Ensure sufficient balance in provider account
Audio quality issues
Check network connectivity
Try different TTS voice:
BETTERCALLCLAUDE_TTS_VOICE=novaAdjust silence detection:
BETTERCALLCLAUDE_STT_SILENCE_DURATION_MS=1000
SMS Issues
SMS not being received
Verify SMS is enabled on your phone number in provider dashboard
Check SMS webhook URL is set:
/webhook/telnyx/smsor/webhook/twilio/smsVerify Messaging Profile is assigned to phone number (Telnyx)
Can't send outbound SMS
Check phone number has SMS capability
Verify destination number format (E.164: +15551234567)
Check provider account balance
WhatsApp Issues
WhatsApp messages not received
Verify WhatsApp Business is set up in provider portal
Check webhook URL:
/webhook/telnyx/whatsappor/webhook/twilio/whatsappEnsure WhatsApp Business verification is complete
Can't send WhatsApp messages
User must have messaged you first (WhatsApp 24-hour rule)
Check WhatsApp Business approval status
Verify message template compliance (for outbound-first messages)
Baileys Issues
QR code doesn't appear
The QR code cannot display inside the MCP server (stdout is reserved for MCP protocol). Run the pairing script separately:
cd /path/to/better-call-claude
bun run baileys:pairOnce paired, the session is saved and the MCP server connects automatically.
"Baileys configured but no session found"
Run bun run baileys:pair to pair your WhatsApp first, then restart Claude Code.
WhatsApp logged out
Delete the auth directory and re-pair:
rm -rf data/baileys-auth
bun run baileys:pairMessages not being received
Check that Baileys is connected (look for
[Baileys] Connectedin stderr)Ensure messages are from individual chats (group messages are filtered out)
Verify the sender is not the linked account itself (own messages are filtered)
Tailscale Issues
"Tailscale not running"
macOS: Open the Tailscale app from Applications
Linux:
sudo systemctl start tailscaled && tailscale up
"Funnel not enabled"
Visit the URL shown in the terminal to enable Funnel
Or go to https://login.tailscale.com/admin/acls and add Funnel capability
Funnel starts but webhooks don't work
Check
tailscale funnel statusshows/bccpointing to your portVerify your phone provider webhook URL matches the Tailscale URL (with
/bccpath)Test with
curl https://your-hostname.ts.net/bcc/health
Development
# Clone the repo
git clone https://github.com/sns45/better-call-claude
cd better-call-claude
# Install dependencies
bun install
# Run in development mode
bun run devTesting locally
# Start the MCP server
bun run dev
# In another terminal, test with MCP inspector
npx @anthropics/mcp-inspectorTech Stack
Runtime: Bun - Fast JavaScript runtime
Web Framework: Hono - Lightweight, fast web framework
WhatsApp: Baileys - Free WhatsApp Web protocol
Speech: OpenAI Whisper - STT/TTS
Transport: Tailscale Funnel - Public URL tunneling
Protocol: MCP - Model Context Protocol
Contributing
PRs welcome! Please see CONTRIBUTING.md for guidelines.
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sns45/better-call-claude'
If you have feedback or need assistance with the MCP directory API, please join our Discord server