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.
| Tool | Description | Scope | Type |
|---|---|---|---|
| make_call | Initiate a real outbound phone call via a KaiCalls AI agent | calls:write | Write / external effect |
| check_call_status | Check the status of a call by its ID | calls:read | Read-only |
| list_recent_calls | List recent calls for the authenticated business | calls:read | Read-only |
| get_transcript | Get the transcript and summary of a completed call | calls:read | Read-only |
| get_call_recording | Get the real call recording URL for a call so reviewers can listen to the voice/audio instead of relying only on the transcript. | calls:read | Read-only |
| list_agents | List KaiCalls agents available to the authenticated account | agents:read | Read-only |
| get_business_info | Get business information, agent count, and recent call stats | agents:read | Read-only |
| get_operational_settings | Audit 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:read | Read-only |
| configure_staff_alerts | Configure 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:write | Write / external effect |
| configure_textable_links | Create 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:write | Write / external effect |
| configure_agent_business_rules | Safely 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:write | Write / external effect |
| list_leads | List leads for the authenticated business, with optional status/source/agent filters. Includes the latest AI lead score when available. | calls:read | Read-only |
| get_lead | Get full details for a single lead by ID, including the latest AI lead score and explanation. | calls:read | Read-only |
| list_voicemails | List recent voicemails for the authenticated business, including transcripts and recording URLs. | calls:read | Read-only |
| list_sms_messages | List recent SMS messages for the authenticated business. Filter by conversation or direction (inbound/outbound). | calls:read | Read-only |
| list_campaigns | List outbound call campaigns for the authenticated business. | calls:read | Read-only |
| create_campaign | Create 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:write | Write / external effect |
| get_analytics | Get 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:read | Read-only |
| upsert_lead | Create 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:write | Write / external effect |
| send_sms | Send 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:write | Write / external effect |
| update_agent_config | Edit 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:write | Write / external effect |
| request_kaicalls_update | Ask 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_usage | List recent API usage events (endpoint, method, status code, cost) for the caller's account. Mirrors GET /api/v1/usage. | Read-only | |
| get_balance | Get per-business minutes-used and subscription status across every business the caller can access. Mirrors GET /api/v1/balance. | Read-only | |
| list_numbers | List phone numbers owned by the accessible business(es), with capability and compliance flags. Mirrors GET /api/v1/numbers. | numbers:read | Read-only |
| list_conversations | List SMS conversation threads (counterparty timeline metadata) for the authenticated business, most recent first. Mirrors GET /api/v1/sms/conversations. | sms:read | Read-only |
| get_conversation | Get a single SMS conversation thread by ID. Mirrors GET /api/v1/sms/conversations?id=. | sms:read | Read-only |
| get_webhook | List the configured outbound webhook(s) for a business, including supported event types. Mirrors GET /api/v1/webhooks. | webhooks:read | Read-only |
| set_webhook | Create or update a business outbound webhook (URL + subscribed events). Returns a webhook secret on first creation only. Mirrors POST /api/v1/webhooks. | webhooks:write | Write / external effect |
| delete_webhook | Remove a business outbound webhook by ID. Mirrors DELETE /api/v1/webhooks. | webhooks:write | Write / external effect |
| list_evals | List canned mock-conversation eval scenarios for an agent (or all accessible agents). Mirrors GET /api/v1/evals. | evals:read | Read-only |
| run_eval | Run 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:write | Write / external effect |
| list_voices | List 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:read | Read-only |
| create_agent | Create 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:write | Write / external effect |
| attach_number | Assign 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:write | Write / external effect |
| detach_number | Release a phone number from a business back to the unassigned registry pool. Mirrors DELETE /api/v1/phone-numbers. | numbers:write | Write / external effect |
| search_available_numbers | Search the carrier for phone numbers available to purchase (real-time Twilio inventory lookup). Mirrors GET /api/v1/phone-numbers/search. | numbers:read | Read-only |
| buy_number | Purchase 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:write | Write / external effect |
| list_knowledge | List agent knowledge base entries for a business. Mirrors GET /api/v1/knowledge. | knowledge:read | Read-only |
| upsert_knowledge | Create 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:write | Write / external effect |
| list_products | List a business's agent product catalog. Mirrors GET /api/v1/products. | products:read | Read-only |
| upsert_product | Create 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:write | Write / external effect |
| list_config_versions | List 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:read | Read-only |
| get_change_history | List 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:read | Read-only |
| rollback_config | Roll 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:write | Write / external effect |
| list_observability_events | List 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:read | Read-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:
bashclaude 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:
bashclaude 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.
- Open Settings → Connectors → Add custom connector.
- Paste the MCP server URL:
https://www.kaicalls.com/api/mcp. - Approve the KaiCalls OAuth consent screen when Claude opens it.
- Enable the tools you want. To start safely, enable read-only tools first and add
make_callonce 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)
- Enable Settings → Connectors → Advanced → Developer mode.
- Add a connector with the MCP server URL
https://www.kaicalls.com/api/mcp. - 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
- A workspace admin opens Settings → Connectors → Add MCP connector.
- Enter the server URL
https://www.kaicalls.com/api/mcp. Le Chat auto-detects the transport and OAuth. - 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
- Open Settings → Connectors → Add Connector → Custom MCP.
- Enter a name, the server URL
https://www.kaicalls.com/api/mcp, and the transport (Streamable HTTP). - 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:
bashsmithery 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:
bashnpx @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.