Skip to main content
Glama

list_comments

Read-only

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

NameRequiredDescriptionDefault
limitNoMaximum number of THREADS considered (with `includeMessages`: the threads whose messages are read).
sinceNoISO 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.
cursorNoThe `nextCursor` of the previous page (with `includeMessages`). It is never a date: a cursor is not built by hand.
statusNoFilter by status (default 'open')
taskIdNoFilter on the threads anchored to ONE task ("task" anchor).
threadIdNoReads ONE specific thread, resolved or not (the `status` filter does not apply). An identifier unknown to this project is a named refusal.
documentIdNoFilter on the threads anchored to ONE document ("document_range" anchor). get_document returns the number of threads of a document; this argument lists them.
anchorCellIdNoFilter on a block
includeMessagesNoReturns 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`).
expectedProjectIdNoUUID 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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / taskId / description
      Previous value: -"Filter on the threads anchored to ONE task (\"task\" anchor). Refused, by name, as long as the instance does not serve this anchor (ignoring the filter would return the threads of the whole project to whoever asked for one task)."New value: +"Filter on the threads anchored to ONE task (\"task\" anchor)."
  2. Changed10 schema fields changed
    • changedInput schema / properties / anchorCellId / description
      Previous value: -"Filtrer sur une cellule"New value: +"Filter on a block"
    • changedInput schema / properties / cursor / description
      Previous value: -"Le `nextCursor` de la page précédente (avec `includeMessages`). Jamais une date : un curseur n’est pas construit à la main."New value: +"The `nextCursor` of the previous page (with `includeMessages`). It is never a date: a cursor is not built by hand."
    • changedInput schema / properties / documentId / description
      Previous value: -"Filtrer sur les fils ancrés à UN document (ancre « document_range »). get_document rend le nombre de fils d’un document ; cet argument les énumère."New value: +"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."
    • changedInput schema / properties / expectedProjectId / description
      Previous value: -"UUID du projet visé par CET appel. Cible RÉELLEMENT ce projet au lieu du projet de session. Refusé sans rien modifier si l'accès n'est pas accordé."New value: +"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."
    • changedInput schema / properties / includeMessages / description
      Previous value: -"Rend les CORPS des messages (Markdown tel quel, avec auteur et date), du plus ancien au plus récent, sous `messages` de chaque fil. Au plus 40 messages et 20 000 caractères par appel : `hasMore` et `nextCursor` disent la suite. Omis : seuls les compteurs (`messageCount`)."New value: +"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`)."
    • changedInput schema / properties / limit / description
      Previous value: -"Nombre maximal de FILS considérés (avec `includeMessages` : les fils dont on lit les messages)."New value: +"Maximum number of THREADS considered (with `includeMessages`: the threads whose messages are read)."
    • changedInput schema / properties / since / description
      Previous value: -"ISO 8601 (ex. \"2026-09-20T09:00:00Z\"). Avec `includeMessages` : seuls les messages STRICTEMENT postérieurs, et les seuls fils qui en ont. Sans : les fils modifiés après cet instant."New value: +"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."
    • changedInput schema / properties / status / description
      Previous value: -"Filtrer par status (défaut 'open')"New value: +"Filter by status (default 'open')"
    • changedInput schema / properties / taskId / description
      Previous value: -"Filtrer sur les fils ancrés à UNE tâche (ancre « task »). Refusé, nommément, tant que l’instance ne sert pas cette ancre (ignorer le filtre rendrait les fils de tout le projet à qui en a demandé une tâche)."New value: +"Filter on the threads anchored to ONE task (\"task\" anchor). Refused, by name, as long as the instance does not serve this anchor (ignoring the filter would return the threads of the whole project to whoever asked for one task)."
    • changedInput schema / properties / threadId / description
      Previous value: -"Lit UN fil précis, résolu ou non (le filtre `status` ne s’applique pas). Un identifiant inconnu de ce projet est un refus nommé."New value: +"Reads ONE specific thread, resolved or not (the `status` filter does not apply). An identifier unknown to this project is a named refusal."
  3. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint/openWorldHint; the description adds substantial behavior beyond that: hard caps of 40 messages and 20,000 characters per call, `hasMore`/`nextCursor` resume semantics with no gap or duplicate, and the fact that `messageCount` stays the thread total rather than the page count. It also discloses privacy behavior (`messagesHidden` for private documents), permanence ('nothing is ever destroyed'), and `orphaned:true` for deleted blocks/tasks — exactly the non-obvious traits an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the answering-question framing, then filters, then pagination/privacy edge cases — a defensible order. It is a dense single block that duplicates some schema-stated filter semantics and leans on ALL-CAPS emphasis, costing a point on efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 10 optional params and no output schema, the description carries the return-shape burden and does: `messages` with author/dates oldest-to-newest, `messageCount`, `hasMore`, `nextCursor`, `messagesHidden`, `orphaned`. Nothing material an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents each parameter; the description adds cross-parameter meaning the schema states less clearly — e.g. that `since` interacts with `includeMessages` to return only later messages, that `threadId` bypasses the `status` filter, and that naming a hidden thread's `threadId` changes nothing. It does partially restate the filter list, keeping it below a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Lists the comment threads of the project') and immediately frames the user question it answers ('which comments were left on X?'). The scope is unambiguous versus the write-side siblings (add_comment, reply_comment, resolve_comment) because it is explicitly a listing/reading operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear when-to-use guidance: without `includeMessages` you only get counters, with it you read the discussion, and `since` + `includeMessages` is for polling an ongoing thread. It also ties itself to get_document's `comments` field. It does not explicitly exclude or route away from any sibling (e.g. 'do not use to post, use add_comment'), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.