@talqing/mcp 0.3.0 → 0.3.1

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 +109 -51
  2. package/package.json +1 -1
  3. package/tools.json +160 -20
package/SKILL.md CHANGED
@@ -817,15 +817,14 @@ message, draft an opening line, pull a field out of a document.
817
817
  **not** read `{{system_vars.human_phone_number}}` / `.agent_phone_number` /
818
818
  `.direction` — there is no call.
819
819
  - **`llm`** — one model, with the same `fallback`, `reasoning_effort`,
820
- `priority` and `builtin_tools` an agent's LLM has. There is no `stt`, `tts`,
821
- `realtime`, `greeting`, `turn_handling`, `avatar`, `handoffs`, `recording`,
822
- `analysis`, `kb_ids` or lifecycle hook — a task has nobody to hear, nobody to
823
- greet, nothing to hand over and one turn to hook.
820
+ `priority` and `builtin_tools` an agent's LLM has. A provider tool runs inside
821
+ a step rather than as one, so it costs no steps and real seconds. There is no
822
+ `stt`, `tts`, `realtime`, `greeting`, `turn_handling`, `avatar`, `handoffs`,
823
+ `recording`, `analysis`, `kb_ids` or lifecycle hook a task has nobody to
824
+ hear, nobody to greet, nothing to hand over and one turn to hook.
824
825
  - **`tools`** / **`mcps`** — exactly an agent's, attached by id or defined
825
- inline. **A task never pins a tool version**: republishing a tool changes
826
- every task that uses it, immediately, with no step in between. That is
827
- defensible for a bounded job and would not be for a live call, which is why
828
- agents pin and tasks do not.
826
+ inline, and pinned by publish exactly as an agent's are: republishing a tool
827
+ does not change a published task until that task is published again.
829
828
  - **`vars`** — the task's **inputs**, declared exactly as an agent's variables
830
829
  are: a `name`, a `description`, an optional `default` and `required`. A run
831
830
  supplies values by name; one it omits falls back to the `default`, and a
@@ -835,25 +834,39 @@ message, draft an opening line, pull a field out of a document.
835
834
  agent, whose key space is open.
836
835
  - **`output`** — a flat list of the fields the model must produce, each with a
837
836
  `name`, a `type` (`string`, `boolean`, `integer` or `number`) and a
838
- `description`. At least one, at most 25. No arrays and no nested objects: a
839
- task that wants to return five talking points returns one string containing
840
- them.
837
+ `description`. At most 25, and at least one **to publish** a draft may have
838
+ none. No arrays and no nested objects: a task that wants to return five
839
+ talking points returns one string containing them.
841
840
  - **`max_steps`** (default 25, max 50) — how many LLM → tools → LLM **rounds**
842
841
  the run may take. A round, not a tool call: four tools in one reply cost one
843
842
  step. This is the runaway-loop guard.
844
- - **`timeout_seconds`** (default 120, max 600) — the real time budget.
843
+ - **`timeout_seconds`** (default 300, max 600) — the real time budget.
845
844
 
846
845
  A name may not appear in both `vars` and `output`: a run's inputs and its output
847
846
  are read side by side, so a collision would make one of the two unreachable.
848
847
 
849
- **There is no draft and no publish step.** One config, strict at save: an
850
- invalid one is refused with a 400 listing every problem and nothing is stored,
851
- so a task that exists can always run. An edit takes effect on the next run with
852
- nothing in between there are no versions, so there is no earlier wording to go
853
- back to and nothing records which definition produced an earlier run.
854
- `create_task` and `update_task` also return **`warnings`**: the problems that
855
- are real but not fatal, such as a prompt reading a variable nothing declares.
856
- There is no publish screen to show them on, so read them where they are.
848
+ ### Draft, publish, versions
849
+
850
+ **A task has the same lifecycle an agent has**, and the same four functions.
851
+ `create_task` and `update_task` write the **draft**, checked only for what a
852
+ half-written task can be judged on so a task saves before it has a model key,
853
+ a prompt or an output field, and the person can keep building. `publish_task`
854
+ freezes that draft as an immutable version, pins every attached tool to the
855
+ version live at that moment, and makes it what runs. `get_task_version` reads a
856
+ frozen one back and `rollback_task_version` puts one back into production,
857
+ replacing the draft.
858
+
859
+ `validate_task` is the publish-grade check without the publish: a workspace API
860
+ key for the model, at least one `output` field, the attached tools' operation
861
+ trees, and the email batches already drafting with this task. Run it before
862
+ `publish_task` — its `errors` are what a publish would refuse with, and its
863
+ `warnings` (a prompt reading a variable nothing declares, a task with no prompt)
864
+ are worth reporting but never block.
865
+
866
+ **Build order:** create the draft → write the prompt, `vars` and `output` →
867
+ `run_task` with `version: "draft"` to try it → fix → `validate_task` →
868
+ `publish_task` **when the person asks you to**. Publishing is their call, not
869
+ yours: it changes what every run and every live email batch does.
857
870
 
858
871
  ### The output tool
859
872
 
@@ -876,6 +889,11 @@ about what belongs there.
876
889
  their secrets, the MCP servers spend their credits, and the model spends their
877
890
  tokens. A task that books, charges or sends will do so.
878
891
 
892
+ It runs the published version unless `version` says otherwise. Pass
893
+ `version: "draft"` to try the unpublished config — that is the loop you build
894
+ in, and it is refused with the publish errors when the draft does not hold
895
+ together.
896
+
879
897
  The response is the whole run — `output`, a `trace` of every tool call and
880
898
  everything the model wrote (secrets redacted, long fields truncated and marked),
881
899
  `steps_used` against `max_steps`, the tokens each model spent and
@@ -901,9 +919,16 @@ problem it is:
901
919
  `no_output` precisely so nobody rewrites a prompt that was never the problem.
902
920
  - `timeout` — `timeout_seconds` elapsed.
903
921
  - `provider_error` — the model or an MCP server failed. Not yours to fix.
904
- - `configuration` — yours to tell them: a missing BYOK key, a deleted or
905
- unpublished tool, an integration whose credential no longer resolves.
922
+ - `configuration` — yours to tell them: a missing BYOK key, a tool version this
923
+ publish pinned that has since been deleted, an integration whose credential no
924
+ longer resolves.
906
925
  - `platform` — ours.
926
+ - `canceled` — a deploy or restart stopped the run. A batch row is drafted again
927
+ automatically; a run started by hand is run again.
928
+
929
+ Each run records `task_version` — which published definition ran it, and null
930
+ for a `version: "draft"` run. That is what makes two runs either side of an edit
931
+ tell apart.
907
932
 
908
933
  Task runs are **not** in the Observability charts, which are built on calls and
909
934
  conversations. `list_task_runs` is where a task's own history lives.
@@ -1035,9 +1060,11 @@ afterwards will not forgive us:
1035
1060
  opted in. This runs on *their* Resend account under *their* agreement.
1036
1061
  - **Nothing is sent that they have not reviewed and selected.** Creating a batch
1037
1062
  only drafts.
1038
- - **Every row runs the task as it stands right now.** Editing it while a batch
1039
- is drafting changes every row generated after that moment, and there is no way
1040
- to get the old wording back.
1063
+ - **Every row runs the task's CURRENT PUBLISHED version**, re-read every pass, so
1064
+ publishing mid-batch changes every row drafted after that moment. Which version
1065
+ wrote which rows is on the batch as `drafted_versions`, and
1066
+ `redraft_email_batch_recipients` with `selection: "stale_version"` is how the
1067
+ older ones are rewritten.
1041
1068
  - **Talqing reports what it sent, not what landed.** Deliveries, bounces and
1042
1069
  spam complaints live in the Resend dashboard, and watching them there is how a
1043
1070
  sending domain survives.
@@ -1067,26 +1094,46 @@ no tokens spent. Flag blank cells in a required column before creating.
1067
1094
 
1068
1095
  ### Two jobs, and a human between them
1069
1096
 
1070
- **Drafting** starts on `start_at` (or immediately), honours `calling_window` on
1071
- the batch's `timezone`, runs `max_concurrency` rows at a time, and stops when
1072
- the last row lands. Its `status` is about drafting and nothing else
1073
- `scheduled`, `drafting`, `paused`, `drafted`, `canceled`, `failed`. A `drafted`
1074
- batch means *"the drafts are ready to review"*, never "finished": it says
1075
- nothing about what has been sent.
1076
-
1077
- **Sending** is separate and only ever happens when a person asks.
1078
- `send_email_batch_recipients` takes **at most 50 rows, named one by one**. There
1079
- is no `selection` shorthand on it, no bulk endpoint, and there must not be one:
1080
- a 5 000-row batch cannot leave the building without a hundred deliberate calls,
1081
- each of which should follow reading the fifty drafts it covers. That friction is
1082
- the only structural safeguard this feature has **do not offer to work around
1083
- it.** `skip`, `restore` and `retry` *do* take `selection: "all_eligible"`,
1084
- because they are reversible and mailing strangers is not.
1085
-
1086
- Each send may override `from_email` / `from_name` / `reply_to` for that call
1087
- alone; the batch's own default is unchanged. The Resend account itself is not
1097
+ **Drafting** starts on `start_at` (or immediately), runs `draft_concurrency` rows
1098
+ at a time with at least `draft_gap_seconds` between two starts, and stops when
1099
+ the last row lands. It has no business-hours window: nobody receives a draft. Its
1100
+ `status` is about drafting and nothing else — `scheduled`, `drafting`, `paused`,
1101
+ `drafted`, `canceled`, `failed`. A `drafted` batch means *"the drafts are ready
1102
+ to review"*, never "finished": it says nothing about what has been sent.
1103
+
1104
+ **Sending** is separate, only ever happens when a person asks, and is its own
1105
+ row. `create_email_send` takes `recipient_ids` or `selection: "all_drafts"` and
1106
+ returns a **send** you can steer:
1107
+
1108
+ - `start_at` schedules it, `window` (on its own `timezone`) holds it to business
1109
+ hours, `send_gap_seconds` is the minimum wait between two emails (1 second to
1110
+ 1 hour) and `send_daily_cap` bounds how many may leave per local day. Anything
1111
+ omitted comes from the batch.
1112
+ - `pause_email_send` stops on the next email; `resume_email_send` carries on.
1113
+ - `cancel_email_send` gives **every unsent row back as a draft**, ready for
1114
+ another send. It is also the ONLY way to change what a scheduled send
1115
+ contains: a send's rows are fixed when it is created, and there is no verb for
1116
+ pulling rows out of one.
1117
+ - `get_email_send` carries `next_send_at`, which is how "waiting for Monday" is
1118
+ told apart from "stuck", and covers a start time, a shut window and a spent
1119
+ daily cap alike.
1120
+
1121
+ **The safeguard here is a RATE, not a row count.** `send_daily_cap` (200 by
1122
+ default, per batch, `null` for uncapped) is what stands between a 5 000-row list
1123
+ and a sending domain nobody trusts again. Before creating a send, say how many
1124
+ emails it is and roughly how long it will take at the pace it has — and if the
1125
+ user asks to raise or remove the cap, say what it is for rather than just doing
1126
+ it.
1127
+
1128
+ Each send may override `from_email` / `from_name` / `reply_to` for itself alone;
1129
+ the batch's own default is unchanged. The Resend account itself is not
1088
1130
  overridable — a different account is a different batch.
1089
1131
 
1132
+ Every email carries `List-Unsubscribe: <mailto:…?subject=unsubscribe>`, pointed
1133
+ at the send's `reply_to` or its `from_email`. There is no one-click unsubscribe
1134
+ and no suppression list, so an opt-out arrives as a reply in the tenant's own
1135
+ inbox and honouring it is theirs to do.
1136
+
1090
1137
  ### Fixing rows
1091
1138
 
1092
1139
  `list_email_batch_recipients` returns each row's `columns` (the merged space),
@@ -1095,8 +1142,13 @@ null when it can. `patch_email_batch_recipient` edits cells: the edit is stored
1095
1142
  apart from what the model wrote, merged last, and an empty value clears it. That
1096
1143
  is the answer to a row whose task returned `null` for the address — type one in.
1097
1144
 
1098
- `retry_email_batch_recipients` re-drafts rows whose drafting failed, and is the
1099
- one action that revives a batch that already finished drafting.
1145
+ `redraft_email_batch_recipients` writes rows again from scratch and is the one
1146
+ action that revives a batch that already finished drafting. Its `selection` is
1147
+ `failed` (drafting failed), `stale_version` (an older published version of the
1148
+ task wrote them), `not_sent`, or `all` — which names every row it refuses.
1149
+ **Each redrafted row runs the task again and is billed again**, so say the row
1150
+ count before running `all`. A person's edited cells survive unless
1151
+ `clear_overrides` is set.
1100
1152
 
1101
1153
  **One address is mailed at most once per batch**, enforced when the row is
1102
1154
  claimed for sending: the second row settles `skipped` with
@@ -1105,12 +1157,18 @@ ours — Resend keeps one and auto-suppresses hard bounces and complaints.
1105
1157
 
1106
1158
  ### Watching it
1107
1159
 
1108
- `get_email_batch` carries live counts, `failure_reason`, `next_draft_at` (which
1109
- is how "waiting for Monday" is told apart from "stuck") and the drafting cost so
1110
- far. A batch that stops itself did so after ten consecutive drafting failures,
1111
- or on the first `configuration` failure (a deleted task, a field map an edit
1112
- broke) or the first account-level send failure (a revoked key, an unverified
1113
- domain) — because those will fail identically for every remaining row.
1160
+ `get_email_batch` carries live counts, `failure_reason`, `sent_today` (against
1161
+ `send_daily_cap`), `drafted_versions` and the drafting cost so far. A batch that
1162
+ stops itself did so after ten consecutive drafting failures, or on the first
1163
+ `configuration` failure a deleted task, a field map an edit broke — because
1164
+ those will fail identically for every remaining row.
1165
+
1166
+ **A send fails on its own, and never takes the batch with it.** Ten consecutive
1167
+ provider failures, or one account-level refusal (a revoked key, an unverified
1168
+ domain, an exhausted quota), stop that send and return its untouched rows to the
1169
+ review table as drafts. Fix the cause and create another send; the drafts are
1170
+ still there. In the other direction, pausing or cancelling the *batch* stops
1171
+ drafting and does not touch a send that is already scheduled or going out.
1114
1172
 
1115
1173
  ## Knowledge bases
1116
1174
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talqing/mcp",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
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
@@ -297,7 +297,7 @@
297
297
  "role": "write"
298
298
  },
299
299
  {
300
- "description": "Fetch one task's config and how its last run went.",
300
+ "description": "Fetch one task's draft config, published version, history and last run.",
301
301
  "method": "GET",
302
302
  "name": "get_task",
303
303
  "parameters": {
@@ -311,7 +311,7 @@
311
311
  "role": "read"
312
312
  },
313
313
  {
314
- "description": "Replace a task's config.",
314
+ "description": "Replace the task's draft config with the one supplied.",
315
315
  "method": "PATCH",
316
316
  "name": "update_task",
317
317
  "parameters": {
@@ -325,7 +325,7 @@
325
325
  "role": "write"
326
326
  },
327
327
  {
328
- "description": "Delete a task. Its run history survives, still named after it.",
328
+ "description": "Delete a task and its published versions. Its runs survive, still named after it.",
329
329
  "method": "DELETE",
330
330
  "name": "delete_task",
331
331
  "parameters": {
@@ -338,6 +338,62 @@
338
338
  "read_only": false,
339
339
  "role": "write"
340
340
  },
341
+ {
342
+ "description": "Run publish-grade validation on the draft without publishing it.",
343
+ "method": "POST",
344
+ "name": "validate_task",
345
+ "parameters": {
346
+ "additionalProperties": true,
347
+ "description": "Arguments not inlined: call describe_function('validate_task').",
348
+ "properties": {},
349
+ "type": "object"
350
+ },
351
+ "path": "/v1/tasks/{task_id}/validate",
352
+ "read_only": false,
353
+ "role": "write"
354
+ },
355
+ {
356
+ "description": "Freeze the current draft as a new immutable version and make it live.",
357
+ "method": "POST",
358
+ "name": "publish_task",
359
+ "parameters": {
360
+ "additionalProperties": true,
361
+ "description": "Arguments not inlined: call describe_function('publish_task').",
362
+ "properties": {},
363
+ "type": "object"
364
+ },
365
+ "path": "/v1/tasks/{task_id}/publish",
366
+ "read_only": false,
367
+ "role": "write"
368
+ },
369
+ {
370
+ "description": "Fetch what one published version of a task actually contains.",
371
+ "method": "GET",
372
+ "name": "get_task_version",
373
+ "parameters": {
374
+ "additionalProperties": true,
375
+ "description": "Arguments not inlined: call describe_function('get_task_version').",
376
+ "properties": {},
377
+ "type": "object"
378
+ },
379
+ "path": "/v1/tasks/{task_id}/versions/{version}",
380
+ "read_only": true,
381
+ "role": "read"
382
+ },
383
+ {
384
+ "description": "Put an earlier published version of a task back into production.",
385
+ "method": "POST",
386
+ "name": "rollback_task_version",
387
+ "parameters": {
388
+ "additionalProperties": true,
389
+ "description": "Arguments not inlined: call describe_function('rollback_task_version').",
390
+ "properties": {},
391
+ "type": "object"
392
+ },
393
+ "path": "/v1/tasks/{task_id}/versions/{version}/rollback",
394
+ "read_only": false,
395
+ "role": "write"
396
+ },
341
397
  {
342
398
  "description": "Run the task once with the variables you supply, and wait for the result.",
343
399
  "method": "POST",
@@ -1137,7 +1193,7 @@
1137
1193
  "role": "write"
1138
1194
  },
1139
1195
  {
1140
- "description": "Stop drafting for good. This is the only terminal action \u2014 a batch cannot be deleted, because it is the record of what was sent to whom.",
1196
+ "description": "Stop drafting for good. A batch cannot be deleted, because it is the record of what was sent to whom.",
1141
1197
  "method": "POST",
1142
1198
  "name": "cancel_email_batch",
1143
1199
  "parameters": {
@@ -1179,58 +1235,142 @@
1179
1235
  "role": "write"
1180
1236
  },
1181
1237
  {
1182
- "description": "Send the rows you name. **This mails real people and cannot be undone.**",
1238
+ "description": "Take drafted rows out of consideration. Reversible with `restore`.",
1183
1239
  "method": "POST",
1184
- "name": "send_email_batch_recipients",
1240
+ "name": "skip_email_batch_recipients",
1185
1241
  "parameters": {
1186
1242
  "additionalProperties": true,
1187
- "description": "Arguments not inlined: call describe_function('send_email_batch_recipients').",
1243
+ "description": "Arguments not inlined: call describe_function('skip_email_batch_recipients').",
1188
1244
  "properties": {},
1189
1245
  "type": "object"
1190
1246
  },
1191
- "path": "/v1/email/batches/{batch_id}/send",
1247
+ "path": "/v1/email/batches/{batch_id}/skip",
1192
1248
  "read_only": false,
1193
1249
  "role": "write"
1194
1250
  },
1195
1251
  {
1196
- "description": "Take drafted rows out of consideration. Reversible with `restore`.",
1252
+ "description": "Put skipped rows back. `selection: \"all_eligible\"` means every skipped row.",
1197
1253
  "method": "POST",
1198
- "name": "skip_email_batch_recipients",
1254
+ "name": "restore_email_batch_recipients",
1199
1255
  "parameters": {
1200
1256
  "additionalProperties": true,
1201
- "description": "Arguments not inlined: call describe_function('skip_email_batch_recipients').",
1257
+ "description": "Arguments not inlined: call describe_function('restore_email_batch_recipients').",
1202
1258
  "properties": {},
1203
1259
  "type": "object"
1204
1260
  },
1205
- "path": "/v1/email/batches/{batch_id}/skip",
1261
+ "path": "/v1/email/batches/{batch_id}/restore",
1206
1262
  "read_only": false,
1207
1263
  "role": "write"
1208
1264
  },
1209
1265
  {
1210
- "description": "Put skipped rows back. `selection: \"all_eligible\"` means every skipped row.",
1266
+ "description": "Draft rows again from scratch. **Each one runs the task and is billed again.**",
1211
1267
  "method": "POST",
1212
- "name": "restore_email_batch_recipients",
1268
+ "name": "redraft_email_batch_recipients",
1213
1269
  "parameters": {
1214
1270
  "additionalProperties": true,
1215
- "description": "Arguments not inlined: call describe_function('restore_email_batch_recipients').",
1271
+ "description": "Arguments not inlined: call describe_function('redraft_email_batch_recipients').",
1216
1272
  "properties": {},
1217
1273
  "type": "object"
1218
1274
  },
1219
- "path": "/v1/email/batches/{batch_id}/restore",
1275
+ "path": "/v1/email/batches/{batch_id}/redraft",
1276
+ "read_only": false,
1277
+ "role": "write"
1278
+ },
1279
+ {
1280
+ "description": "Send these rows. **This mails real people and cannot be undone.**",
1281
+ "method": "POST",
1282
+ "name": "create_email_send",
1283
+ "parameters": {
1284
+ "additionalProperties": true,
1285
+ "description": "Arguments not inlined: call describe_function('create_email_send').",
1286
+ "properties": {},
1287
+ "type": "object"
1288
+ },
1289
+ "path": "/v1/email/batches/{batch_id}/sends",
1290
+ "read_only": false,
1291
+ "role": "write"
1292
+ },
1293
+ {
1294
+ "description": "Every send on this batch, newest first, with its counts and its schedule.",
1295
+ "method": "GET",
1296
+ "name": "list_email_sends",
1297
+ "parameters": {
1298
+ "additionalProperties": true,
1299
+ "description": "Arguments not inlined: call describe_function('list_email_sends').",
1300
+ "properties": {},
1301
+ "type": "object"
1302
+ },
1303
+ "path": "/v1/email/batches/{batch_id}/sends",
1304
+ "read_only": true,
1305
+ "role": "read"
1306
+ },
1307
+ {
1308
+ "description": "One send: where its rows are, and when it next does something.",
1309
+ "method": "GET",
1310
+ "name": "get_email_send",
1311
+ "parameters": {
1312
+ "additionalProperties": true,
1313
+ "description": "Arguments not inlined: call describe_function('get_email_send').",
1314
+ "properties": {},
1315
+ "type": "object"
1316
+ },
1317
+ "path": "/v1/email/batches/{batch_id}/sends/{send_id}",
1318
+ "read_only": true,
1319
+ "role": "read"
1320
+ },
1321
+ {
1322
+ "description": "Re-steer one send: its pace, its hours, its daily cap, its start time.",
1323
+ "method": "PATCH",
1324
+ "name": "patch_email_send",
1325
+ "parameters": {
1326
+ "additionalProperties": true,
1327
+ "description": "Arguments not inlined: call describe_function('patch_email_send').",
1328
+ "properties": {},
1329
+ "type": "object"
1330
+ },
1331
+ "path": "/v1/email/batches/{batch_id}/sends/{send_id}",
1332
+ "read_only": false,
1333
+ "role": "write"
1334
+ },
1335
+ {
1336
+ "description": "Stop sending. It takes hold on the next email, and nothing is lost \u2014 the rows stay queued for whenever you resume.",
1337
+ "method": "POST",
1338
+ "name": "pause_email_send",
1339
+ "parameters": {
1340
+ "additionalProperties": true,
1341
+ "description": "Arguments not inlined: call describe_function('pause_email_send').",
1342
+ "properties": {},
1343
+ "type": "object"
1344
+ },
1345
+ "path": "/v1/email/batches/{batch_id}/sends/{send_id}/pause",
1346
+ "read_only": false,
1347
+ "role": "write"
1348
+ },
1349
+ {
1350
+ "description": "Undo a pause and carry on from where it stopped.",
1351
+ "method": "POST",
1352
+ "name": "resume_email_send",
1353
+ "parameters": {
1354
+ "additionalProperties": true,
1355
+ "description": "Arguments not inlined: call describe_function('resume_email_send').",
1356
+ "properties": {},
1357
+ "type": "object"
1358
+ },
1359
+ "path": "/v1/email/batches/{batch_id}/sends/{send_id}/resume",
1220
1360
  "read_only": false,
1221
1361
  "role": "write"
1222
1362
  },
1223
1363
  {
1224
- "description": "Draft rows whose first attempt failed, again.",
1364
+ "description": "Stop this send, and give every row it has not sent back as a draft.",
1225
1365
  "method": "POST",
1226
- "name": "retry_email_batch_recipients",
1366
+ "name": "cancel_email_send",
1227
1367
  "parameters": {
1228
1368
  "additionalProperties": true,
1229
- "description": "Arguments not inlined: call describe_function('retry_email_batch_recipients').",
1369
+ "description": "Arguments not inlined: call describe_function('cancel_email_send').",
1230
1370
  "properties": {},
1231
1371
  "type": "object"
1232
1372
  },
1233
- "path": "/v1/email/batches/{batch_id}/retry",
1373
+ "path": "/v1/email/batches/{batch_id}/sends/{send_id}/cancel",
1234
1374
  "read_only": false,
1235
1375
  "role": "write"
1236
1376
  },