CARRIER-GRADE TELEPHONY NETWORK
TELECOM SALES & DEMO: 1 (417) 386-2898

Connect KaiCalls to Claude, ChatGPT, Grok, Manus & every MCP client

Connect KaiCalls to the AI assistant you already use, and it can read your calls, transcripts, leads, and voicemails, and manage your account on your behalf. Install the published KaiCalls app in ChatGPT, or paste one URL — https://www.kaicalls.com/api/mcp — into Claude, Grok, Manus, Gemini, Perplexity, Mistral, Cursor, VS Code / GitHub Copilot, or Windsurf.

That URL is a remote Model Context Protocol (MCP) server, so any MCP-capable client works — but you don't need to know that to use it. This page is the exhaustive per-client reference; if you only want the shortest path for the one assistant you use, the setup walkthrough ranks them by how much work each one takes.

At a glance

MCP server URL
https://www.kaicalls.com/api/mcp
ChatGPT app
KaiCalls in the ChatGPT app directory (published, no setup needed)
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
21 scopes across agents, billing, calls, evals, events, knowledge, leads, numbers, products, sms, support, webhooks. Each tool's required scope is listed in the table below.
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_....

OAuth callback URLs (native clients)

Dynamic Client Registration (POST /api/oauth/register) accepts either callback mechanism a desktop MCP client offers:

  • A private-use URI scheme per RFC 8252 §7.1 — e.g. cursor://anysphere.cursor-mcp/oauth/callback or vscode://….
  • A loopback HTTP listener per RFC 8252 §7.3 — http://localhost:PORT/… or http://127.0.0.1:PORT/… on any port.
  • Any https:// callback, for hosted/web clients.

Plain http:// callbacks to non-loopback hosts, and script-capable schemes (javascript:, data:, blob:, file:, vbscript:), are rejected with invalid_client_metadata.

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
request_extra_numberReserve an exact pool number and request an owner-only browser review of its recurring extra-line price. Requires numbers:write and billing:write. Never charges included or prepaid capacity; use attach_number for included allocation. This tool does not approve payment or prove activation.billing:writeWrite / external effect
get_extra_number_statusRead an owner-authorized extra-number request. Billing, assignment and live activation are distinct. Unknown checkout or provider outcomes retain the original request and number; never start a replacement purchase.numbers:readRead-only
retry_setupReconcile database pointers for an existing imported signup phone reservation. Owner-only, entitlement-checked, single-flight and idempotent. Never creates agents, buys numbers, changes provider routing or sends messages. PBX, missing imports, and stale claims return review blockers. Reuse the same key to read/replay the outcome; a failed request requires review before a new key. Ready means database agreement, not activation.numbers:writeWrite / external effect
get_setup_recovery_statusRead an owner-authorized setup recovery request by its business and idempotency key. Running requests are never automatically stolen, including stale requests. A ready receipt does not prove live activation.numbers:readRead-only
make_callInitiate an outbound voice preview via a KaiCalls AI agent. This lets the owner hear Kai, but it is preview only and never proves inbound routing or advances activation. Pass an idempotency_key to make the request safely retryable.calls: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 the KaiCalls agents on the authenticated account. Use this before setting anything up, to see whether this business already has a secretary answering its calls.agents:readRead-only
get_business_infoRead back what a business already has: profile details, how many agents are configured, and recent call volume. Start here when someone wants a business number that answers missed calls, so nothing is created twice.agents:readRead-only
get_operational_settingsAudit the business-level operational setup required before changing a live 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_alertsSave business-owned staff alert recipients and post-call escalation rules. Saving settings does not prove provider delivery or owner receipt; activation notification proof is tracked separately.agents:writeWrite / external effect
get_activation_statusRead the persisted proof-first activation status for one accessible business. Returns masked evidence, the exact next action, and whether the command center/full MCP surface is unlocked. It cannot assert or advance proof. A number is not fully set up until the owner's own phone is on file (see owner_phone_on_file) and forwarding is verified — do not report the line as live/working on the strength of proof state alone.agents:readRead-only
confirm_notification_destinationAPPROVAL-GATED. Save the owner-approved SMS or email destination for the exact active activation session. Delivery starts only when the inbound call artifact is ready, and settings alone never count as delivery proof.agents:writeWrite / external effect
retry_activation_notificationAPPROVAL-GATED. Retry only the current terminal or time-eligible activation notification channel for the exact active session. Requires a new idempotency key; ambiguous provider outcomes are never blindly resent.agents:writeWrite / external effect
choose_customer_routeAPPROVAL-GATED. After setup proof is complete, save forwarding, published_number, both, or testing. This unlocks the command center but does not claim customer coverage; selected live routes remain pending until independently verified. A number is not fully set up until the owner's own phone is on file (see get_activation_status / set_owner_phone) and forwarding is verified.numbers: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
list_workflow_templatesList the cadence/campaign workflow templates KaiCalls can run (standard, aggressive, nurture, custom), including each template's retry interval, defaults (call windows, days, attempts), and a ready-to-use cadence_config example. Call this before create_campaign so an external agent can trigger a multi-step sequence with launch=true instead of guessing the cadence_config shape blind. Static catalog — no per-business state.calls:readRead-only
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, numbers.purchase, agent.config.rollback. 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.events:readRead-only
list_plansRead the canonical public KaiCalls plan catalog, monthly USD prices and allowances. Does not select a plan, create checkout, or change billing.billing:readRead-only
get_checkout_statusRead a Stripe-verified subscription checkout receipt for a business you own. Requires business_id and session_id from checkout. Confirmed billing does not prove agent, number, or call activation; use get_activation_status for setup proof. This tool never creates checkout or retries provisioning.billing:readRead-only
get_balanceGet plan terms and usage for accessible businesses. No-card trials report 25 lifetime minutes, zero price and no overage; paid plans report the mapped subscription price and billing-cycle usage. Answered-call allowance usage is the raw billable call count, matching dashboard and right-sizing. A separate weighted count is informational only, not allowance consumption or right-sizing. Phone allowance includes purchased extra lines. A balance does not prove activation or inbound routing. Mirrors GET /api/v1/balance; unavailable billing data returns an error.billing:readRead-only
create_checkoutCreate or resume an owner-bound hosted Stripe checkout for a current plan from list_plans. Requires business_id, plan_id, and a durable idempotency_key. Reuse the same key for retries; a changed plan requires a new key. The owner must open the returned link and authorize payment in Stripe. This tool never proves payment or phone activation. After checkout, use get_checkout_status with the returned session_id.billing:writeWrite / external effect
list_numbersList phone numbers assigned to the accessible business(es), with capability and compliance flags. Assignment does not prove inbound routing, activation, or customer coverage — and a number is not fully set up until the owner's own phone is on file (see get_activation_status / set_owner_phone) and forwarding is verified. Mirrors GET /api/v1/numbers.numbers:readRead-only
get_phone_flowRead how calls ring on the business's hosted phone system: which cells and desk phones ring, for how many seconds, and whether after-hours callers go straight to the AI receptionist. Reconciled from the phone system on every call. Mirrors POST /api/v1/phone-system action=get_flow. Returns 409 when the hosted phone system is not set up for this business.numbers:readRead-only
update_phone_flowReplace how calls ring on the business's hosted phone system with a full phone flow: { version: 1, hours: { mode: 'always' | 'business_hours', afterHours: 'kai' }, ring: { members: [{ kind: 'cell', phone: E.164, label, requirePressOne } | { kind: 'desk_phone' | 'user', userId, label }], timeoutSeconds: 5-120 }, overflow: 'kai' }. Applied idempotently (only real differences are written); every member passes the forwarding-loop guard; business_hours mode derives the schedule from the business hours already on file. Read the current flow with get_phone_flow first and send it back with your edits. Mirrors POST /api/v1/phone-system action=save_flow.numbers:writeWrite / external effect
set_up_phone_systemTurn the business's number into a hosted phone system: Kai is installed as extension 700, the owner's mobile joins a team ring group, and a dial plan rings the team first and hands the call to Kai when nobody picks up. Idempotent and resumable — a re-run reuses everything already created and reports it under `reused`. Needs a complete US street address on file (the emergency-services and tax location) and the owner's mobile: when either is missing the tool fails with `code` missing_address or missing_owner_mobile plus `required_field` and `next_action` saying exactly what to collect — pass it back as business_address or owner_mobile. Returns the status shape (extension, ring group, dial plan ids, the phone-system line) and `next_step`, the one line to relay to the owner (forward your line here / dial 700 from any office phone). Mirrors POST /api/v1/phone-system action=provision.numbers:writeWrite / external effect
get_phone_system_statusRead whether the business's hosted phone system is set up: Kai's extension, the team ring group and dial plan ids (never secrets), the phone-system line, and `next_step` — the one line to relay to the owner. Use it to confirm a set_up_phone_system run or before adding team phones. Mirrors GET /api/v1/phone-system.numbers:readRead-only
add_team_phoneAdd a teammate's (or the owner's) cell to the phone system's team ring group so it rings before Kai answers. Idempotent — a cell already in the group reports ring_group already_member. Owners and admins are also registered on the admin roster, so calling the business line from that cell reaches the admin secretary; a member only rings. The business's own forwarded-from office line is refused (forwarding_loop) because ringing it would bounce the call straight back. Requires the phone system to be set up first (set_up_phone_system). Mirrors POST /api/v1/phone-system action=add_ring_group_member.numbers:writeWrite / external effect
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 voice agent and grade the result. Bills voice-agent 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 agent — the secretary that answers this business’s calls (the live voice agent plus 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
set_owner_phoneSave the owner's own mobile number on the business record so Kai can ring it first and so activation/forwarding follow-ups can reach a human. A number is not fully set up until this is on file and forwarding is verified — connecting the number alone does not prove the owner can be reached. US numbers only; the number is normalized to E.164 and rejected if it cannot be validated as a US mobile/landline number. When ring_first is true (default), also configures ring-first routing so calls hit this cell before overflowing to the secretary — the same path used at signup.agents: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_numberRequest a real phone-number purchase. This is APPROVAL-GATED: the carrier bills immediately on execution, so the tool only prepares a request for authenticated owner review. Caller-supplied human_confirmed, dashboard_session, or system_policy fields never authorize execution. Relay the stored request and review URL to the owner; do not claim a number was purchased while approval is pending. Existing entitlement and carrier reservation checks still apply. Mirrors POST /api/v1/phone-numbers/purchase via numbers.purchase.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_configRequest a rollback to a prior assistant_config_versions snapshot. This changes live greeting, voice, prompt and model settings, so authenticated owner review of the exact stored request is required. Caller-supplied authority fields never authorize execution. Discover a target with list_config_versions or get_change_history; relay the pending request's review URL. The agent.config.rollback executor preserves version recording and secret exclusion after trusted approval.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
list_tool_execution_logsList per-call voice-agent tool execution traces — outcome, latency, timeout, and a redacted result preview for each routed tool call. Mirrors GET /api/v1/tool-execution-logs. Answers "did this tool call actually work".events:readRead-only
list_subscription_historyList plan/price change history from subscription_change_history — the billing analogue of admin_change_history, written from the Stripe webhook and the right-size apply job. Mirrors GET /api/v1/subscription-history.billing:readRead-only
list_overage_chargesList the idempotent overage-minutes ledger from billing_overage_charges (legacy per-minute-overage tiers only — 2026 plans carry no overage). GET /v1/balance/get_balance only returns an aggregate; this returns the underlying per-period ledger rows. Mirrors GET /api/v1/overage-charges.billing:readRead-only
list_rightsize_recommendationsList per-period auto-right-size decisions from plan_rightsize_recommendations, including the dry_run -> notified -> (kept | applied | superseded) lifecycle. Answers "is this business about to get right-sized". Mirrors GET /api/v1/rightsize-recommendations.billing:readRead-only
report_issueReport a problem with your KaiCalls agent, phone number, billing, or account. Saves the report to your change history and notifies KaiCalls support so a person can follow up — use this any time something is broken or not working as expected.support:writeWrite / 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)

  1. Open Settings → Connectors (this link goes straight there), then Add custom connector.
  2. Paste the KaiCalls connector URL: https://www.kaicalls.com/api/mcp.
  3. Sign in with your KaiCalls account and approve the access Claude asks for.
  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.

On Team and Enterprise plans, an organization owner adds the connector first under Organization settings → Connectors; members then connect it from their own Connectors settings. Claude connects from Anthropic's cloud, so the KaiCalls server being publicly reachable is already taken care of.

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.

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

ChatGPT (published app or Developer Mode)

Option 1 — Install the KaiCalls app (recommended, all plans)

KaiCalls is a published, OpenAI-approved app in the ChatGPT directory. This is the fastest path — no developer settings required, and it works on every ChatGPT plan, including Free.

  1. Open the KaiCalls app listing in ChatGPT (or search for "KaiCalls" in the ChatGPT app directory).
  2. Click Connect and sign in with your KaiCalls account.
  3. Approve the permissions and pick the business to connect. Then just ask — "List my recent calls" — or @-mention KaiCalls in a conversation.

On ChatGPT Business, Enterprise, and Edu workspaces an admin must enable the app first under Workspace settings → Apps.

Option 2 — Add the MCP server in Developer mode (paid plans)

  1. Enable Settings → Security and login → Developer mode (also reachable via the connectors/apps settings under Advanced).
  2. Add a connector with the KaiCalls URL https://www.kaicalls.com/api/mcp.
  3. Sign in with your KaiCalls account when prompted.

ChatGPT always signs in through your KaiCalls account; it does not accept pasted API keys. Its connector callback pattern is allowlisted on the KaiCalls authorization server. Write actions — like placing an outbound call — always ask for confirmation before running.

Claude Code

Add the connector once from the CLI, then authenticate:

bash
claude mcp add --transport http kaicalls https://www.kaicalls.com/api/mcp # then, inside Claude Code: /mcp

To share it with a repo instead of your user profile, add --scope project — that writes a .mcp.json your teammates pick up automatically:

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

For headless runs (CI, cron, a container with no browser to complete OAuth in), skip the interactive sign-in and pass a KaiCalls API key instead: claude mcp add --transport http kaicalls https://www.kaicalls.com/api/mcp --header "Authorization: Bearer kc_live_…"

OpenAI Codex

Add KaiCalls to ~/.codex/config.toml:

toml
[mcp_servers.kaicalls] url = "https://www.kaicalls.com/api/mcp"

Or add it from the CLI with codex mcp add kaicalls --url https://www.kaicalls.com/api/mcp. Codex completes the OAuth sign-in on first use.

Codex's support for remote (streamable-HTTP) MCP servers is version-dependent. If your build only accepts local command servers, or the entry above is ignored, bridge to it with mcp-remote:

toml
[mcp_servers.kaicalls] command = "npx" args = ["-y", "mcp-remote", "https://www.kaicalls.com/api/mcp"]

For non-interactive runs, set a KaiCalls API key as a bearer header rather than relying on the browser OAuth flow.

Provisioning many accounts from a coding agent

Agencies and MSPs are the main reason to attach KaiCalls to a coding agent rather than a chat client: the agent can read your own client roster and set each one up. With the connector attached, a single instruction covers the whole job —

Read clients/roster.yaml. For every client without a kaicalls_number,
create a secretary using the prompt in templates/intake.md, buy a local
number in their area code, attach it, point the webhook at our staging
endpoint, and write the number back to the roster.

That runs create_agent, search_available_numbers, buy_number, attach_number, and set_webhook per client. Two related patterns worth knowing:

  • Keep prompts in git. update_agent_config deploys a change, list_config_versions and rollback_config are the undo — every deploy is hashed and versioned, so reverting is a real operation rather than a re-edit.
  • Test in CI. run_eval executes the saved voice scenarios for an agent, so a reworded greeting can't silently break the booking flow. Gate the merge on it.

For a first-time buyer who has no account yet, point the agent at the narrowed setup endpoint https://www.kaicalls.com/api/mcp/acquisition instead — same auth, restricted to the tools that take someone from no account to a number that answers.

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

One click — add KaiCalls to Cursor. Cursor opens with the connector prefilled; approve it and sign in.

Or add it by hand 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 KaiCalls connector URL https://www.kaicalls.com/api/mcp. Le Chat detects the rest automatically.
  3. Sign in with your KaiCalls account, then share the connector with your team as needed.

xAI Grok

  1. Go to grok.com/connectors and click New Connector, then select Custom.
  2. Enter the KaiCalls connector URL https://www.kaicalls.com/api/mcp.
  3. Sign in with your KaiCalls account when Grok prompts you — or, for an unattended setup, paste an API key as a Bearer header Authorization: Bearer kc_live_….
  4. Grok discovers the KaiCalls tools automatically. Allowlist the ones you want (start with read-only tools).

Grok connects from xAI's cloud, and the KaiCalls connector is already publicly reachable over HTTPS — there is nothing to expose or tunnel from your own machine. Grok Business / Enterprise admins can manage connectors org-wide from the same connector management surface.

Manus

  1. Create a KaiCalls API key in the dashboard (Settings → API Keys). For a safe start, scope it to agents:read and calls:read.
  2. In Manus, open Settings → Integrations → Custom MCP Servers → Add Server.
  3. Enter a server name (e.g. KaiCalls), the server URL https://www.kaicalls.com/api/mcp, and your API key (kc_live_…) as the Bearer token.
  4. Manus tests the connection and lists the KaiCalls tools alongside its built-in integrations. Try "List my recent KaiCalls calls" to confirm.

Add calls:write to the key only if Manus should be able to place real outbound calls with make_call.

Google Gemini (app & CLI)

In the consumer Gemini app, custom MCP connectors are available inside Gemini Spark: open Settings & help → Connected Apps on gemini.google.com and paste https://www.kaicalls.com/api/mcp into Add a custom app link (personal Google accounts, web-first; then available on mobile too).

For the Gemini CLI, add the server from a terminal:

bash
gemini mcp add --transport http kaicalls https://www.kaicalls.com/api/mcp \ --header "Authorization: Bearer kc_live_xxxxx"

Omit the header to use OAuth instead — the CLI discovers the KaiCalls authorization server automatically on the first 401 and walks you through sign-in.

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 sign-in (OAuth) or an API key, then complete it with your KaiCalls account.

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 URL is installed correctly, but you have not signed in yet. Open the client's connector manager and authenticate KaiCalls. In Claude Code, run /mcp inside an interactive session and choose KaiCalls.

Sign-in works, but the business you expected isn't there

Each connection is scoped to one business, chosen during sign-in. If you belong to several, pick the right one on the consent screen — to reach another, connect again and choose that one. If the account you signed in with has no business yet, that is not a dead end: sign-in walks you through creating one, including your phone number, and returns you to your assistant already connected. Seeing no business you recognise usually means you signed in with a different KaiCalls login than the one the business belongs to.

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.

Frequently asked questions

What is the KaiCalls MCP server?

It is the single URL — https://www.kaicalls.com/api/mcp — that connects your KaiCalls account to an AI assistant such as Claude, ChatGPT, Grok, or Manus. Once it is added, that assistant can read your KaiCalls calls, leads, voicemails, and analytics, and — with your permission — place outbound calls or update your AI receptionist, all scoped to one business you approve. MCP is the Model Context Protocol, the open standard that URL speaks; you do not need to know anything about it to use it.

How do I connect KaiCalls to ChatGPT?

The fastest way is the published KaiCalls app: open the KaiCalls listing in the ChatGPT app directory (chatgpt.com/plugins), click Connect, and sign in with your KaiCalls account. Alternatively, on a paid ChatGPT plan you can enable Developer mode and add https://www.kaicalls.com/api/mcp as a custom connector, then sign in the same way. ChatGPT signs you in through your own KaiCalls account — there is no API key to paste.

How do I connect KaiCalls to Claude?

In Claude (web or desktop), open Settings → Connectors → Add custom connector, paste https://www.kaicalls.com/api/mcp, and approve the KaiCalls sign-in screen. In Claude Code, run: claude mcp add --transport http kaicalls https://www.kaicalls.com/api/mcp and authenticate with /mcp. On Team and Enterprise plans an organization owner adds the connector first.

How do I connect KaiCalls to Grok?

Go to grok.com/connectors, click New Connector, choose Custom, and enter the KaiCalls MCP server URL https://www.kaicalls.com/api/mcp. Complete the sign-in when prompted — Grok supports OAuth or an API-key header. Grok then discovers the KaiCalls tools and makes them available in conversations.

How do I connect KaiCalls to Manus?

In Manus, open Settings → Integrations → Custom MCP Servers → Add Server. Enter a name (for example, KaiCalls), the server URL https://www.kaicalls.com/api/mcp, and a KaiCalls API key (kc_live_…) as the Bearer token. Create the key at kaicalls.com/dashboard/settings/api-keys. Manus tests the connection and lists the KaiCalls tools next to its built-in integrations.

Do I need an API key to connect?

Usually not. Hosted chat assistants (ChatGPT, Claude, Grok, Gemini, Mistral, Perplexity) sign you in with your normal KaiCalls account — you approve a consent screen and pick a business, with no key to paste. Developer tools (Claude Code, Cursor, VS Code, Windsurf, Manus) can instead use a KaiCalls API key sent as Authorization: Bearer kc_live_…, created in the KaiCalls dashboard under Settings → API Keys.

What can a connected AI assistant access, and is it safe?

Each connection is scoped to exactly one business that you pick on the KaiCalls consent screen, with explicit permission scopes. Read-only tools (calls, transcripts, leads, voicemails, analytics) are separate from write tools; placing a real outbound call requires the calls:write scope and client-side confirmation. You can revoke a connection at any time from your KaiCalls account.

Which AI clients work with the KaiCalls MCP server?

Any client that supports remote MCP servers over streamable HTTP: ChatGPT (published app or Developer mode), Claude and Claude Code, xAI Grok, Manus, Google Gemini (Spark custom apps and the Gemini CLI), Perplexity, Mistral Le Chat, Microsoft Copilot Studio, VS Code and GitHub Copilot, Cursor, Windsurf, Smithery, and developer runtimes like Z.ai, Hermes, and OpenClaw.

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