Give your agent a phone

DialAgent is a remote MCP server with OAuth, plus a REST API. One endpoint works in every client.

https://mcp.dialagent.com/mcp

Quickstart

01Add the endpoint to your client. Setup for ChatGPT, Claude, OpenClaw, Hermes, Codex and Cursor is on the Connect section.
02Sign in with your phone number when the browser opens. The verified number becomes your caller ID.
03Ask your agent to call. Test on yourself first: “Call me at +1 415 555 0132 and say hi.”
claude mcp add --transport http dialagent https://mcp.dialagent.com/mcp

MCP tools

Calls are asynchronous. place_call returns a call id at once; poll get_call every few seconds until the status is final. This keeps every client inside its tool timeout.

place_callCall one number with a goal.to* E.164 · goal* string · share object (facts it may say) · language BCP-47, default en-US · voice mia|jack|grace|leo|nora|viktor · manner friendly|business|firm · max_minutes · confirm_before_dial bool → call_id
call_aroundCall 2–10 numbers in parallel with the same questions, compare answers, optionally book the best.targets* [to, label] · goal* · pick cheapest|soonest|closest|none · book bool · share · language → batch_id
get_callStatus, live transcript and, when finished, the result.call_id* or batch_id* → status queued|ringing|in_progress|on_hold|completed|no_answer|failed
send_messageCall only to deliver a message and bring back the reply.to* · message* · ask_for_reply bool → call_id
end_call · list_callsHang up a live call. List recent calls with outcomes.end_call: call_id* · list_calls: limit, cursor

Call result

{
  "call_id": "call_8f2k1",
  "status": "completed",
  "outcome": "achieved",
  "summary": "Booked a table for 2 tonight at 7:30 PM, window, under Alex.",
  "commitments": [ "Arrive by 7:40; table held 10 minutes" ],
  "follow_ups": [],
  "duration_s": 72,
  "transcript": [ { "speaker": "agent", "text": "Hi, I'm an AI assistant..." } ],
  "recording_url": "https://rec.dialagent.com/...signed"
}

outcome is one of achieved, partial, not_achieved. Recording links expire after 24 hours; call get_call again for a fresh one.

REST API

Available on Pro and Business. Create an API key in the dashboard. Same parameters as the MCP tools.

curl https://api.dialagent.com/v1/calls \
  -H "Authorization: Bearer da_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "to": "+14155550132", "goal": "Table for 4, Fri ~8pm, before 9", "share": { "name": "Sam" } }'

Webhooks

Events: call.started, call.completed, call.failed, batch.completed, message.replied. Each request is signed with X-DialAgent-Signature (HMAC-SHA256 of the raw body with your webhook secret). We retry failed deliveries for 24 hours with backoff.

Limits

Calls go out 08:00–21:00 in the recipient’s time zone, to the US, Canada and Europe. Up to 2 calls a day to the same number. Parallel calls and call length depend on your plan. The full rules are on the safety page.

Errors

outside_calling_hoursRecipient’s local time is outside 08:00–21:00. Returns next allowed time.
number_opted_outThe number is on the do-not-call list.
goal_refusedThe goal looks like outreach, spam or a blocked use.
country_not_supportedDestination outside the US, Canada and Europe.
plan_limit_reachedMonthly calls or parallel lines used up.
rate_limitedToo many calls to one number today.