Skip to main content

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, taskKey or fieldKey).
  • 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 Z on every timestamp — in structuredContent and again as text. A tool whose route answers 204 No Content returns {"result":null}.
  • Refusals come back as an ordinary tool result with isError set, carrying the v3 error body in structuredContent. The text block starts with the error code and message and ends with the requestId. See Errors and How It Works.
  • idempotencyKey is 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 with checkflow.io/idempotentReplay in the result's _meta; the same key with different arguments, or while the first call is still running, is refused with CONFLICT. 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 readOnlyHint means the tool is assumed to write, no destructiveHint means it is assumed to be potentially destructive and no idempotentHint means it is assumed not to be safe to repeat.
  • Assignee and mention arguments name a person or group either as { type, id } — type being TeamMember or Group — 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 from list_members and list_groups.

Tools​

ToolWhat it doesRead/Write
list_checklist_tasksLists a checklist's tasks cheaplyRead
get_taskReads one task in fullRead
get_task_activityReads one task's activity feedRead
complete_taskCompletes a taskWrite
uncomplete_taskReturns a completed task to incompleteWrite
set_task_not_applicableMarks a task not applicableWrite
clear_task_not_applicableReturns a not-applicable task to incompleteWrite
set_task_assigneesReplaces a task's assigneesWrite
clear_task_assigneesUnassigns a task from everybodyWrite
set_task_due_dateSets a task's due dateWrite
clear_task_due_dateRemoves a task's due dateWrite
add_task_tagsAdds tags to a taskWrite
remove_task_tagRemoves one tag from a taskWrite
get_task_fieldsReads a task's fields and their valuesRead
set_task_fieldsAnswers one or more fields in one callWrite
get_task_filesLists the files on a File Upload controlRead
remove_task_fileRemoves one file from a File Upload controlWrite
get_task_table_rowsReads a Table control in fullRead
add_task_table_rowAdds a row to a tableWrite
remove_task_table_rowRemoves a row from a tableWrite
set_task_table_cellWrites one table cellWrite
add_task_commentAdds a comment to a taskWrite
remove_task_commentDeletes a comment from a taskWrite
get_task_snoozeReads the acting member's snooze on a taskRead
set_task_snoozeSnoozes a task for the acting memberWrite
end_task_snoozeEnds the acting member's snooze on a taskWrite

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
statusstringNoOnly 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 with key, name, order, isHeading, status, isComplete, isNotApplicable, isCurrentlyHalted, isCurrentlyHidden, isAssignedExclusively and, where they have values, dueDateTime, completedDateTime, completedBy, notApplicableDateTime and notApplicableBy.
  • 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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
  • Returns: the task — the fields list_checklist_tasks returns, plus assignees, fields, comments, checklist (its key, name, url and template) and tags. 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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
sortstringNooccurredAt, occurredAt:asc or occurredAt:desc. Default occurredAt:desc.
afterstringNoThe nextCursor from the previous reply.
pageSizeintegerNoEntries per page, 1–100. Default 50.
  • Returns: a page of activity entries — items, nextCursor, hasMore — each with occurredAt, actor, description and, where they apply, taskKey, taskName, fieldKey, fieldName and dateTimeValue.
  • 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).

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
assigneesarray of objectsNoWho 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.
isAssignedExclusivelybooleanNoTrue to let only these assignees open, change or reassign the task. Default false.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
dueDateTimestring (date-time)YesWhen the task is due, in UTC, for example 2026-10-30T17:00:00Z.
  • Returns: dueDateTime and isRuleGoverned. When isRuleGoverned is 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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
tagsarray of stringsYesThe tag names, 1 to 25 of them.
  • Returns: tags (every tag now on the task, ordered by name) and created (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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
namestringYesThe tag's name. Case-insensitive.

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; regexMessage says what it wants.
  • A Members field whose selectionMode is 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, which list_data_set_records returns.

Fields a condition is currently hiding are left out, because they cannot be answered.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
fieldsarray of objectsYesThe 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:

ControlValue
Short Text, Long Text, E-Mail, WebsiteA string.
Date & TimeAn ISO 8601 date.
DropdownThe option's own text.
Multi-ChoiceA list of the selected options' texts.
Sub-TasksA list of the ticked items' texts.
MembersA list of names, email addresses or { type, id } objects.
Dropdown or Multi-Choice linked to a Data SetA 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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
fieldKeystring (GUID)YesThe File Upload control's key, from get_task_fields.
  • Returns: the Files object — fieldKey, fieldName, minFiles, maxFiles, isReadOnly and files — each with id, name, contentType, url, description, uploadedDateTime and uploadedBy.
  • 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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
fieldKeystring (GUID)YesThe File Upload control's key.
fileIdintegerYesThe file's id, from get_task_files.
idempotencyKeystringNoSend the same key again to retry this call safely.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
fieldKeystring (GUID)YesThe Table control's key, from get_task_fields.
  • Returns: the Table object — fieldKey, fieldName, columns, allowAddRemoveRows, isDataSetLinked and rows — each with index, isDeletable and cells (row, column, value, isReadOnly, isRequired, format and, 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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
fieldKeystring (GUID)YesThe Table control's key.
afterRowintegerNoInsert immediately below this row. Zero-based; the row must exist.
beforeRowintegerNoInsert immediately above this row, taking its index; that row and everything below it move down one.
idempotencyKeystringNoSend the same key again to retry this call safely.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
fieldKeystring (GUID)YesThe Table control's key.
rowIndexintegerYesThe row's zero-based index, from get_task_table_rows.
idempotencyKeystringNoSend the same key again to retry this call safely.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
fieldKeystring (GUID)YesThe Table control's key.
rowIndexintegerYesThe row's zero-based index.
columnIndexintegerYesThe column's zero-based index.
valuestringNoThe text for the cell. Null or empty clears it.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
textstringNoThe comment as plain text. Give this or html, not both.
htmlstringNoThe 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.
mentionsarray of objectsNoPeople and groups to mention, each { type, id } or { name }.
assignMentionedbooleanNoWhether 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.
idempotencyKeystringNoSend the same key again to retry this call safely.
  • Returns: comment (a Comment object — its id, text, html, createdBy, createdDateTime, mentions and any attachment) and assignedMentioned — 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.

danger

Deleting a comment cannot be undone.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
commentIdintegerYesThe comment's id, from the task's comments.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
  • Returns: isSnoozed and, 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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.
snoozedUntilstring (date-time)YesWhen the snooze runs out, in UTC. Must be in the future. This does not clear a snooze — use end_task_snooze.

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.

NameTypeRequiredDescription
checklistKeystring (GUID)YesThe checklist's key.
taskKeystring (GUID)YesThe task's key.

Routes Without a Tool​

The tool surface is deliberately smaller than the REST one. These task routes have no tool:

RouteWhy there is no tool
GET .../assignees, GET .../due-date, GET .../tags, GET .../commentsget_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}/filesThe file is sent base64-encoded, which would pass up to 32 MB through the model's context.
  • 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.