Docs Home Log in

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.

ParameterTypeWhat it is
name requiredstringshort name
briefstringwhat the campaign offers, to whom, the expected action: written to brief.md, read by the caller
openerstringfirst variant: what the caller says when they pick up
scriptstringfirst variant: the goal, points to make, objections, the ask. Only facts from the brief: the caller must never invent offers or prices
enginegrok | openaivoice engine: grok (xAI Grok voice) or openai (gpt-realtime)
voicestringengine voice, empty = default (grok: Ara; openai: marin)
agent_namestringthe name the AI caller gives, default Alex
call_max_attemptsnumberdials per lead, default 3
call_retry_hoursnumberhours before calling again after no answer or busy, default 4
call_voicemail_retry_hoursnumberhours before calling again after a voicemail, default 24
call_max_secondsnumberthe call is cut after this, default 240
hoursstringcalling hours in the lead's local time, "start-end", default "8-17"
weekdaysbooleanMonday to Friday only (default true)
countrystringdefault country of the leads (ISO), for national numbers and time zones
autopilotbooleanThompson 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.

ParameterTypeWhat it is
campaign_id requirednumberid
enginegrok | openaivoice engine: grok (xAI Grok voice) or openai (gpt-realtime)
voicestringengine voice, empty = default (grok: Ara; openai: marin)
agent_namestringthe name the AI caller gives, default Alex
call_max_attemptsnumberdials per lead, default 3
call_retry_hoursnumberhours before calling again after no answer or busy, default 4
call_voicemail_retry_hoursnumberhours before calling again after a voicemail, default 24
call_max_secondsnumberthe call is cut after this, default 240
hoursstringcalling hours in the lead's local time, "start-end", default "8-17"
weekdaysbooleanMonday to Friday only (default true)
countrystringdefault country of the leads (ISO), for national numbers and time zones
autopilotbooleanThompson 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.

ParameterTypeWhat it is
numbersarraynumbers to add
e164stringone number
labelstringlabel
daily_capnumbercalls 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.

ParameterTypeWhat it is
e164 requiredstringnumber
statusactive | paused | retired
daily_capnumbercalls a day
labelstringlabel

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.

ParameterTypeWhat it is
idnumbervariant to change
campaign_idnumbercampaign, to create
namestringshort name
openerstringfirst sentence
scriptstringthe script
enginegrok | openaivoice engine: grok (xAI Grok voice) or openai (gpt-realtime)
voicestringvoice
statusactive | 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.

ParameterTypeWhat it is
campaign_idnumbercampaign
variant_idnumberone variant
engine requiredgrok | openaivoice engine: grok (xAI Grok voice) or openai (gpt-realtime)
voicestringvoice
only_defaultbooleanonly 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.

ParameterTypeWhat it is
campaign_id requirednumbercall campaign
csvstringCSV content
filestringkey 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.

ParameterTypeWhat it is
to requiredstringnumber to call, E.164
campaign_idnumbercampaign (its best live variant)
variant_idnumberthis variant
numberstringfrom this number
outcomestringlog 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.

ParameterTypeWhat it is
campaign_idnumbercampaign
statusstringstatus
outcomestringoutcome
variant_idnumbervariant
numberstringfrom number
contact_idnumberlead
enginestringgrok or openai
sincestringISO date
qstringsearch
teststring1 or all
limitnumberdefault 50, max 500
before_idnumbernext 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.

ParameterTypeWhat it is
id requirednumbercall 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.

ParameterTypeWhat it is
campaign_idnumberone 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.

ParameterTypeWhat it is
campaign_idnumbercall campaign
contact_idnumberone lead
nnumber1 to 50, default 1
outcomestringforce: 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.

ParameterTypeWhat it is
campaign_idnumberonly this campaign
dry_runbooleanshow, do not dial