Both tools reach the live Vonage APIs, so a wrong number is a number that actually rings. The part people miss is the callback side: voice events only come back if `CALLBACK_SERVER_URL` points at something Vonage can reach from the internet, which on a laptop means a tunnel rather than localhost.
A Python server that puts two Vonage telephony actions in front of an assistant: dialling a number and speaking to it, and sending a text message. A callback server runs alongside it on port 8080 to receive Vonage's voice events.
- A voice call placed to a number, with language and style parameters so the spoken text can carry a chosen accent — `voice_call`
- A text message sent from your Vonage virtual number — `send_sms`
- A record of what Vonage reported back: the callback server stores voice events and exposes them at `GET /events`, `GET /events/{event_id}` and `DELETE /events`
A Vonage account with an API key, secret, application ID and private key. Environment variables carry them and the endpoints: `VONAGE_API_KEY`, `VONAGE_API_SECRET`, `VONAGE_APPLICATION_ID`, `VONAGE_PRIVATE_KEY_PATH`, `VONAGE_LVN`, `VONAGE_API_URL`, `VONAGE_SMS_URL` and `CALLBACK_SERVER_URL`. Python 3.13+. Run `python telephony_server.py`, or the bundled `docker compose up --build`. In production `CALLBACK_SERVER_URL` has to be a public URL Vonage can reach; in development it defaults to `http://localhost:8080`.
One command plus a key — docker run -i --rm --init -e DOCKER_CONTAINER=true telephony-mcp-server, then supply credentials
