# KaiCalls (remote · www.kaicalls.com)

AI phone secretary: place calls, read transcripts, list calls, agents, and stats.

- Trust score: 39/100 (low)
- Change this week: −28
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-04

## Components

- remote · `www.kaicalls.com`: 39/100 (this document), [markdown](https://verifymcp.io/servers/com-kaicalls-kaicalls/api-mcp.md), [page](https://verifymcp.io/servers/com-kaicalls-kaicalls/api-mcp)

## Channel facts

- Endpoint: `https://www.kaicalls.com/api/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.1`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-04.

- **Endpoint Security**: 97/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server supports Client ID Metadata Documents, the current MCP client-registration mechanism.
- **Transport & Reachability**: 0/100
  - Transport blocked by authentication: the endpoint requires auth we don't have to verify streamable-http.
- **Schema Quality & AI Usability**: 0/100
  - Schema blocked by authentication: the endpoint requires auth we don't have to read it.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 0/100
  - Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.
- **Capabilities**: 0/100
  - Capabilities blocked by authentication: the endpoint requires auth we don't have to read them.

**Unverified: 5 categories.** Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.

## Install

### Claude

```bash
claude mcp add --transport http com-kaicalls-kaicalls https://www.kaicalls.com/api/mcp
```

### Codex

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

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-kaicalls-kaicalls": {
      "type": "remote",
      "url": "https://www.kaicalls.com/api/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-kaicalls-kaicalls --url https://www.kaicalls.com/api/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-kaicalls-kaicalls:
    url: "https://www.kaicalls.com/api/mcp"
```

### Other

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

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-01 (score 39, −36)

- [security regression] Endpoint reachability: reachable → behind authorisation
- [security regression] Transport: pass → unverified
- [security regression] Stability: 0.17 → unverified
- [security] Authorization: The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata.
- [functional regression] Capabilities: fail → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-31 (score 75, +7)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 68, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 67, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 66)

First indexed and scored.

## MCP tools (51)

### `make_call` (~195 tokens)

Make Call

Initiate a real outbound phone call via a KaiCalls AI agent. Pass an idempotency_key to make the request safely retryable: a replay with the same key returns the original call instead of dialing again, and the same key with different arguments is rejected.

Input parameters:

- `agent_id` (string, required): KaiCalls agent ID to use for the call
- `context` (string): Call context or reason (optional)
- `first_message` (string): Override the agent greeting message (optional)
- `idempotency_key` (string): Client-chosen key that makes this call exactly-once: retries with the same key never place a second call (optional but recommended)
- `lead_id` (string): Existing lead ID to associate (optional)
- `name` (string): Caller/lead name (optional)
- `to` (string, required): Phone number to call (E.164 format, e.g. +19085551234)

Output parameters:

- `call` (object)
- `error` (string): Present when success is false
- `idempotency_key` (string)
- `intent_id` (string)
- `replayed` (boolean)
- `success` (boolean): Whether the tool completed successfully

### `check_call_status` (~32 tokens)

Check Call Status

Check the status of a call by its ID

Input parameters:

- `call_id` (string, required): The call ID to check

Output parameters:

- `call` (object)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully

### `list_recent_calls` (~77 tokens)

List Recent Calls

List recent calls for the authenticated business

Input parameters:

- `agent_id` (string): Filter by agent ID (optional)
- `limit` (integer): Max results to return (default 20, max 100)
- `offset` (integer): Zero-based pagination offset (default 0)
- `status` (string): Filter by status (optional)

Output parameters:

- `calls` (array)
- `count` (integer)
- `error` (string): Present when success is false
- `filters` (object)
- `has_more` (boolean)
- `limit` (integer)
- `next_offset` (integer|null)
- `offset` (integer)
- `success` (boolean): Whether the tool completed successfully

### `get_transcript` (~35 tokens)

Get Transcript

Get the transcript and summary of a completed call

Input parameters:

- `call_id` (string, required): The call ID to get the transcript for

Output parameters:

- `call` (object)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully
- `transcript` (string|null)
- `transcript_available` (boolean)
- `transcript_length` (integer)
- `transcript_truncated` (boolean)

### `get_call_recording` (~53 tokens)

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.

Input parameters:

- `call_id` (string, required): The KaiCalls call ID to get the recording for

Output parameters:

- `call` (object)
- `error` (string): Present when success is false
- `recording_available` (boolean)
- `success` (boolean): Whether the tool completed successfully

### `list_agents` (~71 tokens)

List Agents

List KaiCalls agents available to the authenticated account

Input parameters:

- `business_id` (string): Business ID to filter by (optional, must be accessible)
- `limit` (integer): Max results to return (default 50, max 100)
- `offset` (integer): Zero-based pagination offset (default 0)

Output parameters:

- `agents` (array)
- `count` (integer)
- `error` (string): Present when success is false
- `filters` (object)
- `has_more` (boolean)
- `limit` (integer)
- `next_offset` (integer|null)
- `offset` (integer)
- `success` (boolean): Whether the tool completed successfully

### `get_business_info` (~39 tokens)

Get Business Info

Get business information, agent count, and recent call stats

Input parameters:

- `business_id` (string): Business ID (optional, defaults to first accessible business)

Output parameters:

- `agent_count` (integer)
- `business` (object)
- `calls_last_30_days` (integer)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully

### `get_operational_settings` (~69 tokens)

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.

Input parameters:

- `business_id` (string): Business ID (optional, defaults to first accessible business)

Output parameters:

- `agents` (array)
- `available_setup_tools` (array)
- `business` (object)
- `business_links` (array)
- `error` (string): Present when success is false
- `notification_settings` (object|null)
- `success` (boolean): Whether the tool completed successfully

### `configure_staff_alerts` (~207 tokens)

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.

Input parameters:

- `business_id` (string): Business ID (optional only when the token has exactly one accessible business)
- `dry_run` (boolean): Validate and show the proposed settings without writing.
- `email_notifications` (boolean): Enable or disable email staff alerts for this business.
- `escalation_rules` (array): Post-call escalation rules evaluated against completed transcripts. Each rule is { id?, when, then, enabled? }. v1 action then includes text_owner.
- `notification_email` (string|array): Comma-separated string or array of staff email addresses that receive escalation emails.
- `notification_phone` (string|array): Comma-separated string or array of staff phone numbers that receive SMS escalation alerts.
- `sms_notifications` (boolean): Enable or disable SMS staff alerts for this business.

Output parameters:

- `business_id` (string)
- `current_settings` (object|null)
- `dry_run` (boolean)
- `error` (string): Present when success is false
- `proposed_settings` (object)
- `settings` (object)
- `success` (boolean): Whether the tool completed successfully

### `configure_textable_links` (~125 tokens)

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.

Input parameters:

- `business_id` (string): Business ID (optional only when the token has exactly one accessible business)
- `dry_run` (boolean): Validate and show create/update plan without writing.
- `links` (array, required): Links to create/update by link_key. New links require label and destination_url. Existing links can be deactivated with is_active=false.

Output parameters:

- `business_id` (string)
- `dry_run` (boolean)
- `error` (string): Present when success is false
- `links` (array)
- `plan` (array)
- `success` (boolean): Whether the tool completed successfully

### `configure_agent_business_rules` (~318 tokens)

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.

Input parameters:

- `actor` (object): Who is asking: { type: agent|human|system|integration, id, display_name }.
- `agent_id` (string, required): KaiCalls agent ID to update
- `authority` (object): Human-grade authority for live prompt changes: { mode: human_confirmed|dashboard_session|system_policy, confirmed_by, confirmed_at, confirmation_ref }.
- `business_id` (string): Business ID. Required when the agent has multiple accessible assignments.
- `dry_run` (boolean): Validate and show the prompt patch metadata without writing.
- `idempotency_key` (string): Required for writes. Reuse the same key when retrying the same proposed prompt change.
- `mode` (string): replace (default) or append.
- `queue_for_approval` (boolean): When authority is missing, create a pending dashboard approval instead of returning needs_approval.
- `rules` (array, required): Plain-language operational rules to insert as bullets, e.g. callback capture, sister-location boundaries, urgent alert handling.
- `section_title` (string): Prompt section heading to replace/append. Default: Operational handoff rules.
- `source_ref` (string): External source reference, such as a support ticket or Claude conversation ID.

Output parameters:

- `agent_id` (string|null)
- `approval` (object|null)
- `business_id` (string|null)
- `code` (string|null)
- `error` (string): Present when success is false
- `request_id` (string|null)
- `result` (object|null)
- `rules_count` (integer|null)
- `section_title` (string|null)
- `status` (string)
- `success` (boolean): Whether the tool completed successfully
- `summary` (object|null)

### `list_leads` (~107 tokens)

List Leads

List leads for the authenticated business, with optional status/source/agent filters. Includes the latest AI lead score when available.

Input parameters:

- `agent_id` (string): Filter by agent ID (optional)
- `limit` (integer): Max results to return (default 50, max 100)
- `offset` (integer): Zero-based pagination offset (default 0)
- `source` (string): Filter by lead source (optional)
- `status` (string): Filter by lead status (optional)

Output parameters:

- `count` (integer)
- `error` (string): Present when success is false
- `filters` (object)
- `has_more` (boolean)
- `leads` (array)
- `limit` (integer)
- `next_offset` (integer|null)
- `offset` (integer)
- `success` (boolean): Whether the tool completed successfully

### `get_lead` (~41 tokens)

Get Lead

Get full details for a single lead by ID, including the latest AI lead score and explanation.

Input parameters:

- `lead_id` (string, required): The lead ID to fetch

Output parameters:

- `error` (string): Present when success is false
- `lead` (object)
- `success` (boolean): Whether the tool completed successfully

### `list_voicemails` (~60 tokens)

List Voicemails

List recent voicemails for the authenticated business, including transcripts and recording URLs.

Input parameters:

- `limit` (integer): Max results to return (default 20, max 100)
- `offset` (integer): Zero-based pagination offset (default 0)

Output parameters:

- `count` (integer)
- `error` (string): Present when success is false
- `has_more` (boolean)
- `limit` (integer)
- `next_offset` (integer|null)
- `offset` (integer)
- `success` (boolean): Whether the tool completed successfully
- `voicemails` (array)

### `list_sms_messages` (~93 tokens)

List SMS Messages

List recent SMS messages for the authenticated business. Filter by conversation or direction (inbound/outbound).

Input parameters:

- `conversation_id` (string): Filter by conversation ID (optional)
- `direction` (string): Filter by direction: inbound or outbound (optional)
- `limit` (integer): Max results to return (default 50, max 100)
- `offset` (integer): Zero-based pagination offset (default 0)

Output parameters:

- `count` (integer)
- `error` (string): Present when success is false
- `filters` (object)
- `has_more` (boolean)
- `limit` (integer)
- `messages` (array)
- `next_offset` (integer|null)
- `offset` (integer)
- `success` (boolean): Whether the tool completed successfully

### `list_campaigns` (~65 tokens)

List Campaigns

List outbound call campaigns for the authenticated business.

Input parameters:

- `limit` (integer): Max results to return (default 25, max 100)
- `offset` (integer): Zero-based pagination offset (default 0)
- `status` (string): Filter by campaign status (optional)

Output parameters:

- `campaigns` (array)
- `count` (integer)
- `error` (string): Present when success is false
- `filters` (object)
- `has_more` (boolean)
- `limit` (integer)
- `next_offset` (integer|null)
- `offset` (integer)
- `success` (boolean): Whether the tool completed successfully

### `create_campaign` (~181 tokens)

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.

Input parameters:

- `agent_id` (string): Agent ID to place the calls. Required when launch is true.
- `business_id` (string): Business ID (required only when the token can access multiple businesses).
- `cadence_config` (object, required): Cadence configuration. { template: standard|aggressive|nurture|custom, attempts: number }.
- `description` (string): Optional campaign description.
- `launch` (boolean): When true, launch the campaign immediately after creating it.
- `lead_ids` (array): Lead IDs to enroll in the campaign (optional at create time).
- `name` (string, required): Campaign name.

Output parameters:

- `campaign` (object)
- `error` (string): Present when success is false
- `launched` (boolean)
- `queued` (integer|null)
- `sequence_id` (string|null)
- `success` (boolean): Whether the tool completed successfully
- `total_leads` (integer|null)

### `list_workflow_templates` (~90 tokens)

List Workflow Templates

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

Output parameters:

- `cadence_config_fields` (array)
- `defaults` (object)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully
- `templates` (array)
- `usage` (string)

### `get_analytics` (~62 tokens)

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.

Input parameters:

- `days` (integer): Lookback window in days (default 30, max 90)

Output parameters:

- `agents` (object)
- `calls` (object)
- `error` (string): Present when success is false
- `leads` (object)
- `outcomes` (object)
- `outcomes_total` (integer)
- `period` (object)
- `success` (boolean): Whether the tool completed successfully

### `upsert_lead` (~256 tokens)

Create or Update 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.

Input parameters:

- `business_id` (string): Business ID. Required for create when the API key can access multiple businesses.
- `lead` (object): Fields for a NEW lead: name, first_name, last_name, phone, email, status, source, notes, address, city, state, zip, agent_id, message. At least one of name/phone/email is required.
- `updates` (array): Update existing leads. Each item is { id, ...fields } where fields are a subset of name, first_name, last_name, email, phone, status, source, notes, address, city, state, zip. Max 100 per call.

Output parameters:

- `error` (string): Present when success is false
- `failed` (integer|null)
- `lead` (object|null)
- `operation` (string): create or update
- `results` (array|null)
- `success` (boolean): Whether the tool completed successfully
- `updated` (integer|null)

### `send_sms` (~213 tokens)

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.

Input parameters:

- `from_agent_id` (string, required): Agent ID whose phone line the text is sent from.
- `idempotency_key` (string): Optional caller-supplied key. A replay with the same key returns the original send outcome instead of sending again — use it when retrying after an uncertain response.
- `lead_id` (string): Optional lead ID to link and honor the lead's automation-pause state.
- `message` (string, required): Text message body.
- `to` (string, required): Recipient phone number in E.164 format (e.g. +18135551234).

Output parameters:

- `error` (string): Present when success is false
- `from` (string|null)
- `message_sid` (string|null)
- `success` (boolean): Whether the tool completed successfully
- `to` (string|null)

### `update_agent_config` (~464 tokens)

Update Agent Configuration

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.

Input parameters:

- `actor` (object): Who is asking: { type: agent|human|system|integration, id, display_name }.
- `agent_id` (string, required): KaiCalls agent ID to update.
- `authority` (object): Human-grade authority for live changes: { mode: human_confirmed|dashboard_session|system_policy, confirmed_by, confirmed_at, confirmation_ref }.
- `business_id` (string): Business ID. Required when the agent has multiple accessible assignments.
- `dry_run` (boolean): Validate and summarize the change without writing.
- `first_message` (string): Spoken greeting / first message callers hear.
- `idempotency_key` (string): Required for writes. Reuse the same key when retrying the same change.
- `inbound_prompt` (string): Full inbound system prompt that drives the agent.
- `max_duration` (integer): Maximum call duration in seconds.
- `model` (object): Language model selection: { provider, model, temperature }.
- `name` (string): Agent display name.
- `outbound_prompt` (string): Outbound (campaign) system prompt.
- `queue_for_approval` (boolean): When authority is missing, create a pending dashboard approval instead of returning needs_approval.
- `sms_prompt` (string): SMS reply prompt.
- `source_ref` (string): External source reference, such as a support ticket or conversation ID.
- `transfer_enabled` (boolean): Enable/disable live call transfer.
- `transfer_phone_number` (string): Number to transfer qualified calls to.
- `voice` (object): Voice selection: { provider, voiceId }.

Output parameters:

- `agent_id` (string|null)
- `approval` (object|null)
- `business_id` (string|null)
- `code` (string|null)
- `error` (string): Present when success is false
- `message` (string|null)
- `request_id` (string|null)
- `result` (object|null)
- `risk_level` (string|null)
- `status` (string)
- `success` (boolean): Whether the tool completed successfully
- `summary` (object|null)

### `request_kaicalls_update` (~514 tokens)

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

Input parameters:

- `actor` (object): Who is asking: { type: agent|human|system|integration, id, display_name }.
- `authority` (object): How the change was authorized: { mode: none|agent_asserted|human_confirmed|dashboard_session|system_policy, confirmed_by, confirmed_at, confirmation_ref }. human_confirmed requires all three confirma…
- `business_id` (string): Business ID. Required when the API key can access multiple businesses.
- `dry_run` (boolean): Validate tenant, scope, schema, authority, and policy without executing.
- `idempotency_key` (string): Required for any mutating request. Repeating a key returns the original outcome instead of re-running provider side effects.
- `intent` (string, required): Update intent: phone.emergency_address.set, transcripts.sink.configure, agent.patch, numbers.purchase, or agent.config.rollback
- `payload` (object): Intent payload. E911: address + disclosure_acknowledged=true. transcripts: webhook_url + events. agent.patch: name, inbound_prompt, outbound_prompt, sms_prompt, first_message, voice, model, max_durat…
- `queue_for_approval` (boolean): When authority is missing, create a pending dashboard approval instead of returning needs_approval.
- `reason` (string): Required when changing raw vapi_config; recorded in the durable audit.
- `requester` (object): Optional legacy requester metadata for audit trails (prefer actor).
- `source_ref` (string): External source reference, such as a Discord message or automation run ID.
- `target` (object): Target identifiers, e.g. { phone_number } for E911 or { agent_id } for agent.patch.

Output parameters:

- `approval` (object|null)
- `business_id` (string|null)
- `code` (string|null)
- `error` (string): Present when success is false
- `intent` (string|null)
- `message` (string|null)
- `missing_fields` (array|null)
- `request_id` (string|null)
- `result` (object|null)
- `risk_level` (string|null)
- `status` (string)
- `success` (boolean): Whether the tool completed successfully
- `summary` (object|null)

### `get_usage` (~85 tokens)

Get API Usage

List recent API usage events (endpoint, method, status code, cost) for the caller's account. Mirrors GET /api/v1/usage.

Input parameters:

- `end` (string): ISO date/time upper bound (optional).
- `limit` (integer): Max results to return (default 100, max 500).
- `start` (string): ISO date/time lower bound (optional).

Output parameters:

- `error` (string): Present when success is false
- `has_more` (boolean)
- `success` (boolean): Whether the tool completed successfully
- `usage` (array)

### `get_balance` (~33 tokens)

Get Balance

Get per-business minutes-used and subscription status across every business the caller can access. Mirrors GET /api/v1/balance.

Output parameters:

- `businesses` (array)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully

### `list_numbers` (~48 tokens)

List Phone Numbers

List phone numbers owned by the accessible business(es), with capability and compliance flags. Mirrors GET /api/v1/numbers.

Input parameters:

- `business_id` (string): Business ID to filter by (optional).

Output parameters:

- `error` (string): Present when success is false
- `numbers` (array)
- `success` (boolean): Whether the tool completed successfully

### `list_conversations` (~58 tokens)

List SMS Conversations

List SMS conversation threads (counterparty timeline metadata) for the authenticated business, most recent first. Mirrors GET /api/v1/sms/conversations.

Input parameters:

- `limit` (integer): Max results to return (default 50, max 100).

Output parameters:

- `conversations` (array)
- `error` (string): Present when success is false
- `has_more` (boolean)
- `success` (boolean): Whether the tool completed successfully

### `get_conversation` (~44 tokens)

Get SMS Conversation

Get a single SMS conversation thread by ID. Mirrors GET /api/v1/sms/conversations?id=.

Input parameters:

- `conversation_id` (string, required): The conversation ID to fetch.

Output parameters:

- `conversation` (object)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully

### `get_webhook` (~55 tokens)

Get Webhook Configuration

List the configured outbound webhook(s) for a business, including supported event types. Mirrors GET /api/v1/webhooks.

Input parameters:

- `business_id` (string): Business ID (optional only when the token can access exactly one business).

Output parameters:

- `business_id` (string)
- `error` (string): Present when success is false
- `events` (array)
- `success` (boolean): Whether the tool completed successfully
- `webhooks` (array)

### `set_webhook` (~139 tokens)

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.

Input parameters:

- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `description` (string): Human label for this webhook.
- `events` (array): Event types to subscribe to (see get_webhook for the supported list).
- `id` (string): Existing webhook ID to update (omit to create new).
- `is_active` (boolean): Enable or disable delivery.
- `webhook_url` (string, required): HTTPS/HTTP destination URL for event delivery.

Output parameters:

- `business_id` (string)
- `error` (string): Present when success is false
- `events` (array)
- `message` (string)
- `success` (boolean): Whether the tool completed successfully
- `webhook` (object)
- `webhook_secret` (string|null)

### `delete_webhook` (~59 tokens)

Delete Webhook

Remove a business outbound webhook by ID. Mirrors DELETE /api/v1/webhooks.

Input parameters:

- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `id` (string, required): Webhook ID to remove.

Output parameters:

- `business_id` (string)
- `error` (string): Present when success is false
- `message` (string)
- `success` (boolean): Whether the tool completed successfully

### `list_evals` (~48 tokens)

List Agent Evals

List canned mock-conversation eval scenarios for an agent (or all accessible agents). Mirrors GET /api/v1/evals.

Input parameters:

- `agent_id` (string): Filter by agent ID (optional).

Output parameters:

- `error` (string): Present when success is false
- `evals` (array)
- `success` (boolean): Whether the tool completed successfully

### `run_eval` (~127 tokens)

Run Agent 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.

Input parameters:

- `agent_id` (string): Run every eval scenario for this agent.
- `eval_id` (string): Run a single eval scenario by ID.
- `max_wait_ms` (integer): Per-run wait cap in ms when wait is true (default 60000, max 110000).
- `wait` (boolean): Block until the run completes (default true).

Output parameters:

- `completed` (integer|null)
- `error` (string): Present when success is false
- `failed` (integer|null)
- `passed` (boolean|null)
- `results` (array|object|null)
- `run_id` (string|null)
- `status` (string|null)
- `success` (boolean): Whether the tool completed successfully
- `total` (integer|null)
- `vapi_run_id` (string|null)

### `list_voices` (~102 tokens)

List Voice Catalog

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.

Input parameters:

- `gender` (string): Filter by gender: male or female.
- `language` (string): Filter by language label, e.g. English or Spanish.
- `provider` (string): Filter by provider, e.g. vapi, 11labs, or azure.

Output parameters:

- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully
- `voices` (array)

### `create_agent` (~234 tokens)

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.

Input parameters:

- `business_id` (string, required): Business ID to create the agent under.
- `first_message` (string): Spoken greeting (optional).
- `metadata` (object): Extra KaiCalls metadata to store (optional).
- `model` (object): Language model selection: { provider, model, temperature } (optional).
- `name` (string, required): Agent display name.
- `system_prompt` (string, required): The agent's inbound system prompt / instructions.
- `voice` (object): Raw voice selection: { provider, voiceId } (optional).
- `voice_catalog_id` (string): Preferred: a curated catalog id from list_voices (optional).

Output parameters:

- `agent` (object)
- `compliance` (object)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully

### `attach_number` (~116 tokens)

Attach Phone 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.

Input parameters:

- `agent_id` (string): Agent ID to route this number to directly (optional).
- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `phone_number` (string, required): E.164 phone number already in the registry.

Output parameters:

- `business_id` (string)
- `error` (string): Present when success is false
- `number` (object)
- `success` (boolean): Whether the tool completed successfully

### `detach_number` (~70 tokens)

Detach Phone Number

Release a phone number from a business back to the unassigned registry pool. Mirrors DELETE /api/v1/phone-numbers.

Input parameters:

- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `phone_number` (string, required): E.164 phone number to release.

Output parameters:

- `business_id` (string)
- `error` (string): Present when success is false
- `released_phone_number` (string)
- `success` (boolean)

### `search_available_numbers` (~84 tokens)

Search Available Numbers

Search the carrier for phone numbers available to purchase (real-time Twilio inventory lookup). Mirrors GET /api/v1/phone-numbers/search.

Input parameters:

- `area_code` (string): Preferred area code (optional).
- `country` (string): Two-letter country code (default US).
- `limit` (integer): Max results to return (default 10, max 20).

Output parameters:

- `available_numbers` (array)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully

### `buy_number` (~466 tokens)

Buy Phone 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, so the purchase is APPROVAL-GATED: without human-grade authority (an authority envelope with mode human_confirmed, or a dashboard approval) the tool executes nothing and returns a pending_approval record the business owner approves or denies from the dashboard — relay the returned confirmation text to them. Agent-initiated purchases never run unattended. Does not auto-attach an agent; call attach_number afterward to route it. Mirrors POST /api/v1/phone-numbers/purchase via the numbers.purchase update intent. Compliance: KaiCalls automatically applies state-aware AI-disclosure and consent handling to numbers it provisions, and flags high-risk business categories for extra review.

Input parameters:

- `actor` (object): Who is asking: { type: agent|human|system|integration, id, display_name }.
- `agent_id` (string): Agent ID to route this number to directly once purchased (optional; requires the number to also be voice-runtime-imported, which is not guaranteed at purchase time — prefer a follow-up attach_number…
- `authority` (object): How the purchase was authorized: { mode, confirmed_by, confirmed_at, confirmation_ref }. human_confirmed requires all three confirmation fields; anything weaker returns pending_approval.
- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `dry_run` (boolean): Validate tenant, scope, and policy without buying anything.
- `idempotency_key` (string): Stable key for the purchase request; repeating it returns the original outcome. Defaults to a key derived from the phone number — pass your own to retry a previously failed purchase.
- `phone_number` (string, required): The exact E.164 phone number to purchase, as returned by search_available_numbers.
- `queue_for_approval` (boolean): When authority is insufficient, create a durable dashboard approval (default true). Set false to get needs_approval and retry yourself with the same idempotency_key once a human confirms.
- `reason` (string): Optional reason recorded in the durable audit.
- `source_ref` (string): External source reference, such as a ticket or automation run ID.

Output parameters:

- `approval` (object|null)
- `business_id` (string|null)
- `code` (string|null)
- `error` (string): Present when success is false
- `message` (string|null)
- `request_id` (string|null)
- `result` (object|null): On executed: { number, vapi_registered, agent_attached, compliance: { high_risk_category, disclosure_note } }.
- `risk_level` (string|null)
- `status` (string)
- `success` (boolean): Whether the tool completed successfully
- `summary` (object|null)

### `list_knowledge` (~75 tokens)

List Agent Knowledge

List agent knowledge base entries for a business. Mirrors GET /api/v1/knowledge.

Input parameters:

- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `category` (string): Filter by category (optional).
- `query` (string): Free-text search over title/content (optional).

Output parameters:

- `error` (string): Present when success is false
- `knowledge` (array)
- `success` (boolean): Whether the tool completed successfully

### `upsert_knowledge` (~120 tokens)

Create or Update Agent 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.

Input parameters:

- `business_id` (string): Business ID. Required for create when the token can access multiple businesses.
- `category` (string)
- `content` (string)
- `content_type` (string)
- `id` (string): Knowledge item ID to update (omit to create).
- `tags` (array)
- `title` (string)

Output parameters:

- `error` (string): Present when success is false
- `knowledge` (object|null)
- `success` (boolean): Whether the tool completed successfully

### `list_products` (~88 tokens)

List Agent Products

List a business's agent product catalog. Mirrors GET /api/v1/products.

Input parameters:

- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `category` (string): Filter by category (optional).
- `inventory` (boolean): Include current inventory quantity per product (optional).
- `query` (string): Free-text search over name/description (optional).

Output parameters:

- `error` (string): Present when success is false
- `products` (array)
- `success` (boolean): Whether the tool completed successfully

### `upsert_product` (~140 tokens)

Create or Update Agent 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.

Input parameters:

- `attributes` (object)
- `business_id` (string): Business ID. Required for create when the token can access multiple businesses.
- `category` (string)
- `description` (string)
- `id` (string): Product ID to update (omit to create).
- `name` (string)
- `price` (number)
- `quantity` (number): Inventory quantity to set (optional).
- `sku` (string)

Output parameters:

- `error` (string): Present when success is false
- `product` (object|null)
- `success` (boolean): Whether the tool completed successfully

### `list_config_versions` (~121 tokens)

List Agent 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.

Input parameters:

- `agent_id` (string, required): Agent ID (required).
- `limit` (integer): Max versions to return when listing (optional, default 50, max 100).
- `version` (integer): Fetch a single version by its per-agent version_number, including its redacted config_snapshot (optional; omit to list).

Output parameters:

- `agent_id` (string)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully
- `version` (object|null)
- `versions` (array)

### `get_change_history` (~123 tokens)

Get Agent 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.

Input parameters:

- `agent_id` (string, required): Agent ID to fetch change history for.
- `limit` (integer): Max results to return (default 20, max 100).

Output parameters:

- `agent_id` (string)
- `changes` (array)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully

### `rollback_config` (~490 tokens)

Rollback Agent Configuration

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. This OVERWRITES the live deployed config, so it is APPROVAL-GATED: without human-grade authority (an authority envelope with mode human_confirmed, or a dashboard approval) the tool executes nothing and returns a pending_approval record the business owner approves or denies from the dashboard — relay the returned confirmation text to them. Agent-initiated rollbacks never run unattended. Wraps the same version-restore logic as POST /api/v1/agents/rollback and the admin_rollback_change voice tool, via the agent.config.rollback update intent. Discover a target with list_config_versions or get_change_history. Every executed rollback records a new config version; to repeat a rollback that already executed, pass a fresh idempotency_key.

Input parameters:

- `actor` (object): Who is asking: { type: agent|human|system|integration, id, display_name }.
- `agent_id` (string, required): Agent ID to roll back.
- `authority` (object): How the rollback was authorized: { mode, confirmed_by, confirmed_at, confirmation_ref }. human_confirmed requires all three confirmation fields; anything weaker returns pending_approval.
- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `dry_run` (boolean): Validate tenant, scope, and policy without touching the live config.
- `idempotency_key` (string): Stable key for the rollback request; repeating it returns the original outcome. Defaults to a key derived from agent + version — pass a fresh key to repeat a rollback that already executed.
- `queue_for_approval` (boolean): When authority is insufficient, create a durable dashboard approval (default true). Set false to get needs_approval and retry yourself with the same idempotency_key once a human confirms.
- `reason` (string): Optional human-readable reason recorded in the audit trail.
- `source_ref` (string): External source reference, such as a ticket or automation run ID.
- `version_id` (string): Target assistant_config_versions row id to restore. One of version_number/version_id is required.
- `version_number` (integer): Target assistant_config_versions.version_number to restore. One of version_number/version_id is required.

Output parameters:

- `agent_id` (string)
- `approval` (object|null)
- `business_id` (string|null)
- `code` (string|null)
- `error` (string): Present when success is false
- `message` (string|null)
- `request_id` (string|null)
- `result` (object|null): On executed: { agent_id, restored_from_version, restored_fields, skipped_fields, new_version_number, warning? }.
- `risk_level` (string|null)
- `status` (string)
- `success` (boolean): Whether the tool completed successfully
- `summary` (object|null)

### `list_observability_events` (~245 tokens)

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.

Input parameters:

- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `call_id` (string): Runtime-event call UUID filter.
- `connection_id` (string): Integration connection UUID filter.
- `conversation_id` (string): Runtime-event filter.
- `correlation_id` (string): Runtime-event filter.
- `cursor` (string): Opaque next_cursor returned by the previous page.
- `event_type` (string): Runtime-event filter.
- `from` (string)
- `limit` (integer)
- `object_id` (string): Integration-delivery filter.
- `object_type` (string): Integration-delivery filter.
- `operation` (string): Integration-delivery filter.
- `outcome` (string): Integration-delivery filter.
- `provider` (string): Integration-delivery filter.
- `severity` (string): Runtime-event filter.
- `source` (string): Event stream to read (default: all).
- `to` (string)

Output parameters:

- `business_id` (string)
- `error` (string): Present when success is false
- `events` (array)
- `pagination` (object)
- `success` (boolean): Whether the tool completed successfully

### `list_tool_execution_logs` (~185 tokens)

List Tool Execution Logs

List per-call Vapi tool execution traces from vapi_tool_execution_logs — 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".

Input parameters:

- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `call_id` (string): Vapi call/conversation id filter.
- `from` (string)
- `limit` (integer)
- `outcome_status` (string): Outcome envelope status filter (e.g. success, needs_clarification, unavailable, queued, retryable_delay, hard_failure).
- `to` (string)
- `tool_call_id` (string): Exact tool_call_id filter.
- `tool_name` (string): Tool name filter (e.g. send_sms).

Output parameters:

- `business_id` (string)
- `error` (string): Present when success is false
- `logs` (array)
- `success` (boolean): Whether the tool completed successfully

### `list_subscription_history` (~118 tokens)

List Subscription Change History

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

Input parameters:

- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `change_type` (string)
- `from` (string)
- `limit` (integer)
- `source` (string): e.g. stripe_webhook, rightsize_apply_job.
- `to` (string)

Output parameters:

- `business_id` (string)
- `changes` (array)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully

### `list_overage_charges` (~128 tokens)

List Overage Charges

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

Input parameters:

- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `from` (string)
- `limit` (integer)
- `status` (string)
- `to` (string)

Output parameters:

- `business_id` (string)
- `charges` (array)
- `error` (string): Present when success is false
- `success` (boolean): Whether the tool completed successfully

### `list_rightsize_recommendations` (~124 tokens)

List Plan Right-Size Recommendations

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

Input parameters:

- `action` (string)
- `business_id` (string): Business ID (optional only when the token can access exactly one business).
- `from` (string)
- `limit` (integer)
- `status` (string)
- `to` (string)

Output parameters:

- `business_id` (string)
- `error` (string): Present when success is false
- `recommendations` (array)
- `success` (boolean): Whether the tool completed successfully

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-kaicalls-kaicalls/api-mcp#diagnostics

## Score history

- 2026-08-04: 39
- 2026-08-03: 39
- 2026-08-02: 39
- 2026-08-01: 39
- 2026-07-31: 75
- 2026-07-30: 68
- 2026-07-29: 68
- 2026-07-28: 67
- 2026-07-27: 67
- 2026-07-26: 66

## Links

- Remote endpoint: https://www.kaicalls.com/api/mcp
- Repository: https://github.com/cgallic/kaicalls-mcp
- Website: https://www.kaicalls.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-kaicalls-kaicalls/api-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-kaicalls-kaicalls/api-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/com-kaicalls-kaicalls/api-mcp
