The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Ringback listing page.
Your AI agent can call your phone — and actually talk to you.
ringback gives an LLM (Claude, or any MCP client) tools to reach you on your phone — from a one-way "fierce" alert all the way to a live, interruptible voice conversation — using only free, self-hosted pieces. No paid telephony. No extra API key for the conversation: the model already driving the MCP is the voice on the line.
Highlights
It ships two MCP servers, ringback-alert and ringback-voice:
Platform: macOS, Linux, and Windows (via WSL2 or Docker). TTS is Piper by default (same voice everywhere), falling back to the OS-native voice (
sayon macOS). The engine is headless — it never opens a local mic/speaker (all audio is WAV ↔ SIP/RTP), so no sound card is required. Setup guides: macOS · Linux · Windows · Docker.
| Server | Tools | What it does |
|---|---|---|
| ringback-alert | alert_me, alert_test, alert_status | Fire-and-forget notification: a loud push (ntfy / Pushover) and/or a SIP ring + chat message. |
| ringback-voice | call_start, converse, get_conversation, call_end, … | A real two-way phone conversation. Rings your phone; you talk, it transcribes you, the LLM replies in speech. Supports barge-in (talk over it and it stops). |
The criteria for when to contact you live in the tool descriptions — the calling LLM decides. These servers are just the mechanism.
The LLM calls call_start once, then converse(...) for each turn. Plain alerts are even simpler: one alert_me(...) call.
If you have Docker and a free Linphone account, this is the fastest path — no local build:
Claude Code prompts for your SIP details (and optional alert backends), stores secrets in your OS keychain, and registers both ringback-voice and ringback-alert plus the watchdog skill. The engine runs in the prebuilt image (pulled on first call). See plugin/README.md.
Prefer no Docker, or want the native build? Use the paste-prompt below or the manual steps.
🤖 Easiest path: copy the prompt below and paste it into Claude Code — it'll clone, build, configure, and register everything, asking you only for what it needs (a free SIP account + your phone to answer a test call).
Prefer to do it by hand? Quick start and the full walkthrough are below.
Full walkthrough + env-var reference: Set up ringback-voice below.
NOTICE. The ringback-alert server is unaffected.ringback-alert is simpler: it shells out to ntfy/Pushover HTTP and/or baresip for a SIP ring + chat message.
./setup.sh./setup-linux.sh (see docs/SETUP_LINUX.md)./setup-linux.sh inside it) or Docker Desktop (see docs/SETUP_WINDOWS.md)docker build -t ringback . (see docs/SETUP_DOCKER.md)sip.linphone.org) and the Linphone iOS/Android app (for the ring/voice features)python3 you point at)1. Clone + install everything:
setup.sh installs the toolchain, compiles pjsua2 from source (~20–30 min — no Homebrew formula exists for the bindings), relinks the pjproject dylibs to a two-level OpenSSL namespace (the macOS fix that makes SIP/SRTP work), downloads the whisper model, installs Piper + a voice, installs deps, and creates voice.env for you. Safe to re-run. (Override PYTHON_BIN / PJPROJECT_DIR / WHISPER_MODEL_NAME if your layout differs.)
On Linux? Use
./setup-linux.shinstead — it does the same build with apt/dnf and needs no OpenSSL relink. On Windows? Use WSL2 (docs/SETUP_WINDOWS.md) or Docker. Register the server with the cross-platform launcherpython3 run_voice_mcp.py(the.shis macOS-only).
Hit a snag on macOS?
docs/SETUP_MACOS.mdis a field-tested root-cause + troubleshooting guide (build target, the OpenSSL flat-namespace fix, whisper model, symptom→fix table).
2. Get a free SIP account (this is the phone that rings):
sip:<username>@sip.linphone.org.3. Fill in voice.env (already created by setup.sh — just edit it). Only three vars are required:
Full variable reference:
| Variable | Required | Default | What it is |
|---|---|---|---|
VOICE_SIP_ID | ✅ | — | Your SIP address, e.g. sip:you@sip.linphone.org |
VOICE_SIP_USER | ✅ | — | SIP username (the part before @) |
VOICE_SIP_PASS | ✅ | — | Your SIP password |
VOICE_SIP_CALLEE | — | = VOICE_SIP_ID | Address to call (normally yourself) |
VOICE_SIP_PROXY | — | sip:sip.linphone.org;transport=tls | SIP registrar/proxy |
WHISPER_MODEL | — | ~/.whisper-models/ggml-small.en.bin | STT model: base.en (fast) · small.en (default) · medium.en (accurate) |
VOICE_TTS | — | auto | TTS engine: auto (Piper if installed, else OS voice) · piper · say · espeak · sapi |
VOICE_PIPER_MODEL | — | ~/.piper-voices/en_US-lessac-medium.onnx | Piper voice (.onnx; needs the matching .onnx.json beside it) |
VOICE_TTS_CMD | — | — | Custom TTS command template with {text}/{out} (overrides VOICE_TTS) |
VOICE_NULL_AUDIO | — | auto | Force pjsua2 null audio device (auto = on except macOS; 1/0 to force) |
RINGBACK_PRESENCE | — | — | Override watchdog idle/presence: present or absent (for Wayland/headless) |
PJPROJECT_DIR | — | ~/build/pjproject-2.17 | pjsua2 build dir (auto-detected) |
PYTHON_BIN | — | $(command -v python3) | Python that has pjsua2 (auto-detected) |
OPENSSL_PREFIX | — | $(brew --prefix openssl@3) | OpenSSL libs (macOS; auto-detected) |
4. Register + test:
Then in a fresh Claude session say: "Use ringback-voice to call me and say hello." Your phone should ring.
Claude Desktop instead of Code? Add this to
~/Library/Application Support/Claude/claude_desktop_config.json(absolute path required; restart the app):
ringback-alert reads its config from the MCP client's env block (no file to source). Register it with the channels you want:
See alert.env.example for all variables (ntfy / Pushover / SIP ring). Use a long random ntfy topic — anyone who knows it can read/publish.
The LLM drives a simple loop:
converse(text) speaks while listening. If you talk over it, it stops immediately and tells the LLM how far it got and what you said (barge-in).get_conversation() returns the full transcript so far — both sides, plus where it got interrupted.alert_me as text instead.Whisper model accuracy/speed trade-off (set WHISPER_MODEL): base.en (fast/rough) → small.en (balanced, default) → medium.en (most accurate/slow).
alert_me(message, severity, title) with severity = info | warn | critical. Channels via ALERT_CHANNEL (comma list of ntfy, pushover, call):
critical.critical by default.A built-in rate-limit guard (default 5/60s, per-process) stops a misfiring caller from spamming you.
skills/watchdog/ is a ready-to-use Claude skill built on these servers. It watches a condition you give it (a CI run, a deploy, a pod, a file) and escalates only when you're actually away from the laptop — chat status → chat warning → ringback-alert push → ringback-voice call — judged by input-idle time (macOS, Linux, or Windows; see platform_compat.hid_idle_seconds). It never interrupts you while you're typing, and de-escalates the moment you touch the keyboard.
Then: /watchdog <what to watch> | priority=<low|medium|critical> — low = chat only, medium = may send a phone alert, critical = may place a call. Full design in skills/watchdog/SKILL.md.
voice.env (and the baresip accounts file for ringback-alert) — never in the repo or the MCP client config when you can avoid it.NOTICE for the GPL/pjproject licensing caveat before redistributing.Apache-2.0 (see LICENSE), with an important GPL caveat for the voice
component's pjproject dependency — see NOTICE.
Built on pjproject/pjsua2, whisper.cpp, baresip, ntfy, and Linphone.