Connect KaiCalls to AI clients

KaiCalls exposes a remote Model Context Protocol (MCP) server. Add it as a custom connector in Claude, ChatGPT, Cursor, VS Code / GitHub Copilot, Windsurf, Mistral, Grok, Perplexity, and other MCP-capable clients so they can place calls, read transcripts, and manage your KaiCalls account on your behalf.

At a glance

MCP server URL
https://www.kaicalls.com/api/mcp
Transport
Streamable HTTP (POST JSON-RPC 2.0)
Auth
OAuth 2.1 (authorization code + PKCE S256, refresh tokens, Dynamic Client Registration) for hosted chat clients; or a KaiCalls API key (kc_live_…) Bearer token for developer/CLI clients.
Scopes
calls:read, calls:write, agents:read
Discovery
/.well-known/mcp.json, /.well-known/mcp/server-card.json, /.well-known/oauth-protected-resource

Get an API key (for Bearer-token clients) from the dashboard. For OAuth-based clients you approve the KaiCalls consent screen during setup — no key to paste.

For a no-OAuth MCP setup, create a key with agents:read and calls:read. Add calls:write only for trusted clients that should be allowed to place real outbound calls.

Direct MCP clients can send the key as Authorization: Bearer kc_live_.... Gateways that collect API keys separately can send the same key as X-KaiCalls-API-Key: kc_live_....

Public code

The public SDK, plugin, and MCP connector repos live under the KaiCalls GitHub organization. The private product repository stays private; these repos contain the code and metadata intended for developers and connector directories.

Available tools

Every client below exposes the same tool inventory. Read-only tools are safe to enable broadly; make_call places real outbound phone calls, so treat it as a write / external-effect action and enable it deliberately.

ToolDescriptionScopeType
make_callInitiate a real outbound phone call via a KaiCalls AI agentcalls:writeWrite / external effect
check_call_statusCheck the status of a call by its IDcalls:readRead-only
list_recent_callsList recent calls for the authenticated businesscalls:readRead-only
get_transcriptGet the transcript and summary of a completed callcalls:readRead-only
get_call_recordingGet the real call recording URL for a call so reviewers can listen to the voice/audio instead of relying only on the transcript.calls:readRead-only
list_agentsList KaiCalls agents available to the authenticated accountagents:readRead-only
get_business_infoGet business information, agent count, and recent call statsagents:readRead-only
get_operational_settingsAudit the business-level operational setup Claude needs before changing a client account: staff alert recipients, SMS/email alert flags, escalation rules, textable send-link entries, and assigned agent voice/model/greeting metadata.agents:readRead-only
configure_staff_alertsConfigure business-owned staff alert recipients and post-call escalation rules. Use this for emergency/urgent texts, callback alerts, billing/provider follow-up alerts, and ensuring alerts go only to the correct business staff.agents:writeWrite / external effect
configure_textable_linksCreate or repair the business_links entries used by the send_link/send_sms tools. Use this when callers need booking, directions, cancellation, sister-location, or service-specific links texted without exposing raw URLs in the voice prompt.agents:writeWrite / external effect
configure_agent_business_rulesSafely add or replace a named operational rules section inside an agent inbound prompt, then route the prompt patch through the governed agent.patch broker. Use this for cross-business handoffs, callback language, alert promises, and client-specific operating rules without round-tripping the whole prompt manually.agents:writeWrite / external effect
list_leadsList leads for the authenticated business, with optional status/source/agent filters. Includes the latest AI lead score when available.calls:readRead-only
get_leadGet full details for a single lead by ID, including the latest AI lead score and explanation.calls:readRead-only
list_voicemailsList recent voicemails for the authenticated business, including transcripts and recording URLs.calls:readRead-only
list_sms_messagesList recent SMS messages for the authenticated business. Filter by conversation or direction (inbound/outbound).calls:readRead-only
list_campaignsList outbound call campaigns for the authenticated business.calls:readRead-only
create_campaignCreate an outbound call campaign (cadence + lead batch) and optionally launch it immediately. Launching queues calls for the orchestrator; existing TCPA/consent gating still applies at dial time. Requires admin role on the business.calls:writeWrite / external effect
get_analyticsGet a dashboard summary (lead counts by status, conversion rate, call volume and duration, top agents, and business outcomes by type) over a recent time window.calls:readRead-only
upsert_leadCreate a new lead or update existing leads for the authenticated business, routed through the governed leads API (business access-checked, usage-logged, and audited). To create one, pass `lead` with at least one of name/phone/email plus optional status/source/notes/agent_id/etc. To update, pass `updates`: an array of { id, ...fields } for one or many existing leads (status, name, phone, email, notes, address, city, state, zip). Updates are access-checked per row and report partial success.leads:writeWrite / external effect
send_smsSend an outbound text message from one of your agents' phone lines to a recipient, routed through the governed messaging API. Compliance gates (opt-out / Do-Not-Call / quiet-hours), rate limits, and message logging all apply. Provide from_agent_id (the sending agent), to (recipient phone in E.164), and message. Optionally link lead_id to attribute the text and respect that lead's automation-pause state.sms:writeWrite / external effect
update_agent_configEdit an agent's live runtime configuration — greeting/first message, inbound or SMS prompt, voice, language model, max call duration, and call-transfer settings — routed through the governed update broker so every change keeps the consent + audit trail (a versioned config snapshot and change history). Mutating changes need an idempotency_key; high-impact live changes need human authority (an authority envelope) or queue_for_approval for dashboard sign-off. For just a single named operational-rules section, prefer configure_agent_business_rules.agents:writeWrite / external effect
request_kaicalls_updateAsk the KaiCalls on-behalf update broker to perform a scoped, governed mutation. Supported intents: phone.emergency_address.set, transcripts.sink.configure, agent.patch. Prefer update_agent_config for prompt/voice/model edits, configure_agent_business_rules for a single named operational prompt section, upsert_lead for lead create/update, send_sms for outbound texts, configure_staff_alerts for alert recipients/rules, and configure_textable_links for send-link setup. Mutating requests need an idempotency_key; high-risk changes need human authority. The broker returns needs_user_input, needs_approval, pending_approval, executed, denied, or unsupported — never an unaudited side effect.Write / external effect

Using the tools well

Recommended first read-only flow

Start with get_business_info, then list_agents, then list_recent_calls. Use returned IDs for check_call_status and get_transcript.

Structured results

Tool definitions advertise outputSchema, and tool responses include human-readable text plus machine-readable structuredContent containing stable fields such as call IDs, agent IDs, status, counts, pagination metadata, and error details. tools/list is public metadata for clients and directories; tools/call enforces authentication and scope checks before returning account data or taking action.

Pagination

list_recent_calls and list_agents accept limit and offset. If structuredContent.has_more is true, call the same tool again with offset set to structuredContent.next_offset.

Outbound calls

make_call places a real phone call. Clients should ask for explicit user confirmation, show the destination number and agent, and only call it with a token that has calls:write.

Claude (Claude.ai & Desktop)

For Claude Code, install the same remote server from a terminal:

bash
claude mcp add --transport http --scope user kaicalls https://www.kaicalls.com/api/mcp claude mcp list

If Claude Code shows kaicalls - Needs authentication, start an interactive Claude Code session, run /mcp, select kaicalls, and choose authenticate. That opens the KaiCalls OAuth flow and stores the token in Claude.

To skip OAuth and use a static KaiCalls API key instead, pass the Bearer header when you add the server:

bash
claude mcp add --transport http --scope user kaicalls-api https://www.kaicalls.com/api/mcp \ -H "Authorization: Bearer kc_live_xxxxx" claude mcp list

A read-only key should use agents:read and calls:read. Include calls:write only if Claude Code should be able to use make_call.

  1. Open Settings → Connectors → Add custom connector.
  2. Paste the MCP server URL: https://www.kaicalls.com/api/mcp.
  3. Approve the KaiCalls OAuth consent screen when Claude opens it.
  4. Enable the tools you want. To start safely, enable read-only tools first and add make_call once you're ready to place calls.

Claude's OAuth callback (claude.ai/api/mcp/auth_callback) is already allowlisted by the KaiCalls authorization server.

ChatGPT (Developer Mode)

  1. Enable Settings → Connectors → Advanced → Developer mode.
  2. Add a connector with the MCP server URL https://www.kaicalls.com/api/mcp.
  3. Complete the OAuth sign-in flow with your KaiCalls account.

ChatGPT requires OAuth (it does not accept pasted API keys). The ChatGPT connector callback pattern is allowlisted on the KaiCalls authorization server.

VS Code & GitHub Copilot

Add an entry to .vscode/mcp.json (workspace) or your user settings:

json
{ "servers": { "kaicalls": { "type": "http", "url": "https://www.kaicalls.com/api/mcp" } } }

VS Code triggers the OAuth flow on first use. For non-interactive setups, pass a Bearer token instead via a headers entry ("Authorization": "Bearer kc_live_…").

Cursor

Add KaiCalls to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):

json
{ "mcpServers": { "kaicalls": { "url": "https://www.kaicalls.com/api/mcp" } } }

Cursor handles the OAuth handshake automatically. You can also add an "headers": { "Authorization": "Bearer kc_live_…" } block to use a static API key.

Windsurf

Add KaiCalls to ~/.codeium/windsurf/mcp_config.json:

json
{ "mcpServers": { "kaicalls": { "serverUrl": "https://www.kaicalls.com/api/mcp" } } }

Reload Cascade's MCP servers, then authorize KaiCalls when prompted.

Mistral Le Chat

  1. A workspace admin opens Settings → Connectors → Add MCP connector.
  2. Enter the server URL https://www.kaicalls.com/api/mcp. Le Chat auto-detects the transport and OAuth.
  3. Complete the OAuth flow and share the connector with your team as needed.

xAI Grok (Business / Enterprise)

In Grok's connector management, add a remote MCP server:

  • URL: https://www.kaicalls.com/api/mcp
  • Transport: Streamable HTTP
  • Auth: OAuth, or a Bearer header Authorization: Bearer kc_live_…
  • Allowlist the tools you want Grok to use (start with read-only tools).

Perplexity

  1. Open Settings → Connectors → Add Connector → Custom MCP.
  2. Enter a name, the server URL https://www.kaicalls.com/api/mcp, and the transport (Streamable HTTP).
  3. Choose OAuth, an API key, or no auth, then complete sign-in.

Enterprise admins can share the connector org-wide; member-added connectors may be disabled by default.

Smithery

KaiCalls is listed on Smithery. Install from that listing or publish the remote server yourself with the canonical MCP URL.

For a self-managed Smithery deployment, add a config schema so Smithery prompts users for a KaiCalls API key and forwards it as a header:

bash
smithery mcp publish "https://www.kaicalls.com/api/mcp" -n @kaicalls/kaicalls \ --config-schema '{"type":"object","properties":{"kaiCallsApiKey":{"type":"string","title":"KaiCalls API Key","description":"Create a KaiCalls API key with agents:read and calls:read. Add calls:write only if this Smithery connection may place outbound calls.","x-from":{"header":"x-kaicalls-api-key"},"x-to":{"header":"X-KaiCalls-API-Key"}}},"required":["kaiCallsApiKey"]}'

Smithery can list the public tool catalog without credentials. Add the config schema above so users can save a KaiCalls API key for authenticated tools/call requests.

Developer clients (Z.ai, Hermes, OpenClaw)

KaiCalls also works with developer/agent runtimes that consume MCP servers. For Z.ai, reference it as an MCP tool source in a chat/completions request:

json
{ "tools": [ { "type": "mcp", "server_label": "kaicalls", "server_url": "https://www.kaicalls.com/api/mcp", "transport_type": "streamable-http", "allowed_tools": ["list_recent_calls", "get_transcript"], "headers": { "Authorization": "Bearer kc_live_…" } } ] }

Hermes Agent (~/.hermes/config.yaml) and OpenClaw (openclaw mcp add kaicalls --url https://www.kaicalls.com/api/mcp) both accept the same URL with either an Authorization header or auth: oauth. Start with read-only tools and enable outbound/write tools explicitly.

Verify with MCP Inspector

Before wiring up a client, confirm the server with the official inspector:

bash
npx @modelcontextprotocol/inspector # Transport: Streamable HTTP # URL: https://www.kaicalls.com/api/mcp # tools/list works without auth; run OAuth or add an API key before tools/call

You can also confirm the advertised inventory with curl https://www.kaicalls.com/.well-known/mcp.json.

Troubleshooting first setup

Client says "Needs authentication"

The server URL is installed correctly, but the client has not completed OAuth yet. Open the client's MCP/connector manager and authenticate KaiCalls. In Claude Code, run /mcp inside an interactive session and choose KaiCalls.

OAuth opens, then shows no business

Sign in with a KaiCalls dashboard user that belongs to at least one business. The connector can only access businesses linked to that user.

Bearer token clients get 401

Use a KaiCalls API key that starts with kc_live_ and pass it as Authorization: Bearer kc_live_.... MCP gateways may pass the same key as X-KaiCalls-API-Key: kc_live_.... Pasting the key into the URL or using a dashboard session cookie will not work.

A tool returns "Missing required scope"

Recreate the API key or reconnect OAuth with the needed scope. Read-only setup needs agents:read and calls:read; outbound calls also need calls:write.

Questions? Email support@kaicalls.com or see the Agent Discovery reference for the raw protocol details.

    Connect KaiCalls to AI Clients (MCP Connectors) | KaiCalls API Docs