alert_meLABSCO SUMMARY
The escalation ladder ends with your phone actually ringing.
Plenty of tools can send a notification; very few can hold a conversation and let you interrupt. Two design calls make it work: the calling model is the brain, so there is no second API to pay for, and the voice server can only dial the one SIP URI you configure — it cannot reach arbitrary numbers. The caveats section in the README is unusually honest, and worth reading before you rely on it for anything time-critical.
What it is
Two MCP servers that let an LLM reach you away from the keyboard: ringback-alert for a one-way push or SIP ring, and ringback-voice for a live two-way phone call where you speak, it transcribes you, and the model answers in speech. The model already driving the MCP is the voice on the line, so there is no separate conversation API key.
What you get
ringback-alert—alert_mewithseverityofinfo,warnorcritical, plusalert_testandalert_status; channels are chosen withALERT_CHANNELfrom ntfy, pushover and call, and a rate-limit guard defaults to 5 alerts per 60sringback-voice—call_startrings your phone and returns your first words,conversespeaks and listens in one interruptible turn,get_conversationreturns the full transcript including where it was interrupted,call_endhangs up- Barge-in: talk over the agent and it stops immediately, telling the model how far it got and what you said
- Fully self-hosted — pjsua2 for SIP, whisper.cpp for speech-to-text, Piper for neural TTS, and a free Linphone SIP account; no Twilio and no per-minute fees
- A bundled watchdog skill escalates only when you are actually away, judged by input-idle time: chat status, then a chat warning, then a push, then a call — and de-escalates the moment you touch the keyboard
Requirements
macOS or Linux natively, Windows through WSL2 or Docker; Python 3.10+, and a free Linphone SIP account plus the Linphone app on your phone. The Docker plugin path is one command in Claude Code; the native path runs ./setup.sh (or ./setup-linux.sh), which compiles pjsua2 from source in roughly 20 to 30 minutes and creates voice.env. Three variables are required there: VOICE_SIP_ID, VOICE_SIP_USER and VOICE_SIP_PASS. Register with claude mcp add ringback-voice --scope user. Things to know before relying on it: expect about 1 to 2 s per turn, since the loop is record then whisper then LLM then TTS; your machine must be awake and a Claude session live for the call's duration; barge-in assumes a handset or headset, because speakerphone echo can false-trigger interruption; and on iPhone only Pushover's paid Critical Alerts truly pierce Focus and Silent. Apache-2.0, with a GPL caveat for the pjproject dependency behind the voice server.
Setup effort
Build from source — git clone https://github.com/mohitbadwal/ringback && cd ringback
USE CASES
Being asked for a decision while you are away from the desk
The agent rings your phone, explains the situation, and takes your answer in speech before continuing.
Being told a deploy failed, loudly
Send a critical alert to your phone rather than leaving it in a chat window you are not watching.
Escalating only when you are genuinely absent
Let the watchdog use idle time to decide between a chat message, a push and a call, and back off when you start typing.
Reading back what was said on the call
Pull the transcript of both sides, including where you interrupted, after the call ends.
9 tools
Listed in project docs. Your client may show a different list.
alert_testalert_statuscall_startconverseget_conversationcall_endlistenspeakBEFORE YOU INSTALL
What to know first
Tools you get
9 tools named in the project's documentation. The documented list ends in an ellipsis, so there may be more than nine; listen and speak appear only in a diagram.
Requires
- Python 3.10+
- A free Linphone SIP account: VOICE_SIP_ID, VOICE_SIP_USER and VOICE_SIP_PASS saved in voice.env
INSTALLATION
Connect your client
You clone this one yourself.
Server setup
git clone https://github.com/mohitbadwal/ringback && cd ringback
./setup.sh # installs EVERYTHING (toolchain, pjsua2, whisper model, deps) + creates voice.envedit voice.env -> add your 3 SIP vars (free account: https://subscribe.linphone.org), then:
claude mcp add ringback-voice --scope user -- "$PWD/run_voice_mcp.sh"MCP Clients
Claude Code — plugin
/plugin marketplace add mohitbadwal/ringback
/plugin install ringback@ringbackThe SIP credentials (VOICE_SIP_ID, VOICE_SIP_USER, VOICE_SIP_PASS) are not typed into these commands: they go in voice.env in your clone, which the native launchers read and the Docker route converts to voice.docker.env. The plugin asks for them during install. ringback-alert over ntfy needs none of them.
Claude Code — macOS
claude mcp add ringback-voice --scope user -- "$PWD/run_voice_mcp.sh"The SIP credentials (VOICE_SIP_ID, VOICE_SIP_USER, VOICE_SIP_PASS) are not typed into these commands: they go in voice.env in your clone, which the native launchers read and the Docker route converts to voice.docker.env. The plugin asks for them during install. ringback-alert over ntfy needs none of them.
Claude Code — Linux, Windows, WSL
claude mcp add ringback-voice --scope user -- python3 "$PWD/run_voice_mcp.py"The SIP credentials (VOICE_SIP_ID, VOICE_SIP_USER, VOICE_SIP_PASS) are not typed into these commands: they go in voice.env in your clone, which the native launchers read and the Docker route converts to voice.docker.env. The plugin asks for them during install. ringback-alert over ntfy needs none of them.
Claude Code — Docker
voice.env uses shell export syntax, which docker --env-file does not parse, so it is converted to plain KEY=val lines.
Build the image and turn your SIP credentials into a Docker env-file
git clone https://github.com/mohitbadwal/ringback && cd ringback
docker build -t ringback .
cp voice.env.example voice.env
# edit voice.env → add your 3 SIP vars (free account: https://subscribe.linphone.org)
sed -E 's/^[[:space:]]*export //; s/^([A-Z_]+)="?([^"]*)"?$/\1=\2/' voice.env \
| grep -E '^[A-Z_]+=' > voice.docker.envThen register the server (your MCP client launches the container on stdio)
claude mcp add ringback-voice --scope user -- \
docker run -i --rm --network host --env-file voice.docker.env ringbackThe SIP credentials (VOICE_SIP_ID, VOICE_SIP_USER, VOICE_SIP_PASS) are not typed into these commands: they go in voice.env in your clone, which the native launchers read and the Docker route converts to voice.docker.env. The plugin asks for them during install. ringback-alert over ntfy needs none of them.
Claude Code — Ringback Alert
claude mcp add ringback-alert --scope user \
--env ALERT_CHANNEL=ntfy \
--env NTFY_URL=https://ntfy.sh/<YOUR_LONG_RANDOM_TOPIC> \
-- /opt/homebrew/bin/uv --directory "$PWD" run server.pyThe SIP credentials (VOICE_SIP_ID, VOICE_SIP_USER, VOICE_SIP_PASS) are not typed into these commands: they go in voice.env in your clone, which the native launchers read and the Docker route converts to voice.docker.env. The plugin asks for them during install. ringback-alert over ntfy needs none of them.
Claude Desktop
{
"mcpServers": {
"ringback-voice": {
"command": "<YOUR_PATH_TO_RINGBACK>/run_voice_mcp.sh"
}
}
}The SIP credentials (VOICE_SIP_ID, VOICE_SIP_USER, VOICE_SIP_PASS) are not typed into these commands: they go in voice.env in your clone, which the native launchers read and the Docker route converts to voice.docker.env. The plugin asks for them during install. ringback-alert over ntfy needs none of them.