The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Dialfetch listing page.
Connect Dialfetch to Claude, Cursor, VS Code, Windsurf, Cline, the Claude Agent SDK — or any Model Context Protocol client — and your agent can place real phone calls. It navigates IVR phone trees, waits on hold, talks to humans (including after a transfer), and hands back structured answers, a transcript, and a recording.
Give it a phone number and a plain-language goal. Goal in, result out.
"Call the pharmacy at +1 305-555-0148 and tell me what time it closes today." →
{ answers: { closing_time: { value: "9:00 PM", quote: "We close at nine tonight." } } }
https://app.dialfetch.com/api/mcp (Streamable HTTP + SSE)Authorization: Bearer df_…) or one-click OAuth for custom connectorsAdd to claude_desktop_config.json (Settings → Developer → Edit config):
Settings → Connectors → Add custom connector → paste https://app.dialfetch.com/api/mcp and
finish the one-click OAuth sign-in. No API key to paste.
~/.cursor/mcp.json:
.vscode/mcp.json:
More configs (Windsurf, Cline, Agent SDK) are in configs/.
| Tool | Inputs | Does |
|---|---|---|
place_call | phone, goal, extract?, context?, disclose_ai?, from_number_id?, max_duration_minutes?, webhook_url? | Start a goal-call; returns { call_id, status } (async) |
get_call | call_id | Status, outcome, answers, notes, transcript, recording URL |
wait_for_call | call_id, timeout_seconds? | Block (with progress) until the call is terminal |
cancel_call | call_id | Cancel a queued / in-progress call |
list_calls | status?, limit?, cursor? | Recent calls, newest first |
get_call_recording | call_id | Short-lived presigned audio URL |
list_phone_numbers | — | Caller-ID numbers you own |
get_pricing | — | Per-call / per-number pricing |
get_credit_balance | — | Prepaid credit balance |
Resource: dialfetch://calls/{id} · Prompts: check_store_hours, verify_license, get_order_status
Calls are asynchronous (typically 2–10 minutes; longer with holds or transfers):
place_call({ phone, goal, extract }) → { call_id, status: "queued" }get_call({ call_id }) (or use wait_for_call) until status is completed / failed / canceledanswers, transcript, recording_urlCalls disclose they are an AI by default. The agent will not read out or collect sensitive personal data (SSNs, passwords, full card numbers). Goal-screening, credit holds, and rate limits apply to every call and can't be bypassed by a client.
MIT — see LICENSE.