SDK quickstart · checked 2026-11-06

One endpoint. Any MCP SDK.

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.

The endpoint

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.

Auth

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.

Discovery

tools/list answers without a key, so you can read every schema first. initialize and tools/call need the key.

Risky tools say so

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.

0 Get a key (your agent can do this)

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_id

a MCP client config

Paste 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_..." }
    }
  }
}

b Claude Code

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

c TypeScript

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();

d Python

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).

What we checked

  • Endpoint. On 2026-11-06, 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.
  • TypeScript. Type-checks with 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.
  • Python. Compiles and runs against mcp 2.3.0 and reaches the same "Invalid API key" answer with a placeholder key.
  • No call was placed. The snippets use placeholders: kc_live_... and +1YOURCELL.

Every channel on the same key

Status as the product reports it, checked 2026-11-06.

Phone calls out
Errands and callbacks
Livemake_call, check_call_status, join_call, answer_call_question
Inbound answering
Voicemail, human handoff
Liveset_up_phone_system, get_phone_flow, list_voicemails, get_inbox
Meetings
Zoom, Meet, Teams, Webex
Livejoin_meeting, get_meeting, leave_meeting
SMS in
Read and route replies
Livelist_sms_messages, get_conversation, sms.received
SMS out
10DLC first
After verificationsend_sms, get_text_registration
Email campaigns
Consent + owner approval
Liverequest_email_sender, record_email_consent, draft_email_campaign, approve_email_campaign, launch_email_campaign
Webhooks
Transcripts, recordings
Liveset_webhook, get_transcript, get_call_recording
Web chat
Embed on your site
Liveembed snippet
WhatsApp
Built, not on yet
Coming soonconnect_whatsapp, get_whatsapp_status
Email inbox
Receive and one-off send
RoadmapNot available yet
iMessage · RCS
Planned
RoadmapNot available yet

Give your agent a number

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.