@talqing/mcp 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/SKILL.md +132 -64
  2. package/package.json +1 -1
  3. package/tools.json +227 -17
package/SKILL.md CHANGED
@@ -42,7 +42,9 @@ An agent is a single object, `config`, plus what you attach to it:
42
42
  Anam avatar) or `text` (chat). The channel decides which model slots exist.
43
43
  - **`prompt`** — the system prompt. This is where the agent's behaviour lives.
44
44
  - **`greeting`** — the line spoken on connect, and on the way in from a
45
- handoff. Voice and video only.
45
+ handoff. Voice and video only. `greeting_interruptible: false` makes the
46
+ caller unable to cut it off (cascade only); a greeting speaking the recording
47
+ notice is always protected.
46
48
 
47
49
  Both are personalized per session: `{{userdata.field}}` is substituted from
48
50
  the session's userdata when the agent starts, so *"You are speaking with
@@ -97,7 +99,7 @@ An agent is a single object, `config`, plus what you attach to it:
97
99
 
98
100
  Values arrive on the **request that starts the session** — `vars` on
99
101
  `calls_token`, `create_outbound_call`, `create_call_batch` or
100
- `create_text_conversation` — and override the defaults. One bag per session,
102
+ `create_chat` — and override the defaults. One bag per session,
101
103
  reaching *every* agent on it: the entry agent, every team member, and a handoff
102
104
  target that was never in the plan, each merged over its own declared defaults.
103
105
  Nothing inside the session can write it.
@@ -108,8 +110,8 @@ An agent is a single object, `config`, plus what you attach to it:
108
110
  repeated back. A credential belongs in a workspace secret, read as
109
111
  `{{secrets.NAME}}` from a tool, where the model never sees it.
110
112
  - **`required: true` refuses the session** that supplies no value for a
111
- variable with no `default` — the call token, the dial, the batch and the text
112
- conversation, before anything is compiled and before any provider is called.
113
+ variable with no `default` — the call token, the dial, the batch and the chat,
114
+ before anything is compiled and before any provider is called.
113
115
  An empty string counts as a value; a `default` satisfies it outright. Nothing
114
116
  is enforced once a session is connected, so a handoff target that needs a
115
117
  value nobody supplied reads it as empty rather than ending the call.
@@ -169,6 +171,13 @@ An agent is a single object, `config`, plus what you attach to it:
169
171
  job inside a longer call — taking an address, qualifying a lead — and a
170
172
  `handoffs` entry when the caller should belong to someone else from then on.
171
173
 
174
+ **Start `description` with "Handoff to an agent task responsible for …"**,
175
+ then say when to enter it and when to skip it: "Handoff to an agent task
176
+ responsible for collecting the caller's name and work email, after they've
177
+ agreed to a demo. Skip this if you already have both." It tells the calling
178
+ model this is not a lookup but an agent that takes over the conversation and
179
+ talks to the person until its job is done.
180
+
172
181
  `name` is yours, not the task's, so renaming the task never changes the tool
173
182
  name a published prompt was written against. The task must be **published**;
174
183
  publishing the agent pins the version. An entry may instead carry `{"task":
@@ -258,22 +267,44 @@ An agent is a single object, `config`, plus what you attach to it:
258
267
  scoped away. And the summary is written by an LLM the caller has been talking
259
268
  to, so it is exactly as trustworthy as anything else the model says. The one
260
269
  thing that does hold is that the source agent's raw tool results do not cross.
261
- - **`conversation`** — what a new call knows about earlier ones with the same
262
- person: `context` is `none` (the default — every call starts clean, though
263
- earlier conversations are still saved against that caller), `summary` (the
270
+ - **`max_steps`** (1–50, `null` = 4 on voice and video, 25 on text) — how many
271
+ LLM → tools → LLM **rounds** one turn may take. Past it the model must answer
272
+ without tools, so the caller gets a thinner answer rather than an error; a
273
+ `tool.step_limit_reached` session event records it. Raise it when a turn
274
+ legitimately chains lookups; on voice every round is dead air. The agent that
275
+ starts the call sets it for the whole call, handoffs included. Realtime models
276
+ ignore it.
277
+ - **`silence`** and **`max_duration_seconds`** — what ends a call nobody hung up.
278
+ Voice and video only; like `max_steps`, the agent that starts the call sets both.
279
+ `silence` (`enabled`, `timeout` 10 s, `max_check_ins` 2): after `timeout` seconds
280
+ of quiet the agent checks the caller is still there, in its own words, and after
281
+ the last unanswered check-in says goodbye and hangs up (close reason
282
+ `silence_timeout`). `max_duration_seconds` (default 1800; `null` = the platform's
283
+ 3-hour cap): the agent says goodbye and hangs up at the limit (`max_duration`).
284
+ Raise either rather than turning it off when a caller legitimately goes quiet —
285
+ reading out a long number, or on hold with their bank.
286
+ - **`voicemail_detection`** (`enabled`, off by default; `message`) — on calls the
287
+ agent places, it gets a `voicemail_detected` tool to call when a machine answers.
288
+ It then speaks `message` word for word (same substitutions as the greeting;
289
+ `null` = no message) and hangs up with close reason `voicemail`. A batch retries
290
+ that recipient like a missed call. Voice agents only. Turn it on for any agent
291
+ that makes outbound calls, and keep the message short.
292
+ - **`conversation`** — what a new call or chat knows about earlier ones with the
293
+ same person: `context` is `none` (the default — each starts clean, though
294
+ earlier conversations are still saved against that person), `summary` (the
264
295
  agent is told, as background, what happened on recent ones) or `transcript`
265
- (one long conversation across every call). `summary_limit` bounds how many
266
- recent calls `summary` describes — leave it out for all of them — and
267
- `initialize_userdata` decides whether the call also starts from what the agent
296
+ (one long conversation across every call and chat). `summary_limit` bounds how
297
+ many recent ones `summary` describes — leave it out for all of them — and
298
+ `initialize_userdata` decides whether it also starts from what the agent
268
299
  learned about this person before.
269
300
 
270
301
  This is the answer whenever someone wants an agent to remember, or to forget,
271
302
  earlier calls. **Never write that instruction into the prompt** — a model told
272
303
  to ignore what is in its context is being asked to do the impossible, and a
273
304
  model told to remember cannot see what was never loaded. Set the field.
274
- `summary` needs call analysis with its summary switched on, and publish
275
- refuses it otherwise. A text agent is always `transcript` and cannot be
276
- changed: a chat thread has no boundary anyone would recognise.
305
+ `summary` needs analysis with its summary switched on, and publish refuses it
306
+ otherwise. All three work on text too, and a WhatsApp call always joins the
307
+ chat's conversation, whatever the agent answering it is set to.
277
308
  - **`on_enter`, `on_exit`, `on_user_turn_completed`** — one such tool reference
278
309
  each, run as lifecycle hooks.
279
310
 
@@ -298,10 +329,11 @@ it.
298
329
 
299
330
  ## Writing config
300
331
 
301
- `update_agent` and `create_agent` take the **whole** config, not a patch.
302
- Anything you leave out reverts to its default — omitting `tools` detaches
303
- every tool. Always read the current config first, apply your change to it, and
304
- send the result back.
332
+ `create_agent` takes a whole config. `update_agent` takes only the fields you
333
+ change: omitted fields are kept, an explicit `null` clears a field, objects
334
+ merge key by key, and lists replace whole — to add one tool, send the complete
335
+ `tools` list with it appended. Naming a new `provider` on `stt`, `tts` or `llm`
336
+ starts that object over, so send its `voice` and settings with it. Unknown fields are refused, not ignored.
305
337
 
306
338
  The config is validated on every write. Unknown models, a model that does not
307
339
  support the channel, a language the model does not offer, a speed outside the
@@ -311,8 +343,10 @@ guessing.
311
343
 
312
344
  Some fields are normalized for you. Switching to `text` clears `stt`, `tts`,
313
345
  `greeting`, `turn_handling` and `avatar`. Switching to `video` fills in an
314
- `avatar`, and always has `resume_false_interruption` off — the avatar cannot
315
- resume a sentence it has already stopped rendering.
346
+ `avatar`, and the call ignores `resume_false_interruption` — the avatar cannot
347
+ resume a sentence it has already stopped rendering. Keypad input is voice-only
348
+ and a text agent cannot watch a screen share, so enabling either off its channel
349
+ is refused: turn it off in the same write that switches the channel.
316
350
 
317
351
  ### Choosing models
318
352
 
@@ -412,7 +446,7 @@ without you doing anything. Rules worth knowing before you hit them:
412
446
  `deepgram/nova-3` and both xAI speech-to-text models transcribe as English on
413
447
  Auto and will mistranscribe a caller who speaks anything else. For an agent
414
448
  taking non-English calls on Auto, pick `deepgram/nova-3-general` (`multi`),
415
- `deepgram/flux-general-multi`, `sarvam/saaras:v3` (`unknown`), ElevenLabs
449
+ `deepgram/flux-general-multi`, `sarvam/saaras:v4` (`unknown`), ElevenLabs
416
450
  Scribe or OpenAI — all of which detect for real.
417
451
  - Models that publish no languages (OpenAI TTS is multilingual, Deepgram encodes
418
452
  the language in the voice) simply ignore the setting.
@@ -822,11 +856,11 @@ before hanging up — logging the outcome, posting a lead — goes **before** th
822
856
  Each hook points at a **published tool id**, or null.
823
857
 
824
858
  - **`on_enter`** — a session opens. It finishes *before* the greeting, which
825
- waits for it and reads whatever it published to userdata; on text, when the
826
- conversation window opens. A handoff target runs it and then speaks its own
859
+ waits for it and reads whatever it published to userdata; on text, once, when
860
+ the chat's first message arrives. A handoff target runs it and then speaks its own
827
861
  greeting — or, having none, opens with a generated line instead.
828
- - **`on_exit`** — the session closes: call end or handoff on voice and video;
829
- on text, `end_call`, a closed window, or about a minute idle.
862
+ - **`on_exit`** — the call or chat ends, or this agent hands off. On text it
863
+ runs once, when the chat ends; what it says is saved to the chat.
830
864
  - **`on_user_turn_completed`** — after every user turn, before the LLM replies.
831
865
  Each spoken turn on voice and video, each inbound message on text. The user's
832
866
  words arrive as `{{args.user_message}}`. On an agent with
@@ -901,8 +935,8 @@ message, draft an opening line, take a shipping address mid-call.
901
935
  - **`max_steps`** (default 25, max 50) — how many LLM → tools → LLM **rounds**
902
936
  a STANDALONE run may take. A round, not a tool call: four tools in one reply
903
937
  cost one step. This is the runaway-loop guard. Entered by an agent the task
904
- runs on the calling session's budget instead — three rounds per reply on
905
- voice and video, twenty-five on text, refreshed on every user turn.
938
+ runs on the calling agent's `max_steps` instead, refreshed on every user
939
+ turn.
906
940
  - **`timeout_seconds`** (default 300, max 600) — the real time budget, and the
907
941
  one setting that applies both ways. Entered by an agent it is the only bound
908
942
  on how long the task may hold the caller: keep it short on a voice agent.
@@ -941,26 +975,27 @@ fields. Never declare a tool of that name yourself.
941
975
 
942
976
  **Nothing is appended to a task's prompt.** `submit_result_description` is the
943
977
  whole of what the model is told about how a run ends, so it has to say that
944
- calling the tool IS the ending — a written answer produces nothing — and that a
945
- value the model could not determine goes in as `null`. It is required and
946
- non-empty, but a new task only carries the one-line stub
947
- `"Submit the result and finish."`: **replace it.** A task whose finishing is
948
- described by that stub is a task relying on the model to guess.
949
-
950
- Every output field is **required and nullable** in that tool. The model must say
951
- something about every field, including "I could not find it" — an optional field
952
- lets it silently omit the address it failed to find, and "omitted" and "not
953
- generated yet" then look identical to whoever reads the row. Say so in each
954
- field's `description`: that description is the only instruction the model gets
955
- about what belongs there.
978
+ calling the tool IS the ending — a written answer produces nothing — and when the
979
+ job is done enough to call it. It is required and
980
+ non-empty; a new task starts with `"Submit results if you are sure that you have achieved the goal of this task"`. **Make it specific**: what
981
+ "achieved" means for this task (e.g. "once the caller has confirmed the address").
982
+
983
+ Every output field is a **required argument** of that tool — an optional one lets
984
+ the model silently omit the address it failed to find, and "omitted" and "not
985
+ generated yet" then look identical to whoever reads the row. A field's own
986
+ `required` flag (default `true`) decides whether `null` is accepted: turn it off
987
+ for a value the model may legitimately fail to find, and say in that field's
988
+ `description` when to send null — the description is the only instruction the
989
+ model gets about what belongs there.
956
990
 
957
991
  A task an agent enters also gets **`finish_without_result`**, which abandons the
958
992
  job and fails the calling agent's tool call.
959
993
  `finish_without_result_description` — required and non-empty too, and starting as
960
- the stub `"Give up and finish without a result."` — is the only thing saying when
961
- that is allowed: **a task that gives up on work it should have finished is fixed
962
- there, not in the prompt.** Narrow it to the caller actually changing their mind;
963
- "I could not work out a value" is a `null`, not a reason to abandon. Publishing
994
+ `"Finish without result only if you have failed to achieve the goal of this task and would like to give up rather than continue."` — is the only thing saying when that is allowed: **a task that gives up on
995
+ work it should have finished is fixed there, not in the prompt.** Narrow it for the
996
+ task (the caller changing their mind, a named number of failed attempts). Giving up
997
+ IS how a task reports failure, so never add a success/failure boolean to `output`;
998
+ a value it may legitimately not find is a field with `required` off. Publishing
964
999
  refuses either description blank.
965
1000
 
966
1001
  ### Reading a run
@@ -1040,10 +1075,14 @@ back off the integration, or read `exposed_name` from
1040
1075
  `allowed_tools` still approves the server's own names. Two attached servers
1041
1076
  sharing a namespace fails publish.
1042
1077
 
1043
- **Channel integrations** (Telegram) deploy an agent to a messaging
1078
+ **Channel integrations** (Telegram, WhatsApp) deploy an agent to a messaging
1044
1079
  channel through *triggers*, not MCP attachment. A trigger binds an inbound event
1045
1080
  to a published text agent and decides what happens with the reply.
1046
1081
 
1082
+ A Twilio WhatsApp number also takes calls: a `whatsapp.call.inbound` trigger puts a
1083
+ published **voice** agent on it, which must use `conversation.context: "transcript"` —
1084
+ the call joins the chat's thread. It cannot transfer to a phone number.
1085
+
1047
1086
  `integration_catalog` is the authoritative list of providers and, in
1048
1087
  `setup_fields`, exactly what each one needs — read it instead of guessing.
1049
1088
  Providers whose `auth_type` is `oauth` must be connected from the dashboard's
@@ -1054,7 +1093,7 @@ stores it as a workspace secret and wires the reference, or pass an existing
1054
1093
 
1055
1094
  ## Phone numbers
1056
1095
 
1057
- A voice or video agent answers the phone once a number is pointed at it. Three
1096
+ A voice agent answers the phone once a number is pointed at it. Three
1058
1097
  things have to line up, in order:
1059
1098
 
1060
1099
  1. **A carrier account** — the credential for a phone network.
@@ -1067,8 +1106,10 @@ things have to line up, in order:
1067
1106
  provisions them. Numbers are bought at the carrier, never here. Import
1068
1107
  reports per number: read every `ok` rather than trusting the 200.
1069
1108
  3. **An agent on the number** — `assign_phone_number` puts a **published**
1070
- voice or video agent on it. Republishing the agent updates live calls
1071
- automatically; the assignment is not redone.
1109
+ `voice` agent on it. Republishing the agent updates live calls
1110
+ automatically; the assignment is not redone. A publish or rollback that
1111
+ would take it off `voice` is refused while any number, stream connection or
1112
+ running batch uses it.
1072
1113
 
1073
1114
  `readiness` on a number is the honest answer to "does this work": `live`,
1074
1115
  `needs_agent`, `needs_carrier_setup`, `setting_up`, `error` or `disabled`.
@@ -1109,8 +1150,9 @@ window may cross midnight; the days then name the evening it starts on.
1109
1150
  **Say these two things before creating one**, because a user who discovers
1110
1151
  either from an invoice will not forgive us:
1111
1152
 
1112
- - **Answering machines are not detected.** A call that reaches voicemail is
1113
- answered, billed, and reported as completed.
1153
+ - **Voicemail is answered and billed** unless the agent has
1154
+ `voicemail_detection` on — then it hangs up (after its message, if it has one),
1155
+ the call ends as `voicemail`, and the recipient is retried like a missed call.
1114
1156
  - **Every call runs the agent's current published version**, so republishing
1115
1157
  mid-batch changes every call placed after that moment.
1116
1158
 
@@ -1270,10 +1312,36 @@ the review table as drafts and never takes the batch with it; the drafts are
1270
1312
  still there. In the other direction, pausing or cancelling the *batch* stops
1271
1313
  drafting and does not touch a send that is already scheduled or going out.
1272
1314
 
1315
+ ## WhatsApp outbound
1316
+
1317
+ A **WhatsApp batch** sends one *approved* template to every row of a CSV from a
1318
+ connected WhatsApp integration. There is no drafting: Meta approved the wording,
1319
+ and only the template's variables change per row. `list_whatsapp_templates`
1320
+ gives a sender's approved templates — header, body, footer, buttons and variable
1321
+ names; one with `unsupported_reason` cannot be used.
1322
+ `create_whatsapp_batch` maps `to_column` and every variable onto CSV columns. A
1323
+ row with a bad or repeated phone, or a blank mapped cell, is kept and skipped
1324
+ with the reason, so read the returned `counts`.
1325
+
1326
+ **Say these before creating one:**
1327
+
1328
+ - **Only people who opted in to hear from the business on WhatsApp** may be
1329
+ messaged. Cold outreach breaks WhatsApp's policy and risks their number.
1330
+ - **US numbers never receive marketing templates**, and Meta caps the marketing
1331
+ templates any one person receives.
1332
+ - **You cannot send it.** `send_whatsapp_batch` and `resume_whatsapp_batch` are
1333
+ a person's to press, on the batch page. Create the batch, point them at it.
1334
+
1335
+ Replies are answered by the agent on the sender's
1336
+ `whatsapp.message.inbound` trigger, which sees the row's columns as
1337
+ `{{userdata.<column>}}` and the whole template, buttons included, as its own
1338
+ first message — so write that agent's prompt against the CSV's column names.
1339
+
1273
1340
  ## Knowledge bases
1274
1341
 
1275
1342
  A knowledge base gives an agent grounded answers over crawled content. Attach
1276
- ready ones through the agent's `kb_ids`; only `ready` ones can be attached.
1343
+ it through the agent's `kb_ids`. A call reads only `ready` ones, so one still
1344
+ building can be attached now and is used once it finishes.
1277
1345
 
1278
1346
  Building one runs in three stages and takes minutes, not seconds:
1279
1347
 
@@ -1319,8 +1387,8 @@ Published agents can be run from here, and every run leaves a record.
1319
1387
 
1320
1388
  **Starting something.** `create_outbound_call` dials a real phone number from
1321
1389
  one of the workspace's numbers and puts a published voice agent on the call.
1322
- `create_text_conversation` plus `create_text_message` talks to a published text
1323
- agent — the fastest way to try one. `calls_token` mints the token a *browser*
1390
+ `create_chat` plus `create_chat_message` talks to a published text agent — the
1391
+ fastest way to try one. `calls_token` mints the token a *browser*
1324
1392
  needs to join a web call; it starts nothing by itself.
1325
1393
 
1326
1394
  All three take `userdata`, which seeds the session's state and is readable as
@@ -1336,8 +1404,7 @@ for facts about the person and `vars` for configuration of the session; unlike
1336
1404
  can change it mid-session. An empty string is a deliberate blank, not a request
1337
1405
  for the default. The model can see the values, so credentials stay in workspace
1338
1406
  secrets. On a batch it is one bag for the whole campaign, copied onto every call
1339
- it places — per-person data is what a recipient's `userdata` is for. On a text
1340
- conversation it is fixed for the life of the thread.
1407
+ it places — per-person data is what a recipient's `userdata` is for.
1341
1408
 
1342
1409
  **Per-call configuration.** All three — and `create_call_batch` — also take four
1343
1410
  fields that change what runs on that one call:
@@ -1370,12 +1437,14 @@ The merged result is validated by the same rules that guard publishing, so a
1370
1437
  bad override is a 400 at create — naming the problem — rather than a call that
1371
1438
  connects and then fails.
1372
1439
 
1373
- `create_text_message` returns as soon as the message is accepted — the agent
1374
- replies asynchronously, so poll `list_conversation_items` (with `order: desc`)
1375
- for the reply. Give it a few seconds, and expect several items when the agent
1376
- calls tools.
1440
+ A chat is one text session, as a call is a voice one. `create_chat_message`
1441
+ takes a `client_message_id` (a UUID you generate) and returns the reply itself:
1442
+ `status`, `items` and `chat_status`. A chat **ends only explicitly** — the
1443
+ agent's `end_call`, or `end_chat` — and only then is it analysed and its
1444
+ `session.completed` sent, so end the chats you start. On Telegram and WhatsApp a
1445
+ person's messages join one chat until it ends; the next starts a new one.
1377
1446
 
1378
- It can also carry `images`: up to four `{data_url, filename}` entries beside
1447
+ A message can carry `images`: up to four `{data_url, filename}` entries beside
1379
1448
  `message`, each a base64 `data:image/...` URL of a JPEG, PNG or WebP under 10 MB.
1380
1449
  The caption and the photo arrive as one turn and one item, so send them together
1381
1450
  rather than as two messages. The agent's model must have `vision` (see *Images*
@@ -1383,17 +1452,16 @@ above) or the call is refused naming the model.
1383
1452
 
1384
1453
  **Reading it back.** A *conversation* is the thread with a person, on any
1385
1454
  surface; a *call* is one voice or video session. `list_conversations` and
1386
- `list_conversation_items` are the transcript; `list_conversation_sessions` says
1387
- which agent version handled each turn of it. `list_calls` and `get_call` cover
1388
- phone and web calls — `get_call` gives the transcript with every tool call and
1455
+ `list_conversation_items` are the transcript; `list_conversation_sessions` lists
1456
+ its calls and chats, and `get_chat` gives one chat's cost and analysis.
1457
+ `list_calls` and `get_call` cover phone and web calls — `get_call` gives the transcript with every tool call and
1389
1458
  its output, plus usage, cost and a per-stage latency breakdown, which is where
1390
1459
  you find out why an agent did something odd or answered slowly.
1391
1460
  `get_observability` is the workspace view: sessions, spend and latency per day.
1392
1461
 
1393
1462
  What a run costs is the provider spend on the workspace's own keys plus
1394
- Talqing's per-minute platform fee, which `get_catalog` gives per channel. **Text
1395
- agents carry no platform fee at all** — a text conversation costs the workspace
1396
- only what its own LLM key was charged.
1463
+ Talqing's platform fee, which `get_catalog` gives: per minute on voice and
1464
+ video, and $0.0001 per answered message on text.
1397
1465
 
1398
1466
  When an agent misbehaves, read the actual run before theorizing. The transcript
1399
1467
  and the final `userdata` usually name the cause.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talqing/mcp",
3
- "version": "0.3.3",
3
+ "version": "0.4.0",
4
4
  "description": "MCP server for building Talqing AI voice, video and text agents from Claude Code, Codex, or any MCP client.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://talqing.com",
package/tools.json CHANGED
@@ -45,7 +45,7 @@
45
45
  "role": "read"
46
46
  },
47
47
  {
48
- "description": "Replace the agent's draft config with the one supplied.",
48
+ "description": "Update the agent's draft config. Send only the fields to change.",
49
49
  "method": "PATCH",
50
50
  "name": "update_agent",
51
51
  "parameters": {
@@ -59,7 +59,7 @@
59
59
  "role": "write"
60
60
  },
61
61
  {
62
- "description": "Delete an agent and its published versions permanently.",
62
+ "description": "Delete an agent and its versions permanently; 409 while anything still points at it.",
63
63
  "method": "DELETE",
64
64
  "name": "delete_agent",
65
65
  "parameters": {
@@ -84,7 +84,7 @@
84
84
  },
85
85
  "path": "/v1/agents/{agent_id}/validate",
86
86
  "read_only": false,
87
- "role": "write"
87
+ "role": "read"
88
88
  },
89
89
  {
90
90
  "description": "Freeze the current draft as a new immutable version and make it live.",
@@ -210,7 +210,7 @@
210
210
  },
211
211
  "path": "/v1/tools/{tool_id}/validate",
212
212
  "read_only": false,
213
- "role": "write"
213
+ "role": "read"
214
214
  },
215
215
  {
216
216
  "description": "Run the draft tool once with arguments you supply and see every step.",
@@ -311,7 +311,7 @@
311
311
  "role": "read"
312
312
  },
313
313
  {
314
- "description": "Replace the task's draft config with the one supplied.",
314
+ "description": "Update the task's draft config. Send only the fields to change.",
315
315
  "method": "PATCH",
316
316
  "name": "update_task",
317
317
  "parameters": {
@@ -350,7 +350,7 @@
350
350
  },
351
351
  "path": "/v1/tasks/{task_id}/validate",
352
352
  "read_only": false,
353
- "role": "write"
353
+ "role": "read"
354
354
  },
355
355
  {
356
356
  "description": "Freeze the current draft as a new immutable version and make it live.",
@@ -1151,7 +1151,7 @@
1151
1151
  "role": "write"
1152
1152
  },
1153
1153
  {
1154
- "description": "Stop a batch for good. There is no undo, and a batch cannot be deleted.",
1154
+ "description": "Stop a batch for good. There is no undo.",
1155
1155
  "method": "POST",
1156
1156
  "name": "cancel_call_batch",
1157
1157
  "parameters": {
@@ -1263,7 +1263,7 @@
1263
1263
  "role": "write"
1264
1264
  },
1265
1265
  {
1266
- "description": "Stop drafting for good. A batch cannot be deleted, because it is the record of what was sent to whom.",
1266
+ "description": "Stop drafting for good.",
1267
1267
  "method": "POST",
1268
1268
  "name": "cancel_email_batch",
1269
1269
  "parameters": {
@@ -1444,6 +1444,160 @@
1444
1444
  "read_only": false,
1445
1445
  "role": "write"
1446
1446
  },
1447
+ {
1448
+ "description": "List a WhatsApp sender's approved templates, read live from its BSP.",
1449
+ "method": "GET",
1450
+ "name": "list_whatsapp_templates",
1451
+ "parameters": {
1452
+ "additionalProperties": true,
1453
+ "description": "Arguments not inlined: call describe_function('list_whatsapp_templates').",
1454
+ "properties": {},
1455
+ "type": "object"
1456
+ },
1457
+ "path": "/v1/whatsapp/templates",
1458
+ "read_only": true,
1459
+ "role": "read"
1460
+ },
1461
+ {
1462
+ "description": "Create a WhatsApp batch: one approved template, sent once per CSV row. Sends nothing yet.",
1463
+ "method": "POST",
1464
+ "name": "create_whatsapp_batch",
1465
+ "parameters": {
1466
+ "additionalProperties": true,
1467
+ "description": "Arguments not inlined: call describe_function('create_whatsapp_batch').",
1468
+ "properties": {},
1469
+ "type": "object"
1470
+ },
1471
+ "path": "/v1/whatsapp/batches",
1472
+ "read_only": false,
1473
+ "role": "write"
1474
+ },
1475
+ {
1476
+ "description": "List WhatsApp batches, newest first.",
1477
+ "method": "GET",
1478
+ "name": "list_whatsapp_batches",
1479
+ "parameters": {
1480
+ "additionalProperties": true,
1481
+ "description": "Arguments not inlined: call describe_function('list_whatsapp_batches').",
1482
+ "properties": {},
1483
+ "type": "object"
1484
+ },
1485
+ "path": "/v1/whatsapp/batches",
1486
+ "read_only": true,
1487
+ "role": "read"
1488
+ },
1489
+ {
1490
+ "description": "One batch: its template, schedule and per-status counts, `replied` included.",
1491
+ "method": "GET",
1492
+ "name": "get_whatsapp_batch",
1493
+ "parameters": {
1494
+ "additionalProperties": true,
1495
+ "description": "Arguments not inlined: call describe_function('get_whatsapp_batch').",
1496
+ "properties": {},
1497
+ "type": "object"
1498
+ },
1499
+ "path": "/v1/whatsapp/batches/{batch_id}",
1500
+ "read_only": true,
1501
+ "role": "read"
1502
+ },
1503
+ {
1504
+ "description": "Edit a batch. Pacing and the window reach a live send within minutes.",
1505
+ "method": "PATCH",
1506
+ "name": "patch_whatsapp_batch",
1507
+ "parameters": {
1508
+ "additionalProperties": true,
1509
+ "description": "Arguments not inlined: call describe_function('patch_whatsapp_batch').",
1510
+ "properties": {},
1511
+ "type": "object"
1512
+ },
1513
+ "path": "/v1/whatsapp/batches/{batch_id}",
1514
+ "read_only": false,
1515
+ "role": "write"
1516
+ },
1517
+ {
1518
+ "description": "Stop sending before the next message. Nothing is lost.",
1519
+ "method": "POST",
1520
+ "name": "pause_whatsapp_batch",
1521
+ "parameters": {
1522
+ "additionalProperties": true,
1523
+ "description": "Arguments not inlined: call describe_function('pause_whatsapp_batch').",
1524
+ "properties": {},
1525
+ "type": "object"
1526
+ },
1527
+ "path": "/v1/whatsapp/batches/{batch_id}/pause",
1528
+ "read_only": false,
1529
+ "role": "write"
1530
+ },
1531
+ {
1532
+ "description": "Stop for good. Messages already sent stay sent, and replies are still answered.",
1533
+ "method": "POST",
1534
+ "name": "cancel_whatsapp_batch",
1535
+ "parameters": {
1536
+ "additionalProperties": true,
1537
+ "description": "Arguments not inlined: call describe_function('cancel_whatsapp_batch').",
1538
+ "properties": {},
1539
+ "type": "object"
1540
+ },
1541
+ "path": "/v1/whatsapp/batches/{batch_id}/cancel",
1542
+ "read_only": false,
1543
+ "role": "write"
1544
+ },
1545
+ {
1546
+ "description": "A batch's rows in upload order, each with its rendered message.",
1547
+ "method": "GET",
1548
+ "name": "list_whatsapp_batch_recipients",
1549
+ "parameters": {
1550
+ "additionalProperties": true,
1551
+ "description": "Arguments not inlined: call describe_function('list_whatsapp_batch_recipients').",
1552
+ "properties": {},
1553
+ "type": "object"
1554
+ },
1555
+ "path": "/v1/whatsapp/batches/{batch_id}/recipients",
1556
+ "read_only": true,
1557
+ "role": "read"
1558
+ },
1559
+ {
1560
+ "description": "Edit cells on a row not yet sent, its phone included. An empty value clears the edit.",
1561
+ "method": "PATCH",
1562
+ "name": "patch_whatsapp_batch_recipient",
1563
+ "parameters": {
1564
+ "additionalProperties": true,
1565
+ "description": "Arguments not inlined: call describe_function('patch_whatsapp_batch_recipient').",
1566
+ "properties": {},
1567
+ "type": "object"
1568
+ },
1569
+ "path": "/v1/whatsapp/batches/{batch_id}/recipients/{recipient_id}",
1570
+ "read_only": false,
1571
+ "role": "write"
1572
+ },
1573
+ {
1574
+ "description": "Take ready rows out of the send. Reversible with restore.",
1575
+ "method": "POST",
1576
+ "name": "skip_whatsapp_batch_recipients",
1577
+ "parameters": {
1578
+ "additionalProperties": true,
1579
+ "description": "Arguments not inlined: call describe_function('skip_whatsapp_batch_recipients').",
1580
+ "properties": {},
1581
+ "type": "object"
1582
+ },
1583
+ "path": "/v1/whatsapp/batches/{batch_id}/recipients/skip",
1584
+ "read_only": false,
1585
+ "role": "write"
1586
+ },
1587
+ {
1588
+ "description": "Put rows a person skipped back. A row skipped for its cells returns when they are fixed.",
1589
+ "method": "POST",
1590
+ "name": "restore_whatsapp_batch_recipients",
1591
+ "parameters": {
1592
+ "additionalProperties": true,
1593
+ "description": "Arguments not inlined: call describe_function('restore_whatsapp_batch_recipients').",
1594
+ "properties": {},
1595
+ "type": "object"
1596
+ },
1597
+ "path": "/v1/whatsapp/batches/{batch_id}/recipients/restore",
1598
+ "read_only": false,
1599
+ "role": "write"
1600
+ },
1447
1601
  {
1448
1602
  "description": "Mint a LiveKit token for a browser to open a web call with an agent.",
1449
1603
  "method": "POST",
@@ -1459,30 +1613,86 @@
1459
1613
  "role": "write"
1460
1614
  },
1461
1615
  {
1462
- "description": "Open a text conversation with a published text agent.",
1616
+ "description": "Start a chat with a text agent. Send it messages with `create_chat_message`.",
1463
1617
  "method": "POST",
1464
- "name": "create_text_conversation",
1618
+ "name": "create_chat",
1465
1619
  "parameters": {
1466
1620
  "additionalProperties": true,
1467
- "description": "Arguments not inlined: call describe_function('create_text_conversation').",
1621
+ "description": "Arguments not inlined: call describe_function('create_chat').",
1468
1622
  "properties": {},
1469
1623
  "type": "object"
1470
1624
  },
1471
- "path": "/v1/conversations",
1625
+ "path": "/v1/chats",
1626
+ "read_only": false,
1627
+ "role": "write"
1628
+ },
1629
+ {
1630
+ "description": "List chats, newest first.",
1631
+ "method": "GET",
1632
+ "name": "list_chats",
1633
+ "parameters": {
1634
+ "additionalProperties": true,
1635
+ "description": "Arguments not inlined: call describe_function('list_chats').",
1636
+ "properties": {},
1637
+ "type": "object"
1638
+ },
1639
+ "path": "/v1/chats",
1640
+ "read_only": true,
1641
+ "role": "read"
1642
+ },
1643
+ {
1644
+ "description": "Read one chat: its status, cost so far and, once ended, its analysis.",
1645
+ "method": "GET",
1646
+ "name": "get_chat",
1647
+ "parameters": {
1648
+ "additionalProperties": true,
1649
+ "description": "Arguments not inlined: call describe_function('get_chat').",
1650
+ "properties": {},
1651
+ "type": "object"
1652
+ },
1653
+ "path": "/v1/chats/{chat_id}",
1654
+ "read_only": true,
1655
+ "role": "read"
1656
+ },
1657
+ {
1658
+ "description": "The messages, tool calls and handoffs of one chat.",
1659
+ "method": "GET",
1660
+ "name": "list_chat_items",
1661
+ "parameters": {
1662
+ "additionalProperties": true,
1663
+ "description": "Arguments not inlined: call describe_function('list_chat_items').",
1664
+ "properties": {},
1665
+ "type": "object"
1666
+ },
1667
+ "path": "/v1/chats/{chat_id}/items",
1668
+ "read_only": true,
1669
+ "role": "read"
1670
+ },
1671
+ {
1672
+ "description": "Send a message and get the agent's reply back on this request.",
1673
+ "method": "POST",
1674
+ "name": "create_chat_message",
1675
+ "parameters": {
1676
+ "additionalProperties": true,
1677
+ "description": "Arguments not inlined: call describe_function('create_chat_message').",
1678
+ "properties": {},
1679
+ "type": "object"
1680
+ },
1681
+ "path": "/v1/chats/{chat_id}/messages",
1472
1682
  "read_only": false,
1473
1683
  "role": "write"
1474
1684
  },
1475
1685
  {
1476
- "description": "Send a message to a text agent \u2014 the way to actually talk to one.",
1686
+ "description": "End a chat. Its analysis and `session.completed` webhook follow.",
1477
1687
  "method": "POST",
1478
- "name": "create_text_message",
1688
+ "name": "end_chat",
1479
1689
  "parameters": {
1480
1690
  "additionalProperties": true,
1481
- "description": "Arguments not inlined: call describe_function('create_text_message').",
1691
+ "description": "Arguments not inlined: call describe_function('end_chat').",
1482
1692
  "properties": {},
1483
1693
  "type": "object"
1484
1694
  },
1485
- "path": "/v1/conversations/messages",
1695
+ "path": "/v1/chats/{chat_id}/end",
1486
1696
  "read_only": false,
1487
1697
  "role": "write"
1488
1698
  },
@@ -1683,7 +1893,7 @@
1683
1893
  "role": "admin"
1684
1894
  },
1685
1895
  {
1686
- "description": "Delete a secret permanently. Anything still referencing it will fail to resolve at runtime. Organization admins only.",
1896
+ "description": "Delete a secret permanently. Refused with 409 while a tool, integration or carrier account references it. Organization admins only.",
1687
1897
  "method": "DELETE",
1688
1898
  "name": "delete_secret",
1689
1899
  "parameters": {