list_comments
Lists the comment threads of the project. Filters: status (open/resolved/all), anchorCellId, documentId (the threads anchored to ONE document range), taskId (the threads anchored to ONE task), threadId (ONE specific thread, resolved or not), since (ISO 8601). Answers the user's question 'which comments were left on X?'. WITHOUT includeMessages, the tool only returns COUNTERS (messageCount): it does not say what was said. With includeMessages: true, it returns the message BODIES (Markdown as is, with author, creation and edit dates), from oldest to newest, under messages of each thread — this is how you READ the discussion that a get_document flagged to you through its comments field. A call returns at most 40 messages and 20,000 characters of body: hasMore says whether more remain, nextCursor (the value of the cursor parameter of the next call) resumes STRICTLY after the last message returned, with no gap or duplicate. since + includeMessages only returns the messages after that instant (polling an ongoing discussion). messageCount remains the TOTAL of the thread, not that of the page. Rights unchanged: a thread anchored to a PRIVATE document of which you are not the creator is still listed, but its messages never come out (messagesHidden) — naming its threadId changes nothing. Each thread anchored to a block carries orphaned:true when that block has since been deleted: the thread survives (nothing is ever destroyed) but is INVISIBLE on the canvas — which sets it apart from a legitimate thread awaiting a reply. The same goes for a thread anchored to a deleted TASK.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of THREADS considered (with `includeMessages`: the threads whose messages are read). | |
| since | No | ISO 8601 (e.g. "2026-09-20T09:00:00Z"). With `includeMessages`: only the messages STRICTLY after it, and only the threads that have some. Without: the threads modified after that instant. | |
| cursor | No | The `nextCursor` of the previous page (with `includeMessages`). It is never a date: a cursor is not built by hand. | |
| status | No | Filter by status (default 'open') | |
| taskId | No | Filter on the threads anchored to ONE task ("task" anchor). | |
| threadId | No | Reads ONE specific thread, resolved or not (the `status` filter does not apply). An identifier unknown to this project is a named refusal. | |
| documentId | No | Filter on the threads anchored to ONE document ("document_range" anchor). get_document returns the number of threads of a document; this argument lists them. | |
| anchorCellId | No | Filter on a block | |
| includeMessages | No | Returns the message BODIES (Markdown as is, with author and date), from oldest to newest, under `messages` of each thread. At most 40 messages and 20,000 characters per call: `hasMore` and `nextCursor` give the rest. Omitted: only the counters (`messageCount`). | |
| expectedProjectId | No | UUID of the project targeted by THIS call. ACTUALLY targets this project instead of the session project. Refused without changing anything if access is not granted. |