No waitlist — POST /api/v1/signup is live right now

Phone 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

Outbound → +1 (555) 123-4567completed

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?"
call_3f9a1e2b94sagent: Front Deskget_transcript / get_call_recording

How a call flows through CallMCP — connect, discover, call, read the outcome

CallMCP — Phone calls as an MCP tool

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" } }
make_callcheck_call_statuslist_recent_calls

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 call
search_available_numbersbuy_numberattach_numberdetach_numberlist_numbers

SMS

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 }
send_smslist_sms_messageslist_conversationsget_conversation

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..."
get_transcriptget_call_recording

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>
set_webhookget_webhookdelete_webhook

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
update_agent_configconfigure_agent_business_rulesrequest_kaicalls_updatelist_config_versionsget_change_historyrollback_config

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 }
upsert_leadlist_leadsget_lead

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 authority envelope (human_confirmed, dashboard_session, or system_policy) — or queue_for_approval: true to 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.
agent config · v14 (illustrative)applied
config_hash:
sha256:8f2a1c4e9b...
rolled_back_from:
v12
authority:
human_confirmed
idempotency_key:
voice-swap-08f2
Source patch (update_agent_config)
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

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.

Connect your agentRead the docs
Connect