---
title: campaign_plan_comment_list
description: 'List the Comments of a Campaign Plan, by thread, newest thread first.'
---

Ask the agent what the team said about a Campaign Plan.

> "What are the last updates on the spring sale plan?"

The agent calls `campaign_plan_comment_list`. It gets each thread, newest first: a top-level Comment with its replies, oldest first. Each Comment names its author, and the agent that posted it for that person, if an agent posted it. `campaign_plan_get` gives the number of Comments.

[Plan a campaign](/mcp/tools/plan-a-campaign) walks the whole job.

## Reference

List the Comments of a Campaign Plan, by thread, newest thread first: each top-level Comment with its live replies, oldest first. A Comment is a post on the AdCrunch Campaign Plan, by a person or by an agent, not a comment on a provider campaign. clientId names the agent that posted a Comment, or is null when a person posted it. campaign_plan_get gives the number of Comments. A Campaign Plan is AdCrunch's own planning document — it is **not** a campaign on Meta or Google. For those, use list_campaigns and get_campaign. The answer holds at most `limit` rows (default 100, maximum 500). When it carries `nextCursor`, more rows exist: call this tool again with the same arguments and `cursor` set to that value. When it carries no `nextCursor`, you have every row.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `cursor` | string, at least 1 character | no | The `nextCursor` of the previous page. Omit it to get the first page. Send it with no change, and with the same filters as the request that answered it: a cursor from a different query gets a 400 `invalid_cursor`. Do not build or change a cursor. |
| `limit` | integer, 1 to 500 | no | The greatest number of rows on the page, from 1 to 500. The default is 100. A greater value gets a 400, with `error` of `invalid_request`. Default: `100`. |
| `campaign_plan_name` | string | yes | The Campaign Plan slug — its stable per-organization handle. |

### Output

A successful call returns this object in `structuredContent`.

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `comments` | array of object | yes | The threads on this page, newest thread first. |
| `comments[].body` | string or null | yes | The markdown text. `null` for a deleted Comment that stays as the head of its thread. |
| `comments[].clientId` | string or null | yes | The client of the agent that posted the Comment, or `null` when a person posted it in the console. `adgent` is the AdCrunch Adgent. |
| `comments[].createdAt` | number | yes | Milliseconds since the Unix epoch, UTC. |
| `comments[].createdBy` | string | yes | The author of the Comment, `usr_…`: the person who posted it, or for whom an agent posted it. |
| `comments[].deleted` | boolean | yes | `true` for a deleted Comment that a live reply still answers. Its `body` is `null`. |
| `comments[].editedAt` | number or null | yes | When the author last edited the text, or `null`. |
| `comments[].id` | string | yes | The id of the Comment, `cmt_…`. Send it as `parent_id` to reply in its thread. |
| `comments[].parentId` | string or null | yes | The top-level Comment that this reply answers, or `null` for a top-level Comment. |
| `comments[].replies` | array of object | yes | Each live reply, oldest first. A reply has no replies. |
| `comments[].replies[].body` | string or null | yes | The markdown text. `null` for a deleted Comment that stays as the head of its thread. |
| `comments[].replies[].clientId` | string or null | yes | The client of the agent that posted the Comment, or `null` when a person posted it in the console. `adgent` is the AdCrunch Adgent. |
| `comments[].replies[].createdAt` | number | yes | Milliseconds since the Unix epoch, UTC. |
| `comments[].replies[].createdBy` | string | yes | The author of the Comment, `usr_…`: the person who posted it, or for whom an agent posted it. |
| `comments[].replies[].deleted` | boolean | yes | `true` for a deleted Comment that a live reply still answers. Its `body` is `null`. |
| `comments[].replies[].editedAt` | number or null | yes | When the author last edited the text, or `null`. |
| `comments[].replies[].id` | string | yes | The id of the Comment, `cmt_…`. Send it as `parent_id` to reply in its thread. |
| `comments[].replies[].parentId` | string or null | yes | The top-level Comment that this reply answers, or `null` for a top-level Comment. |
| `comments[].replyCount` | number | yes | The number of live replies. |
| `nextCursor` | string | no | Send this value as `cursor` to get the next page. It is absent on the last page. |

### Failure codes

A failed call has `isError` set, and `structuredContent.error` holds one of these codes. [Errors](/mcp/errors) describes the shape of a failed call.

- `not_found`
- `invalid_cursor`
- `organization_unentitled`
- `forbidden`
- `invalid_request`
- `internal_error`

### Scope

The token must hold `campaign_plan:read`. [Auth & scopes](/mcp/auth) lists each scope.

### Annotations

A client reads these hints. A hint that the tool does not declare has the default value of the MCP specification.

- **Read-only.** The tool changes nothing.
- **Closed world.** The tool reads and writes the data of AdCrunch only.

### Example

The arguments:

```json
{
  "campaign_plan_name": "spring-sale",
  "limit": 20
}
```

The result, in `structuredContent`:

```json
{
  "comments": [
    {
      "body": "Meta carries the reach. TikTok tests the younger audience first.",
      "clientId": null,
      "createdAt": 1768435200000,
      "createdBy": "usr_5d2b71",
      "deleted": false,
      "editedAt": null,
      "id": "cmt_8b3f10",
      "parentId": null,
      "replies": [
        {
          "body": "The TikTok test ends on 15 April. I will post the CPA then.",
          "clientId": "https://claude.ai/oauth/mcp-oauth-client-metadata",
          "createdAt": 1768435260000,
          "createdBy": "usr_5d2b71",
          "deleted": false,
          "editedAt": null,
          "id": "cmt_c41a92",
          "parentId": "cmt_8b3f10"
        }
      ],
      "replyCount": 1
    }
  ]
}
```
