URL and transport
https://callmcp.ai/mcp, Streamable HTTP, JSON-RPC 2.0. It is the same server as https://www.kaicalls.com/api/mcp.
callmcp.ai/mcpSDK quickstart · checked 2026-11-06
CallMCP is a standard MCP server, so the official TypeScript and Python MCP SDKs are its SDKs. Point them at https://callmcp.ai/mcp with one key and your agent can call, answer, text, join meetings and run approved email campaigns.
https://callmcp.ai/mcp, Streamable HTTP, JSON-RPC 2.0. It is the same server as https://www.kaicalls.com/api/mcp.
Authorization: Bearer kc_live_... (or OAuth in clients that support it). Each key is bound to one business and only carries the scopes it was given.
tools/list answers without a key, so you can read every schema first. initialize and tools/call need the key.
make_call is marked destructive. Get your human's OK for the number and the purpose, and pass an idempotency_key so a retry never rings twice.
POST /api/v1/signup needs no key and no card. Your agent can call it itself; a six-digit code goes to your email. The key is free and shown once. A real phone number turns on with a paid plan: $2 for your first week, then Kai Backup $10/mo. Full request and response shapes are in the homepage quickstart.
curl -X POST https://www.kaicalls.com/api/v1/signup \
-H "Content-Type: application/json" \
-d '{
"business_name": "YOUR BUSINESS",
"email": "you@yourdomain.com",
"activation_mode": "otp",
"api_key_scopes": ["agents:read", "calls:read", "calls:write"]
}'
# → { "status": "otp_sent", "challenge_id": "..." }
# Send the same body again with "challenge_id" and the emailed "otp_code"
# → one-time api_key (kc_live_...) and agent_idPaste into any MCP client that takes an mcpServers block (Claude Desktop, Cursor, a project .mcp.json). Some clients spell the type streamable-http; the URL and header are the same.
{
"mcpServers": {
"callmcp": {
"type": "http",
"url": "https://callmcp.ai/mcp",
"headers": { "Authorization": "Bearer kc_live_..." }
}
}
}One line. Then run /mcp in Claude Code to confirm the tools loaded.
claude mcp add --transport http callmcp https://callmcp.ai/mcp \ --header "Authorization: Bearer kc_live_..."
The official @modelcontextprotocol/sdk with StreamableHTTPClientTransport. Run it as an ES module (top-level await).
// npm i @modelcontextprotocol/sdk
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const transport = new StreamableHTTPClientTransport(new URL("https://callmcp.ai/mcp"), {
requestInit: { headers: { Authorization: `Bearer ${process.env.CALLMCP_API_KEY}` } },
});
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(transport);
const result = await client.callTool({
name: "make_call",
arguments: {
agent_id: "AGENT_ID_FROM_SIGNUP",
to: "+1YOURCELL",
context: "Test call: introduce yourself and confirm this line works",
idempotency_key: "first-test-call-001",
},
});
console.log(result.structuredContent ?? result.content);
await client.close();The official mcp package. httpx2 is installed with it and carries the auth header.
# pip install mcp (written against mcp 2.3.0)
import asyncio, os
import httpx2
from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client
async def main() -> None:
headers = {"Authorization": f"Bearer {os.environ['CALLMCP_API_KEY']}"}
async with httpx2.AsyncClient(headers=headers, timeout=60) as http:
async with streamable_http_client("https://callmcp.ai/mcp", http_client=http) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
result = await session.call_tool("make_call", {
"agent_id": "AGENT_ID_FROM_SIGNUP",
"to": "+1YOURCELL",
"context": "Test call: introduce yourself and confirm this line works",
"idempotency_key": "first-test-call-001",
})
print(result.structuredContent or result.content)
asyncio.run(main())On mcp 1.x (checked on 1.30.0) the transport is streamablehttp_client(url, headers=headers) and it yields (read, write, get_session_id).
tools/list on both callmcp.ai/mcp and www.kaicalls.com/api/mcp returned the same catalog of 180+ tools without a key; initialize without a key returned 401.tsc --strict against @modelcontextprotocol/sdk 1.32.2. With a placeholder key it reaches the server and gets "Invalid API key" back, as it should.mcp 2.3.0 and reaches the same "Invalid API key" answer with a placeholder key.kc_live_... and +1YOURCELL.Status as the product reports it, checked 2026-11-06.
| Phone calls out Errands and callbacks | Live | make_call, check_call_status, join_call, answer_call_question |
| Inbound answering Voicemail, human handoff | Live | set_up_phone_system, get_phone_flow, list_voicemails, get_inbox |
| Meetings Zoom, Meet, Teams, Webex | Live | join_meeting, get_meeting, leave_meeting |
| SMS in Read and route replies | Live | list_sms_messages, get_conversation, sms.received |
| SMS out 10DLC first | After verification | send_sms, get_text_registration |
| Email campaigns Consent + owner approval | Live | request_email_sender, record_email_consent, draft_email_campaign, approve_email_campaign, launch_email_campaign |
| Webhooks Transcripts, recordings | Live | set_webhook, get_transcript, get_call_recording |
| Web chat Embed on your site | Live | embed snippet |
| WhatsApp Built, not on yet | Coming soon | connect_whatsapp, get_whatsapp_status |
| Email inbox Receive and one-off send | Roadmap | Not available yet |
| iMessage · RCS Planned | Roadmap | Not available yet |
Free key first. A real line is $2 for your first week, then Kai Backup $10/mo with no per-minute overage. Compare plans on pricing, or see how CallMCP compares.