MCP call tools
The tools your AI uses for calls. The same server has every Kata Send tool too (company memory, lead lists, campaign status): call tools/list to see them all. import_leads and set_campaign_status also work on a call campaign.
create_call_campaign
Kata Call: create a phone campaign (status draft). An AI voice agent calls the leads, one engine session per call. Same leads, lists, brief.md and hours as an email campaign; its angles are call variants (opener + script + engine). Give opener and script to create the first variant (or use set_call_variant). Then: add_numbers, import_leads (csv with a phone column, campaign_id) or connect_list, and set_campaign_status active with the user's approval. Calls go out only from active numbers, in each lead's local calling hours.
| Parameter | Type | What it is |
|---|---|---|
name required | string | short name |
brief | string | what the campaign offers, to whom, the expected action: written to brief.md, read by the caller |
opener | string | first variant: what the caller says when they pick up |
script | string | first variant: the goal, points to make, objections, the ask. Only facts from the brief: the caller must never invent offers or prices |
engine | grok | openai | voice engine: grok (xAI Grok voice) or openai (gpt-realtime) |
voice | string | engine voice, empty = default (grok: Ara; openai: marin) |
agent_name | string | the name the AI caller gives, default Alex |
call_max_attempts | number | dials per lead, default 3 |
call_retry_hours | number | hours before calling again after no answer or busy, default 4 |
call_voicemail_retry_hours | number | hours before calling again after a voicemail, default 24 |
call_max_seconds | number | the call is cut after this, default 240 |
hours | string | calling hours in the lead's local time, "start-end", default "8-17" |
weekdays | boolean | Monday to Friday only (default true) |
country | string | default country of the leads (ISO), for national numbers and time zones |
autopilot | boolean | Thompson sampling and hourly evolve on (default true) |
update_call_campaign
Change a call campaign's settings: default engine and voice, agent name, max attempts, retry delays, max call length, calling hours, weekdays, country, autopilot.
| Parameter | Type | What it is |
|---|---|---|
campaign_id required | number | id |
engine | grok | openai | voice engine: grok (xAI Grok voice) or openai (gpt-realtime) |
voice | string | engine voice, empty = default (grok: Ara; openai: marin) |
agent_name | string | the name the AI caller gives, default Alex |
call_max_attempts | number | dials per lead, default 3 |
call_retry_hours | number | hours before calling again after no answer or busy, default 4 |
call_voicemail_retry_hours | number | hours before calling again after a voicemail, default 24 |
call_max_seconds | number | the call is cut after this, default 240 |
hours | string | calling hours in the lead's local time, "start-end", default "8-17" |
weekdays | boolean | Monday to Friday only (default true) |
country | string | default country of the leads (ISO), for national numbers and time zones |
autopilot | boolean | Thompson sampling and hourly evolve on (default true) |
add_numbers
Add phone numbers that place the calls (E.164, e.g. +33612345678). With real calls on (the workspace's switch on the Numbers page) a number must already be in the Twilio account (Kata never buys numbers); with real calls off (default) numbers are simulated and nothing dials. Default cap 50 calls a day per number.
| Parameter | Type | What it is |
|---|---|---|
numbers | array | numbers to add |
e164 | string | one number |
label | string | label |
daily_cap | number | calls a day |
list_numbers
Phone numbers with status (active, paused, retired), daily cap, calls today, live calls, dials and answer rate. Kata pauses a number by itself when its answer rate collapses (under 5 % on its last 30+ calls) and halves its cap under 15 %.
No parameters.
set_number
Pause, resume or retire a phone number, or change its daily cap or label.
| Parameter | Type | What it is |
|---|---|---|
e164 required | string | number |
status | active | paused | retired | |
daily_cap | number | calls a day |
label | string | label |
set_call_variant
Create a call variant (campaign_id + opener and/or script) or change one (id). A variant = opener (said at pick-up) + script (goal, points, objections, the ask) + engine + voice. Thompson sampling picks one per call; success = interested, callback or a conversion. status retired removes it from the test. Scripts must only use facts from brief.md and company.md: speech models invent offers otherwise.
| Parameter | Type | What it is |
|---|---|---|
id | number | variant to change |
campaign_id | number | campaign, to create |
name | string | short name |
opener | string | first sentence |
script | string | the script |
engine | grok | openai | voice engine: grok (xAI Grok voice) or openai (gpt-realtime) |
voice | string | voice |
status | active | retired |
set_call_engine
Set the voice engine (grok or openai) of a call campaign (its default and all its live variants, unless only_default) or of one variant. To make the engines compete, keep variants on both engines: evolve also adds the best script on a missing engine.
| Parameter | Type | What it is |
|---|---|---|
campaign_id | number | campaign |
variant_id | number | one variant |
engine required | grok | openai | voice engine: grok (xAI Grok voice) or openai (gpt-realtime) |
voice | string | voice |
only_default | boolean | only the campaign default, not the live variants |
import_call_leads
Import leads with phones into a call campaign from a CSV (phone column required: phone, phone_number, mobile or tel; email optional; first_name, company and any other column become facts the caller knows). National numbers use the row's country column, else the campaign's country. Leads on the do-not-call list are not enrolled.
| Parameter | Type | What it is |
|---|---|---|
campaign_id required | number | call campaign |
csv | string | CSV content |
file | string | key of an uploaded CSV |
place_test_call
Call a given number (the user's own) with a campaign's best variant or a given variant, to hear the agent. Not a lead, not in the stats. With real calls off nothing dials: the call is simulated (outcome forces the simulated result). With real calls on it REALLY CALLS: ask the user first.
| Parameter | Type | What it is |
|---|---|---|
to required | string | number to call, E.164 |
campaign_id | number | campaign (its best live variant) |
variant_id | number | this variant |
number | string | from this number |
outcome | string | log mode only: force the simulated result |
list_calls
Calls, newest first, with filters: campaign_id, status (queued, ringing, in-progress, completed, no-answer, busy, failed, canceled, voicemail), outcome (interested, callback, not_interested, do_not_call, voicemail, wrong_person, no_conversation, or none), variant_id, number, contact_id, engine, since (ISO date), q (text), test (1 = test calls only, all = both). Each with duration, outcome and one-line summary. Page with before_id.
| Parameter | Type | What it is |
|---|---|---|
campaign_id | number | campaign |
status | string | status |
outcome | string | outcome |
variant_id | number | variant |
number | string | from number |
contact_id | number | lead |
engine | string | grok or openai |
since | string | ISO date |
q | string | search |
test | string | 1 or all |
limit | number | default 50, max 500 |
before_id | number | next page |
get_call
One call: status, timings, duration, outcome, summary, the transcript (turns of agent and lead), events (status changes, machine detection, engine, tool calls), the lead, and recording_url (an app URL, signed-in) when there is a recording.
| Parameter | Type | What it is |
|---|---|---|
id required | number | call id |
call_stats
Kata Call performance, for one campaign or all: dials (today, total), answered and answer rate, voicemails, conversations, positive outcomes (interested + callback) and success rate, conversions and value, minutes, estimated cost, outcomes breakdown, per engine, per number, per variant (conversations, successes, rate, p_best = probability of being the best), and the last 90 days per day.
| Parameter | Type | What it is |
|---|---|---|
campaign_id | number | one campaign; omit for all |
simulate_calls
Simulated calls (never dials, whatever the real-calls switch says): n waiting leads of a call campaign (or one contact) are called now by the simulator, ignoring hours and caps, through the real status flow and outcome tagging. outcome forces the result. For demos and to check a campaign end to end.
| Parameter | Type | What it is |
|---|---|---|
campaign_id | number | call campaign |
contact_id | number | one lead |
n | number | 1 to 50, default 1 |
outcome | string | force: an outcome, or no-answer, busy, failed, answered (a person, random outcome) |
run_call_scheduler
Runs the call scheduler now, as the cron does every minute: active call campaigns, due leads inside their calling hours, one call per free active number. With real calls on this REALLY CALLS: ask the user first. dry_run shows what would be dialed without dialing.
| Parameter | Type | What it is |
|---|---|---|
campaign_id | number | only this campaign |
dry_run | boolean | show, do not dial |