Claude Code Whatsapp Approval
MCP server with Whatsapp integration (Twilio) to remote approve Claude Code tool use
Installation
npx claude-code-whatsapp-approvalAsk AI about Claude Code Whatsapp Approval
Powered by Claude Β· Grounded in docs
I know everything about Claude Code Whatsapp Approval. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
Claude MCP Approval Server

A Model Context Protocol (MCP) server that provides approval prompts via WhatsApp before executing potentially sensitive commands. Built with FastMCP and Twilio.
Features
- π Permission Prompts: Intercepts tool executions and requests approval via WhatsApp
- π± WhatsApp Integration: Uses Twilio to send approval requests with quick-reply buttons
- β‘ FastMCP: Built on FastMCP for easy integration with Claude
- π― Smart Formatting: Formats commands and reasons in a readable way
- β±οΈ Auto-expiry: Requests expire after 5 minutes for security
- πΎ Database Tracking: SQLite database to track approval requests
Setup Instructions
1. Install Dependencies
uv install
2. Set Up Twilio Account
- Sign up to Twilio at https://www.twilio.com
- Try WhatsApp messaging - Go to https://console.twilio.com/us1/develop/sms/try-it-out/whatsapp-learn and follow the setup guide to:
- Join the WhatsApp Sandbox by sending a message to the Twilio number
- Test sending/receiving messages from your device
- Note your sandbox WhatsApp number (e.g.,
whatsapp:+14155238886)
3. Get Twilio Credentials
- Get your Account SID from the Twilio Console dashboard
- Generate an Auth Token at https://console.twilio.com/us1/account/keys-credentials/api-keys
- Click "Create API Key"
- Note the SID and Secret (this is your Auth Token)
4. Configure Environment
cp .env.example .env
Edit .env with your credentials:
TWILIO_ACCOUNT_SID=your_account_sid_here
TWILIO_AUTH_TOKEN=your_auth_token_here
TWILIO_WHATSAPP_FROM=whatsapp:+14155238886 # Your sandbox number
APPROVAL_PHONE=+1234567890 # YOUR phone number (without whatsapp: prefix)
SERVER_PORT=8000 # Optional: Server port (defaults to 8000)
Important: Replace +1234567890 with your actual phone number that you used to join the WhatsApp sandbox. This is where approval requests will be sent.
5. Create WhatsApp Template
python setup_template.py
This automatically creates the Twilio template and updates your .env file with the template SID.
6. Expose the Server
Expose your local server using ngrok or Tailscale:
Option A: ngrok
ngrok http 8000 # Replace 8000 with your SERVER_PORT if different
Option B: Tailscale
tailscale funnel --bg 8000 # Replace 8000 with your SERVER_PORT if different
Note your public URL (e.g., https://abc123.ngrok.io or https://hostname.tail12345.ts.net)
7. Configure Twilio Webhook
- Go back to the Try WhatsApp page: https://console.twilio.com/us1/develop/sms/try-it-out/whatsapp-learn
- Click Sandbox Settings
- Set both webhook URLs to:
https://your-public-url/twilio-webhook- When a message comes in:
https://your-public-url/twilio-webhook - Status callback URL:
https://your-public-url/twilio-webhook
- When a message comes in:
8. Start the Approval Server
Important: Start the server BEFORE running Claude!
uv run approval_server.py
The server should show:
- β Twilio configured
- π Server endpoints listed
- Webhook URL ready
9. Run Claude with Permission Prompts
claude --mcp-config mcp-servers.json \
--mcp-debug \
--permission-prompt-tool mcp__approval-server__permissions__approve \
--verbose \
--debug \
--output-format stream-json \
-p "your prompt here"
10. Approve/Deny from Anywhere! π
When Claude tries to execute a command, you'll receive a WhatsApp message with β Approve and β Deny buttons. Tap to respond from anywhere in the world!
Important Caveats
β οΈ Network Access: The -p (prompt) mode has no network access
β οΈ Interactive Mode: Non-interactive mode (without -p) does not use the --permission-prompt-tool
MCP Configuration
The MCP configuration is in mcp-servers.json.
Replace 8000 with your SERVER_PORT if you're using a different port.
How It Works
- Tool Interception: When Claude tries to execute a tool, the
permissions__approvefunction is called first - WhatsApp Notification: An approval request is sent to your WhatsApp with formatted command details
- User Response: You can approve or deny using the quick-reply buttons
- Execution: Based on your response, Claude either proceeds or stops
Message Format
Bash commands:
π Approval Request
Execute command: `ls -la /etc`
*Reason:* List system configuration files
*Request ID:* abc123
β±οΈ Expires in 5 minutes
Other tools:
π Approval Request
*Tool:* WebFetch
β’ url: https://example.com
β’ prompt: Extract title
*Request ID:* abc123
β±οΈ Expires in 5 minutes
Customizing the Template
To modify the WhatsApp message format or buttons:
- Edit
template_config.json - Run
python setup_template.pyto create a new template - The script will update your
.envfile with the new SID
Security & Features
- β±οΈ Auto-expiry: Requests expire after 5 minutes
- π Phone verification: Only responses from your configured phone number are accepted
- π Audit trail: Database stores request history for tracking
- π E2E encryption: WhatsApp messages use end-to-end encryption
- π Global access: Approve/deny from anywhere with WhatsApp
Credits
https://github.com/mmarcen/test_permission-prompt-tool for providing a working example of using an MCP server with permission prompt tool.
