Skip to main content

Add your description here

Project description

Claude MCP Approval Server

Claude MCP Approval Server Demo

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

  1. Sign up to Twilio at https://www.twilio.com
  2. 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

  1. Get your Account SID from the Twilio Console dashboard
  2. 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

  1. Go back to the Try WhatsApp page: https://console.twilio.com/us1/develop/sms/try-it-out/whatsapp-learn
  2. Click Sandbox Settings
  3. 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

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

  1. Tool Interception: When Claude tries to execute a tool, the permissions__approve function is called first
  2. WhatsApp Notification: An approval request is sent to your WhatsApp with formatted command details
  3. User Response: You can approve or deny using the quick-reply buttons
  4. 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:

  1. Edit template_config.json
  2. Run python setup_template.py to create a new template
  3. The script will update your .env file 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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file iflow_mcp_adstastic_claude_code_approval-0.1.0.tar.gz.

File metadata

  • Download URL: iflow_mcp_adstastic_claude_code_approval-0.1.0.tar.gz
  • Upload date:
  • Size: 4.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for iflow_mcp_adstastic_claude_code_approval-0.1.0.tar.gz
Algorithm Hash digest
SHA256 bffffece33de3a271b39ae370a8f20016d2891c1fb230959804b0352df138b47
MD5 2c77e14b9116c91660ba494b86f0732a
BLAKE2b-256 5a1cd130790ae63b590626c5c4ef6486024045b2ad763e6b6fe50f9080f0dff8

See more details on using hashes here.

File details

Details for the file iflow_mcp_adstastic_claude_code_approval-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: iflow_mcp_adstastic_claude_code_approval-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 4.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for iflow_mcp_adstastic_claude_code_approval-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 239c4ab12e05eab5a2be03bc0232b5778c5ae3073d9404b9f77afda73d7caa07
MD5 faf0109c948937f2d3e75b0cc6c9ff1b
BLAKE2b-256 46464dc1f5c2295707b25c20093d46c9fff3d0c544e58f936b62ecf60265ecf8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page