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, WordPress source, n8n, and MCP connector repos live under the KaiCalls GitHub organization. The approved WordPress plugin installs from WordPress.org. The private product repository stays private; these repos contain the code and metadata intended for developers, answer engines, 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). Every write here is reversible: inspect what changed with get_change_history or list_config_versions, then undo it with rollback_config. 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
get_usageList recent API usage events (endpoint, method, status code, cost) for the caller's account. Mirrors GET /api/v1/usage.Read-only
get_balanceGet per-business minutes-used and subscription status across every business the caller can access. Mirrors GET /api/v1/balance.Read-only
list_numbersList phone numbers owned by the accessible business(es), with capability and compliance flags. Mirrors GET /api/v1/numbers.numbers:readRead-only
list_conversationsList SMS conversation threads (counterparty timeline metadata) for the authenticated business, most recent first. Mirrors GET /api/v1/sms/conversations.sms:readRead-only
get_conversationGet a single SMS conversation thread by ID. Mirrors GET /api/v1/sms/conversations?id=.sms:readRead-only
get_webhookList the configured outbound webhook(s) for a business, including supported event types. Mirrors GET /api/v1/webhooks.webhooks:readRead-only
set_webhookCreate or update a business outbound webhook (URL + subscribed events). Returns a webhook secret on first creation only. Mirrors POST /api/v1/webhooks.webhooks:writeWrite / external effect
delete_webhookRemove a business outbound webhook by ID. Mirrors DELETE /api/v1/webhooks.webhooks:writeWrite / external effect
list_evalsList canned mock-conversation eval scenarios for an agent (or all accessible agents). Mirrors GET /api/v1/evals.evals:readRead-only
run_evalRun a single eval scenario (eval_id) or every scenario for an agent (agent_id) against its live Vapi assistant and grade the result. Bills Vapi compute. Mirrors POST /api/v1/evals/run.evals:writeWrite / external effect
list_voicesList the curated, credential-free voice catalog (id, display name, accent, language, gender, sample URL) used to configure agent voices. Mirrors GET /api/v1/voices.agents:readRead-only
create_agentCreate a new KaiCalls voice agent (Vapi assistant + KaiCalls records) with a system prompt, greeting, voice, and model. Mirrors POST /api/v1/agents. Every subsequent mutation to this agent is versioned (assistant_config_versions) and reversible via rollback_config — inspect history with get_change_history / list_config_versions. Compliance: KaiCalls automatically applies state-aware AI-disclosure and consent handling to every agent it provisions, and flags high-risk business categories for extra review.agents:writeWrite / external effect
attach_numberAssign a phone number already in the KaiCalls registry pool to a business (and optionally route it directly to an agent). Does NOT purchase a new number — use search_available_numbers + buy_number for that. Mirrors POST /api/v1/phone-numbers.numbers:writeWrite / external effect
detach_numberRelease a phone number from a business back to the unassigned registry pool. Mirrors DELETE /api/v1/phone-numbers.numbers:writeWrite / external effect
search_available_numbersSearch the carrier for phone numbers available to purchase (real-time Twilio inventory lookup). Mirrors GET /api/v1/phone-numbers/search.numbers:readRead-only
buy_numberPurchase a real phone number from the carrier and register it to a business. This spends real money — the number is billed by the carrier immediately. Does not auto-attach an agent; call attach_number afterward to route it. Mirrors POST /api/v1/phone-numbers/purchase. Compliance: KaiCalls automatically applies state-aware AI-disclosure and consent handling to numbers it provisions, and flags high-risk business categories for extra review.numbers:writeWrite / external effect
list_knowledgeList agent knowledge base entries for a business. Mirrors GET /api/v1/knowledge.knowledge:readRead-only
upsert_knowledgeCreate a new agent knowledge base entry, or update one when `id` is provided. Mirrors POST /api/v1/knowledge. Creating requires title, content, and content_type.knowledge:writeWrite / external effect
list_productsList a business's agent product catalog. Mirrors GET /api/v1/products.products:readRead-only
upsert_productCreate a new product row, or update one when `id` is provided. Mirrors POST /api/v1/products. Creating requires name and business_id. Pass `quantity` to set/update inventory.products:writeWrite / external effect
list_config_versionsList an agent's hashed, redacted assistant config version history (rollback lineage included). Pass `version` to fetch one version's full redacted config_snapshot instead of the list. Mirrors GET /api/v1/agents/versions.agents:readRead-only
get_change_historyList an agent's recent config-change audit trail (change_type, change_source, old/new value, timestamp) from admin_change_history — the same record the admin_get_change_history voice tool reads over the phone. Every mutation KaiCalls makes to an agent (via update_agent_config, configure_agent_business_rules, the admin call-in secretary, or the dashboard) is logged here and reversible with rollback_config.agents:readRead-only
rollback_configRoll an agent's deployed voice configuration back to a prior assistant_config_versions snapshot — restoring greeting, voice, prompt, and scalar model params (never secrets/credentials) onto the live agent. Wraps the same version-restore logic as POST /api/v1/agents/rollback and the admin_rollback_change voice tool. Discover a target with list_config_versions or get_change_history. This OVERWRITES the live deployed config and is NOT idempotent — every rollback, including repeating the same one, records a new config version.agents:writeWrite / external effect
list_observability_eventsList a business-scoped timeline of compact call-runtime events and redacted integration-delivery attempts. Mirrors GET /api/v1/observability-events and uses bounded keyset pagination.events:readRead-only

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