campaign_plan_comment_list
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 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 describes the shape of a failed call.
not_foundinvalid_cursororganization_unentitledforbiddeninvalid_requestinternal_error
Scope
The token must hold campaign_plan:read. Auth & scopes 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:
{
"campaign_plan_name": "spring-sale",
"limit": 20
}
The result, in structuredContent:
{
"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
}
]
}