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