Your coding agent makes phone calls for you: an MCP tool on Telnyx + OpenAI GPT-Live
call4me
以下摘录自该仓库的 README(片段) · 在 GitHub 读完整 README →
https://call4.me
call4me lets your AI agent make real phone calls for you. Ask Claude, ChatGPT, Cursor, Codex or your
own app to book a table, schedule a dentist appointment, cancel a subscription or ask a business a question,
and it calls, waits on hold, gets through the phone menu, talks to the person who answers and reports back with the outcome
and a transcript. It can also ring you to join the call. Calls are paid from prepaid credits, starting at $10.
Use it
The hosted MCP server is https://call4.me/mcp (streamable HTTP). Your agent signs you in through the
browser with Google or X. The easiest setup is to paste the prompt from call4.me/mcp
into your agent. To add it by hand:
Cursor: add it to ~/.cursor/mcp.json and sign in when Cursor asks.
In your own code, the Vercel AI SDK package gives an agent the same tools:
- Examples: real calls and the prompts that placed them.
- Blog: guides for Claude Code,
the AI SDK and more.
- MCP Registry: io.github.skeptrunedev/call4me.
The rest of this README is for working on call4me itself or hosting your own copy.
How a call works
- src/server/voice/prompt.ts: what the caller is told. The product lives here: no opening disclosure,
no recording notice, no end-of-call read-back; honest if sincerely asked whether it's an AI.
- src/server/voice/session.ts: the audio relay and back-office functions.
- src/server/services/dialer.ts: placing calls, per-account numbers, answering callbacks.
- src/server/services/numbers.ts: the account's call4me numbers, and the user's own numbers
verified to call from. Telnyx keeps one verified-number list for our whole carrier account, so
verified_numbers ties each to the one call4me account that submitted a fresh code for it; a
number Telnyx already lists as verified is never handed to another account. A call from an own
number (from) only reaches businesses in its country, and still rings the user from a call4me number.
- src/server/mcp/server.ts: the MCP tools.
The app does not request recording when dialing or answering. Existing recordings stored by Telnyx
can be played or opened from the signed in call page after a call ends, or retrieved using call4me_get_recordings({ call_id }) over MCP, or
GET /api/calls/{call_id}/recordings with a call4me API key or OAuth token in the Bearer header.
Both check account ownership before contacting Telnyx and return fresh download links without
storing them. Empty results can mean processing is pending or no recording was saved. Links may
expire and should only be shared with the account owner.
Trunk recordings use call leg IDs. A separate provider ID table receives these from verified
webhooks; existing calls resolve them from an exact control ID match in Telnyx webhook history.
The app never guesses a match from phone numbers or timestamps. If provider history has expired
and no mapping was saved, only recordings directly associated with the control ID can be found.
The recording lookup never contacts the voice session or changes prompts, live tools, audio,
or Telnyx recording settings. Existing call status and transcript responses are unchanged.
The recording API's OpenAPI document is served at /api/openapi.json. Run
npm run openapi:generate to regenerate openapi.json from the shared MCP and HTTP schemas.
CI checks the generated artifact for drift. Run npm test, npm run check, npm run lint,
and npx wrangler deploy --dry-run before deploying through git.
Menu recovery tracks fresh phone prompts separately from transcript timestamps and remembers
accepted keypad submissions. Repeated menus, invalid input, and recorded instruction dead ends
can restart the existing back office after the recording goes quiet. It waits for pending tools
and their continuations, avoids interrupting holds or a person answering, and asks the model to
choose a supported route from the heard options rather than blindly replaying digits.