For AI phone agent builders
MCP for AI Phone Agents
You don't need to build an AI phone agent's telephony layer to build the agent. CallMCP supplies calling, transcripts, call logs, and CRM sync as MCP tools — your agent keeps the conversation logic, CallMCP handles the phone.
Inbound vs. outbound
Outbound is a direct tool call: your agent calls make_call with anagent_id and a number, and CallMCP dials it. Inbound works the other way — you attach a phone number to an agent with attach_number (or buy a new one with search_available_numbers and buy_number), and every call to that number routes to the agent automatically. You don't poll for inbound calls; you register a webhook with set_webhook and CallMCP pushes call, SMS, and lead events to it as they happen, so your agent decides what to do next instead of guessing on a schedule.
Call logs and transcripts
Once a call exists — inbound or outbound — the same read tools cover it:
- list_recent_calls — paginated call log for the business, filterable by
agent_idorstatus. - check_call_status — single call by ID: status, duration, summary, recording URL.
- get_transcript — full transcript text once the call has one, with a clear
transcript_available: falseinstead of an empty string while it doesn't. - get_call_recording — the audio URL, for review flows that need to listen instead of read.
Human handoff
Handoff is a call-transfer setting on the agent — nothing your agent has to invoke as a separate tool mid-conversation. update_agent_config takes transfer_enabled and transfer_phone_number — when the agent decides a caller needs a person, it transfers the live call to that number. Changing that configuration is itself an audited write: it takes an idempotency_key, and for a live production agent, an authority envelope (human_confirmed, dashboard_session, or system_policy) or queue_for_approval: true to route it through a dashboard sign-off instead of applying immediately.
Writing results back to your CRM
A call is only useful if what happened on it ends up somewhere your team looks. upsert_lead does both sides of that: pass lead with at least a name, phone, or email to create one, or pass updates — an array of { id, ...fields } objects, up to 100 per call — to update existing leads after a call closes (status, notes, address, and the rest). list_leads and get_lead read the other direction: pull a lead's current state, including its latest AI-generated score, before or after the call.
{
"name": "upsert_lead",
"arguments": {
"updates": [
{ "id": "lead_88213", "status": "qualified", "notes": "Confirmed Thursday 2pm, sent directions." }
]
}
}What this looks like end to end
Call leads
Agent qualifies or follows up with a lead, then writes the outcome back with upsert_lead.
Confirm appointments
Outbound confirmation call; a no-answer or reschedule updates the lead status automatically.
Recover missed calls
Inbound event fires on a missed call; agent calls or texts back and books the next step.
Escalate to a person
Agent transfers the live call when confidence is low or the caller asks for a human.