Checklist Task Tools
These tools work on the tasks inside a checklist: completing them or marking them not applicable, assigning them, setting due dates, tagging them, answering their fields, managing File Upload and Table controls, commenting and snoozing. Every tool takes the checklist's key and the task's key — you get both from create_checklist, get_checklist or a list_my_work row.
Each tool is the MCP counterpart of a route on the Checklist Tasks or Task Fields REST page and calls the same handler, so a tool and its route give the same answer and refuse in the same words. Fields are the task's input controls — see Control Types.
Tasks attached to a checklist by hand are standalone tasks, not checklist tasks, and none of these tools can address them. Use the Standalone Task Tools for those.
How These Tools Behave
- Keys are strings holding a GUID. A malformed key is refused with
VALIDATION_ERROR, naming the argument you sent (checklistKey,taskKeyorfieldKey). - Dates are ISO 8601 instants in UTC, for example
2026-10-30T17:00:00Z. - Results carry the same JSON as the REST response — camelCase, properties with no value omitted, a
Zon every timestamp — instructuredContentand again as text. A tool whose route answers204 No Contentreturns{"result":null}. - Refusals come back as an ordinary tool result with
isErrorset, carrying the v3 error body instructuredContent. The text block starts with the error code and message and ends with therequestId. See Errors and How It Works. idempotencyKeyis accepted by the write tools that list it. The same key with the same arguments within 24 hours returns the first call's answer, marked withcheckflow.io/idempotentReplayin the result's_meta; the same key with different arguments, or while the first call is still running, is refused withCONFLICT. Keys are at most 255 characters. See Idempotency.- Annotations are the hints each tool publishes to the client. A hint a tool does not declare is left out, and the client falls back to the MCP defaults: no
readOnlyHintmeans the tool is assumed to write, nodestructiveHintmeans it is assumed to be potentially destructive and noidempotentHintmeans it is assumed not to be safe to repeat. - Assignee and mention arguments name a person or group either as
{ type, id }—typebeingTeamMemberorGroup— or as{ name }, where the name is a member's full name, a member's email address or a group's name. A name matching more than one member is refused with the matches, so an email address is the safest choice. Ids come fromlist_membersandlist_groups.
Tools
| Tool | What it does | Read/Write |
|---|---|---|
list_checklist_tasks | Lists a checklist's tasks cheaply | Read |
get_task | Reads one task in full | Read |
get_task_activity | Reads one task's activity feed | Read |
complete_task | Completes a task | Write |
uncomplete_task | Returns a completed task to incomplete | Write |
set_task_not_applicable | Marks a task not applicable | Write |
clear_task_not_applicable | Returns a not-applicable task to incomplete | Write |
set_task_assignees | Replaces a task's assignees | Write |
clear_task_assignees | Unassigns a task from everybody | Write |
set_task_due_date | Sets a task's due date | Write |
clear_task_due_date | Removes a task's due date | Write |
add_task_tags | Adds tags to a task | Write |
remove_task_tag | Removes one tag from a task | Write |
get_task_fields | Reads a task's fields and their values | Read |
set_task_fields | Answers one or more fields in one call | Write |
get_task_files | Lists the files on a File Upload control | Read |
remove_task_file | Removes one file from a File Upload control | Write |
get_task_table_rows | Reads a Table control in full | Read |
add_task_table_row | Adds a row to a table | Write |
remove_task_table_row | Removes a row from a table | Write |
set_task_table_cell | Writes one table cell | Write |
add_task_comment | Adds a comment to a task | Write |
remove_task_comment | Deletes a comment from a task | Write |
get_task_snooze | Reads the acting member's snooze on a task | Read |
set_task_snooze | Snoozes a task for the acting member | Write |
end_task_snooze | Ends the acting member's snooze on a task | Write |
list_checklist_tasks
Lists a checklist's tasks in the order the checklist lays them out. This is the cheap read: get_checklist returns the same tasks with their fields, comments and assignees, which costs a query per task, while this costs one query for the whole checklist.
Headings are included — they hold no state and cannot be completed. So are tasks a condition is currently hiding or halting: isCurrentlyHidden and isCurrentlyHalted report them rather than the list leaving them out, so you can decide which reading you want.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
status | string | No | Only tasks in these states: one or more of Incomplete, Complete and NotApplicable, comma-separated. Case, spaces, hyphens and underscores are ignored. Omit for every task, headings included. |
- Returns:
{ "tasks": [...] }, each withkey,name,order,isHeading,status,isComplete,isNotApplicable,isCurrentlyHalted,isCurrentlyHidden,isAssignedExclusivelyand, where they have values,dueDateTime,completedDateTime,completedBy,notApplicableDateTimeandnotApplicableBy. - Annotations:
readOnlyHint: true,idempotentHint: true. - REST equivalent:
GET /v3/checklists/{checklistKey}/tasks. - Example prompt: "Which tasks on Invoice Review — INV-2041 are still incomplete?"
get_task
Reads one task and everything on it: its state, its assignees, its fields and their current values, its comments and its tags. The task must be one of the checklist's own. A checklist in another workspace is reported as missing rather than forbidden.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
- Returns: the task — the fields
list_checklist_tasksreturns, plusassignees,fields,comments,checklist(itskey,name,urlandtemplate) andtags. See the Task object. - Annotations:
readOnlyHint: true,idempotentHint: true. - REST equivalent:
GET /v3/checklists/{checklistKey}/tasks/{taskKey}. - Example prompt: "What's on the Manager Approval task of Invoice Review — INV-2041, and who has commented on it?"
get_task_activity
Reads what has happened on one task, most recent first. It is the same feed get_checklist_activity returns, filtered to this task, and it can carry entries the checklist's feed does not, because some are recorded against a task without naming a checklist. Entries are prose with the names already filled in, so a renamed task reads under its current name throughout its history.
Entries are written a second or two after the event, so this is not the way to confirm a write you have just made — the reply to the write is.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
sort | string | No | occurredAt, occurredAt:asc or occurredAt:desc. Default occurredAt:desc. |
after | string | No | The nextCursor from the previous reply. |
pageSize | integer | No | Entries per page, 1–100. Default 50. |
- Returns: a page of activity entries —
items,nextCursor,hasMore— each withoccurredAt,actor,descriptionand, where they apply,taskKey,taskName,fieldKey,fieldNameanddateTimeValue. - Annotations:
readOnlyHint: true,idempotentHint: true. - REST equivalent:
GET /v3/checklists/{checklistKey}/tasks/{taskKey}/activity. - Example prompt: "When was the Manager Approval task on INV-2041 completed, and by whom?"
complete_task
Completes a task. Completing one can change the whole checklist: conditions re-run, which may show, hide or halt other tasks, and a checklist whose last task this was completes itself. The reply is the task as it now stands — read the checklist back if you need to see what else moved.
A task that is already complete is left alone and the call still succeeds. Refused for a heading, for a task a condition is currently halting, for a task assigned exclusively to somebody else, and for a task with required fields still empty (the refusal names them).
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
- Returns: the task with its
assignees,fieldsandcomments. - Annotations:
destructiveHint: false,idempotentHint: true. - REST equivalent:
POST /v3/checklists/{checklistKey}/tasks/{taskKey}/complete. - Example prompt: "Tick off the Match PO task on Invoice Review — INV-2041."
uncomplete_task
Returns a completed task to incomplete. Conditions re-run, so this can hide, show or halt other tasks, and a checklist that had completed reopens. It does nothing to a task marked not applicable — that is a separate state with its own way back (clear_task_not_applicable). A task that is already incomplete is left alone and the call still succeeds.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
- Returns: the task with its
assignees,fieldsandcomments. - Annotations:
idempotentHint: true. - REST equivalent:
DELETE /v3/checklists/{checklistKey}/tasks/{taskKey}/complete. - Example prompt: "Reopen the Match PO task on INV-2041 — the purchase order was wrong."
set_task_not_applicable
Marks a task as not applicable: it does not need doing on this checklist, and the checklist can complete without it. This is not the same as completing it — the task is recorded as skipped rather than done, and reads back with isNotApplicable rather than isComplete. Conditions re-run, as they do for a completion. A task already marked not applicable is left alone and the call still succeeds.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
- Returns: the task with its
assignees,fieldsandcomments. - Annotations:
destructiveHint: false,idempotentHint: true. - REST equivalent:
POST /v3/checklists/{checklistKey}/tasks/{taskKey}/not-applicable. - Example prompt: "INV-2041 is under the threshold, so mark the Director Sign-Off task as not applicable."
clear_task_not_applicable
Returns a task marked not applicable to incomplete, so it needs doing again. It does nothing to a completed task — use uncomplete_task for that. A task that is already incomplete is left alone and the call still succeeds.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
- Returns: the task with its
assignees,fieldsandcomments. - Annotations:
idempotentHint: true. - REST equivalent:
DELETE /v3/checklists/{checklistKey}/tasks/{taskKey}/not-applicable. - Example prompt: "Director Sign-Off on INV-2041 is needed after all — put it back."
set_task_assignees
Sets who a task is assigned to. This is a replacement, not an addition: anyone not in the list is unassigned. To add somebody, read the task first and send the people already on it alongside the new one. Everyone newly assigned is notified; sending the same list twice notifies nobody a second time.
isAssignedExclusively is written on every call and defaults to false, so to keep a task's current exclusivity you have to send it back.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
assignees | array of objects | No | Who the task is assigned to afterwards, each { type, id } or { name }. An empty list unassigns the task. Naming the same person twice is not an error. |
isAssignedExclusively | boolean | No | True to let only these assignees open, change or reassign the task. Default false. |
- Returns:
assignees(each an Assignee object withid,typeandname) andisAssignedExclusively. - Annotations:
idempotentHint: true. - REST equivalent:
PUT /v3/checklists/{checklistKey}/tasks/{taskKey}/assignees. - Example prompt: "Assign the Manager Approval task on INV-2041 to Sarah Chen and the Finance Team, and let only them work on it."
clear_task_assignees
Unassigns a task from everybody. It is the same write as set_task_assignees with an empty list. A task assigned to nobody is open to everyone who can run the checklist, whatever isAssignedExclusively says.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
- Returns:
assignees(empty) andisAssignedExclusively. - Annotations:
idempotentHint: true. - REST equivalent:
DELETE /v3/checklists/{checklistKey}/tasks/{taskKey}/assignees. - Example prompt: "Unassign everyone from the Filing task on INV-2041 so anyone can pick it up."
set_task_due_date
Sets when a task is due. The task's reminders are rescheduled from the new date, so writing the same date twice changes nothing and re-sends nothing. A date in the past is accepted — that is how a task is recorded as already overdue. An unreadable or missing date is refused rather than clearing the due date; to remove one, use clear_task_due_date.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
dueDateTime | string (date-time) | Yes | When the task is due, in UTC, for example 2026-10-30T17:00:00Z. |
- Returns:
dueDateTimeandisRuleGoverned. WhenisRuleGovernedis true, the template calculates this task's due date from a rule, and the date you set stands only until the rule next runs. - Annotations:
destructiveHint: false,idempotentHint: true. - REST equivalent:
PUT /v3/checklists/{checklistKey}/tasks/{taskKey}/due-date. - Example prompt: "Make the Manager Approval task on INV-2041 due by 5 pm UTC on Friday 30 October."
clear_task_due_date
Removes a task's due date. Its reminders are rebuilt without it, so the ones that would have fired do not; nobody is told the due date has gone. A task with no due date is left as it is and the call still succeeds.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
- Returns:
isRuleGoverned, withdueDateTimeabsent. - Annotations:
idempotentHint: true. - REST equivalent:
DELETE /v3/checklists/{checklistKey}/tasks/{taskKey}/due-date. - Example prompt: "Take the due date off the Filing task on INV-2041."
add_task_tags
Adds one or more tags to a task. A name the workspace has not used before creates the tag, so the tool's description tells the model to check what exists first with list_tags. Matching is case-insensitive, so Urgent and urgent are one tag. Tags the task already has are not added twice.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
tags | array of strings | Yes | The tag names, 1 to 25 of them. |
- Returns:
tags(every tag now on the task, ordered by name) andcreated(names this call added to the workspace for the first time). - Annotations:
destructiveHint: false,idempotentHint: true. - REST equivalent:
POST /v3/checklists/{checklistKey}/tasks/{taskKey}/tags. - Example prompt: "Tag the Manager Approval task on INV-2041 as urgent."
remove_task_tag
Removes one tag from a task, by name. Removing a tag the task does not have succeeds and writes nothing. A tag that no task or checklist carries any more is removed from the workspace, so this can be the call that deletes the tag itself.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
name | string | Yes | The tag's name. Case-insensitive. |
- Returns:
tags(every tag now on the task) andtagDeleted. - Annotations:
idempotentHint: true. - REST equivalent:
DELETE /v3/checklists/{checklistKey}/tasks/{taskKey}/tags?name=…. - Example prompt: "Remove the urgent tag from the Manager Approval task on INV-2041."
get_task_fields
Reads the fields on a task and what each one currently holds — their keys, types, whether they are required and whether they are read-only. The tool's description tells the model to read this before writing an answer, because a field's key and the shape its value takes both come from here.
The description also points out the details that decide whether a write is accepted:
- A Date & Time field carries
mode— date, time or date-and-time. All three answer with a whole timestamp: a date-only field is a calendar date held at midnight UTC, and a time-only field is a time of day on an arbitrary date. - A Short Text field with a pattern (
regex) refuses an answer that does not match;regexMessagesays what it wants. - A Members field whose
selectionModeis single refuses a value naming two people. - A Dropdown or Multi-Choice that reads its options from a Data Set carries
dataSet— the Data Set, view and display field, by key. Its value is the selected record,{ recordKey, text }or a list of them, and it has no options: the options are the view's records, whichlist_data_set_recordsreturns.
Fields a condition is currently hiding are left out, because they cannot be answered.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
- Returns:
{ "fields": [...] }, each a Field object. - Annotations:
readOnlyHint: true,idempotentHint: true. - REST equivalent:
GET /v3/checklists/{checklistKey}/tasks/{taskKey}/fields. - Example prompt: "What do I need to fill in on the Invoice Details task of INV-2041?"
set_task_fields
Answers one or more of a task's fields. Send every answer in one call rather than calling once per field: writing them together costs one read, one round of binding propagation and one notification however many fields changed. Every value is checked before any is written, so a batch either applies completely or changes nothing. Naming the same field twice is refused.
The reply is the task's whole field set, not only the fields you wrote, because a write propagates: a Data Set-linked control fills in every other control bound to the same record, and a dynamic value copies into the controls that point at it.
Refused for a field a condition is hiding, for a read-only field, and for controls that hold no single value — Table and File Upload controls have tools of their own. At most 50 fields in one call.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
fields | array of objects | Yes | The answers, as { key, value }. key is the field's key from get_task_fields. See the value shapes below. A null value clears the field. |
The value takes the shape get_task_fields reports:
| Control | Value |
|---|---|
| Short Text, Long Text, E-Mail, Website | A string. |
| Date & Time | An ISO 8601 date. |
| Dropdown | The option's own text. |
| Multi-Choice | A list of the selected options' texts. |
| Sub-Tasks | A list of the ticked items' texts. |
| Members | A list of names, email addresses or { type, id } objects. |
| Dropdown or Multi-Choice linked to a Data Set | A record of the field's view — { recordKey } from list_data_set_records, or the words the option shows — or a list of either for a Multi-Choice. |
The list-valued answers are replacements: anything left out is deselected.
- Returns:
{ "fields": [...] }— the task's whole field set after the write. - Annotations:
idempotentHint: true. - REST equivalent:
PUT /v3/checklists/{checklistKey}/tasks/{taskKey}/fields. The single-field route,PUT .../fields/{fieldKey}, has no tool — a batch of one does the same job. - Example prompt: "On the Invoice Details task of INV-2041, set the amount to 4,250.00, the supplier to Northwind Components and the approvers to Sarah Chen and James Okafor."
get_task_files
Lists the files on one File Upload control: each file's name, media type, upload time, uploader, id and download address. The address is not behind the API key — the URL itself is the secret — so treat it as one before passing it on. This answers for a control a condition is hiding and for a read-only control, which get_task_fields leaves out.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
fieldKey | string (GUID) | Yes | The File Upload control's key, from get_task_fields. |
- Returns: the Files object —
fieldKey,fieldName,minFiles,maxFiles,isReadOnlyandfiles— each withid,name,contentType,url,description,uploadedDateTimeanduploadedBy. - Annotations:
readOnlyHint: true,idempotentHint: true. - REST equivalent:
GET /v3/checklists/{checklistKey}/tasks/{taskKey}/fields/{fieldKey}/files. - Example prompt: "Which files have been uploaded to the Supporting Documents control on INV-2041?"
remove_task_file
Removes one file from a File Upload control. The id comes from get_task_files. An id that is not on this control is refused as missing rather than acted on, because file ids are unique across the whole database and an id alone would otherwise be enough to delete someone else's file. Removing a file that is no longer there is also reported as missing, since it means your picture of the task is out of date.
Refused for a control a condition is hiding and for a control whose files came from the template.
There is no tool for uploading a file. The REST route takes the file base64-encoded, which through a tool call would pass up to 32 MB through the model's context window.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
fieldKey | string (GUID) | Yes | The File Upload control's key. |
fileId | integer | Yes | The file's id, from get_task_files. |
idempotencyKey | string | No | Send the same key again to retry this call safely. |
- Returns: the control's files after the removal, as
get_task_filesreturns them, plusblobDeleted— true when this was the last reference to the stored file and the file itself was deleted. - Annotations: none declared.
- REST equivalent:
DELETE /v3/checklists/{checklistKey}/tasks/{taskKey}/fields/{fieldKey}/files/{fileId}. - Example prompt: "Remove the duplicate PDF from the Supporting Documents control on INV-2041."
get_task_table_rows
Reads one Table control in full: its columns, every cell with its row and column index and its value, which cells are read-only, whether rows can be added and which rows can be removed. Read this before writing to a table — the field list reports a table's cells but not whether a write will be accepted. It answers for a table a condition is hiding, where all three table writes would be refused.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
fieldKey | string (GUID) | Yes | The Table control's key, from get_task_fields. |
- Returns: the Table object —
fieldKey,fieldName,columns,allowAddRemoveRows,isDataSetLinkedandrows— each withindex,isDeletableandcells(row,column,value,isReadOnly,isRequired,formatand, when linked,recordKey). - Annotations:
readOnlyHint: true,idempotentHint: true. - REST equivalent:
GET /v3/checklists/{checklistKey}/tasks/{taskKey}/fields/{fieldKey}/rows. - Example prompt: "Show me the line items table on the Invoice Details task of INV-2041."
add_task_table_row
Adds a row to a table, above or below an existing row. Give exactly one of afterRow and beforeRow: the new row's cells are copied from that row — their formats, their read-only and required state and the text of the read-only cells, which are the template's labels rather than anyone's answer.
This is not idempotent: calling it twice adds two rows. Use idempotencyKey if you may need to retry. The reply is the whole table re-read, because an insert renumbers every row after it — including, when beforeRow is used, the new row itself.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
fieldKey | string (GUID) | Yes | The Table control's key. |
afterRow | integer | No | Insert immediately below this row. Zero-based; the row must exist. |
beforeRow | integer | No | Insert immediately above this row, taking its index; that row and everything below it move down one. |
idempotencyKey | string | No | Send the same key again to retry this call safely. |
- Returns: the whole table, as
get_task_table_rowsreturns it, plusaddedRow— the new row with the index it ended up at. - Annotations:
destructiveHint: false. - REST equivalent:
POST /v3/checklists/{checklistKey}/tasks/{taskKey}/fields/{fieldKey}/rows. - Example prompt: "Add a line item row to the bottom of the table on INV-2041's Invoice Details task."
remove_task_table_row
Removes one row from a table. This is neither idempotent nor safe to retry blindly: the rows below move up, so calling it twice with the same index removes two different rows. Use idempotencyKey if you may need to retry.
A table's last row cannot be removed — new rows are copied from an existing one, so an empty table could never be refilled — and get_task_table_rows reports this in advance as isDeletable. A row index the table does not have is refused as an invalid value rather than as a missing resource.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
fieldKey | string (GUID) | Yes | The Table control's key. |
rowIndex | integer | Yes | The row's zero-based index, from get_task_table_rows. |
idempotencyKey | string | No | Send the same key again to retry this call safely. |
- Returns: the whole table, as
get_task_table_rowsreturns it, plusremovedRow— the index that was deleted. - Annotations: none declared.
- REST equivalent:
DELETE /v3/checklists/{checklistKey}/tasks/{taskKey}/fields/{fieldKey}/rows/{rowIndex}. - Example prompt: "Delete the third line item from the table on INV-2041's Invoice Details task."
set_task_table_cell
Writes a value into one cell of a table. The value is text whatever the column's format — nothing parses it. Null or an empty string clears the cell. Writing the value the cell already holds writes nothing and adds no activity, so re-sending a row you have just read does not record a change for every cell you left alone.
Refused for a read-only cell and for a table a condition is hiding.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
fieldKey | string (GUID) | Yes | The Table control's key. |
rowIndex | integer | Yes | The row's zero-based index. |
columnIndex | integer | Yes | The column's zero-based index. |
value | string | No | The text for the cell. Null or empty clears it. |
- Returns: the whole table, as
get_task_table_rowsreturns it, pluscell(the cell as it now stands) andchanged(false when the cell already held that value). - Annotations:
idempotentHint: true. - REST equivalent:
PUT /v3/checklists/{checklistKey}/tasks/{taskKey}/fields/{fieldKey}/rows/{rowIndex}/cells/{columnIndex}. - Example prompt: "In the line items table on INV-2041, set the quantity in the first row to 12."
add_task_comment
Comments on a task, attributed to the member the connection acts for. Send text unless you genuinely have markup: text is escaped and wrapped into paragraphs, so a blank line starts a new paragraph and anything that looks like a tag is shown rather than interpreted.
Mention people with mentions rather than typing an @ into the text — a mention is a particular piece of markup, and naming somebody in mentions composes it for you, placed where the comment already names them. Everyone mentioned is notified by email and Slack. A comment with no text and no mentions is refused.
This is not idempotent: calling it twice posts the comment twice. Use idempotencyKey if you may need to retry.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
text | string | No | The comment as plain text. Give this or html, not both. |
html | string | No | The comment as HTML. Run through an allow-list — paragraphs, breaks, headings, lists, tables, inline emphasis and links to http, https or mailto. Anything else is dropped, keeping the text inside it. |
mentions | array of objects | No | People and groups to mention, each { type, id } or { name }. |
assignMentioned | boolean | No | Whether mentioning somebody on an exclusively assigned task also assigns them, so they can open it. True when omitted. Set it false when reporting rather than asking. It changes nothing on a task that is not exclusively assigned, and nothing about who is notified. |
idempotencyKey | string | No | Send the same key again to retry this call safely. |
- Returns:
comment(a Comment object — itsid,text,html,createdBy,createdDateTime,mentionsand anyattachment) andassignedMentioned— anyone this comment added to the task's assignees. - Annotations:
destructiveHint: false. - REST equivalent:
POST /v3/checklists/{checklistKey}/tasks/{taskKey}/comments. - Example prompt: "Comment on the Manager Approval task of INV-2041 asking Sarah Chen to check the VAT amount."
remove_task_comment
Deletes one comment from a task, with its attachment. Nobody is told. The id comes from the comments on get_task; a comment that is already gone is reported as missing.
Deleting a comment cannot be undone.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
commentId | integer | Yes | The comment's id, from the task's comments. |
- Returns: nothing —
{"result":null}. - Annotations:
idempotentHint: true. - REST equivalent:
DELETE /v3/checklists/{checklistKey}/tasks/{taskKey}/comments/{commentId}. - Example prompt: "Delete the comment I just posted on the Manager Approval task of INV-2041 — it went to the wrong person."
get_task_snooze
Reads whether this task is snoozed for the member the connection acts for, and until when. A snooze is personal — it hides the task from that member's own Tasks grid and changes nothing anyone else sees — which is why it is not part of the task read.
Every snooze tool needs a key that acts as a member. A key that acts as the workspace is refused with API_KEY_ACTS_AS_WORKSPACE.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
- Returns:
isSnoozedand, when snoozed,snoozedUntil. A snooze whose date has passed reads as not snoozed. - Annotations:
readOnlyHint: true,idempotentHint: true. - REST equivalent:
GET /v3/checklists/{checklistKey}/tasks/{taskKey}/snooze. - Example prompt: "Have I snoozed the Filing task on INV-2041? Until when?"
set_task_snooze
Hides a task from the acting member's own Tasks grid until a date. Nobody else sees any difference, no activity is recorded and nothing is announced. The date must be in the future. Refused with API_KEY_ACTS_AS_WORKSPACE for a key that acts as the workspace.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
snoozedUntil | string (date-time) | Yes | When the snooze runs out, in UTC. Must be in the future. This does not clear a snooze — use end_task_snooze. |
- Returns:
isSnoozedandsnoozedUntil. - Annotations:
destructiveHint: false,idempotentHint: true. - REST equivalent:
PUT /v3/checklists/{checklistKey}/tasks/{taskKey}/snooze. - Example prompt: "Snooze the Filing task on INV-2041 until Monday morning."
end_task_snooze
Brings a snoozed task back into the acting member's Tasks grid now. A task that was not snoozed is left as it is and the call still succeeds. Refused with API_KEY_ACTS_AS_WORKSPACE for a key that acts as the workspace.
| Name | Type | Required | Description |
|---|---|---|---|
checklistKey | string (GUID) | Yes | The checklist's key. |
taskKey | string (GUID) | Yes | The task's key. |
- Returns:
isSnoozed(false). - Annotations:
destructiveHint: false,idempotentHint: true. - REST equivalent:
DELETE /v3/checklists/{checklistKey}/tasks/{taskKey}/snooze. - Example prompt: "Unsnooze the Filing task on INV-2041 — I want to do it today."
Routes Without a Tool
The tool surface is deliberately smaller than the REST one. These task routes have no tool:
| Route | Why there is no tool |
|---|---|
GET .../assignees, GET .../due-date, GET .../tags, GET .../comments | get_task already returns all four. |
GET .../fields/{fieldKey} | get_task_fields returns every field. |
PUT .../fields/{fieldKey} | set_task_fields with one entry does the same work. |
POST .../fields/{fieldKey}/files | The file is sent base64-encoded, which would pass up to 32 MB through the model's context. |
Related Pages
- Checklist Tasks API — the REST routes behind the status, assignee, due date, tag, comment and snooze tools.
- Task Fields API — the field object, value shapes and the file and table routes in full.
- Standalone Task Tools — the tools for tasks attached to a checklist and tasks that belong to no checklist.
- Control Types — which controls a task can contain and what each one captures.