Docs
Everything an agent (or a human) needs to connect and call.
Connect
Endpoint: https://www.patchmcp.com/mcp (Streamable HTTP, OAuth 2.1 with PKCE, dynamic client registration and client-ID metadata documents supported). Discovery lives at /.well-known/oauth-protected-resource/mcp and /.well-known/oauth-authorization-server.
- Open Settings → Connectors → Add custom connector.
- Paste
https://www.patchmcp.com/mcpas the server URL and save. - Click Connect: verify your number, approve access, and you are done.
- Ask Claude to call someone.
claude mcp add --transport http patch-mcp https://www.patchmcp.com/mcp
Then run /mcp inside Claude Code to authenticate, or let the first place_call trigger it.
Add to ~/.codex/config.toml:
[mcp_servers.patch-mcp]
url = "https://www.patchmcp.com/mcp"
Add to .cursor/mcp.json (or the global one):
{ "mcpServers": { "patch-mcp": { "url": "https://www.patchmcp.com/mcp" } } }
- Enable Developer mode under Settings → Connectors → Advanced.
- Create a connector with the MCP server URL
https://www.patchmcp.com/mcpand OAuth authentication. - Authorise in the browser window that opens.
Tools
place_call
Start an outbound call from your verified number. Returns immediately with a call_id and a listen_url.
- to
- Destination in E.164 (
+14155551234). US/CA only. - objective
- What the call must achieve, with specifics and acceptable fallbacks (10–2000 chars).
- callee_name
- Who is being called. Optional, improves the conversation.
- context
- Extra facts the agent may reveal if asked. Optional.
- max_duration_minutes
- Hard cap, default 6, max 10.
get_call
Status and, once terminal, the resolution, transcript and recording_url. Pass wait_seconds (≤ 50) to long-poll.
end_call
Ends an in-progress call: the agent says goodbye and hangs up within ~10 seconds.
list_calls
Recent calls, newest first, with statuses and outcomes.
Call lifecycle
Statuses: queued → ringing → in_progress → one of completed, no_answer, busy, voicemail, failed, canceled, declined_recording, opted_out.
Every terminal call carries a resolution: { outcome: achieved | partially_achieved | not_achieved | no_conversation, summary, commitments[], follow_ups[], key_facts[], callee_requested_no_further_calls }. The resolution can lag the terminal status by a few seconds while it is extracted.
Transcript rows are { role: agent | callee, text, at_ms }. recording_status moves from processing to available typically 15–90 s after the call ends; recording_url links expire after about an hour, listen_url after a few hours.
Errors
Rejections come back as tool errors with a machine-readable error code and a human message. Relay the message to the user; do not retry blindly.
- invalid_number / unsupported_region / blocked_number
- The destination is invalid, outside US/CA, or in a blocked range.
- caller_id_not_verified
- Finish caller-ID verification at /caller-id.
- do_not_call
- The destination opted out of calls from this service.
- outside_calling_hours
- Includes
reset_at: the next moment calls are allowed at the destination. - rate_limited / destination_limit_reached
- Includes
reset_atandretry_after_seconds. - concurrent_call_in_progress
- Includes
active_call_id; wait or end it first. - objective_rejected
- Safety screening declined the objective.
- carrier_error / service_unavailable
- Temporary provider problems.
Limits
- One call at a time per account; 3 per hour; 10 per day; 2 per destination number per day.
- Calls only 8:00–21:00 at the destination's local time (by area code, conservative for multi-zone codes).
- Hard cap 10 minutes per call.