Skip to main content

Better Call Claude

Let Claude—or any MCP-compatible AI agent—call your phone with a short spoken update.

uvx better-call-claude setup

The guided setup saves your Twilio credentials locally, registers a call_me MCP tool with Claude Code, and installs a small skill that teaches Claude when a phone call is appropriate. Restart Claude Code, then try:

Call me and say the setup worked.

Why this shape?

This first version makes simple outbound voice alerts. There is no public webhook, tunnel, hosted service, or background daemon. Twilio receives inline TwiML and reads the agent's message aloud.

That makes it useful for requests like:

  • “Run the migration and call me when it finishes.”
  • “Call me if the production health check fails.”
  • “In 20 minutes, check the build and call me with the result.”

The scheduling or monitoring still belongs to your agent. Better Call Claude handles the final phone call.

What you need

Twilio trial accounts can generally call only verified recipients. Calls use your Twilio account and may incur normal voice charges.

During setup you will be asked for your Twilio Account SID, Auth Token, Twilio number, and personal number. Phone numbers must use E.164 format, such as +14155552671. The Auth Token prompt is hidden.

pipx alternative

pipx run better-call-claude setup

Commands

# Guided configuration and agent installation
better-call-claude setup

# Validate configuration without placing a call
better-call-claude doctor

# Place a real test call
better-call-claude call "The deployment finished successfully."

# Start the stdio MCP server (normally launched by your agent)
better-call-claude mcp

For non-interactive setup:

TWILIO_ACCOUNT_SID=AC... \
TWILIO_AUTH_TOKEN=... \
TWILIO_FROM_NUMBER=+14155550100 \
BETTER_CALL_CLAUDE_NUMBER=+14155550101 \
uvx better-call-claude setup --agent claude

Other MCP clients

uvx better-call-claude setup --agent generic

The command prints a stdio MCP configuration for your client. The server exposes one tool:

call_me(message: str)

The recipient is deliberately absent from the tool input. It is fixed during setup, so an agent cannot use your Twilio account to dial arbitrary numbers.

Configuration and safety

Configuration is stored at ~/.config/better-call-claude/config.json with owner-only permissions. Set BETTER_CALL_CLAUDE_CONFIG to use a different path. Environment variables override saved values:

Variable Purpose
TWILIO_ACCOUNT_SID Twilio Account SID
TWILIO_AUTH_TOKEN Twilio Auth Token
TWILIO_FROM_NUMBER Voice-capable Twilio number
BETTER_CALL_CLAUDE_NUMBER Fixed recipient
BETTER_CALL_CLAUDE_VOICE Twilio <Say> voice; default Polly.Joanna
BETTER_CALL_CLAUDE_LANGUAGE Voice language; default en-US
BETTER_CALL_CLAUDE_PREFIX Spoken introduction

Built-in guardrails:

  • One fixed recipient, hidden from the model except for a masked hint
  • Messages capped at 600 characters
  • Three calls per hour by default
  • A 60-second cooldown between calls
  • Skill instructions require explicit or previously granted authorization
  • No automatic retry after a failed or unanswered call

The Auth Token is a valuable secret. Do not commit the config file, paste it into a prompt, or share it in logs.

Development

uv sync
uv run pytest
uv run ruff check .
uv build --no-sources

To point Claude Code at a local checkout:

claude mcp add --scope user --transport stdio better-call-claude-dev -- \
  uv --directory "$PWD" run better-call-claude mcp

The integration follows Claude Code's documented local stdio MCP configuration. Twilio calls use the documented Call resource with inline TwiML.

Publishing to PyPI

uv build --no-sources
uv publish --dry-run
UV_PUBLISH_TOKEN=pypi-your-token uv publish

Create an API token in your PyPI account settings and keep it out of the repository and shell history. Test the exact wheel first with uvx --from dist/better_call_claude-0.1.0-py3-none-any.whl better-call-claude --help.

Current limitation

The tool confirms that Twilio accepted and queued the call. It cannot tell whether the user answered or listened to the message. Delivery tracking and two-way conversation would require a reachable webhook service and are intentionally outside this zero-infrastructure MVP.

License

MIT

Download files

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

Source Distribution

better_call_claude-0.1.0.tar.gz (89.1 kB view details)

Uploaded Source

Built Distribution

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

better_call_claude-0.1.0-py3-none-any.whl (13.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: better_call_claude-0.1.0.tar.gz
  • Upload date:
  • Size: 89.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.13

File hashes

Hashes for better_call_claude-0.1.0.tar.gz
Algorithm Hash digest
SHA256 9396de13414a4b3b2846c8735421ebf235496f7e65176092f9bfca308435c747
MD5 ee8d546c9c8c6593f021bd7cbff7853a
BLAKE2b-256 35f77b833e22a8164485df2ca604ffb88406bef8aad05fe3d14da44eb4dfdd0a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for better_call_claude-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b17f66c069e687cf494c776009850b70701e03f9aa83f7133b797db5ac5cab29
MD5 8bcd3b27cb0b88fca99f5110986516f3
BLAKE2b-256 ad3fbcab74f672e8d381df058ce97e5dfa82d18d8bbcb4253ce216f7c7eca4f3

See more details on using hashes here.

Release history Release notifications | RSS feed

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

This release

0.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page