POST /api/v1/signup is live right nowPhone calls as an MCP tool
Give Your AI Agent a Phone Line
CallMCP is an MCP server that lets AI agents make and receive phone calls — outbound calls, appointment confirmations, lead qualification, voicemail, transcripts, and human handoff — through the same tool-call contract your agent already speaks.
Speaks MCP — the open protocol Claude and other MCP-compliant clients already use, so there's no bespoke integration to write.
Connect in one block — no bespoke integration
{
"mcpServers": {
"callmcp": {
"type": "streamable-http",
"url": "https://callmcp.ai/mcp",
"headers": { "Authorization": "Bearer kc_live_..." }
}
}
}No key yet? Get one programmatically — a real POST /api/v1/signup your agent can call itself, with x402 machine payment or a human checkout fallback.
Illustrative example — no live call placed
Called to confirm Thursday 2pm appointment. Reached voicemail on the first attempt; live pickup on retry. Confirmed the slot and sent parking instructions by SMS.
"Yes, Thursday at 2 works for me — do you have parking?"
How a call flows through CallMCP — connect, discover, call, read the outcome

Every line of JSON in that walkthrough is the real shape — the same initialize/tools/list handshake and make_call example used elsewhere on this page. Run it yourself against the production endpoint:curl -s -X POST https://www.kaicalls.com/api/mcp -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
What it does
Most agent frameworks can browse, read files, and call APIs. They can't pick up a phone — and a phone call needs more than a REST request/response cycle gives you for free. It needs permissions (who is this agent allowed to call, and about what), state (is the call still ringing, did it fail, was a human handed off), logs (what was said, was it recorded), and approval (should a human confirm before the agent dials). That shape — permissioned, stateful, logged, approvable — is exactly what MCP tools are for. CallMCP is built on that primitive: it exposes calling, texting, and phone-number management as MCP tools, so an agent can dial a lead, leave a voicemail, confirm an appointment, or escalate to a human — the same way it already calls any other tool.
How a call happens
Connect
Add CallMCP as an MCP server — stdio locally, streamable HTTP hosted.
Discover
tools/list returns the schema for every tool your key can reach.
Call
make_call dials; the call runs on real carrier infrastructure.
Read the outcome
Poll status, then pull the transcript, recording, and summary.
An agent placing an outbound call looks like any other MCP tool call:
{
"method": "tools/call",
"params": {
"name": "make_call",
"arguments": {
"agent_id": "agt_9f2a1c",
"to": "+15551234567",
"context": "Confirm Thursday 2pm appointment",
"lead_id": "lead_88213"
}
}
}The response includes a call ID, provider status, and — once the call ends — a transcript, recording URL, and outcome, retrievable with get_transcript and get_call_recording.
Everything the tool surface covers
51 MCP tools today, grouped by what an agent builder actually reaches for. Every schema below is the real inputSchema/outputSchema pair the server publishes, so a model reading this page and a model calling tools/list land on the same shape. The machine-readable version of this whole page lives at /llms.txt.
Place & receive calls
Dial out, check status, and page through the call log — the full example is above.
make_call({ agent_id, to, context })
// → { success: true, call: { id, status: "queued" } }Numbers
Search real-time carrier inventory, then buy, attach, or release a line.
search_available_numbers({ area_code: "415" })
// → { available_numbers: ["+14155550101", ...] }
buy_number({ phone_number: "+14155550101" })
// → spends real money — carrier-billed on callSMS
Text a number and read conversation threads back.
send_sms({ from_agent_id, to, message })
// gated: opt-out / DNC / quiet-hours + rate limit
// → { success: true, message_sid, to, from }Transcripts & recordings
Full text once a call ends — a clear flag instead of an empty string before it does.
transcript_available: false // call still in progress transcript_available: true transcript: "AI: Hi, this is..."
Webhooks
Register a destination once; 16 event types push to it as they happen, HMAC-signed.
set_webhook({ webhook_url, events: ["call.completed"] })
// → { webhook_secret } — shown once, on creation
POST webhook_url
X-KaiCalls-Signature: t=1751..,v1=<hmac-sha256>Config safety
Prompt, voice, model, and transfer-number edits route through an idempotent, authority-checked broker.
idempotency_key: required authority: human_confirmed | dashboard_session | system_policy // or queue_for_approval: true
Leads & CRM
Create or bulk-update leads after a call closes, or read one back before dialing.
upsert_lead({ updates: [
{ id: "lead_88213", status: "qualified" }
] })
// → { operation: "update", updated: 1, failed: 0 }Plus agent and voice management (list_agents, create_agent, list_voices, get_business_info, get_operational_settings), voicemail (list_voicemails), business-alert config (configure_staff_alerts, configure_textable_links), campaigns (list_campaigns, create_campaign, list_workflow_templates), a knowledge base (list_knowledge, upsert_knowledge), a product catalog (list_products, upsert_product), analytics and usage (get_analytics, get_usage, get_balance, list_subscription_history, list_overage_charges, list_rightsize_recommendations), observability (list_observability_events, list_tool_execution_logs), and eval tooling (list_evals, run_eval) — 51 tools total, all discoverable via tools/list before you write a line of integration code.
Native to the core
Versioned, recoverable config
update_agent_config and configure_agent_business_rules don't patch the live assistant directly — they route through a governed broker that treats a prompt or voice edit with the same discipline as a database migration.
- Every write needs an
idempotency_key— retry the same key and you get the original outcome back. - High-impact fields require an
authorityenvelope (human_confirmed,dashboard_session, orsystem_policy) — orqueue_for_approval: trueto land in a dashboard review queue instead. - Every applied change is sha256-hashed and snapshotted first — a misconfigured greeting or voice rolls back to the last snapshot in one step.
- config_hash:
- sha256:8f2a1c4e9b...
- rolled_back_from:
- v12
- authority:
- human_confirmed
- idempotency_key:
- voice-swap-08f2
voice.voiceId: "rachel" → "matthew" first_message: unchanged transfer_enabled: unchanged
Risky actions get flagged
Tools that spend money or change live state — like buying a number — are annotated destructiveHint: true in their schema, so MCP clients with human-in-the-loop confirmation (Claude included) surface a check before executing, instead of treating a phone-number purchase like a harmless read.
Event push-back
Your agent stays in control of workflow logic. CallMCP pushes call, SMS, and lead events to your own webhook so your agent decides what happens next.
Compliance by default
State-aware AI-disclosure and consent handling are on by default for every number and agent CallMCP provisions. See the full safety & compliance breakdown for exactly what's gated server-side versus client-annotated.
Use cases
- Call leads with an AI agent — qualify or follow up, then write results back to your CRM.
- Appointment confirmation calls — reduce no-shows with confirmation and rescheduling logic.
- Missed-call recovery — when a business misses a call, your agent calls or texts back and books the next step.
- Human handoff — escalate to a person when confidence is low or the caller needs one.
Get a key
Your agent gets tools to search and buy numbers, place and receive calls, send SMS, fetch transcripts and recordings, manage webhooks, and trigger multi-step follow-up sequences — backed by the same production telephony infrastructure already carrying thousands of live business phone lines. Grab the mcpServers block near the top of this page to connect, or have your agent provision its own key by calling POST /api/v1/signup directly — no human required.