Cleotic
Server Details
AI brand visibility, competitor mentions and citation evidence for agents. Cleotic account required.
- Status
- Healthy
- Uptime
- 50.0% over 45 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP ยท MCP 2025-11-25
- URL
TDQS
Scored across 48 tools
Most tools target distinct resources and actions, with detailed descriptions explicitly disambiguating similar tools like act_on_opportunity vs update_opportunities and get_brand_overview vs list_brands. A few read-oriented tools (get_brand_overview, get_brand_settings, get_brand_setup, list_brands) could still be confused by an agent, but boundaries are mostly clear.
All tool names follow a consistent snake_case verb_noun or verb_prep_noun pattern (e.g., create_page, get_page, list_pages, save_prompt). There is no mixing of camelCase or vague standalone verbs, making the naming highly predictable.
48 tools is well above the typical 3-15 range and far exceeds the 25+ threshold for 'too many.' Although the domain is broad, the count creates significant cognitive load and suggests many operations could be consolidated or made more discoverable.
The surface covers major lifecycle operations for brands, competitors, segments, prompts, answers, citations, traffic, readiness, opportunities, pages, reports, facts, and documentation. Minor gaps exist, such as no explicit deletion for brands or facts (only pause/reject), but agents can work around these limitations.
Available Tools
48 toolsact_on_opportunityAct on opportunityAInspect
Record or start an opportunity's play, which moves it to watching. Use it rather than update_opportunities whenever the play was done, so the inbox knows what to watch for. fix_shipped: a readiness fix is live. pitched: a source gap's outreach was sent. optimised: a traffic gap's page was improved. track_prompts: track the chosen suggested questions as prompts. draft_outreach: draft a source gap's outreach; Cleotic never sends it. Cost: track_prompts uses one active prompt of plan capacity per question and model budget for their first answers; draft_outreach uses one from the Content Studio allowance and model budget; the others are free.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| action | Yes | ||
| opportunity_id | Yes | Opportunity ID from list_opportunities. | |
| suggestion_ids | No | track_prompts only: suggestion IDs from get_opportunity. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-read-only, non-destructive, non-idempotent, open-world write. The description adds genuinely new context: the state transition to 'watching', the fact that outreach is never actually sent, and a per-action resource cost model (plan capacity, Content Studio allowance, model budget). It does not cover auth requirements, but the consumption and side-effect disclosures go well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the routing rule, then action definitions, then costs. The dense colon-delimited enumeration is compact and every sentence carries distinct information; nothing is restated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutating tool with an output schema, the description supplies what the structured fields cannot: action semantics, side effects, the alternative tool, and the cost of each path. Return-value behavior is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3, but the description meaningfully exceeds it by documenting every enum value of 'action' (which the schema leaves as a bare enum) and clarifying that suggestion_ids drives track_prompts. brand, opportunity_id and idempotency_key semantics remain schema-only, which is acceptable given their rich schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Record or start an opportunity's play'), states the resulting state change ('moves it to watching'), and explicitly separates itself from the sibling update_opportunities. An agent can distinguish this from every other opportunity-related tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative ('Use it rather than update_opportunities') and the exact condition that selects it ('whenever the play was done'). Each enum action is further glossed with the real-world event it represents (fix shipped, outreach sent, page improved), so the agent knows which action to pick, not just when to call the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approve_brand_setupApprove brand setupAInspect
Create the brand from a ready setup's proposals. List exactly the competitor and prompt proposals to keep; an empty list keeps none of that kind, and the primary brand is always kept. Confirm the brand's market with the user first and pass it as market; get_brand_setup's segment.market and market_label give its code and label. Cost: a brand, a segment and the kept prompts from plan capacity; model budget for each prompt's first answers and the site's first readiness scan.
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | The market the user confirmed: kind country with its code, region with key and country_codes, or global. Start from get_brand_setup's segment.market and market_label. | |
| setup_id | Yes | Setup ID from start_brand_setup. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. | |
| accepted_brand_proposal_ids | Yes | Competitor proposal IDs to keep, from get_brand_setup. [] keeps none. | |
| accepted_prompt_proposal_ids | Yes | Prompt proposal IDs to keep, from get_brand_setup. [] keeps none. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false, idempotentHint=false) by disclosing real cost/resource implications: plan capacity consumption (a brand, a segment, kept prompts) plus model budget for first answers and the first readiness scan. It also clarifies the keep/drop semantics of the accepted lists, which is behavioral context the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then proposal semantics, then market guidance, then cost. Every sentence carries information, though the final cost sentence is dense and the overall text is long for a five-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers creation semantics, required pre-confirmation, and cost. It stops short of stating preconditions explicitly (that the setup must be in a ready state) and of naming the initiating sibling start_brand_setup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it explains that an empty accepted list keeps none of that kind, that the primary brand is always kept, and that market must be user-confirmed before being passed. Those are semantic constraints not fully spelled out in the field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create the brand from a ready setup's proposals.' An agent can distinguish this from get_brand_setup (retrieve), start_brand_setup (initiate), and save_competitor/save_prompt (manual writes) without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear workflow context: it names get_brand_setup as the source of segment.market/market_label and instructs confirming the market with the user first. It implies the post-setup stage but does not explicitly name start_brand_setup as the prerequisite or state exclusions, so it falls short of a full when/when-not routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
comment_on_opportunityComment on opportunityCInspect
Add a comment to an opportunity as you.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The comment. | |
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| opportunity_id | Yes | Opportunity ID from list_opportunities. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false and idempotentHint=false, so the safety profile is covered. The only behavioral content the description adds is 'as you' (identity attribution); it says nothing about visibility of the comment, permissions required, or how the non-idempotent write behaves, and notably the idempotentHint=false annotation sits oddly beside a required idempotency_key whose replay semantics are only explained in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; 'as you' is the one piece of information beyond the title. It is efficient, though arguably too terse for a mutation tool rather than genuinely well-proportioned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the schema plus annotations carry the safety and parameter load. What is missing is any statement of when to comment versus other communication siblings and whether the comment is visible to others, which leaves the definition merely adequate for a write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including detailed semantics for idempotency_key (reuse on retry, replayed flag) and sourcing of brand/opportunity_id from list_brands/list_opportunities. The description adds no parameter meaning beyond that, so the baseline 3 for a fully-documented schema is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a comment to an opportunity') and adds the attribution detail 'as you', so the agent knows the comment is posted under the caller's identity. It is clear, but it does not distinguish this from other write-style siblings (e.g. message_page, act_on_opportunity) or explain the opportunity-centric framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, no prerequisites, and no mention of alternatives such as message_page or act_on_opportunity for communicating on a record. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pageCreate pageAInspect
Start a Content Studio page and hand it to Cleotic's page agent: from a content gap opportunity, a question or idea, an existing draft in Markdown, or a URL to import. The agent first sets the page's goal, reader and angle, then proposes an outline, asking only for facts it is missing. Returns pending while it works; read its questions with get_page and answer them with message_page. Cost: one of the plan's Content Studio pages, counted once the agent first writes the page; model budget.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Or a page to import as the draft. | |
| idea | No | Or the question or idea the page should cover. | |
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| draft | No | Or a draft in Markdown to review and improve. | |
| title | No | Optional working title. | |
| opportunity_id | No | A content gap opportunity ID from list_opportunities. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only flag non-read-only, non-idempotent, open-world): it discloses the asynchronous contract ("Returns pending while it works"), the agent's internal sequence of goal/reader/angle then outline, and an explicit cost model โ one plan Content Studio page counted on first write plus model budget. That is exactly the operational context an agent needs before spending quota.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then the input variants, then the async/return contract and cost in two dense sentences. Nearly every clause earns its place, though the four-source enumeration slightly restates what the schema already says.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description still supplies the missing pieces an agent cannot infer: async pending status, the question/answer loop via get_page and message_page, and the billing unit. Nothing material is left out for a 7-parameter write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented, including the brand ID-vs-name rule and the idempotency replay semantics. The description's list of the four sources mirrors the schema's own "Or ..." phrasing without adding new syntax or constraints, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Start a Content Studio page") plus the four accepted input sources (opportunity, question/idea, Markdown draft, URL), which cleanly separates it from edit_page, revise_page, and mark_page_published among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete entry conditions for each of the four starting points and routes the agent to get_page to read questions and message_page to answer them, covering the full follow-up loop. It stops short of naming an explicit alternative for the case where a page already exists (e.g., edit_page/revise_page), so no true when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_reportCreate reportAInspect
Save a shareable report of the brand's results for a date range, compared with the same number of days before. Returns its public link at once; the link shows the report once its figures are built, usually within a minute. Cost: one report of plan capacity; on plans with report narratives, model budget for its summary.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, YYYY-MM-DD. Defaults to today. | |
| from | No | Start date, YYYY-MM-DD. Defaults to 30 days ago. | |
| name | No | ||
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, but the description adds substantial traits beyond that: the call returns the public link immediately while figures build asynchronously (usually within a minute), and it consumes real resources (one report of plan capacity, plus model budget for narratives). These are exactly the operational facts an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, correctly front-loaded: purpose first, then return timing, then cost. Each sentence delivers a distinct decision-relevant fact and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description is not obliged to document return values, yet it still clarifies the asynchronous link semantics. Combined with cost/quota disclosure and the schema's full parameter documentation, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 80% schema coverage the schema already documents to/from defaults, brand resolution, and idempotency_key retry behavior, so the baseline is 3. The description adds meaning the schema does not carry โ that the date range is interpreted as a comparison against the prior equal-length period โ which clarifies how to/from are actually used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (save/create) and resource (a shareable report of the brand's results), plus the distinctive scope that the range is compared against the immediately preceding equal-length period. That scope detail separates it from siblings like list_reports and revoke_report without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose: an agent can infer this is the tool for producing a shareable brand report. However there is no explicit when-to-use or when-not-to-use guidance, no mention of prerequisites (plan capacity, report narratives), and no routing between this and alternatives such as list_reports or get_brand_overview.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_itemDelete itemADestructiveInspect
Delete one competitor, segment, prompt, page, or report for good: pass exactly one of its IDs. It cannot be restored. Deleting a segment deletes its prompts and their answers; deleting a prompt deletes its answers. To stop tracking but keep the history, pause it with save_competitor, save_segment or save_prompt; to only kill a report's link, use revoke_report. Free, and frees the plan capacity the item used.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| page_id | No | A Content Studio page, from list_pages. | |
| segment | No | A segment ID or name, from get_brand_settings. | |
| prompt_id | No | A prompt, from list_prompts. | |
| report_id | No | A report, from list_reports. | |
| competitor_id | No | A competitor, from get_brand_settings. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, so permanence is expected, but the description adds real value beyond that: it details cascading deletion (deleting a segment deletes its prompts and answers; deleting a prompt deletes its answers), confirms no restore path, and notes the side effect of freeing plan capacity. It doesn't cover auth/permission requirements, but the cascade and irreversibility disclosures are substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely dense and front-loaded: the action and its irreversibility lead, then cascade effects, then alternatives, then cost/capacity. Every clause earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive multi-resource deletion tool with an output schema, the description covers the safety-critical facts an agent needs: which IDs are valid, that exactly one is required, irreversibility, cascade scope, and the routing alternatives. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter carries a description naming its source (list_brands, get_brand_settings, list_pages, etc.), so the schema does the heavy lifting. The description reinforces the 'exactly one ID' constraint, which the schema does not enforce structurally, adding modest value above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and enumerates exactly the resource types covered (competitor, segment, prompt, page, report) with the 'pass exactly one of its IDs' rule. This distinguishes it clearly from revoke_report, which is named as the alternative for a narrower action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use this for permanent deletion, use save_competitor/save_segment/save_prompt to pause (preserve history), and use revoke_report to kill a report's link only. The when-to-use and when-not-to-use are both stated with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_pageEdit pageAInspect
Change a page yourself: replace its Markdown, or make exact find-and-replace edits, and edit its title, goal, reader or angle. Pass base_version from get_page; a stale version is refused so you don't overwrite a teammate. A live page is locked: revise_page first. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | ||
| angle | No | ||
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| edits | No | Or exact edits, applied in order. | |
| title | No | ||
| reader | No | ||
| reason | No | Why you changed it, kept in the page's history. | |
| page_id | Yes | Page ID from list_pages. | |
| markdown | No | The whole page as Markdown. | |
| base_version | No | The version from get_page. Needed with markdown or edits. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavior the annotations don't carry: optimistic concurrency (a stale base_version is refused), a locking constraint on live pages, and a cost signal ('Free'). The annotations only declare the safety profile (readOnly=false, destructive=false, idempotent=false), so this is genuine added value. It stops short of explaining what happens if a find string is ambiguous or whether multi-edit application is atomic, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and its modes, then preconditions, then the sibling routing. Every clause carries actionable information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with an output schema and full annotation coverage, the description supplies what structured fields cannot: concurrency semantics, the live-page lock, and routing to revise_page. Return values are covered by the output schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 64%, so the schema documents several parameters itself; the description reinforces which fields are editable (markdown, edits, title, goal, reader, angle) and repeats the base_version dependency. It adds the semantic framing of 'replace its Markdown' vs 'exact find-and-replace edits' as alternative modes, which helps mode selection, but does not document brand or idempotency_key beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (change/edit) plus resource (page) and enumerates the concrete capabilities: replace Markdown, find-and-replace edits, and title/goal/reader/angle edits. It also distinguishes itself from the sibling revise_page by stating that live pages are locked. An agent can identify this tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit preconditions ('Pass base_version from get_page') and an explicit exclusion with a named alternative ('A live page is locked: revise_page first'). The when-to-use versus revise_page routing is unambiguous, which is exactly the distinction siblings create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ai_trafficGet AI trafficARead-onlyIdempotentInspect
AI crawler requests and AI-referred visits to the brand's site, from its tracking; connected is false when tracking is not set up. Visits are human page views; bots, crawlers and Cleotic's own fetches are never visits. AI share is AI-referred visits as a percentage of human visits; crawler requests are counted on their own. view summary: totals, providers, crawlers, referral sources, pages to improve, by week. view pages: per-page traffic. view evidence: individual visits. Only pages and evidence are paged.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today. | |
| from | No | Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention. | |
| path | No | Optional exact page path, for example /pricing. | |
| view | No | Defaults to summary. | |
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| limit | No | Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor. | |
| cursor | No | next_cursor from the previous page. Leave out for the first page. | |
| provider | No | Optional AI provider, as the summary's systems name it, for example OpenAI; capitalisation does not matter. A provider with no traffic in the period is refused as unknown. | |
| traffic_type | No | Optional filter. | |
| traffic_view | No | Optional filter set: a built-in view (pages, discovery, previews, errors, spoofed, everything) or a saved view ID. Defaults to pages: loaded pages from verified or unverifiable bots and AI referrals. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the tracking-setup caveat (connected is false), the definitional rule that bots/crawlers/Cleotic's own fetches are never visits, and which views are paged. It stops short of disclosing rate limits or the interaction between view and traffic_view.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence carries content (definitions, view semantics, paging rules) with no filler. The style is a dense run of short declaratives rather than prose, which is efficient but slightly hard to parse on first read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters, an output schema, and full annotation coverage, the description supplies the non-structural context an agent needs: metric definitions, view semantics, paging, and the tracking-not-connected edge case. The one gap is that it never clarifies whether traffic_view acts as a filter on top of view, or how the two interact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: what each view actually returns, that only pages and evidence are paged, and that provider names must match the summary's system names. This goes beyond the terse schema text for view and traffic_view.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: AI crawler requests and AI-referred visits to the brand's site, with explicit definitions of visits vs crawler requests and of AI share. No sibling tool covers traffic analytics, so the boundary is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The view enumeration (summary = totals/providers/crawlers/referral sources/pages to improve/by week; pages = per-page; evidence = individual visits) implies which view to pick for which need. However there is no explicit when-to-use guidance, no routing to alternatives like get_brand_overview, and no statement of when this tool is the wrong choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_answerGet answerARead-onlyIdempotentInspect
One AI answer in full, with the brands it mentions, its recommendations, ranked list, outcome, and citations. Use it to read an answer_id from list_answers; to scan many answers use list_answers.
| Name | Required | Description | Default |
|---|---|---|---|
| answer_id | Yes | Answer ID from list_answers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the bar is lower. The description adds what the response contains, but since an output schema exists that content is largely duplicated rather than additive. No auth, rate-limit, or error behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with what is returned and followed by the routing rule. No filler and nothing that fails to earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema handling return-value structure and annotations handling the safety profile, the description needs only to state identity and routing, which it does completely. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, so the schema already documents answer_id fully. The description reinforces its provenance ('an answer_id from list_answers'), which adds a little origin context but no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (one AI answer) and enumerates the payload contents (brands, recommendations, ranked list, outcome, citations). This clearly distinguishes it from the sibling list_answers, which is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: use this to read a single answer_id obtained from list_answers, and use list_answers instead to scan many answers. Both the when-to-use and the alternative are stated with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_brand_overviewGet brand overviewARead-onlyIdempotentInspect
The brand's Overview in one call: visibility, share of voice and recommendation with their basis and change, how the brand and its main competitors stand, and headline readiness, traffic, inbox and Content Studio status. For one slice in depth use get_perception, list_citations, get_ai_traffic or get_readiness. A segment filters the answer metrics.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today. | |
| from | No | Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention. | |
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| segment | No | Optional segment ID or name. get_brand_settings lists the brand's segments. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower; the description still adds real behavioral context by disclosing that this is a multi-metric roll-up in one call and that a segment 'filters the answer metrics' rather than everything. It stops short of describing retention/latency behavior, but the schema already handles date-window and retention caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what the call returns and followed by the routing rule and the segment caveat. The first sentence is a long enumeration but every item corresponds to actual returned content, so it earns its length; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only aggregate tool with a 100%-documented schema and an output schema covering return values, the description supplies everything an agent needs: content scope, alternative tools, and the segment filtering nuance. Nothing required for correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes beyond the schema by clarifying the scope of the optional segment parameter ('filters the answer metrics'), which is a behavior the schema description does not state. The brand/date parameters add no extra meaning in the prose, but nothing is misleading.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (the brand Overviewe) and enumerates exactly what it returns: visibility, share of voice, recommendation with basis and change, competitor standing, and readiness/traffic/inbox/Content Studio status. It also names the sibling tools it is not, so an agent can separate the aggregate view from the single-slice tools without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to alternatives: 'For one slice in depth use get_perception, list_citations, get_ai_traffic or get_readiness.' That is a clear when-not-this condition paired with the correct substitutes, leaving little to inference beyond the obvious 'use this for the overall picture'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_brand_settingsGet brand settingsARead-onlyIdempotentInspect
Read the brand's settings: primary brand, competitors, segments (market, language, models), site tracking and CMS status, brand voice, and Content Studio skills. Use it to find the competitor_id and segment values other tools take, and to see the current state before changing a setting. For metrics use get_brand_overview.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered and the bar is lower. The description adds useful framing as a state-inspection read used to source IDs for other tools, but offers nothing on rate limits, auth scopes, or payload shape beyond the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with the scope front-loaded before the routing hint, and every clause (settings list, ID lookup, pre-change inspection, metrics alternative) carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description is not obligated to describe return values, and it covers purpose, usage trigger, sibling routing, and the pre-mutation inspection role completely. Nothing 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single 'brand' parameter with 100% schema description coverage that already explains ID vs. exact/unique-prefix name resolution. The description adds no syntax or format detail beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the brand's settings') and enumerates exactly which settings are returned (primary brand, competitors, segments, tracking/CMS status, brand voice, Content Studio skills). It also explicitly differentiates itself from the metrics sibling by naming get_brand_overview, so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit positive triggers ('find the competitor_id and segment values other tools take') and a clear workflow role ('see the current state before changing a setting'), plus an explicit exclusion routing metrics queries to get_brand_overview. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_brand_setupGet brand setupARead-onlyIdempotentInspect
A brand setup's progress and, once it needs approval, its proposals: the brand, competitors, segment, and prompts, each with the proposal_id approve_brand_setup takes.
| Name | Required | Description | Default |
|---|---|---|---|
| setup_id | Yes | Setup ID from start_brand_setup. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld). The description adds a genuine behavioral nuance beyond them: proposals are only present 'once it needs approval', so the payload is state-dependent. That is useful context an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single compact sentence, so nothing is wasted, but the nested 'progress and, once it needs approval, its proposals' clause plus the trailing relative clause makes it dense and slightly awkward to parse. Front-loading the resource is good; the structure could be cleaner.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich annotation set and an existing output schema, the description need not enumerate return fields, and it correctly focuses on the setup lifecycle and proposal availability. Only minor gaps remain, such as behavior when the setup is not yet at the approval stage or when setup_id is invalid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, and the schema already tells the agent the id comes from start_brand_setup. The description alludes to 'a brand setup's' but adds no syntax or constraint detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific resource (a brand setup) and what is retrieved (progress, and its proposals once approval is needed), which distinguishes it from get_brand_overview and get_brand_settings. It is a noun fragment rather than a verb+resource statement, but an agent can still tell what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: call this to read a setup's progress, and once it reaches the approval stage to obtain proposal_ids. It names approve_brand_setup as the consumer of those ids, but gives no when-not guidance or explicit alternative for reading brand data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_citation_sourceGet citation sourceARead-onlyIdempotentInspect
One cited source. With domain: its citations, models, brands named, trend, and its most influential pages. With source_id: one page's citing prompts, models, brands named, recent snippets, and trend.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today. | |
| from | No | Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention. | |
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| domain | No | A domain from list_citations. | |
| source_id | No | A page's source_id from list_citations view pages. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-destructive, open-world lookup, so the safety profile is covered. The description adds useful behavioral context about what each mode yields (citations, models, brands named, snippets, trend), but says nothing about retention limits, rate limits, or permission requirements beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, with the dual-mode structure front-loaded in the first clause. The clipped noun-phrase opener ('One cited source') is slightly less readable than a full verb phrase but is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and an output schema covering return structure, the description's job is limited to distinguishing the two lookup modes, which it does. Date-window behavior and the required brand come from the schema, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so domain, source_id, brand, from, and to are all documented in the schema itself (including where domain and source_id come from: list_citations). The description's domain-vs-source_id contrast is largely a restatement of the schema's own hints, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (a cited source) and clearly splits its behavior into two lookup modes โ by domain and by source_id โ with what each returns. It stops short of using an explicit verb like 'retrieve', but the resource and mode distinction make it differentiable from the sibling list_citations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage through the mode split (domain โ domain-level rollup, source_id โ single page detail), which tells the agent how to choose between the two parameter paths. However, it never states when to use this tool over list_citations, nor that brand is required, so the guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_docGet docARead-onlyIdempotentInspect
Fetch one public Cleotic documentation page by slug. Links inside a page are slugs this tool takes. Use search_docs first when you have no slug.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Documentation slug from search_docs, for example core-concepts/visibility-metrics. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds only the 'public' scope constraint, which is useful (private pages presumably fail) but there is no error behavior, rate limit, or failure-mode context beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, no filler, with the core action front-loaded and the routing hint last. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only lookup with an output schema and full annotation coverage, the description supplies everything needed: what is fetched, what the slug is, and how to obtain one. Return values are properly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the slug parameter is already documented with an example, so the baseline would be 3. The description adds real value by explaining where slugs come from (in-page links, or search_docs output), which clarifies the value the agent should pass.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: fetch one public Cleotic documentation page by slug. The 'public' qualifier and 'by slug' key distinguish it cleanly from list_pages and search_docs without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use search_docs first when you have no slug' names the alternative sibling and the exact condition that selects it. It also clarifies that in-page links are already valid slugs, telling the agent when no lookup step is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_operationGet operationARead-onlyIdempotentInspect
Follow a write: its live status (pending, completed, or failed) read from the resource itself, its progress, and how long to wait before checking again. Only the member and connection that made the write can read it.
| Name | Required | Description | Default |
|---|---|---|---|
| operation_id | Yes | Operation ID returned by a write tool. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is handled. The description adds a genuinely new behavioral constraint beyond structured data: 'Only the member and connection that made the write can read it,' which warns the agent about per-connection scoping and potential authorization failures. It stops short of describing failure behavior when the operation does not exist or is still pending.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and front-loaded: the return payload is described first, then the access restriction. Every clause earns its place by telling the agent something actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value shape need not be explained, and annotations cover the safety profile; the description still usefully names the status vocabulary and the caller-scoping rule. Complete enough to call correctly, with only minor gaps around terminal-state and not-found behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema already fully documents operation_id and its provenance. The description reinforces the polling purpose but adds no new format, syntax, or constraint detail for the parameter itself, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Follow a write') and enumerates exactly what is returned: live status (pending/completed/failed), progress, and retry delay. No sibling tool in the list deals with async operation tracking, so the agent can immediately place it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'Follow a write' plus the schema note that operation_id comes from a write tool tells the agent this is the post-write polling endpoint, and 'how long to wait before checking again' hints at the polling loop. However, there is no explicit when-to-use framing, no statement of when to stop polling, and no named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_opportunityGet opportunityARead-onlyIdempotentInspect
One opportunity with its evidence (who is winning, verbatim excerpts, cited sources, trend), its play and the tool call that carries it out, before/after proof, timeline, and comments. Content gaps include each engine's latest answer. Read it before act_on_opportunity or create_page; to browse the inbox use list_opportunities.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| opportunity_id | Yes | Opportunity ID from list_opportunities. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so the safety profile is covered. The description adds genuinely useful context about the shape of the payload (evidence, play, the tool call that carries it out, proof, timeline, comments) rather than restating the annotations. It stops short of disclosing anything about auth, freshness, or rate limits, but the bar is lower here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, and the routing guidance lands in the final sentence where it is easy to find. The long parenthetical content list is dense but each item is informative; only slight trimming would be possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, yet it still orients the agent on payload richness. Combined with full parameter coverage and annotations covering safety, nothing 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both params are documented in-schema (brand resolvable from list_brands, opportunity_id from list_opportunities). The description adds no syntax or format meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('One opportunity') and then enumerates precisely what the payload contains โ evidence, play, tool call, before/after proof, timeline, comments โ so the agent knows exactly what it gets. It is clearly distinguished from list_opportunities (browsing) and act_on_opportunity/create_page (acting), which appear in sibling tool names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit sequencing rule ('Read it before act_on_opportunity or create_page') and names the alternative for the other mode ('to browse the inbox use list_opportunities'). Both when-to-use and when-to-use-something-else are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pageGet pageARead-onlyIdempotentInspect
One Content Studio page: its brief (goal, reader, angle), target questions, outline, the page as Markdown (in parts when long), the latest conversation with Cleotic's page agent including any question it is waiting on, its pending suggestions and authority notes, and results once live. Read it after create_page and message_page; to find pages use list_pages.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| cursor | No | markdown_next_cursor from the previous call, for the next part of a long page. | |
| page_id | Yes | Page ID from list_pages. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds value beyond that by disclosing pagination of long Markdown via an internal cursor and by noting that the latest conversation may contain a question the page agent is waiting on, which is operationally useful behavioral context not present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is a long enumeration of returned contents but is efficiently packed and front-loads the resource. The second sentence cleanly handles sequencing. It is a single dense sentence plus one routing sentence, which is reasonably sized for a rich read tool, though the first sentence borders on a laundry list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description is not required to explain return value shape. It still complements the schema by summarizing what is inside a page and by explaining the cursor-driven pagination flow (markdown_next_cursor from the previous call), which is exactly the contextual information an agent needs to invoke this correctly. Nothing critical appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already has a thorough description in the schema (brand ID or name, cursor for next Markdown part, page_id origin). The description does not add per-parameter detail the schema lacks. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get/read) and resource (one Content Studio page), and enumerates the rich contents returned (brief, questions, outline, Markdown, conversation, suggestions, live results). It explicitly names siblings create_page, message_page and list_pages, so an agent can distinguish this retrieval tool from creation and listing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear timing guidance: read it after create_page and message_page, and use list_pages to find pages. This signals when this tool is the right pick versus discovery via list_pages. It does not, however, contrast against the other page-reading siblings like get_doc or edit_page, but the population of sibling alternatives for a single-page fetch is limited.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_perceptionGet perceptionARead-onlyIdempotentInspect
How AI answers describe the brand and its competitors: scores out of 10 on each dimension, by model, with the brand's evidence quotes and trend. Only analysis inside the period is used; has_data is false when there is none, and latest_analysis_at then says which period to ask for. Competitors are capped, best score first. Not included on every plan.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today. | |
| from | No | Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention. | |
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| max_competitors | No | Competitors to include, best overall score first. Defaults to 8; the brand is always included. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so this is judged on added context. The description adds real behavioral detail: empty-period handling with has_data/latest_analysis_at, a cap on competitors ordered best-first, period-scoped analysis, and a plan-availability caveat โ none of which the annotations express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded paragraph that leads with what is returned, then layers in the empty-data contract and plan caveat. Dense but every sentence carries distinct information; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it correctly focuses on gating (plan availability), empty-result behavior, and period scoping. An agent has almost everything needed; the only gap is explicit sibling routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so period bounds, retention limits, brand resolution, and the max_competitors cap/ordering are already fully documented in the schema. The description restates competitor capping and period scoping without adding syntax beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (perception of the brand and its competitors) and defines the return shape precisely: scores out of 10 per dimension, by model, with evidence quotes and trend. It does not, however, distinguish itself from nearby siblings such as get_brand_overview, so the agent must infer which tool to reach for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful operational context (analysis is scoped to the period, has_data is false when empty, latest_analysis_at points to a valid period) and warns it is not on every plan. But it never states when to choose this over alternatives like get_brand_overview โ usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_planGet planARead-onlyIdempotentInspect
Read the organisation's plan: limits and their use (null limit = unlimited), included features, the Content Studio allowance, the model budget, and the AI models every segment collects from. Check it before a write that costs plan capacity, a generation, or model budget.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world, so the safety profile is covered. The description adds real interpretive context beyond that, notably the 'null limit = unlimited' convention and the fact that it exposes per-segment model collection. Not a rich behavioral narrative, but a useful increment over the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and the contents, then the when-to-use trigger. Dense but every clause carries information. The enumerated contents list is slightly long but each item is a distinct capability of the plan object.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema already describing the return shape, the description need not restate fields, and it correctly focuses on purpose and timing. The read is fully specified for a no-parameter, annotated, schema-documented tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the schema or description to disambiguate. Baseline 4 applies; the description cannot add parameter meaning where none exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (the organisation's plan) and then enumerates exactly what is returned: limits and their use, included features, Content Studio allowance, model budget, and per-segment AI models. No sibling tool reads plan data, so it is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call it: 'before a write that costs plan capacity, a generation, or model budget.' That is clear pre-flight guidance. It does not name an alternative tool, but no sibling overlaps this concern, so the omission is minor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_readinessGet site readinessARead-onlyIdempotentInspect
The brand site's AI readiness scan. view summary: score, verdict, lens and pillar scores, and open findings by severity. view action_plan: open findings to fix, with the questions no page answers. view pages: pages the scan read, or with page_id one page's open findings. view history: past scans. view competitors: competitor scans, the checks they pass that the brand fails, and the plan's competitor limit and cooldown; competitor scans are started in the app, not through MCP.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | action_plan order. Defaults to points. | |
| view | No | Defaults to summary. | |
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| limit | No | Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor. | |
| cursor | No | next_cursor from the previous page. Leave out for the first page. | |
| run_id | No | Optional scan ID; defaults to the latest. | |
| status | No | action_plan filter. Defaults to open. | |
| page_id | No | pages view: a page_id from the pages list, for that page's findings. | |
| severity | No | action_plan filter: comma list of critical, major, minor, info. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so safety behavior is covered. The description adds useful context about what each view returns and clarifies that competitor scans cannot be started here, but says nothing about authentication, rate limits, or how 'open findings' change between runs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded and each view is covered in one compact clause with no filler. The semicolon-dense sentence is information-dense and the competitor caveat is slightly buried at the end, but the structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description only needs to orient the caller, and it does so by enumerating what each view yields and what the tool cannot do. An agent has enough to select a view and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the 9 parameters is documented there, so the schema carries the load. The description reinforces the view semantics and the page_id case but adds no format or syntax detail beyond what's already in the schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a precise noun phrase identifying the resource ('The brand site's AI readiness scan') and enumerates five distinct views, so an agent can tell exactly what each invocation returns and how it differs from siblings like get_plan or get_brand_overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description maps every view to a use case ('view action_plan: open findings to fix', 'view pages: pages the scan read'), which effectively tells the agent when to pick each mode. It also explicitly excludes competitor scanning ('started in the app, not through MCP'), but gives no guidance on when to prefer summary over action_plan or how it relates to run_readiness_scan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_readiness_findingGet readiness findingARead-onlyIdempotentInspect
One readiness check: why it matters, its drafted fix, and where it fails. Pass check_request_id to follow a verify_readiness_fix re-check.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| limit | No | Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor. | |
| cursor | No | next_cursor from the previous page. Leave out for the first page. | |
| run_id | No | Optional scan ID; defaults to the latest. | |
| check_id | Yes | Check ID from get_readiness. | |
| check_request_id | No | Optional: the check_request_id from verify_readiness_fix, to include that re-check's status and result. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds the shape of the finding (rationale, fix, failure location), which is genuine context, but says nothing about permissions, scoping to run_id, or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no waste; the identifying content of the finding is front-loaded and the workflow hint follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers the tool's content and its link to verify_readiness_fix. It is nearly complete, though the relationship to get_readiness and run_id scoping could be clearer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so brand, check_id, run_id, limit and cursor are already documented in the schema. The description only touches check_request_id, and even that repeats the schema text, so it adds little beyond structured data โ baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('one readiness check') and enumerates its contents (why it matters, drafted fix, where it fails), which distinguishes it from get_readiness (a list) and verify_readiness_fix (a re-check). It does not explicitly contrast itself with those siblings, keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies the follow-up workflow by stating 'Pass check_request_id to follow a verify_readiness_fix re-check', which is useful routing context. However, it never says when to call this versus get_readiness, nor any exclusion or prerequisite, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_answersList answersARead-onlyIdempotentInspect
AI answers, newest first. With prompt_id: that prompt's answers across models, with the brands they mention and recommend. Without: answers that mention the brand, with the mention in context; empty for a brand no answer mentions, while prompt_id shows a prompt's answers either way.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today. | |
| from | No | Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention. | |
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| limit | No | Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor. | |
| model | No | Optional model family: chatgpt, claude, gemini, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model. A family is exact: gemini does not include google-ai-mode or google-ai-overviews. | |
| cursor | No | next_cursor from the previous page. Leave out for the first page. | |
| segment | No | Optional segment ID or name. get_brand_settings lists the brand's segments. | |
| prompt_id | No | A prompt ID from list_prompts. Leave out for answers mentioning the brand. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly/idempotent/non-destructive/openWorld), so the bar is lower, and the description still adds real context: sort order, what each mode returns (brands mentioned/recommended vs mention in context), and the important edge-case semantics that one mode can be empty while the other still returns rows.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core fact ('AI answers, newest first') before the two branches, and every clause carries information. The semicolon-joined final sentence is dense but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shapes needn't be explained, and the annotations plus rich schema cover safety and parameters. The description supplies the mode split, ordering, and empty-result behavior, leaving little an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter (dates, limit, model, cursor, segment, prompt_id). The description reinforces prompt_id's mode-switching role but adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (list AI answers) with ordering ('newest first') and then splits the tool into two clearly-scoped modes keyed on prompt_id. This lets an agent understand behavior well, though it never explicitly names siblings like get_answer or list_citations to sharpen the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance: with prompt_id you get a prompt's answers across models; without it you get answers mentioning the brand. The 'either way' clause on the empty case tells the agent when each mode still yields results, but no explicit alternatives or exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_brandsList brandsARead-onlyIdempotentInspect
List the brands and studies you can access, with visibility, share of voice and recommendation (each with the answers and models behind it and its change on the previous period), citations, site readiness, collection health, AI traffic, and the opportunity inbox's Now stage. Brands come in name order, so paging stays steady as brands are added. Start here to find a brand ID.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today. | |
| from | No | Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention. | |
| kind | No | Optional filter. | |
| limit | No | Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor. | |
| cursor | No | next_cursor from the previous page. Leave out for the first page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower, yet the description still adds a genuine behavioral guarantee: brands are returned in name order "so paging stays steady as brands are added" โ a stability property not derivable from annotations. It does not discuss auth scoping or rate limits, keeping it at a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and ordering guarantee are front-loaded, with the entry-point cue last. The middle clause is a long laundry list of returned metrics, but each item is scoped and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety, a full output schema, and 100% parameter coverage, the description only needs purpose, ordering, and entry-point guidance โ all present. Minor gap: no hint about how large the result set can be before paging, though the schema's cursor/limit notes mitigate this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents from/to/kind/limit/cursor, including defaults, window caps, and enum values. The description adds no parameter-level detail beyond the ordering note, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("List the brands and studies you can access") and explicitly frames itself as the entry point ("Start here to find a brand ID"), which separates it from detail-oriented siblings like get_brand_overview or get_brand_settings. An agent can route to it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Start here to find a brand ID" gives clear, actionable context for when to reach for this tool, and the enumeration of returned data implies it's the discovery/index call. It stops short of naming when NOT to use it or pointing to a specific alternative for per-brand detail, so it falls just short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_citationsList citationsARead-onlyIdempotentInspect
The sources AI answers cite for this brand's prompts. view overview: totals by ownership and source type, by week. view domains: cited domains, with source gaps where competitors are cited and the brand is not. view pages: cited pages ranked by influence. Only domains and pages are paged.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today. | |
| from | No | Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention. | |
| view | No | Defaults to overview. | |
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| limit | No | Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor. | |
| cursor | No | next_cursor from the previous page. Leave out for the first page. | |
| domain | No | Optional domain filter. | |
| search | No | Optional text filter. | |
| segment | No | Optional segment ID or name. get_brand_settings lists the brand's segments. | |
| ownership | No | Optional filter. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, so the bar is lower. The description adds a non-obvious behavioral fact: 'Only domains and pages are paged,' which tells the agent overview is not paginated. No auth/rate-limit context, but the paging asymmetry is meaningful added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight clauses: what it is, then the three views, then the paging caveat. Front-loaded, zero filler, every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-format details are unnecessary, and all 10 params are described in the schema. The view semantics and paging note round out the main ambiguities. Minor gap: no guidance on how 'influence' or 'source gaps' are computed, but that is arguably output-schema territory.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description goes beyond the enum by describing what each view returns (totals by ownership/source type, cited domains with gaps, pages ranked by influence) and clarifies paging applicability, which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('sources AI answers cite for this brand's prompts') and enumerates the three views it can return, making the scope concrete. It doesn't name a sibling tool to differentiate against, but the citation-specific scope is unambiguous against list_answers/list_prompts/list_pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains what each view is for โ overview for ownership/source-type totals by week, domains for competitor source gaps, pages for influence ranking. That is genuine selection guidance for the main decision (which view). No explicit when-not-to-use or alternative tools are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_opportunitiesList opportunitiesARead-onlyIdempotentInspect
The brand's opportunity inbox: content, readiness, source, traffic, and coverage gaps, each with its score, AI search demand, stage (now, in_flight, watching, won), and assignee, plus stage counts for the active inbox (counts.ready_to_win: watching items whose gap has closed). Start here to find an opportunity_id, read it with get_opportunity, and change it with act_on_opportunity or update_opportunities.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Optional filter. | |
| view | No | Defaults to active. | |
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| limit | No | Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor. | |
| stage | No | Optional filter. | |
| cursor | No | next_cursor from the previous page. Leave out for the first page. | |
| segment | No | Optional segment ID or name. get_brand_settings lists the brand's segments. | |
| assignee | No | Optional: me, or a member ID (none is not accepted here). No tool lists members: take an ID from an opportunity's assignee.member_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive behavior, so the bar is lower. The description adds context annotations cannot: the returned fields, stage vocabulary, and the semantics of counts.ready_to_win (watching items whose gap has closed). It omits anything about auth or rate limits, but adds real behavioral value over the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what the tool returns and then the routing advice. The first sentence is a dense run-on that packs fields, stages and counts together, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be re-explained; the 8-parameter schema is fully described. Combined with the explicit follow-up workflow, an agent has enough to call this correctly, though nothing covers the active/view default interaction or pagination caveats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all filtering params (kind, view, stage, segment, assignee, limit, cursor) are documented in the schema itself. The description restates the stage values but adds no syntax, defaults, or interactions beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (the brand's opportunity inbox) and enumerates its contents: content, readiness, source, traffic and coverage gaps with score, demand, stage and assignee. It also names sibling tools (get_opportunity, act_on_opportunity, update_opportunities), so an agent can distinguish it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the tool as the entry point: 'Start here to find an opportunity_id, read it with get_opportunity, and change it with act_on_opportunity or update_opportunities.' That is a clear workflow with named alternatives. It stops short of stating when-not to use it (e.g., when the ID is already known).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pagesList pagesARead-onlyIdempotentInspect
The brand's Content Studio pages, newest first, with their status: drafting, sent (to the CMS as a draft), live (locked, with results tracked) or revising. Start here to find a page_id for get_page.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| limit | No | Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor. | |
| cursor | No | next_cursor from the previous page. Leave out for the first page. | |
| status | No | Optional filter. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly, idempotent, non-destructive), so the description's contribution is the domain semantics: what 'drafting', 'sent', 'live' (locked, results tracked) and 'revising' actually mean, plus newest-first ordering. That is real context beyond the structured fields, though it says nothing about result size or truncation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and ordering, then the status vocabulary, then the routing hint. No sentence is redundant and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the return shape need not be described, and pagination is fully covered by the limit/cursor schema descriptions. Ordering, status semantics, and the next-step tool are all supplied, leaving no gap an agent needs filled before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description earns the extra point by giving meaning to the status values the schema only labels as "Optional filter", clarifying the lifecycle states an agent will see in results and can filter on.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (the brand's Content Studio pages), the ordering (newest first), and the status vocabulary the list exposes. It also distinguishes itself from get_page by positioning itself as the entry point that yields a page_id, so an agent can tell it apart from get_page/create_page without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Start here to find a page_id for get_page" gives explicit when-to-use guidance and names the follow-on sibling. It stops short of stating when NOT to use it (e.g. when you already hold a page_id) or naming list_brands/search alternatives, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_promptsList promptsARead-onlyIdempotentInspect
The brand's tracked prompts, highest AI search demand first, with segment, status, labels, monthly AI searches, and how many answers in the period mentioned the brand. Use it to find a prompt_id for list_answers; suggest_prompts proposes new prompts and save_prompt adds them.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today. | |
| from | No | Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention. | |
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| limit | No | Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor. | |
| cursor | No | next_cursor from the previous page. Leave out for the first page. | |
| status | No | Optional filter. | |
| segment | No | Optional segment ID or name. get_brand_settings lists the brand's segments. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds non-obvious behavior the annotations don't: the demand-based sort order and the fact that mention counts are scoped to the requested period. It does not add auth or rate-limit context, but the annotation baseline lowers that burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The resource and ordering come first, the routing guidance second, and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and pagination fully described in-schema (limit/cursor/next_cursor), the description covers the remaining agent-relevant context: sort order, period scoping of the mention count, and downstream tool routing. The only mild redundancy is enumerating return fields that the output schema already defines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the seven parameters (to, from, brand, limit, cursor, status, segment) are each documented in-schema, so the schema carries the parameter burden. The description references the period and segment dimensions only indirectly and adds no syntax or format detail beyond the schema โ the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (the brand's tracked prompts), states the ordering ('highest AI search demand first'), and enumerates the returned fields (segment, status, labels, monthly AI searches, brand mentions). An agent can distinguish this from list_answers, suggest_prompts, and save_prompt without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent: use this to obtain a prompt_id for list_answers, while suggest_prompts proposes and save_prompt persists. That covers the primary selection decision against the closest siblings, though it states no exclusion conditions or prerequisites (e.g., brand must already be set up).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reportsList reportsARead-onlyIdempotentInspect
The brand's saved reports, with their date ranges and public share links. Use it to find a report to revoke_report; create_report makes a new one.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered by structured data. The description adds return-content context (date ranges, share links) but says nothing about pagination, result volume, or rate limits, so it is only modestly additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, zero filler, with the inventory of the resource front-loaded before the routing guidance for related tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need no explanation, and annotations cover the safety profile. The description is essentially complete for a simple one-param list tool, with only pagination/result-size behavior unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 100% schema description coverage; the schema already explains that brand accepts an ID from list_brands or an exact/unique-prefix name. The description adds no format or syntax detail beyond that, so the baseline 3 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific resource ('the brand's saved reports') and its scope, plus what the listing carries (date ranges, public share links). It explicitly differentiates from both revoke_report and create_report, so an agent can place it among siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use condition ('find a report to revoke_report') and routes the create case to create_report. The alternative tools and the condition selecting each are named rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_page_publishedMark page publishedAInspect
Record that a page is live at a URL, for pages published outside a connected CMS. The page locks, and Cleotic compares answers to its target questions from that day. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The live page's address. | |
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| page_id | Yes | Page ID from list_pages. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (not read-only, not destructive, open-world), and the description adds genuinely new behavior: the page becomes locked, Cleotic re-evaluates its target questions as of that day, and the call is free. It omits retry/idempotency semantics even though a required idempotency_key implies they matter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler; the scope constraint and the side effects are front-loaded before the pricing note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full schema, an output schema, and annotations present, the description covers the essentials: what it records, the eligibility scope, and the locking/comparison side effects. The residual gap is that it never addresses the idempotency_key's retry contract, which is the one non-obvious field on a write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters, including the detailed idempotency_key semantics, are already documented in the schema. The description adds no parameter-level meaning beyond that, which is the baseline case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Record that a page is live at a URL') and immediately scopes it to 'pages published outside a connected CMS', which cleanly separates it from the sibling send_page_to_cms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The qualifier 'for pages published outside a connected CMS' tells the agent the condition under which this tool applies rather than the CMS-sync alternative. It stops short of naming the alternative tool explicitly or stating exclusions for already-published pages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
message_pageMessage pageAInspect
Talk to a page's agent as you: answer its question, ask for a change, approve its outline, or ask why something is the way it is. The agent replies, and may edit the page or the brief. Returns pending while it works; read the reply with get_page. Cost: model budget; the first draft of a page uses one Content Studio page.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | What to say to the agent. | |
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| page_id | Yes | Page ID from list_pages or create_page. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only carry safety hints), the description discloses asynchronous behavior ('Returns pending while it works'), the required follow-up read via get_page, the side effects ('may edit the page or the brief'), and a cost model ('model budget; the first draft of a page uses one Content Studio page'). These are exactly the non-obvious traits an agent needs before invoking a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the purpose and then the async behavior and cost. Nothing is padded; the cost sentence is terse but does carry unique information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter write tool with an output schema, the description covers purpose, side effects, async return handling, and cost. An agent can decide to call it, know that 'pending' is expected, and know how to retrieve the reply.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters, including the idempotency_key replay semantics. The description adds no parameter-level guidance beyond that, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Talk to a page's agent as you') plus four concrete intents (answer its question, ask for a change, approve its outline, ask why), so the agent knows exactly what kinds of actions this covers. It stops short of naming siblings such as edit_page or revise_page, and the clause 'may edit the page or the brief' is the only hint at how this differs from a direct edit tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The enumerated intents function as clear use-cases and the follow-up path is stated ('read the reply with get_page'). There are no explicit exclusions, however โ nothing says when to use edit_page or revise_page instead of routing through the page agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revise_pageRevise pageBInspect
Unlock a live page for changes. Results keep counting from when it first went live; send or publish the new version when it's ready. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| page_id | Yes | Page ID from list_pages. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds genuinely useful traits: results continue counting from the original go-live date and the operation is free. It does not mention the idempotency-key retry behavior or what happens if the page is not live.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action followed by the workflow and cost note. The one-word 'Free.' is borderline but conveys a real decision-relevant fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and annotations carry the mutation safety profile. Still, for a write tool that takes over a live page, the description leaves open whether the page stays publicly live during revision and how it relates to the sibling edit_page.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with all three parameters (brand, page_id, idempotency_key) fully documented in the schema, so baseline is 3. The description adds no parameter-level meaning beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it unlocks a live page for revision and names the follow-up actions (send or publish). This differentiates it from create_page and edit_page, which operate on non-live pages, though the exact state transition is described indirectly as 'unlock' rather than a concrete mutation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence implies a workflow (revise now, then send/publish when ready) and implicitly routes to send_page_to_cms or mark_page_published. However it never explicitly says when to choose this over edit_page, nor what preconditions apply (does the page have to be live already?).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_reportRevoke reportADestructiveInspect
Kill a report's public link. A revoked link stays dead: it cannot be restored, so create_report makes a new report with a new link. The report stays listed with revoked: true. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| report_id | Yes | Report ID from list_reports or create_report. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds non-obvious behavior beyond them: the revocation is permanent and irreversible, and the report remains listed with revoked: true. It also notes the operation is free. It does not mention required permissions or error behavior, keeping it at a strong 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action and its irreversible consequence; the one-word 'Free.' earns its place by conveying cost. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers the destructive consequence and the post-state. It stops short of covering auth/permission requirements or failure modes for a destructive write.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents brand, report_id, and idempotency_key. The description adds no parameter-level detail, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: it kills a report's public link, and it explicitly distinguishes revocation (link dies, report survives) from deletion. Against siblings like delete_item and create_report, an agent can tell exactly which outcome this produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear routing condition: because a revoked link cannot be restored, the alternative is create_report for a new link. It does not state explicit when-not-to-use cases (e.g., use delete_item to remove the report itself), so it falls short of full alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_readiness_scanRun readiness scanAInspect
Start a full site readiness scan of the brand's website. Owners and admins only. Only the first scan, or a retry while none has completed, can be started by hand; later scans run weekly, and the call is then refused with scheduled_only and next_run_at (get_readiness shows can_start_scan). verify_readiness_fix re-checks one issue. Returns pending; follow it with get_operation or get_readiness. Cost: one full scan, counted for the month; scans have no monthly allowance.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), while the description discloses the authorization requirement (owners/admin), the refusal mode with concrete error fields, the async pattern (returns pending, poll with get_operation/get_readiness), and the quota cost of one scan counted against the month with no monthly allowance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: purpose first, then eligibility, then refusal/limits, then follow-up. Almost every clause carries information, though the mid-section compresses several distinct rules (scheduling cadence, refusal fields, sibling pointer) into a single run-on sentence that is slightly harder to parse than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, quota-consuming, asynchronous tool, the description covers everything the agent needs before calling: who may call, when the call is refused, the async follow-up path, and the cost. Return-value details are rightly left to the existing output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (brand, idempotency_key) are already fully documented in the schema. The description adds only indirect context about retries that touches the idempotency key, but no new syntax or format detail; baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope: 'Start a full site readiness scan of the brand's website.' It also distinguishes itself from the two closest siblings by name โ get_readiness (status) and verify_readiness_fix (re-checks one issue) โ so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit eligibility and preconditions: owners/admins only, and the call is permitted only for a first scan or a retry while none has completed; otherwise it is refused with scheduled_only and next_run_at. It also names the follow-up alternatives (get_operation, get_readiness) for the pending result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_competitorSave competitorAInspect
Add a competitor, or with competitor_id edit one or pause and resume tracking it. A change to how answers name it re-reads existing answers automatically; it returns pending until that finishes. Cost: a new competitor is one tracked brand of plan capacity.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| domain | No | ||
| status | No | ||
| aliases | No | The full list of other names answers use for it. Replaces the current aliases, so include the existing ones; [] clears them. | |
| competitor_id | No | Edit this competitor, from get_brand_settings. Leave out to add one. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=false, destructiveHint=false), and the description adds genuinely non-obvious behavior: a naming/alias change silently re-reads existing answers and the call returns pending until done, plus a capacity cost. That is real side-effect disclosure beyond structured fields, though permission requirements and what a paused competitor stops doing are not stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the create/edit distinction before the async and cost caveats. Dense phrasing ('one tracked brand of plan capacity') is compact but earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description still covers the create/edit branch, the async re-read state, and cost. Only the relationship to brand/study scoping and pause semantics remain thin for a 7-parameter mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 57%, so the schema documents part of the surface. The description adds meaning only for competitor_id (edit vs add); brand, name, domain, and status semantics are left entirely to the schema, and the alias-replacement behavior is described in the schema, not the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and then splits the two modes precisely: add versus edit/pause/resume via competitor_id. An agent can distinguish it from siblings like save_fact, save_prompt, and update_brand without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear condition for each branch (omit competitor_id to add, supply it to edit or pause/resume tracking). It does not name any alternative tool or exclusion (e.g. when to prefer update_brand_settings-style tools), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_factSave factAInspect
Add a fact to the brand's fact library, or with fact_id edit, confirm or reject one. Set from_user only when the user told you the fact in this conversation; it is then confirmed as theirs. A fact you found yourself, on their site, the web or a draft, is proposed with its source_url and waits for the user to confirm it. The same fact is stored once. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | number: a figure with its period. process: what happens, step by step. example: a named customer or case. claim: anything else the brand states. | |
| text | No | The fact as one self-contained sentence a page could quote. | |
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| status | No | With fact_id: confirm a proposed fact once the user agrees, or reject it. | |
| fact_id | No | Edit this fact, from search_facts. Leave out to add one. | |
| segment | No | The segment ID or name it applies to; leave out for the whole brand. With fact_id, none makes it brand-wide. | |
| from_user | No | True only when the user told you this fact in this conversation. | |
| source_url | No | Where you found it. A new fact needs it unless from_user is true. | |
| stale_after | No | YYYY-MM-DD after which to re-check it, for figures and dated claims. With fact_id, none clears it. | |
| source_excerpt | No | The words on the source the fact rests on. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=false), and the description adds genuinely useful behavior beyond them: facts are deduplicated ('the same fact is stored once'), user-sourced facts skip the approval wait, and the call is 'Free'. It doesn't clarify permission requirements or what a rejection does to an existing confirmed fact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the add-vs-edit split are front-loaded, and every sentence carries information (dedup rule, source requirement, approval flow, cost). It is dense but not padded, though the middle sentences could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with two enums and an output schema present, the description covers the decision-relevant behaviors: mode selection, sourcing rules, confirmation workflow, and dedup. Return-value details are rightly omitted since an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema documents only per-field: the from_user/source_url dependency, the fact_id triggering edit/confirm/reject mode, and the fact_id-absent behavior of clearing segment and stale_after. That is real added value beyond the field-level docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Add a fact to the brand's fact library') and distinguishes the two operating modes (add vs. edit/confirm/reject via fact_id). It does not name the read-side sibling search_facts, but the mode split is enough for an agent to place the tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real conditional guidance: use from_user only for facts the user stated in-conversation (which are auto-confirmed), and propose self-found facts with source_url so they wait for user confirmation. It stops short of explicitly routing to alternatives like search_facts for reading or save_segment for segment-level facts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_promptSave promptAInspect
Add a prompt to a segment, or with prompt_id edit one. Changing an existing prompt's text replaces it, keeping the old prompt's answers in its history. Cost: an active prompt is plan capacity; new and replaced prompts get a first answer from every model, using model budget.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| text | No | ||
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| market | No | A free-text label stored on the prompt. It does not change where the prompt is collected: the segment's geo does. | |
| status | No | ||
| persona | No | ||
| segment | No | The segment (ID or name) for a new prompt. | |
| category | No | ||
| language | No | ||
| prompt_id | No | Edit this prompt, from list_prompts. Leave out to add one. | |
| intent_type | No | ||
| funnel_stage | No | ||
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false), so the bar is lower. The description adds genuinely useful behavior beyond them: replacing text retains the old prompt's answers in history, and active prompts consume plan capacity while new/replaced prompts trigger a first answer from every model against model budget.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the primary action and mode switch, then behavioral and cost consequences. Every sentence carries load; the cost sentence is dense but justified for a write operation with budget implications.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description covers the key decision inputs: mode selection, history retention on replacement, and cost. Minor gaps remain around the active/paused enum effect and the many free-text metadata fields, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 38% across 13 parameters. The description clarifies the most consequential semantic (prompt_id toggles edit vs. create) and echoes segment scoping, but the remaining fields (text, tags, status, persona, category, language, intent_type, funnel_stage) get no added meaning, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a prompt to a segment') and immediately distinguishes the two operating modes: create when prompt_id is omitted, edit when it is supplied. An agent can tell exactly what the call does and which mode it is entering without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear routing between add and edit ('with prompt_id edit one') and supplies cost context that informs whether to call it. It does not name sibling alternatives (e.g. suggest_prompts for generating prompts, list_prompts for retrieval), so it falls short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_segmentSave segmentAInspect
Add a segment (a market and language to track), or with segment edit one or pause and resume it. A segment can carry an audience on the Business plan: a buyer described by situation (budget, role, company size, home, priorities) that is sent with every prompt as an 'About me' line, so answers show what the engines tell that buyer; Google AI Overviews and AI Mode are not collected for it. To compare an audience with an existing segment, create a new segment with copy_prompts_from and an audience. Cost: an active segment is plan capacity and collects daily from every plan model, using model budget; copied prompts each use one prompt of plan capacity.
| Name | Required | Description | Default |
|---|---|---|---|
| geo | No | Country code, for example GB, or global: where this segment's answers are collected from. | |
| name | No | ||
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| status | No | ||
| segment | No | Edit this segment (ID or name). Leave out to add one. | |
| audience | No | The buyer this segment's prompts are asked as. Replaces the current audience. Describe needs and situation: age and gender alone rarely change answers. | |
| language | No | Language code, for example en. | |
| prompt_limit | No | ||
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. | |
| audience_template | No | Start from a built-in audience instead of passing audience; none removes the audience. | |
| copy_prompts_from | No | New segments only: copy this segment's (ID or name) active prompts, market and language into the new segment, so the two can be compared. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true, destructiveHint=false, and idempotentHint=false, so the safety profile is covered. The description adds real context the annotations cannot: an active segment consumes plan capacity and collects daily from every plan model against model budget, copied prompts each consume one prompt of capacity, and Google AI Overviews/AI Mode are excluded from collection. That is genuinely useful cost and coverage disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is dense and earns its place, but it is delivered as one long, run-on paragraph with several stacked clauses per sentence, and the opening sentence is awkward to parse. Front-loading of the core action is decent, but readability suffers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the mutation/safety profile. The description fills the remaining gaps โ modes, audience semantics, comparison workflow, and cost โ so an agent has enough to call it correctly, though geo/language/brand usage is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 73%, so the schema carries most parameter detail; the description still adds meaning the schema does not, explaining that 'audience' is the buyer prompts are asked as, that 'age and gender alone rarely change answers', and that copy_prompts_from exists to enable segment comparison. Undescribed fields (brand, geo, language, prompt_limit) are adequately covered by inline schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (segment) and enumerates its modes: add, edit (via 'segment'), and pause/resume via status. It distinguishes itself from nearby write tools like save_prompt and save_competitor by describing what a segment actually contains (market + language). The first sentence is slightly garbled ('or with segment edit one or pause and resume it'), which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives conditional guidance: leave out 'segment' to add, pass it to edit, use status to pause/resume, and create a new segment with copy_prompts_from to compare audiences. That covers when-to-use for each mode, though it never names a sibling alternative or an explicit 'do not use this for X' case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch docsARead-onlyIdempotentInspect
Search the public Cleotic documentation by keyword and return matching pages. Use it when you do not know which page you need; use get_doc when you already have a slug.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return. Defaults to 5, max 10. | |
| query | Yes | Search query. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds that the search targets public documentation and returns matching pages, but does not add rate limits, result behavior, or ranking details beyond what the annotations and output schema provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with the main action and the usage decision front-loaded. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, full schema descriptions, and presence of an output schema, the description provides enough context to select and invoke the tool correctly without repeating structured data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the input schema. The description mentions keyword search but adds no syntax, matching rules, or limit behavior beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Search) and resource (public Cleotic documentation), and distinguishes the tool from the sibling get_doc by contrasting keyword search with slug lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: use search when you do not know which page you need, and use get_doc when you already have a slug. The alternative is named directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_factsSearch factsARead-onlyIdempotentInspect
The brand's fact library: what the brand stands behind (confirmed) and facts found on its site, the web or a draft that wait for the brand to confirm them (proposed). With query, the best matches by words and meaning; without, every fact, proposed first. Quote only confirmed facts as the brand's own and check stale ones with the user first. Add, confirm or reject facts with save_fact.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| limit | No | Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor. | |
| query | No | Optional. What to look for, in plain words, for example how long approvals take. | |
| cursor | No | next_cursor from the previous page. Leave out for the first page. | |
| status | No | Optional. Defaults to confirmed and proposed. | |
| segment | No | Optional segment ID or name: the brand-wide facts and that segment's own. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the bar is lower, yet the description still adds value: hybrid word+meaning matching for query, proposed-first ordering without query, and guidance to quote only confirmed facts and verify stale ones. It does not discuss pagination behavior, though the schema's cursor/limit fields cover that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences front-load the tool's identity and matching behavior, then the downstream usage caution. Slightly dense but every sentence contributes; the stale-fact caution is the most tangential.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full annotation coverage, the description needn't cover return values. It supplies purpose, match semantics, ordering, alternative-tool routing, and usage caution, leaving no major gap for a 6-param filtered search.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning beyond the schema by explaining that query does hybrid keyword+semantic matching and that omitting it returns everything with proposed facts first, giving the query parameter conceptual weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (the brand's fact library), then defines the two fact states (confirmed vs proposed) so the agent understands the domain. It explicitly routes write operations to the sibling save_fact, distinguishing itself from it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains behavior with vs without query ('best matches by words and meaning' vs 'every fact, proposed first') and names save_fact as the alternative for adding/confirming/rejecting. It lacks explicit steering against other search siblings like search_docs or search_site, but the write-vs-read context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_siteSearch siteARead-onlyIdempotentInspect
Passages from the brand's own website that match a query, by words and meaning, with the page each comes from. Cleotic reads the pages its latest site readiness scan found, up to 100, after each scan. Use it to see what the site already says before asking the user, and quote it as the site's wording. index says when the site was last read.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| limit | No | Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor. | |
| query | Yes | What to look for, in plain words. | |
| cursor | No | next_cursor from the previous page. Leave out for the first page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), so the description's added value is corpus and freshness semantics: it reads pages from the latest readiness scan, caps at 100, refreshes after each scan, and that 'index says when the site was last read'. Those are real behavioral facts an agent cannot derive from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, front-loaded with what is returned before the usage advice and freshness note. Dense but no filler; the phrase 'Cleotic reads the pages its latest site readiness scan found' is slightly indirect but carries necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, and the corpus scope, freshness signal and usage guidance are covered. Pagination behavior is left entirely to the schema's cursor/limit descriptions, which is acceptable though it means the description is silent on multi-page retrieval.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so brand, query, limit and cursor are already documented in the schema; baseline is 3. The description echoes the 100-row cap but adds no syntax, format or query-language detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: passages from 'the brand's own website' matching a query 'by words and meaning', with page provenance. The phrase 'the brand's own website' cleanly separates it from siblings search_docs and search_facts without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit context: 'Use it to see what the site already says before asking the user, and quote it as the site's wording.' That is a clear trigger and even prescribes how to reuse the result. It stops short of naming when to prefer search_docs or list_pages instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_page_to_cmsSend page to CMSAInspect
Send the page to the brand's connected CMS as a new draft, never published: the team publishes it there, and Cleotic marks the page live when it sees it on the site. Needs exactly one ready CMS destination; otherwise send it from the app. Confirm with the user first. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| page_id | Yes | Page ID from list_pages. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark it non-read-only, open-world, and non-destructive; the description goes further by disclosing the exact downstream behavior (creates a draft that is never published, the team publishes it, Cleotic later marks the page live) plus cost ('Free') and a user-confirmation requirement. It does not clarify retry/replay behavior, which is only covered in the idempotency_key schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences with zero filler, leading with the action and state change before prerequisites and the confirmation requirement. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description still covers the state transition, prerequisite, fallback, cost, and confirmation duty. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters and the baseline is 3. The description adds real meaning for 'brand' by requiring that it resolve to exactly one ready CMS destination, a constraint the schema does not express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (send) plus resource (page) plus destination (the brand's connected CMS) and the resulting state (new draft, never published). This clearly separates it from siblings like mark_page_published, create_page, and edit_page without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite ('exactly one ready CMS destination'), a when-not ('otherwise send it from the app'), and a safety directive ('Confirm with the user first'). It does not explicitly name sibling tools as alternatives, which keeps it from a 5, but the routing guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_primary_brandSet primary brandAInspect
Create or edit the brand being tracked: its name, domain, and aliases. Pass at least one; what you leave out stays as it is. To add a competitor use save_competitor; to rename a brand or study, or pause it, use update_brand. A change to how answers name the brand re-reads existing answers automatically; it returns pending until that finishes. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The brand's name as answers name it. | |
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| domain | No | The brand's website domain, for example example.com. | |
| aliases | No | The full list of other names answers use for the brand. Replaces the current aliases, so include the existing ones; [] clears them. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, but the description adds non-obvious behavior the annotations cannot convey: changing how answers name the brand triggers an automatic re-read of existing answers and the call returns 'pending' until it completes, plus cost ('Free'). It doesn't cover auth/permission requirements or the replace-vs-merge nuance for aliases (left to the schema), so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with purpose, then update contract, then sibling routing, then async side effect and cost. Every clause carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, yet the description still flags the important 'pending' interim status after a name-affecting change. Combined with sibling routing and the partial-update contract, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it identifies the editable fields as name/domain/aliases and clarifies the partial-update semantics ('what you leave out stays as it is'). It does not restate per-parameter formats, which the schema already handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create or edit the brand being tracked') plus the fields involved (name, domain, aliases), and explicitly differentiates itself from two siblings (save_competitor, update_brand) by naming when each is used instead. An agent can pick this tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: use save_competitor to add a competitor, use update_brand for renaming a brand/study or pausing it. It also states the partial-update contract ('Pass at least one; what you leave out stays as it is'), which removes any ambiguity about when this is the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_brand_setupStart brand setupAInspect
Add a brand the way the app does: Cleotic reads the website and proposes the brand, competitors, a segment, and prompts. Returns pending while it reads; poll get_brand_setup until it needs approval, review the proposals with the user, then approve_brand_setup. Cost: model budget to read the site.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The brand's website. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-readonly, open-world write that is not destructive, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: it returns 'pending' while reading (async), and it consumes model budget to read the site. It does not cover failure modes, auth requirements, or rate limits, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler, front-loaded with what the tool does before the polling workflow and the cost note. Every clause earns its place and none repeats the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is unnecessary, yet the description still supplies the one return fact that matters for orchestration ('returns pending'). For an async, multi-step workflow tool, an agent has everything needed to call it and route to the next step.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including a thorough idempotency_key explanation, so the schema carries parameter semantics entirely. The description adds nothing about url format or key reuse beyond what the schema already states, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a brand') and immediately specifies the mechanism and scope: Cleotic reads the website and proposes the brand, competitors, a segment, and prompts. An agent can distinguish this entry-point tool from siblings like update_brand or save_competitor without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the follow-up workflow and the exact siblings to use: poll get_brand_setup until approval is needed, review proposals with the user, then call approve_brand_setup. The when-to-use path and the alternatives are both stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_promptsSuggest promptsARead-onlyIdempotentInspect
Suggest prompts for a segment about a topic. Ranked by AI search demand only when the demand provider has data; monthly_ai_searches null or 0 means none was found. Saves nothing and returns no IDs: add the ones you want with save_prompt (text, tags, category, intent_type). Cost: one AI model call from the model budget.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its name (exact or a unique prefix). | |
| count | No | How many to suggest. Defaults to 8. | |
| topic | Yes | What the prompts should be about. | |
| segment | Yes | Segment ID or name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world). The description adds genuinely new behavioral context beyond them: the one-model-call cost, the fact that ranking depends on the demand provider having data, and the null/0 sentinel meaning for monthly_ai_searches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the purpose and each carrying distinct information (ranking caveat, no-save behavior, cost). No filler or repeated schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure needn't be repeated, and annotations carry the safety profile. The description fills the remaining gaps an agent needs: cost, the meaning of a null/0 demand figure, and the absence of persisted IDs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so brand, segment, topic and count are already documented, establishing a baseline of 3. The description doesn't add syntax or format detail for any input parameter; its illustrative parameter list (text, tags, category, intent_type) actually belongs to the sibling save_prompt, not this tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Suggest prompts for a segment about a topic') and immediately carves out scope by noting it 'saves nothing and returns no IDs,' which distinguishes it from save_prompt and list_prompts without the agent opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear workflow context: this is a suggestion-generation step whose output is consumed via save_prompt (text, tags, category, intent_type). It routes the agent forward, but never states when to prefer this over list_prompts or what conditions make it worth the model-call cost.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_brandUpdate brandAInspect
Rename a brand or study, or pause or resume it. Cost: resuming restarts daily collection, which uses plan capacity and model budget.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| status | No | ||
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real consequence detail beyond annotations: resuming restarts daily collection and consumes plan capacity and model budget. Annotations flag non-idempotent and open-world but do not convey this cost. Does not mention auth or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the actions and followed by the cost caveat. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be described. The cost/billing warning is the key missing piece for such a mutation; the idempotency-key replay semantics are delegated to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, and the description names the operations (rename โ name param, pause/resume โ status enum) but gives no syntax or format detail beyond what the schema already documents. Adequate, not compensating.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs (rename, pause, resume) and the target resource (brand or study), directly mirroring the update_brand name and distinguishing it from siblings like update_brand_voice or get_brand_settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the action list but there are no explicit when-to-use/when-not conditions or named alternatives. No routing guidance for choosing this over approve_brand_setup or start_brand_setup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_brand_voiceUpdate brand voiceAInspect
Set the default tone for the brand's Content Studio pages, or none to clear it. The page agent writes in it from its next turn; pages already written are not rewritten.
| Name | Required | Description | Default |
|---|---|---|---|
| tone | Yes | ||
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, closed-world write, so safety is covered. The description adds genuinely useful behavior beyond that: the change applies to the page agent from its next turn, and existing pages are not retroactively rewritten โ a non-obvious temporal/non-retroactive trait. It stops short of stating auth requirements or the reply shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, and every clause carries information (default target, clear option, activation timing, non-retroactivity). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and annotations cover the safety profile. The description covers the effect timing and clearing semantics well; only peripheral details (permissions, error behavior for an invalid brand) are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with 'brand' and 'idempotency_key' richly documented in the schema. The description adds real meaning for the enum-only 'tone' parameter by explaining that 'none' clears the tone, which the raw enum list does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Set') and a precise resource ('the default tone for the brand's Content Studio pages'), plus the clearing behavior. This scopes it distinctly from generic siblings like update_brand or update_opportunities without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the resource ('set the default tone'), but there is no explicit when-to-use guidance, no named alternative (e.g., update_brand, edit_page), and no when-not-to-use or prerequisite conditions. It is adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_opportunitiesUpdate opportunitiesAInspect
Triage inbox opportunities: move one or more to a stage, assign, snooze, dismiss, or restore them. All listed opportunities change together or none do. To record a play that was done, such as a fix shipped or outreach sent, use act_on_opportunity instead.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| stage | No | Move to this stage. | |
| dismiss | No | Dismiss the opportunities. | |
| restore | No | Bring snoozed or dismissed opportunities back to the inbox. | |
| assignee | No | me (yourself), none (unassign), or a member ID. No tool lists members: take an ID from an opportunity's assignee.member_id. | |
| snooze_until | No | Hide until this date (YYYY-MM-DD, taken as 09:00 UTC) or RFC 3339 time. | |
| dismiss_reason | No | Optional reason when dismissing. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. | |
| opportunity_ids | Yes | Opportunity IDs from list_opportunities. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=false, so safety profile is covered. The description adds a genuinely useful behavioral guarantee not in the annotations: 'All listed opportunities change together or none do' (atomic batch semantics). It stops short of noting auth/permission requirements, hence 4 not 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then the atomicity constraint, then the disambiguation. Every sentence earns its place with no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full parameter coverage, and annotations, the description need only cover routing and behavior; it does both, including batch atomicity. Minor gap: no mention of what happens on invalid IDs or partial-input validation, but that is largely handled by the schema constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter carries a rich inline description (brand resolution rules, assignee 'me'/'none'/member ID, snooze time format, idempotency replay semantics). The description's operation list maps onto stage/assignee/snooze/dismiss/restore but adds no syntax beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (triage/update) and resource (inbox opportunities) and enumerates the exact operations available: stage move, assign, snooze, dismiss, restore. It also explicitly distinguishes itself from act_on_opportunity, so the agent can separate the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'To record a play that was done, such as a fix shipped or outreach sent, use act_on_opportunity instead.' That names the alternative and the condition that selects it, matching the highest calibration bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_readiness_fixVerify readiness fixAInspect
Re-check a fix without a full scan. With opportunity_id, re-checks an inbox readiness task; the result updates the task. With check_id, re-checks that open finding on its affected pages. Returns pending with the re-check's id; follow it with get_operation or get_readiness_finding's check_request_id. Cost: by opportunity_id free, once every 10 minutes; by check_id one of the plan's monthly re-checks.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | Brand or study: its ID from list_brands, or its exact name. A partial name is refused. | |
| check_id | No | A check ID from get_readiness. | |
| opportunity_id | No | A readiness opportunity ID from list_opportunities. | |
| idempotency_key | Yes | A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| generated_at | Yes | RFC 3339 time the response was made. |
| schema_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (not read-only, not destructive, open-world); the description goes well beyond them by disclosing the side effect (the result updates the task), the pending return state plus the id to track it, and non-obvious operating limits (free once per 10 minutes by opportunity_id; consumes one monthly re-check by check_id).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core purpose, then mode behavior, then the return/follow-up and cost. Nothing is padding; every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description still supplies the pending-status contract and the tracking IDs, and it covers the mutation side effect, follow-up path, and rate limits. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by explaining what each ID selector actually does (inbox task re-check vs open-finding re-check on affected pages). It does not add format or validity detail beyond the schema, so it stays below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (re-check/verify) and resource (a readiness fix), and splits it into two clearly named modes keyed on opportunity_id vs check_id. An agent can distinguish it from run_readiness_scan ('without a full scan') and from get_readiness without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the caller: use opportunity_id to re-check an inbox readiness task, use check_id to re-check an open finding on its affected pages, and contrasts both against a full scan. It also names the follow-up tools (get_operation, get_readiness_finding's check_request_id) and gives the cost/rate gating for each mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
get_ai_traffic1 field changed- changed
Output schema / properties / data / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "ai_share": { - "description": "AI visits as a percentage of all visits.", - "type": "number" - }, - "ai_visits": { - "type": "integer" - }, - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "connected": { - "description": "Whether site tracking is set up; when false nothing is measured.", - "type": "boolean" - }, - "crawler_visits": { - "type": "integer" - }, - "crawlers": { - "items": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "pages": { - "type": "integer" - }, - "provider": { - "type": "string" - }, - "purpose": { - "description": "Why the crawler fetched pages: ai_user (for a live user question), ai_search (to build an AI search index) or ai_training (to collect model training data).", - "type": "string" - }, - "verified": { - "description": "Visits whose IP address is in the operator's published crawler IP list.", - "type": "integer" - }, - "visits": { - "type": "integer" - } - }, - "required": [ - "name", - "provider", - "purpose", - "visits", - "verified", - "pages" - ], - "type": "object" - }, - "type": "array" - }, - "latest_visit_at": { - "type": "string" - }, - "pages_reached": { - "description": "Distinct pages an AI crawler or AI referral reached.", - "type": "integer" - }, - "pages_to_improve": { - "description": "Pages AI crawlers read but people rarely reach from AI answers.", - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "ai_visits": { - "type": "integer" - }, - "change": { - "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.", - "type": [ - "null", - "number" - ] - }, - "crawler_visits": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "providers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "total_visits": { - "type": "integer" - }, - "url": { - "type": "string" - } - }, - "required": [ - "path", - "url", - "total_visits", - "ai_visits", - "crawler_visits", - "ai_referrals", - "providers", - "change" - ], - "type": "object" - }, - "type": "array" - }, - "period": { - "additionalProperties": false, - "properties": { - "from": { - "description": "First day, YYYY-MM-DD.", - "type": "string" - }, - "to": { - "description": "Last day, YYYY-MM-DD.", - "type": "string" - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - }, - "referral_sources": { - "items": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "pages": { - "type": "integer" - }, - "provider": { - "type": "string" - }, - "referrals": { - "type": "integer" - }, - "source": { - "type": "string" - } - }, - "required": [ - "source", - "name", - "provider", - "referrals", - "pages" - ], - "type": "object" - }, - "type": "array" - }, - "systems": { - "description": "AI providers, by visits.", - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "crawler_visits": { - "type": "integer" - }, - "pages": { - "type": "integer" - }, - "provider": { - "description": "Pass as provider to filter.", - "type": "string" - } - }, - "required": [ - "provider", - "crawler_visits", - "ai_referrals", - "pages" - ], - "type": "object" - }, - "type": "array" - }, - "total_visits": { - "type": "integer" - }, - "view": { - "type": "string" - }, - "weekly": { - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "crawler_visits": { - "type": "integer" - }, - "week_start": { - "type": "string" - } - }, - "required": [ - "week_start", - "crawler_visits", - "ai_referrals" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "brand", - "view", - "period", - "connected", - "total_visits", - "ai_visits", - "ai_share", - "crawler_visits", - "ai_referrals", - "pages_reached", - "latest_visit_at", - "systems", - "crawlers", - "referral_sources", - "pages_to_improve", - "weekly" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "connected": { - "type": "boolean" - }, - "pages": { - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "ai_visits": { - "type": "integer" - }, - "change": { - "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.", - "type": [ - "null", - "number" - ] - }, - "crawler_visits": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "providers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "total_visits": { - "type": "integer" - }, - "url": { - "type": "string" - } - }, - "required": [ - "path", - "url", - "total_visits", - "ai_visits", - "crawler_visits", - "ai_referrals", - "providers", - "change" - ], - "type": "object" - }, - "type": "array" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "period": { - "additionalProperties": false, - "properties": { - "from": { - "description": "First day, YYYY-MM-DD.", - "type": "string" - }, - "to": { - "description": "Last day, YYYY-MM-DD.", - "type": "string" - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "period", - "connected", - "pages", - "pagination" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "connected": { - "type": "boolean" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "period": { - "additionalProperties": false, - "properties": { - "from": { - "description": "First day, YYYY-MM-DD.", - "type": "string" - }, - "to": { - "description": "Last day, YYYY-MM-DD.", - "type": "string" - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - }, - "view": { - "type": "string" - }, - "visits": { - "items": { - "additionalProperties": false, - "properties": { - "captured_at": { - "type": "string" - }, - "name": { - "description": "The crawler or referring AI product.", - "type": "string" - }, - "path": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "type": { - "description": "crawler or referral.", - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "type", - "path", - "url", - "provider", - "name", - "captured_at" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "brand", - "view", - "period", - "connected", - "visits", - "pagination" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "ai_share": { + "description": "AI-referred visits as a percentage of human visits.", + "type": "number" + }, + "ai_visits": { + "description": "Human visits that arrived from an AI assistant.", + "type": "integer" + }, + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "connected": { + "description": "Whether site tracking is set up; when false nothing is measured.", + "type": "boolean" + }, + "crawler_visits": { + "description": "AI crawler requests. These are not visits and are not part of ai_share.", + "type": "integer" + }, + "crawlers": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "pages": { + "type": "integer" + }, + "provider": { + "type": "string" + }, + "purpose": { + "description": "Why the crawler fetched pages: ai_user (for a live user question), ai_search (to build an AI search index) or ai_training (to collect model training data).", + "type": "string" + }, + "verified": { + "description": "Visits whose IP address is in the operator's published crawler IP list.", + "type": "integer" + }, + "visits": { + "type": "integer" + } + }, + "required": [ + "name", + "provider", + "purpose", + "visits", + "verified", + "pages" + ], + "type": "object" + }, + "type": "array" + }, + "latest_visit_at": { + "type": "string" + }, + "pages_reached": { + "description": "Distinct pages an AI crawler or AI referral reached.", + "type": "integer" + }, + "pages_to_improve": { + "description": "Pages AI crawlers read but people rarely reach from AI answers.", + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "ai_visits": { + "description": "Human visits to the page that arrived from an AI assistant.", + "type": "integer" + }, + "change": { + "description": "Change in the page's AI share (AI-referred visits as a percentage of human visits) on the previous period, in percentage points; null when the page had no human visits before.", + "type": [ + "null", + "number" + ] + }, + "crawler_visits": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "providers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "total_visits": { + "description": "Human visits to the page.", + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "required": [ + "path", + "url", + "total_visits", + "ai_visits", + "crawler_visits", + "ai_referrals", + "providers", + "change" + ], + "type": "object" + }, + "type": "array" + }, + "period": { + "additionalProperties": false, + "properties": { + "from": { + "description": "First day, YYYY-MM-DD.", + "type": "string" + }, + "to": { + "description": "Last day, YYYY-MM-DD.", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "referral_sources": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "pages": { + "type": "integer" + }, + "provider": { + "type": "string" + }, + "referrals": { + "type": "integer" + }, + "source": { + "type": "string" + } + }, + "required": [ + "source", + "name", + "provider", + "referrals", + "pages" + ], + "type": "object" + }, + "type": "array" + }, + "systems": { + "description": "AI providers, by visits.", + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "crawler_visits": { + "type": "integer" + }, + "pages": { + "type": "integer" + }, + "provider": { + "description": "Pass as provider to filter.", + "type": "string" + } + }, + "required": [ + "provider", + "crawler_visits", + "ai_referrals", + "pages" + ], + "type": "object" + }, + "type": "array" + }, + "total_visits": { + "description": "Human page visits. Bots, crawlers and Cleotic's own fetches are not counted.", + "type": "integer" + }, + "view": { + "type": "string" + }, + "weekly": { + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "crawler_visits": { + "type": "integer" + }, + "week_start": { + "type": "string" + } + }, + "required": [ + "week_start", + "crawler_visits", + "ai_referrals" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "brand", + "view", + "period", + "connected", + "total_visits", + "ai_visits", + "ai_share", + "crawler_visits", + "ai_referrals", + "pages_reached", + "latest_visit_at", + "systems", + "crawlers", + "referral_sources", + "pages_to_improve", + "weekly" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "connected": { + "type": "boolean" + }, + "pages": { + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "ai_visits": { + "description": "Human visits to the page that arrived from an AI assistant.", + "type": "integer" + }, + "change": { + "description": "Change in the page's AI share (AI-referred visits as a percentage of human visits) on the previous period, in percentage points; null when the page had no human visits before.", + "type": [ + "null", + "number" + ] + }, + "crawler_visits": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "providers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "total_visits": { + "description": "Human visits to the page.", + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "required": [ + "path", + "url", + "total_visits", + "ai_visits", + "crawler_visits", + "ai_referrals", + "providers", + "change" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "period": { + "additionalProperties": false, + "properties": { + "from": { + "description": "First day, YYYY-MM-DD.", + "type": "string" + }, + "to": { + "description": "Last day, YYYY-MM-DD.", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "period", + "connected", + "pages", + "pagination" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "connected": { + "type": "boolean" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "period": { + "additionalProperties": false, + "properties": { + "from": { + "description": "First day, YYYY-MM-DD.", + "type": "string" + }, + "to": { + "description": "Last day, YYYY-MM-DD.", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "view": { + "type": "string" + }, + "visits": { + "items": { + "additionalProperties": false, + "properties": { + "captured_at": { + "type": "string" + }, + "name": { + "description": "The crawler or referring AI product.", + "type": "string" + }, + "path": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "type": { + "description": "crawler or referral.", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "type", + "path", + "url", + "provider", + "name", + "captured_at" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "brand", + "view", + "period", + "connected", + "visits", + "pagination" + ], + "type": "object" + } +]
1 tool update
- Changed
get_ai_traffic1 field changed- added
Input schema / properties / traffic_viewAdded value: +{ + "description": "Optional filter set: a built-in view (pages, discovery, previews, errors, spoofed, everything) or a saved view ID. Defaults to pages: loaded pages from verified or unverifiable bots and AI referrals.", + "type": "string" +}
33 tool updates
- Changed
act_on_opportunity1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Removed
answer_page_questions - Changed
approve_brand_setup1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
comment_on_opportunity1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
create_page11 fields changed- added
Input schema / properties / draftAdded value: +{ + "description": "Or a draft in Markdown to review and improve.", + "maxLength": 100000, + "type": "string" +} - added
Input schema / properties / ideaAdded value: +{ + "description": "Or the question or idea the page should cover.", + "maxLength": 2000, + "type": "string" +} - removed
Input schema / properties / questionRemoved value: -{ - "description": "Or the question the page should answer.", - "maxLength": 1000, - "type": "string" -} - added
Input schema / properties / urlAdded value: +{ + "description": "Or a page to import as the draft.", + "maxLength": 2048, + "type": "string" +} - changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance." - added
Output schema / properties / data / properties / resource / properties / agent_stateAdded value: +{ + "type": "string" +} - added
Output schema / properties / data / properties / resource / properties / live_urlAdded value: +{ + "type": "string" +} - removed
Output schema / properties / data / properties / resource / properties / plan_statusRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / data / properties / resource / properties / published_urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / data / properties / resource / properties / versionAdded value: +{ + "type": "integer" +} - changed
Output schema / properties / data / properties / resource / requiredPrevious value: -[ - "page_id", - "title", - "status", - "plan_status", - "published_url" -]New value: +[ + "page_id", + "title", + "status", + "agent_state", + "version", + "live_url" +]
- Changed
create_report1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
delete_item1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Removed
draft_page - Added
edit_page - Changed
get_brand_overview6 fields changed- changed
Output schema / properties / data / properties / pages / descriptionPrevious value: -"Content Studio pages by lane."New value: +"Content Studio pages by status." - added
Output schema / properties / data / properties / pages / properties / draftingAdded value: +{ + "description": "Being written, or revised after going live.", + "type": "integer" +} - removed
Output schema / properties / data / properties / pages / properties / in_progressRemoved value: -{ - "type": "integer" -} - removed
Output schema / properties / data / properties / pages / properties / needs_refreshRemoved value: -{ - "type": "integer" -} - added
Output schema / properties / data / properties / pages / properties / sentAdded value: +{ + "description": "Sent to the CMS, not yet seen live.", + "type": "integer" +} - changed
Output schema / properties / data / properties / pages / requiredPrevious value: -[ - "in_progress", - "live", - "needs_refresh" -]New value: +[ + "drafting", + "sent", + "live" +]
- Changed
get_opportunity6 fields changed- removed
Output schema / properties / data / properties / play / properties / page_ideasRemoved value: -{ - "items": { - "additionalProperties": false, - "properties": { - "content_type": { - "type": "string" - }, - "covered": { - "description": "An existing page already covers it.", - "type": "boolean" - }, - "objective": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "title", - "content_type", - "objective", - "covered" - ], - "type": "object" - }, - "type": "array" -} - added
Output schema / properties / data / properties / play / properties / page_resultsAdded value: +{ + "additionalProperties": false, + "description": "draft_content: results of its most recently live page.", + "properties": { + "crawlers": { + "description": "AI crawlers that have read the page since it went live.", + "items": { + "additionalProperties": false, + "properties": { + "crawler": { + "type": "string" + }, + "first_at": { + "type": "string" + }, + "reads": { + "type": "integer" + } + }, + "required": [ + "crawler", + "first_at", + "reads" + ], + "type": "object" + }, + "type": "array" + }, + "targets": { + "description": "For each target question: answers in the 4 weeks before it went live and since.", + "items": { + "additionalProperties": false, + "properties": { + "before": { + "additionalProperties": false, + "properties": { + "answers": { + "type": "integer" + }, + "cited": { + "description": "Answers that cite the page.", + "type": "integer" + }, + "named": { + "description": "Answers that name the brand.", + "type": "integer" + } + }, + "required": [ + "answers", + "named", + "cited" + ], + "type": "object" + }, + "question": { + "type": "string" + }, + "since": { + "additionalProperties": false, + "properties": { + "answers": { + "type": "integer" + }, + "cited": { + "description": "Answers that cite the page.", + "type": "integer" + }, + "named": { + "description": "Answers that name the brand.", + "type": "integer" + } + }, + "required": [ + "answers", + "named", + "cited" + ], + "type": "object" + } + }, + "required": [ + "question", + "before", + "since" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "targets", + "crawlers" + ], + "type": [ + "null", + "object" + ] +} - added
Output schema / properties / data / properties / play / properties / pages / items / properties / live_urlAdded value: +{ + "type": "string" +} - removed
Output schema / properties / data / properties / play / properties / pages / items / properties / published_urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / data / properties / play / properties / pages / items / properties / status / descriptionAdded value: +"drafting, sent, live, or revising." - changed
Output schema / properties / data / properties / play / properties / pages / items / requiredPrevious value: -[ - "page_id", - "title", - "status", - "published_url" -]New value: +[ + "page_id", + "title", + "status", + "live_url" +]
- Changed
get_page40 fields changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"markdown_next_cursor from the previous call, for the next part of a long draft."New value: +"markdown_next_cursor from the previous call, for the next part of a long page." - removed
Input schema / properties / include_preflightRemoved value: -{ - "description": "Also run the publish preflight checks, which fetch the live page.", - "type": "boolean" -} - added
Output schema / properties / data / properties / agent_errorAdded value: +{ + "type": "string" +} - added
Output schema / properties / data / properties / agent_stateAdded value: +{ + "description": "idle, working (poll get_page), or failed (agent_error says why).", + "type": "string" +} - added
Output schema / properties / data / properties / angleAdded value: +{ + "type": "string" +} - added
Output schema / properties / data / properties / authority_notesAdded value: +{ + "description": "Claims with no confirmed fact or site passage behind them: suggestions to add a source, never blockers.", + "items": { + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + }, + "quote": { + "type": "string" + } + }, + "required": [ + "quote", + "message" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / data / properties / content_typeRemoved value: -{ - "type": "string" -} - added
Output schema / properties / data / properties / conversationAdded value: +{ + "description": "The latest messages with the page agent, oldest first.", + "items": { + "additionalProperties": false, + "properties": { + "at": { + "type": "string" + }, + "from": { + "description": "user, a teammate's name, or cleotic.", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "from", + "text", + "at" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / data / properties / draftRemoved value: -{ - "additionalProperties": false, - "description": "Set once drafting starts.", - "properties": { - "busy": { - "description": "Sections are still being written; poll get_page.", - "type": "boolean" - }, - "failing_checks": { - "items": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "id", - "label", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "grade": { - "description": "The draft's quality grade, A-F; empty until graded.", - "type": "string" - }, - "status": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "unsupported_claims": { - "description": "Sentences with no evidence behind them.", - "type": "integer" - }, - "version": { - "type": "integer" - } - }, - "required": [ - "status", - "version", - "busy", - "grade", - "summary", - "unsupported_claims", - "failing_checks" - ], - "type": [ - "null", - "object" - ] -} - added
Output schema / properties / data / properties / edit_modeAdded value: +{ + "description": "direct: the agent edits the page. suggest: its changes wait as suggestions.", + "type": "string" +} - added
Output schema / properties / data / properties / goalAdded value: +{ + "type": "string" +} - removed
Output schema / properties / data / properties / interviewRemoved value: -{ - "additionalProperties": false, - "properties": { - "questions": { - "items": { - "additionalProperties": false, - "properties": { - "answer": { - "type": "string" - }, - "kind": { - "description": "number, process, or example.", - "type": "string" - }, - "question": { - "type": "string" - }, - "question_id": { - "description": "Pass to answer_page_questions.", - "type": "string" - }, - "status": { - "description": "pending, answered, or skipped.", - "type": "string" - } - }, - "required": [ - "question_id", - "kind", - "question", - "status", - "answer" - ], - "type": "object" - }, - "type": "array" - }, - "status": { - "description": "generating_questions (poll get_page), waiting_for_answers, or done.", - "type": "string" - } - }, - "required": [ - "status", - "questions" - ], - "type": "object" -} - added
Output schema / properties / data / properties / live_atAdded value: +{ + "type": "string" +} - added
Output schema / properties / data / properties / live_urlAdded value: +{ + "type": "string" +} - changed
Output schema / properties / data / properties / markdown / descriptionPrevious value: -"The draft as Markdown, or one part of it when markdown_next_cursor is set."New value: +"The page as Markdown, or one part of it when markdown_next_cursor is set." - added
Output schema / properties / data / properties / outlineAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "heading": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "heading", + "note" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / data / properties / planRemoved value: -{ - "additionalProperties": false, - "description": "Set once the plan is ready.", - "properties": { - "angle": { - "type": "string" - }, - "format": { - "type": "string" - }, - "sections": { - "items": { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - }, - "heading": { - "type": "string" - }, - "section_id": { - "description": "Pass to redraft_page_section.", - "type": "string" - }, - "shape": { - "description": "prose, table, or list.", - "type": "string" - }, - "status": { - "description": "pending, drafting, drafted, or failed.", - "type": "string" - } - }, - "required": [ - "section_id", - "heading", - "shape", - "status", - "error" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "angle", - "format", - "sections" - ], - "type": [ - "null", - "object" - ] -} - removed
Output schema / properties / data / properties / plan_statusRemoved value: -{ - "description": "none, interview (answer its questions), planning (the plan is being built), or ready (draft_page can write it).", - "type": "string" -} - changed
Output schema / properties / data / properties / poll_after_seconds / descriptionPrevious value: -"While questions, the plan or the draft are being written, how long to wait before reading again; 0 otherwise."New value: +"While the agent is working, how long to wait before reading again; 0 otherwise." - removed
Output schema / properties / data / properties / preflightRemoved value: -{ - "additionalProperties": false, - "description": "Set when include_preflight was true.", - "properties": { - "checks": { - "items": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "label": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "status": { - "description": "pass, fail, or pending.", - "type": "string" - } - }, - "required": [ - "id", - "label", - "status", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "failing": { - "type": "integer" - } - }, - "required": [ - "failing", - "checks" - ], - "type": [ - "null", - "object" - ] -} - removed
Output schema / properties / data / properties / questionRemoved value: -{ - "type": "string" -} - added
Output schema / properties / data / properties / readerAdded value: +{ + "type": "string" +} - removed
Output schema / properties / data / properties / results / properties / answersRemoved value: -{ - "type": "integer" -} - removed
Output schema / properties / data / properties / results / properties / citedRemoved value: -{ - "type": "integer" -} - added
Output schema / properties / data / properties / results / properties / crawlersAdded value: +{ + "description": "AI crawlers that have read the page since it went live.", + "items": { + "additionalProperties": false, + "properties": { + "crawler": { + "type": "string" + }, + "first_at": { + "type": "string" + }, + "reads": { + "type": "integer" + } + }, + "required": [ + "crawler", + "first_at", + "reads" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / data / properties / results / properties / dayRemoved value: -{ - "description": "Days since it went live.", - "type": "integer" -} - removed
Output schema / properties / data / properties / results / properties / first_citation_atRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / data / properties / results / properties / live_atRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / data / properties / results / properties / namedRemoved value: -{ - "type": "integer" -} - removed
Output schema / properties / data / properties / results / properties / refresh_due_atRemoved value: -{ - "type": "string" -} - added
Output schema / properties / data / properties / results / properties / targetsAdded value: +{ + "description": "For each target question: answers in the 4 weeks before it went live and since.", + "items": { + "additionalProperties": false, + "properties": { + "before": { + "additionalProperties": false, + "properties": { + "answers": { + "type": "integer" + }, + "cited": { + "description": "Answers that cite the page.", + "type": "integer" + }, + "named": { + "description": "Answers that name the brand.", + "type": "integer" + } + }, + "required": [ + "answers", + "named", + "cited" + ], + "type": "object" + }, + "question": { + "type": "string" + }, + "since": { + "additionalProperties": false, + "properties": { + "answers": { + "type": "integer" + }, + "cited": { + "description": "Answers that cite the page.", + "type": "integer" + }, + "named": { + "description": "Answers that name the brand.", + "type": "integer" + } + }, + "required": [ + "answers", + "named", + "cited" + ], + "type": "object" + } + }, + "required": [ + "question", + "before", + "since" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / data / properties / results / properties / urlRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / data / properties / results / requiredPrevious value: -[ - "url", - "live_at", - "day", - "answers", - "named", - "cited", - "first_citation_at", - "refresh_due_at" -]New value: +[ + "targets", + "crawlers" +] - changed
Output schema / properties / data / properties / status / descriptionPrevious value: -"draft, generating, generated, failed, published, or archived."New value: +"drafting, sent, live (locked until revise_page), or revising." - added
Output schema / properties / data / properties / suggestionsAdded value: +{ + "description": "Edits the agent proposed in suggest mode, waiting for the team in the app.", + "items": { + "additionalProperties": false, + "properties": { + "find": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "replace": { + "type": "string" + } + }, + "required": [ + "find", + "replace", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / data / properties / target_questionsAdded value: +{ + "description": "Tracked questions the page answers; its results count answers to these.", + "items": { + "type": "string" + }, + "type": "array" +} - removed
Output schema / properties / data / properties / toneRemoved value: -{ - "type": "string" -} - added
Output schema / properties / data / properties / versionAdded value: +{ + "description": "Pass as base_version to edit_page.", + "type": "integer" +} - added
Output schema / properties / data / properties / waiting_on_youAdded value: +{ + "description": "The agent's open question, when its last turn ended asking one; answer it with message_page.", + "type": "string" +} - changed
Output schema / properties / data / requiredPrevious value: -[ - "brand", - "id", - "title", - "question", - "content_type", - "status", - "plan_status", - "tone", - "interview", - "plan", - "draft", - "markdown", - "markdown_next_cursor", - "results", - "preflight", - "app_url", - "poll_after_seconds" -]New value: +[ + "brand", + "id", + "title", + "status", + "agent_state", + "agent_error", + "version", + "edit_mode", + "goal", + "reader", + "angle", + "target_questions", + "outline", + "markdown", + "markdown_next_cursor", + "waiting_on_you", + "conversation", + "suggestions", + "authority_notes", + "live_url", + "live_at", + "results", + "app_url", + "poll_after_seconds" +]
- Changed
list_pages18 fields changed- removed
Input schema / properties / laneRemoved value: -{ - "description": "Optional filter.", - "enum": [ - "in_progress", - "live", - "needs_refresh" - ], - "type": "string" -} - added
Input schema / properties / statusAdded value: +{ + "description": "Optional filter.", + "enum": [ + "drafting", + "sent", + "live", + "revising" + ], + "type": "string" +} - added
Output schema / properties / data / properties / pages / items / properties / agent_stateAdded value: +{ + "description": "idle, working (Cleotic's page agent is on it), or failed.", + "type": "string" +} - removed
Output schema / properties / data / properties / pages / items / properties / claims_to_refreshRemoved value: -{ - "description": "Claims that may be out of date when the refresh is due.", - "type": "integer" -} - removed
Output schema / properties / data / properties / pages / items / properties / content_typeRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / data / properties / pages / items / properties / crawlersRemoved value: -{ - "description": "AI crawlers that have read it since it went live.", - "type": "integer" -} - removed
Output schema / properties / data / properties / pages / items / properties / laneRemoved value: -{ - "description": "in_progress, live, or needs_refresh.", - "type": "string" -} - removed
Output schema / properties / data / properties / pages / items / properties / live_atRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / data / properties / pages / items / properties / new_first_citationRemoved value: -{ - "description": "An AI answer cited it for the first time since it was last viewed.", - "type": "boolean" -} - removed
Output schema / properties / data / properties / pages / items / properties / questionRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / data / properties / pages / items / properties / refresh_due_atRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / data / properties / pages / items / properties / resultsRemoved value: -{ - "additionalProperties": false, - "description": "Once live: AI answers to its question that name or cite the brand.", - "properties": { - "answers": { - "type": "integer" - }, - "cited": { - "description": "Answers that cite the page.", - "type": "integer" - }, - "named": { - "description": "Answers that name the brand.", - "type": "integer" - } - }, - "required": [ - "answers", - "named", - "cited" - ], - "type": [ - "null", - "object" - ] -} - removed
Output schema / properties / data / properties / pages / items / properties / sections_draftedRemoved value: -{ - "type": "integer" -} - removed
Output schema / properties / data / properties / pages / items / properties / sections_totalRemoved value: -{ - "type": "integer" -} - removed
Output schema / properties / data / properties / pages / items / properties / stageRemoved value: -{ - "description": "writing, live, read (AI crawlers read it), mentioned, cited, or refresh.", - "type": "string" -} - changed
Output schema / properties / data / properties / pages / items / properties / status / descriptionPrevious value: -"draft, generating, generated, failed, published, or archived."New value: +"drafting, sent (sent to the CMS as a draft), live (locked; results are tracked), or revising." - added
Output schema / properties / data / properties / pages / items / properties / wordsAdded value: +{ + "type": "integer" +} - changed
Output schema / properties / data / properties / pages / items / requiredPrevious value: -[ - "id", - "title", - "question", - "content_type", - "lane", - "stage", - "status", - "sections_drafted", - "sections_total", - "live_at", - "results", - "crawlers", - "refresh_due_at", - "claims_to_refresh", - "new_first_citation", - "updated_at" -]New value: +[ + "id", + "title", + "status", + "agent_state", + "words", + "updated_at" +]
- Changed
mark_page_published7 fields changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance." - added
Output schema / properties / data / properties / resource / properties / agent_stateAdded value: +{ + "type": "string" +} - added
Output schema / properties / data / properties / resource / properties / live_urlAdded value: +{ + "type": "string" +} - removed
Output schema / properties / data / properties / resource / properties / plan_statusRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / data / properties / resource / properties / published_urlRemoved value: -{ - "type": "string" -} - added
Output schema / properties / data / properties / resource / properties / versionAdded value: +{ + "type": "integer" +} - changed
Output schema / properties / data / properties / resource / requiredPrevious value: -[ - "page_id", - "title", - "status", - "plan_status", - "published_url" -]New value: +[ + "page_id", + "title", + "status", + "agent_state", + "version", + "live_url" +]
- Added
message_page - Removed
redraft_page_section - Added
revise_page - Changed
revoke_report1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
run_readiness_scan1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
save_competitor1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Added
save_fact - Changed
save_prompt1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
save_segment1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Added
search_facts - Added
search_site - Added
send_page_to_cms - Changed
set_primary_brand1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
start_brand_setup1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
suggest_prompts1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
update_brand1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
update_brand_voice1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
update_opportunities1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
- Changed
verify_readiness_fix1 field changed- changed
Output schema / properties / data / properties / cost / properties / content_generations / descriptionPrevious value: -"Content Studio generations used from the plan's allowance."New value: +"Content Studio pages or outreach drafts used from the plan's allowance."
2 tool updates
- Changed
get_brand_settings4 fields changed- added
Output schema / properties / data / properties / segments / items / properties / audienceAdded value: +{ + "additionalProperties": false, + "description": "The buyer the segment's prompts are asked as, or null when answers are collected for an anonymous user.", + "properties": { + "age_band": { + "type": "string" + }, + "archetype": { + "type": "string" + }, + "budget": { + "type": "string" + }, + "company_complexity": { + "type": "string" + }, + "company_size": { + "type": "string" + }, + "expertise": { + "type": "string" + }, + "gender": { + "type": "string" + }, + "home": { + "type": "string" + }, + "household": { + "type": "string" + }, + "industry": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "label": { + "type": "string" + }, + "occupation": { + "type": "string" + }, + "priorities": { + "items": { + "type": "string" + }, + "type": "array" + }, + "role": { + "type": "string" + }, + "seniority": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": [ + "null", + "object" + ] +} - added
Output schema / properties / data / properties / segments / items / properties / audience_textAdded value: +{ + "description": "The 'About me' line sent with every prompt in the segment; empty without an audience.", + "type": "string" +} - changed
Output schema / properties / data / properties / segments / items / properties / models / descriptionPrevious value: -"The AI models the segment collects from: every model the plan covers."New value: +"The AI models the segment collects from: every model the plan covers, except Google AI Overviews and AI Mode for a segment with an audience." - changed
Output schema / properties / data / properties / segments / items / requiredPrevious value: -[ - "id", - "name", - "status", - "market", - "language", - "prompt_limit", - "prompt_count", - "models" -]New value: +[ + "id", + "name", + "status", + "market", + "language", + "audience", + "audience_text", + "prompt_limit", + "prompt_count", + "models" +]
- Changed
save_segment7 fields changed- added
Input schema / properties / audienceAdded value: +{ + "additionalProperties": false, + "description": "The buyer this segment's prompts are asked as. Replaces the current audience. Describe needs and situation: age and gender alone rarely change answers.", + "properties": { + "age_band": { + "enum": [ + "18_24", + "25_34", + "35_44", + "45_54", + "55_64", + "65_plus" + ], + "type": "string" + }, + "budget": { + "enum": [ + "comfortable", + "moderate", + "tight" + ], + "type": "string" + }, + "company_complexity": { + "enum": [ + "multi_entity", + "multinational", + "single_entity" + ], + "type": "string" + }, + "company_size": { + "enum": [ + "1000_plus", + "11_50", + "201_1000", + "2_10", + "51_200", + "solo" + ], + "type": "string" + }, + "expertise": { + "enum": [ + "expert", + "novice", + "some" + ], + "type": "string" + }, + "gender": { + "enum": [ + "man", + "non_binary", + "woman" + ], + "type": "string" + }, + "home": { + "enum": [ + "owns_flat", + "owns_house", + "renting_home", + "renting_room" + ], + "type": "string" + }, + "household": { + "enum": [ + "alone", + "couple", + "multi_generational", + "shared_house", + "teenagers", + "young_children" + ], + "type": "string" + }, + "industry": { + "enum": [ + "charity", + "construction_trades", + "education", + "financial_services", + "healthcare", + "hospitality", + "manufacturing", + "other", + "professional_services", + "public_sector", + "retail_ecommerce", + "software" + ], + "type": "string" + }, + "kind": { + "enum": [ + "consumer", + "business" + ], + "type": "string" + }, + "label": { + "maxLength": 60, + "type": "string" + }, + "occupation": { + "enum": [ + "carer", + "employed", + "retired", + "self_employed", + "student", + "unemployed" + ], + "type": "string" + }, + "priorities": { + "items": { + "enum": [ + "customer_service", + "integrations", + "lowest_price", + "mobile", + "predictable_costs", + "premium_quality", + "quick_setup", + "reporting_controls", + "simplicity", + "sustainability" + ], + "type": "string" + }, + "maxItems": 3, + "type": "array" + }, + "role": { + "enum": [ + "executive", + "finance", + "founder_owner", + "hr", + "it_engineering", + "marketing", + "operations", + "procurement", + "sales" + ], + "type": "string" + }, + "seniority": { + "enum": [ + "c_level", + "director", + "individual", + "manager" + ], + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" +} - added
Input schema / properties / audience_templateAdded value: +{ + "description": "Start from a built-in audience instead of passing audience; none removes the audience.", + "enum": [ + "budget_student", + "young_professional", + "young_family", + "comfortable_retiree", + "eco_household", + "startup_founder", + "sole_trader", + "mid_market_manager", + "enterprise_finance", + "technical_evaluator", + "none" + ], + "type": "string" +} - added
Input schema / properties / copy_prompts_fromAdded value: +{ + "description": "New segments only: copy this segment's (ID or name) active prompts, market and language into the new segment, so the two can be compared.", + "maxLength": 4096, + "minLength": 1, + "type": "string" +} - added
Output schema / properties / data / properties / resource / properties / audienceAdded value: +{ + "additionalProperties": false, + "description": "The buyer the segment's prompts are asked as, or null when answers are collected for an anonymous user.", + "properties": { + "age_band": { + "type": "string" + }, + "archetype": { + "type": "string" + }, + "budget": { + "type": "string" + }, + "company_complexity": { + "type": "string" + }, + "company_size": { + "type": "string" + }, + "expertise": { + "type": "string" + }, + "gender": { + "type": "string" + }, + "home": { + "type": "string" + }, + "household": { + "type": "string" + }, + "industry": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "label": { + "type": "string" + }, + "occupation": { + "type": "string" + }, + "priorities": { + "items": { + "type": "string" + }, + "type": "array" + }, + "role": { + "type": "string" + }, + "seniority": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": [ + "null", + "object" + ] +} - added
Output schema / properties / data / properties / resource / properties / audience_textAdded value: +{ + "description": "The 'About me' line sent with every prompt in the segment; empty without an audience.", + "type": "string" +} - changed
Output schema / properties / data / properties / resource / properties / models / descriptionPrevious value: -"The AI models the segment collects from: every model the plan covers."New value: +"The AI models the segment collects from: every model the plan covers, except Google AI Overviews and AI Mode for a segment with an audience." - changed
Output schema / properties / data / properties / resource / requiredPrevious value: -[ - "id", - "name", - "status", - "market", - "language", - "prompt_limit", - "prompt_count", - "models" -]New value: +[ + "id", + "name", + "status", + "market", + "language", + "audience", + "audience_text", + "prompt_limit", + "prompt_count", + "models" +]
1 tool update
- Changed
get_readiness1 field changed- changed
Output schema / properties / data / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "can_start_scan": { - "description": "Whether run_readiness_scan can start a scan for you now.", - "type": "boolean" - }, - "disabled_reason": { - "description": "Why it cannot: scheduled_only (later scans run weekly), run_active, role, or no_site; empty when it can.", - "type": "string" - }, - "lenses": { - "description": "Readiness, SEO health and security scores.", - "items": { - "additionalProperties": false, - "properties": { - "lens": { - "type": "string" - }, - "score": { - "type": [ - "null", - "number" - ] - }, - "verdict": { - "type": "string" - } - }, - "required": [ - "lens", - "score", - "verdict" - ], - "type": "object" - }, - "type": "array" - }, - "next_run_at": { - "description": "When the next weekly scan runs; empty before the first scan completes.", - "type": "string" - }, - "open_findings": { - "additionalProperties": false, - "description": "Checks the site fails or only partly passes, by severity. view action_plan lists them.", - "properties": { - "critical": { - "type": "integer" - }, - "info": { - "type": "integer" - }, - "major": { - "type": "integer" - }, - "minor": { - "type": "integer" - }, - "total": { - "type": "integer" - } - }, - "required": [ - "critical", - "major", - "minor", - "info", - "total" - ], - "type": "object" - }, - "pages_audited": { - "type": "integer" - }, - "passing_checks": { - "type": "integer" - }, - "pillars": { - "items": { - "additionalProperties": false, - "properties": { - "label": { - "type": "string" - }, - "pillar": { - "type": "string" - }, - "points_awarded": { - "type": "number" - }, - "points_possible": { - "type": "number" - } - }, - "required": [ - "pillar", - "label", - "points_awarded", - "points_possible" - ], - "type": "object" - }, - "type": "array" - }, - "poll_after_seconds": { - "description": "While a scan runs, how long to wait before reading again; 0 otherwise.", - "type": "integer" - }, - "progress": { - "additionalProperties": false, - "description": "Set while a scan runs.", - "properties": { - "message": { - "type": "string" - }, - "page_limit": { - "type": "integer" - }, - "pages_fetched": { - "type": "integer" - }, - "percent": { - "type": "integer" - }, - "stage": { - "type": "string" - } - }, - "required": [ - "stage", - "message", - "percent", - "pages_fetched", - "page_limit" - ], - "type": [ - "null", - "object" - ] - }, - "scan": { - "additionalProperties": false, - "description": "The scan summarised; null before the first scan.", - "properties": { - "completed_at": { - "type": "string" - }, - "error": { - "type": "string" - }, - "id": { - "description": "Scan ID, the run_id other readiness calls take.", - "type": "string" - }, - "started_at": { - "type": "string" - }, - "status": { - "description": "queued, processing, complete, or failed.", - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "status", - "url", - "error", - "started_at", - "completed_at" - ], - "type": [ - "null", - "object" - ] - }, - "scan_in_progress": { - "type": "boolean" - }, - "score": { - "description": "Readiness score, 0-100.", - "type": [ - "null", - "number" - ] - }, - "verdict": { - "description": "Excellent (90+), Good (75+), Needs work (60+), Poor (40+), or Critical.", - "type": "string" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "scan", - "score", - "verdict", - "lenses", - "pillars", - "open_findings", - "passing_checks", - "pages_audited", - "scan_in_progress", - "progress", - "poll_after_seconds", - "can_start_scan", - "disabled_reason", - "next_run_at" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "affected_pages": { - "type": "integer" - }, - "check_id": { - "description": "Pass to get_readiness_finding or verify_readiness_fix.", - "type": "string" - }, - "consequence": { - "type": "string" - }, - "effort_minutes": { - "type": [ - "null", - "integer" - ] - }, - "fix_type": { - "type": "string" - }, - "label": { - "type": "string" - }, - "latest_check": { - "additionalProperties": false, - "description": "The latest re-check since the scan.", - "properties": { - "check_id": { - "type": "string" - }, - "completed_at": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "error": { - "type": "string" - }, - "id": { - "description": "The check_request_id get_readiness_finding takes.", - "type": "string" - }, - "per_url": { - "items": { - "additionalProperties": false, - "properties": { - "status": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "url", - "status" - ], - "type": "object" - }, - "type": "array" - }, - "recharges_at": { - "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.", - "type": "string" - }, - "resolved": { - "description": "Whether the issue is fixed; null until complete.", - "type": [ - "null", - "boolean" - ] - }, - "status": { - "description": "queued, processing, complete, or failed.", - "type": "string" - } - }, - "required": [ - "id", - "check_id", - "status", - "resolved", - "per_url", - "error", - "created_at", - "completed_at", - "recharges_at" - ], - "type": [ - "null", - "object" - ] - }, - "owner_role": { - "type": "string" - }, - "pillar": { - "type": "string" - }, - "points_recoverable": { - "type": "number" - }, - "severity": { - "description": "critical, major, minor, or info; empty when passing.", - "type": "string" - }, - "site_wide": { - "description": "One fix applies to the whole site.", - "type": "boolean" - }, - "status": { - "description": "fail, warning, pass, or not_applicable.", - "type": "string" - } - }, - "required": [ - "check_id", - "label", - "pillar", - "status", - "severity", - "consequence", - "points_recoverable", - "effort_minutes", - "owner_role", - "fix_type", - "affected_pages", - "site_wide", - "latest_check" - ], - "type": "object" - }, - "type": "array" - }, - "open_findings": { - "additionalProperties": false, - "properties": { - "critical": { - "type": "integer" - }, - "info": { - "type": "integer" - }, - "major": { - "type": "integer" - }, - "minor": { - "type": "integer" - }, - "total": { - "type": "integer" - } - }, - "required": [ - "critical", - "major", - "minor", - "info", - "total" - ], - "type": "object" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "questions_no_page_answers": { - "description": "Tracked prompts no page on the site answers well.", - "items": { - "additionalProperties": false, - "properties": { - "monthly_ai_searches": { - "type": [ - "null", - "integer" - ] - }, - "opportunity_id": { - "description": "The content gap opportunity for it, when there is one.", - "type": "string" - }, - "prompt_id": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "required": [ - "prompt_id", - "text", - "monthly_ai_searches", - "opportunity_id" - ], - "type": "object" - }, - "type": "array" - }, - "scan_id": { - "type": "string" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "scan_id", - "open_findings", - "findings", - "questions_no_page_answers", - "pagination" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "pages": { - "items": { - "additionalProperties": false, - "properties": { - "page_id": { - "description": "Pass to get_readiness view pages with page_id for this page's findings.", - "type": "string" - }, - "page_type": { - "type": "string" - }, - "response_time_ms": { - "type": "integer" - }, - "status_code": { - "type": "integer" - }, - "text_chars": { - "type": "integer" - }, - "url": { - "type": "string" - } - }, - "required": [ - "page_id", - "url", - "page_type", - "status_code", - "response_time_ms", - "text_chars" - ], - "type": "object" - }, - "type": "array" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "scan_id": { - "type": "string" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "scan_id", - "pages", - "pagination" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "findings": { - "description": "Open findings that affect this page, in fix order; at most 25.", - "items": { - "additionalProperties": false, - "properties": { - "affected_pages": { - "type": "integer" - }, - "check_id": { - "description": "Pass to get_readiness_finding or verify_readiness_fix.", - "type": "string" - }, - "consequence": { - "type": "string" - }, - "effort_minutes": { - "type": [ - "null", - "integer" - ] - }, - "fix_type": { - "type": "string" - }, - "label": { - "type": "string" - }, - "latest_check": { - "additionalProperties": false, - "description": "The latest re-check since the scan.", - "properties": { - "check_id": { - "type": "string" - }, - "completed_at": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "error": { - "type": "string" - }, - "id": { - "description": "The check_request_id get_readiness_finding takes.", - "type": "string" - }, - "per_url": { - "items": { - "additionalProperties": false, - "properties": { - "status": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "url", - "status" - ], - "type": "object" - }, - "type": "array" - }, - "recharges_at": { - "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.", - "type": "string" - }, - "resolved": { - "description": "Whether the issue is fixed; null until complete.", - "type": [ - "null", - "boolean" - ] - }, - "status": { - "description": "queued, processing, complete, or failed.", - "type": "string" - } - }, - "required": [ - "id", - "check_id", - "status", - "resolved", - "per_url", - "error", - "created_at", - "completed_at", - "recharges_at" - ], - "type": [ - "null", - "object" - ] - }, - "owner_role": { - "type": "string" - }, - "pillar": { - "type": "string" - }, - "points_recoverable": { - "type": "number" - }, - "severity": { - "description": "critical, major, minor, or info; empty when passing.", - "type": "string" - }, - "site_wide": { - "description": "One fix applies to the whole site.", - "type": "boolean" - }, - "status": { - "description": "fail, warning, pass, or not_applicable.", - "type": "string" - } - }, - "required": [ - "check_id", - "label", - "pillar", - "status", - "severity", - "consequence", - "points_recoverable", - "effort_minutes", - "owner_role", - "fix_type", - "affected_pages", - "site_wide", - "latest_check" - ], - "type": "object" - }, - "type": "array" - }, - "page": { - "additionalProperties": false, - "properties": { - "page_id": { - "description": "Pass to get_readiness view pages with page_id for this page's findings.", - "type": "string" - }, - "page_type": { - "type": "string" - }, - "response_time_ms": { - "type": "integer" - }, - "status_code": { - "type": "integer" - }, - "text_chars": { - "type": "integer" - }, - "url": { - "type": "string" - } - }, - "required": [ - "page_id", - "url", - "page_type", - "status_code", - "response_time_ms", - "text_chars" - ], - "type": "object" - }, - "scan_id": { - "type": "string" - }, - "total_findings": { - "type": "integer" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "scan_id", - "page", - "findings", - "total_findings" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "scans": { - "items": { - "additionalProperties": false, - "properties": { - "completed_at": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "error": { - "type": "string" - }, - "fixed": { - "description": "Findings fixed since the previous scan.", - "type": "integer" - }, - "new": { - "type": "integer" - }, - "pages_audited": { - "type": [ - "null", - "integer" - ] - }, - "readiness": { - "type": [ - "null", - "number" - ] - }, - "regressed": { - "type": "integer" - }, - "scan_id": { - "type": "string" - }, - "security": { - "type": [ - "null", - "number" - ] - }, - "seo": { - "type": [ - "null", - "number" - ] - }, - "status": { - "type": "string" - }, - "trigger": { - "description": "manual or scheduled.", - "type": "string" - } - }, - "required": [ - "scan_id", - "status", - "trigger", - "readiness", - "seo", - "security", - "pages_audited", - "fixed", - "new", - "regressed", - "created_at", - "completed_at", - "error" - ], - "type": "object" - }, - "type": "array" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "scans", - "pagination" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "allowed": { - "description": "Whether competitor scans are available.", - "type": "boolean" - }, - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "competitors": { - "items": { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "next_available_at": { - "type": "string" - }, - "scan_id": { - "type": "string" - }, - "scanned_at": { - "type": "string" - }, - "scores": { - "additionalProperties": false, - "properties": { - "readiness": { - "type": [ - "null", - "number" - ] - }, - "security": { - "type": [ - "null", - "number" - ] - }, - "seo": { - "type": [ - "null", - "number" - ] - } - }, - "required": [ - "readiness", - "seo", - "security" - ], - "type": [ - "null", - "object" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "brand", - "scan_id", - "status", - "scores", - "scanned_at", - "next_available_at" - ], - "type": "object" - }, - "type": "array" - }, - "cooldown_days": { - "description": "Days before a competitor can be scanned again.", - "type": "integer" - }, - "gaps": { - "description": "Checks competitors pass and the brand does not.", - "items": { - "additionalProperties": false, - "properties": { - "check_id": { - "type": "string" - }, - "competitors": { - "items": { - "type": "string" - }, - "type": "array" - }, - "fix_summary": { - "type": "string" - }, - "label": { - "type": "string" - }, - "pillar": { - "type": "string" - }, - "points_possible": { - "type": "number" - }, - "your_status": { - "type": "string" - } - }, - "required": [ - "check_id", - "label", - "pillar", - "your_status", - "competitors", - "points_possible", - "fix_summary" - ], - "type": "object" - }, - "type": "array" - }, - "max_competitors": { - "description": "How many competitors can be scanned.", - "type": "integer" - }, - "note": { - "description": "Where competitor scans are started: in the app, not through MCP.", - "type": "string" - }, - "reason": { - "description": "Why not: plan, role, or no_competitors.", - "type": "string" - }, - "view": { - "type": "string" - }, - "you": { - "additionalProperties": false, - "properties": { - "readiness": { - "type": [ - "null", - "number" - ] - }, - "security": { - "type": [ - "null", - "number" - ] - }, - "seo": { - "type": [ - "null", - "number" - ] - } - }, - "required": [ - "readiness", - "seo", - "security" - ], - "type": [ - "null", - "object" - ] - } - }, - "required": [ - "brand", - "view", - "allowed", - "reason", - "max_competitors", - "cooldown_days", - "note", - "you", - "competitors", - "gaps" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "can_start_scan": { + "description": "Whether run_readiness_scan can start a scan for you now.", + "type": "boolean" + }, + "disabled_reason": { + "description": "Why it cannot: scheduled_only (later scans run weekly), run_active, role, or no_site; empty when it can.", + "type": "string" + }, + "lenses": { + "description": "Readiness and SEO health scores.", + "items": { + "additionalProperties": false, + "properties": { + "lens": { + "type": "string" + }, + "score": { + "type": [ + "null", + "number" + ] + }, + "verdict": { + "type": "string" + } + }, + "required": [ + "lens", + "score", + "verdict" + ], + "type": "object" + }, + "type": "array" + }, + "next_run_at": { + "description": "When the next weekly scan runs; empty before the first scan completes.", + "type": "string" + }, + "open_findings": { + "additionalProperties": false, + "description": "Checks the site fails or only partly passes, by severity. view action_plan lists them.", + "properties": { + "critical": { + "type": "integer" + }, + "info": { + "type": "integer" + }, + "major": { + "type": "integer" + }, + "minor": { + "type": "integer" + }, + "total": { + "type": "integer" + } + }, + "required": [ + "critical", + "major", + "minor", + "info", + "total" + ], + "type": "object" + }, + "pages_audited": { + "type": "integer" + }, + "passing_checks": { + "type": "integer" + }, + "pillars": { + "items": { + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "pillar": { + "type": "string" + }, + "points_awarded": { + "type": "number" + }, + "points_possible": { + "type": "number" + } + }, + "required": [ + "pillar", + "label", + "points_awarded", + "points_possible" + ], + "type": "object" + }, + "type": "array" + }, + "poll_after_seconds": { + "description": "While a scan runs, how long to wait before reading again; 0 otherwise.", + "type": "integer" + }, + "progress": { + "additionalProperties": false, + "description": "Set while a scan runs.", + "properties": { + "message": { + "type": "string" + }, + "page_limit": { + "type": "integer" + }, + "pages_fetched": { + "type": "integer" + }, + "percent": { + "type": "integer" + }, + "stage": { + "type": "string" + } + }, + "required": [ + "stage", + "message", + "percent", + "pages_fetched", + "page_limit" + ], + "type": [ + "null", + "object" + ] + }, + "scan": { + "additionalProperties": false, + "description": "The scan summarised; null before the first scan.", + "properties": { + "completed_at": { + "type": "string" + }, + "error": { + "type": "string" + }, + "id": { + "description": "Scan ID, the run_id other readiness calls take.", + "type": "string" + }, + "started_at": { + "type": "string" + }, + "status": { + "description": "queued, processing, complete, or failed.", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "status", + "url", + "error", + "started_at", + "completed_at" + ], + "type": [ + "null", + "object" + ] + }, + "scan_in_progress": { + "type": "boolean" + }, + "score": { + "description": "Readiness score, 0-100.", + "type": [ + "null", + "number" + ] + }, + "verdict": { + "description": "Excellent (90+), Good (75+), Needs work (60+), Poor (40+), or Critical.", + "type": "string" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "scan", + "score", + "verdict", + "lenses", + "pillars", + "open_findings", + "passing_checks", + "pages_audited", + "scan_in_progress", + "progress", + "poll_after_seconds", + "can_start_scan", + "disabled_reason", + "next_run_at" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "findings": { + "items": { + "additionalProperties": false, + "properties": { + "affected_pages": { + "type": "integer" + }, + "check_id": { + "description": "Pass to get_readiness_finding or verify_readiness_fix.", + "type": "string" + }, + "consequence": { + "type": "string" + }, + "effort_minutes": { + "type": [ + "null", + "integer" + ] + }, + "fix_type": { + "type": "string" + }, + "label": { + "type": "string" + }, + "latest_check": { + "additionalProperties": false, + "description": "The latest re-check since the scan.", + "properties": { + "check_id": { + "type": "string" + }, + "completed_at": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "error": { + "type": "string" + }, + "id": { + "description": "The check_request_id get_readiness_finding takes.", + "type": "string" + }, + "per_url": { + "items": { + "additionalProperties": false, + "properties": { + "status": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "recharges_at": { + "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.", + "type": "string" + }, + "resolved": { + "description": "Whether the issue is fixed; null until complete.", + "type": [ + "null", + "boolean" + ] + }, + "status": { + "description": "queued, processing, complete, or failed.", + "type": "string" + } + }, + "required": [ + "id", + "check_id", + "status", + "resolved", + "per_url", + "error", + "created_at", + "completed_at", + "recharges_at" + ], + "type": [ + "null", + "object" + ] + }, + "owner_role": { + "type": "string" + }, + "pillar": { + "type": "string" + }, + "points_recoverable": { + "type": "number" + }, + "severity": { + "description": "critical, major, minor, or info; empty when passing.", + "type": "string" + }, + "site_wide": { + "description": "One fix applies to the whole site.", + "type": "boolean" + }, + "status": { + "description": "fail, warning, pass, or not_applicable.", + "type": "string" + } + }, + "required": [ + "check_id", + "label", + "pillar", + "status", + "severity", + "consequence", + "points_recoverable", + "effort_minutes", + "owner_role", + "fix_type", + "affected_pages", + "site_wide", + "latest_check" + ], + "type": "object" + }, + "type": "array" + }, + "open_findings": { + "additionalProperties": false, + "properties": { + "critical": { + "type": "integer" + }, + "info": { + "type": "integer" + }, + "major": { + "type": "integer" + }, + "minor": { + "type": "integer" + }, + "total": { + "type": "integer" + } + }, + "required": [ + "critical", + "major", + "minor", + "info", + "total" + ], + "type": "object" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "questions_no_page_answers": { + "description": "Tracked prompts no page on the site answers well.", + "items": { + "additionalProperties": false, + "properties": { + "monthly_ai_searches": { + "type": [ + "null", + "integer" + ] + }, + "opportunity_id": { + "description": "The content gap opportunity for it, when there is one.", + "type": "string" + }, + "prompt_id": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "prompt_id", + "text", + "monthly_ai_searches", + "opportunity_id" + ], + "type": "object" + }, + "type": "array" + }, + "scan_id": { + "type": "string" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "scan_id", + "open_findings", + "findings", + "questions_no_page_answers", + "pagination" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "pages": { + "items": { + "additionalProperties": false, + "properties": { + "page_id": { + "description": "Pass to get_readiness view pages with page_id for this page's findings.", + "type": "string" + }, + "page_type": { + "type": "string" + }, + "response_time_ms": { + "type": "integer" + }, + "status_code": { + "type": "integer" + }, + "text_chars": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "required": [ + "page_id", + "url", + "page_type", + "status_code", + "response_time_ms", + "text_chars" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "scan_id": { + "type": "string" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "scan_id", + "pages", + "pagination" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "findings": { + "description": "Open findings that affect this page, in fix order; at most 25.", + "items": { + "additionalProperties": false, + "properties": { + "affected_pages": { + "type": "integer" + }, + "check_id": { + "description": "Pass to get_readiness_finding or verify_readiness_fix.", + "type": "string" + }, + "consequence": { + "type": "string" + }, + "effort_minutes": { + "type": [ + "null", + "integer" + ] + }, + "fix_type": { + "type": "string" + }, + "label": { + "type": "string" + }, + "latest_check": { + "additionalProperties": false, + "description": "The latest re-check since the scan.", + "properties": { + "check_id": { + "type": "string" + }, + "completed_at": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "error": { + "type": "string" + }, + "id": { + "description": "The check_request_id get_readiness_finding takes.", + "type": "string" + }, + "per_url": { + "items": { + "additionalProperties": false, + "properties": { + "status": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "recharges_at": { + "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.", + "type": "string" + }, + "resolved": { + "description": "Whether the issue is fixed; null until complete.", + "type": [ + "null", + "boolean" + ] + }, + "status": { + "description": "queued, processing, complete, or failed.", + "type": "string" + } + }, + "required": [ + "id", + "check_id", + "status", + "resolved", + "per_url", + "error", + "created_at", + "completed_at", + "recharges_at" + ], + "type": [ + "null", + "object" + ] + }, + "owner_role": { + "type": "string" + }, + "pillar": { + "type": "string" + }, + "points_recoverable": { + "type": "number" + }, + "severity": { + "description": "critical, major, minor, or info; empty when passing.", + "type": "string" + }, + "site_wide": { + "description": "One fix applies to the whole site.", + "type": "boolean" + }, + "status": { + "description": "fail, warning, pass, or not_applicable.", + "type": "string" + } + }, + "required": [ + "check_id", + "label", + "pillar", + "status", + "severity", + "consequence", + "points_recoverable", + "effort_minutes", + "owner_role", + "fix_type", + "affected_pages", + "site_wide", + "latest_check" + ], + "type": "object" + }, + "type": "array" + }, + "page": { + "additionalProperties": false, + "properties": { + "page_id": { + "description": "Pass to get_readiness view pages with page_id for this page's findings.", + "type": "string" + }, + "page_type": { + "type": "string" + }, + "response_time_ms": { + "type": "integer" + }, + "status_code": { + "type": "integer" + }, + "text_chars": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "required": [ + "page_id", + "url", + "page_type", + "status_code", + "response_time_ms", + "text_chars" + ], + "type": "object" + }, + "scan_id": { + "type": "string" + }, + "total_findings": { + "type": "integer" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "scan_id", + "page", + "findings", + "total_findings" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "scans": { + "items": { + "additionalProperties": false, + "properties": { + "completed_at": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "error": { + "type": "string" + }, + "fixed": { + "description": "Findings fixed since the previous scan.", + "type": "integer" + }, + "new": { + "type": "integer" + }, + "pages_audited": { + "type": [ + "null", + "integer" + ] + }, + "readiness": { + "type": [ + "null", + "number" + ] + }, + "regressed": { + "type": "integer" + }, + "scan_id": { + "type": "string" + }, + "seo": { + "type": [ + "null", + "number" + ] + }, + "status": { + "type": "string" + }, + "trigger": { + "description": "manual or scheduled.", + "type": "string" + } + }, + "required": [ + "scan_id", + "status", + "trigger", + "readiness", + "seo", + "pages_audited", + "fixed", + "new", + "regressed", + "created_at", + "completed_at", + "error" + ], + "type": "object" + }, + "type": "array" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "scans", + "pagination" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "allowed": { + "description": "Whether competitor scans are available.", + "type": "boolean" + }, + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "competitors": { + "items": { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "next_available_at": { + "type": "string" + }, + "scan_id": { + "type": "string" + }, + "scanned_at": { + "type": "string" + }, + "scores": { + "additionalProperties": false, + "properties": { + "readiness": { + "type": [ + "null", + "number" + ] + }, + "seo": { + "type": [ + "null", + "number" + ] + } + }, + "required": [ + "readiness", + "seo" + ], + "type": [ + "null", + "object" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "brand", + "scan_id", + "status", + "scores", + "scanned_at", + "next_available_at" + ], + "type": "object" + }, + "type": "array" + }, + "cooldown_days": { + "description": "Days before a competitor can be scanned again.", + "type": "integer" + }, + "gaps": { + "description": "Checks competitors pass and the brand does not.", + "items": { + "additionalProperties": false, + "properties": { + "check_id": { + "type": "string" + }, + "competitors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "fix_summary": { + "type": "string" + }, + "label": { + "type": "string" + }, + "pillar": { + "type": "string" + }, + "points_possible": { + "type": "number" + }, + "your_status": { + "type": "string" + } + }, + "required": [ + "check_id", + "label", + "pillar", + "your_status", + "competitors", + "points_possible", + "fix_summary" + ], + "type": "object" + }, + "type": "array" + }, + "max_competitors": { + "description": "How many competitors can be scanned.", + "type": "integer" + }, + "note": { + "description": "Where competitor scans are started: in the app, not through MCP.", + "type": "string" + }, + "reason": { + "description": "Why not: plan, role, or no_competitors.", + "type": "string" + }, + "view": { + "type": "string" + }, + "you": { + "additionalProperties": false, + "properties": { + "readiness": { + "type": [ + "null", + "number" + ] + }, + "seo": { + "type": [ + "null", + "number" + ] + } + }, + "required": [ + "readiness", + "seo" + ], + "type": [ + "null", + "object" + ] + } + }, + "required": [ + "brand", + "view", + "allowed", + "reason", + "max_competitors", + "cooldown_days", + "note", + "you", + "competitors", + "gaps" + ], + "type": "object" + } +]
1 tool update
- Changed
get_ai_traffic1 field changed- changed
Output schema / properties / data / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "ai_share": { - "description": "AI visits as a percentage of all visits.", - "type": "number" - }, - "ai_visits": { - "type": "integer" - }, - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "connected": { - "description": "Whether site tracking is set up; when false nothing is measured.", - "type": "boolean" - }, - "crawler_visits": { - "type": "integer" - }, - "crawlers": { - "items": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "pages": { - "type": "integer" - }, - "provider": { - "type": "string" - }, - "visits": { - "type": "integer" - } - }, - "required": [ - "name", - "provider", - "visits", - "pages" - ], - "type": "object" - }, - "type": "array" - }, - "latest_visit_at": { - "type": "string" - }, - "pages_reached": { - "description": "Distinct pages an AI crawler or AI referral reached.", - "type": "integer" - }, - "pages_to_improve": { - "description": "Pages AI crawlers read but people rarely reach from AI answers.", - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "ai_visits": { - "type": "integer" - }, - "change": { - "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.", - "type": [ - "null", - "number" - ] - }, - "crawler_visits": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "providers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "total_visits": { - "type": "integer" - }, - "url": { - "type": "string" - } - }, - "required": [ - "path", - "url", - "total_visits", - "ai_visits", - "crawler_visits", - "ai_referrals", - "providers", - "change" - ], - "type": "object" - }, - "type": "array" - }, - "period": { - "additionalProperties": false, - "properties": { - "from": { - "description": "First day, YYYY-MM-DD.", - "type": "string" - }, - "to": { - "description": "Last day, YYYY-MM-DD.", - "type": "string" - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - }, - "referral_sources": { - "items": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "pages": { - "type": "integer" - }, - "provider": { - "type": "string" - }, - "referrals": { - "type": "integer" - }, - "source": { - "type": "string" - } - }, - "required": [ - "source", - "name", - "provider", - "referrals", - "pages" - ], - "type": "object" - }, - "type": "array" - }, - "systems": { - "description": "AI providers, by visits.", - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "crawler_visits": { - "type": "integer" - }, - "pages": { - "type": "integer" - }, - "provider": { - "description": "Pass as provider to filter.", - "type": "string" - } - }, - "required": [ - "provider", - "crawler_visits", - "ai_referrals", - "pages" - ], - "type": "object" - }, - "type": "array" - }, - "total_visits": { - "type": "integer" - }, - "view": { - "type": "string" - }, - "weekly": { - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "crawler_visits": { - "type": "integer" - }, - "week_start": { - "type": "string" - } - }, - "required": [ - "week_start", - "crawler_visits", - "ai_referrals" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "brand", - "view", - "period", - "connected", - "total_visits", - "ai_visits", - "ai_share", - "crawler_visits", - "ai_referrals", - "pages_reached", - "latest_visit_at", - "systems", - "crawlers", - "referral_sources", - "pages_to_improve", - "weekly" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "connected": { - "type": "boolean" - }, - "pages": { - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "ai_visits": { - "type": "integer" - }, - "change": { - "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.", - "type": [ - "null", - "number" - ] - }, - "crawler_visits": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "providers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "total_visits": { - "type": "integer" - }, - "url": { - "type": "string" - } - }, - "required": [ - "path", - "url", - "total_visits", - "ai_visits", - "crawler_visits", - "ai_referrals", - "providers", - "change" - ], - "type": "object" - }, - "type": "array" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "period": { - "additionalProperties": false, - "properties": { - "from": { - "description": "First day, YYYY-MM-DD.", - "type": "string" - }, - "to": { - "description": "Last day, YYYY-MM-DD.", - "type": "string" - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "period", - "connected", - "pages", - "pagination" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "connected": { - "type": "boolean" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "period": { - "additionalProperties": false, - "properties": { - "from": { - "description": "First day, YYYY-MM-DD.", - "type": "string" - }, - "to": { - "description": "Last day, YYYY-MM-DD.", - "type": "string" - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - }, - "view": { - "type": "string" - }, - "visits": { - "items": { - "additionalProperties": false, - "properties": { - "captured_at": { - "type": "string" - }, - "name": { - "description": "The crawler or referring AI product.", - "type": "string" - }, - "path": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "type": { - "description": "crawler or referral.", - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "type", - "path", - "url", - "provider", - "name", - "captured_at" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "brand", - "view", - "period", - "connected", - "visits", - "pagination" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "ai_share": { + "description": "AI visits as a percentage of all visits.", + "type": "number" + }, + "ai_visits": { + "type": "integer" + }, + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "connected": { + "description": "Whether site tracking is set up; when false nothing is measured.", + "type": "boolean" + }, + "crawler_visits": { + "type": "integer" + }, + "crawlers": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "pages": { + "type": "integer" + }, + "provider": { + "type": "string" + }, + "purpose": { + "description": "Why the crawler fetched pages: ai_user (for a live user question), ai_search (to build an AI search index) or ai_training (to collect model training data).", + "type": "string" + }, + "verified": { + "description": "Visits whose IP address is in the operator's published crawler IP list.", + "type": "integer" + }, + "visits": { + "type": "integer" + } + }, + "required": [ + "name", + "provider", + "purpose", + "visits", + "verified", + "pages" + ], + "type": "object" + }, + "type": "array" + }, + "latest_visit_at": { + "type": "string" + }, + "pages_reached": { + "description": "Distinct pages an AI crawler or AI referral reached.", + "type": "integer" + }, + "pages_to_improve": { + "description": "Pages AI crawlers read but people rarely reach from AI answers.", + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "ai_visits": { + "type": "integer" + }, + "change": { + "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.", + "type": [ + "null", + "number" + ] + }, + "crawler_visits": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "providers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "total_visits": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "required": [ + "path", + "url", + "total_visits", + "ai_visits", + "crawler_visits", + "ai_referrals", + "providers", + "change" + ], + "type": "object" + }, + "type": "array" + }, + "period": { + "additionalProperties": false, + "properties": { + "from": { + "description": "First day, YYYY-MM-DD.", + "type": "string" + }, + "to": { + "description": "Last day, YYYY-MM-DD.", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "referral_sources": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "pages": { + "type": "integer" + }, + "provider": { + "type": "string" + }, + "referrals": { + "type": "integer" + }, + "source": { + "type": "string" + } + }, + "required": [ + "source", + "name", + "provider", + "referrals", + "pages" + ], + "type": "object" + }, + "type": "array" + }, + "systems": { + "description": "AI providers, by visits.", + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "crawler_visits": { + "type": "integer" + }, + "pages": { + "type": "integer" + }, + "provider": { + "description": "Pass as provider to filter.", + "type": "string" + } + }, + "required": [ + "provider", + "crawler_visits", + "ai_referrals", + "pages" + ], + "type": "object" + }, + "type": "array" + }, + "total_visits": { + "type": "integer" + }, + "view": { + "type": "string" + }, + "weekly": { + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "crawler_visits": { + "type": "integer" + }, + "week_start": { + "type": "string" + } + }, + "required": [ + "week_start", + "crawler_visits", + "ai_referrals" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "brand", + "view", + "period", + "connected", + "total_visits", + "ai_visits", + "ai_share", + "crawler_visits", + "ai_referrals", + "pages_reached", + "latest_visit_at", + "systems", + "crawlers", + "referral_sources", + "pages_to_improve", + "weekly" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "connected": { + "type": "boolean" + }, + "pages": { + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "ai_visits": { + "type": "integer" + }, + "change": { + "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.", + "type": [ + "null", + "number" + ] + }, + "crawler_visits": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "providers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "total_visits": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "required": [ + "path", + "url", + "total_visits", + "ai_visits", + "crawler_visits", + "ai_referrals", + "providers", + "change" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "period": { + "additionalProperties": false, + "properties": { + "from": { + "description": "First day, YYYY-MM-DD.", + "type": "string" + }, + "to": { + "description": "Last day, YYYY-MM-DD.", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "period", + "connected", + "pages", + "pagination" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "connected": { + "type": "boolean" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "period": { + "additionalProperties": false, + "properties": { + "from": { + "description": "First day, YYYY-MM-DD.", + "type": "string" + }, + "to": { + "description": "Last day, YYYY-MM-DD.", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "view": { + "type": "string" + }, + "visits": { + "items": { + "additionalProperties": false, + "properties": { + "captured_at": { + "type": "string" + }, + "name": { + "description": "The crawler or referring AI product.", + "type": "string" + }, + "path": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "type": { + "description": "crawler or referral.", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "type", + "path", + "url", + "provider", + "name", + "captured_at" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "brand", + "view", + "period", + "connected", + "visits", + "pagination" + ], + "type": "object" + } +]
1 tool update
- Changed
get_opportunity1 field changed- changed
Output schema / properties / data / requiredPrevious value: -[ - "brand", - "id", - "kind", - "stage", - "title", - "signal", - "segment", - "monthly_ai_searches", - "score", - "assignee", - "found_at", - "stage_changed_at", - "snoozed_until", - "dismissed_at", - "comment_count", - "app_url", - "facts", - "play", - "presence", - "omitted_competitors", - "excerpts", - "engine_answers", - "sources", - "trend", - "proof", - "timeline", - "comments" -]New value: +[ + "id", + "kind", + "stage", + "title", + "signal", + "segment", + "monthly_ai_searches", + "score", + "assignee", + "found_at", + "stage_changed_at", + "snoozed_until", + "dismissed_at", + "comment_count", + "brand", + "app_url", + "facts", + "play", + "presence", + "omitted_competitors", + "excerpts", + "engine_answers", + "sources", + "trend", + "proof", + "timeline", + "comments" +]
5 tool updates
- Changed
get_brand_overview1 field changed- changed
Output schema / properties / data / properties / collection / properties / next_collection_at / descriptionPrevious value: -"When the brand's prompts are next collected (00:00 UTC on Mondays, Wednesdays and Fridays). Absent when nothing is set to collect."New value: +"When the brand's prompts are next collected (00:00 UTC daily). Absent when nothing is set to collect."
- Changed
get_brand_settings1 field changed- changed
Output schema / properties / data / properties / segments / items / properties / status / descriptionPrevious value: -"active segments collect on Mondays, Wednesdays and Fridays; paused ones do not."New value: +"active segments collect daily; paused ones do not."
- Changed
list_brands1 field changed- changed
Output schema / properties / data / properties / brands / items / properties / collection / properties / next_collection_at / descriptionPrevious value: -"When the brand's prompts are next collected (00:00 UTC on Mondays, Wednesdays and Fridays). Absent when nothing is set to collect."New value: +"When the brand's prompts are next collected (00:00 UTC daily). Absent when nothing is set to collect."
- Changed
list_prompts1 field changed- changed
Output schema / properties / data / properties / prompts / items / properties / status / descriptionPrevious value: -"active prompts run on Mondays, Wednesdays and Fridays; paused ones do not."New value: +"active prompts run daily; paused ones do not."
- Changed
save_segment1 field changed- changed
Output schema / properties / data / properties / resource / properties / status / descriptionPrevious value: -"active segments collect on Mondays, Wednesdays and Fridays; paused ones do not."New value: +"active segments collect daily; paused ones do not."
1 tool update
- Changed
create_report1 field changed- changed
Input schema / properties / name / maxLengthPrevious value: -200New value: +120
1 tool update
- Changed
list_answers1 field changed- changed
Input schema / properties / model / descriptionPrevious value: -"Optional model family: chatgpt, claude, gemini, perplexity, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model. A family is exact: gemini does not include google-ai-mode or google-ai-overviews."New value: +"Optional model family: chatgpt, claude, gemini, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model. A family is exact: gemini does not include google-ai-mode or google-ai-overviews."
1 tool update
- Changed
list_answers1 field changed- changed
Input schema / properties / model / descriptionPrevious value: -"Optional model family: chatgpt, claude, gemini, perplexity, muse-spark, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model. A family is exact: gemini does not include google-ai-mode or google-ai-overviews."New value: +"Optional model family: chatgpt, claude, gemini, perplexity, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model. A family is exact: gemini does not include google-ai-mode or google-ai-overviews."
1 tool update
- Changed
get_doc1 field changed- changed
Input schema / properties / slug / descriptionPrevious value: -"Documentation slug from search_docs, for example analytics/share-of-voice."New value: +"Documentation slug from search_docs, for example core-concepts/visibility-metrics."
3 tool updates
- Changed
get_brand_overview15 fields changed- added
Output schema / properties / data / properties / recommendation / properties / calibratingAdded value: +{ + "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.", + "type": "boolean" +} - added
Output schema / properties / data / properties / recommendation / properties / changedAdded value: +{ + "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.", + "type": "boolean" +} - added
Output schema / properties / data / properties / recommendation / properties / highAdded value: +{ + "description": "High end of the range the value likely sits in (95%).", + "type": [ + "null", + "number" + ] +} - added
Output schema / properties / data / properties / recommendation / properties / lowAdded value: +{ + "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.", + "type": [ + "null", + "number" + ] +} - changed
Output schema / properties / data / properties / recommendation / requiredPrevious value: -[ - "value", - "change", - "answers", - "models_collecting", - "models_expected", - "period" -]New value: +[ + "value", + "change", + "changed", + "calibrating", + "answers", + "models_collecting", + "models_expected", + "period" +] - added
Output schema / properties / data / properties / share_of_voice / properties / calibratingAdded value: +{ + "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.", + "type": "boolean" +} - added
Output schema / properties / data / properties / share_of_voice / properties / changedAdded value: +{ + "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.", + "type": "boolean" +} - added
Output schema / properties / data / properties / share_of_voice / properties / highAdded value: +{ + "description": "High end of the range the value likely sits in (95%).", + "type": [ + "null", + "number" + ] +} - added
Output schema / properties / data / properties / share_of_voice / properties / lowAdded value: +{ + "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.", + "type": [ + "null", + "number" + ] +} - changed
Output schema / properties / data / properties / share_of_voice / requiredPrevious value: -[ - "value", - "change", - "answers", - "models_collecting", - "models_expected", - "period" -]New value: +[ + "value", + "change", + "changed", + "calibrating", + "answers", + "models_collecting", + "models_expected", + "period" +] - added
Output schema / properties / data / properties / visibility / properties / calibratingAdded value: +{ + "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.", + "type": "boolean" +} - added
Output schema / properties / data / properties / visibility / properties / changedAdded value: +{ + "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.", + "type": "boolean" +} - added
Output schema / properties / data / properties / visibility / properties / highAdded value: +{ + "description": "High end of the range the value likely sits in (95%).", + "type": [ + "null", + "number" + ] +} - added
Output schema / properties / data / properties / visibility / properties / lowAdded value: +{ + "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.", + "type": [ + "null", + "number" + ] +} - changed
Output schema / properties / data / properties / visibility / requiredPrevious value: -[ - "value", - "change", - "answers", - "models_collecting", - "models_expected", - "period" -]New value: +[ + "value", + "change", + "changed", + "calibrating", + "answers", + "models_collecting", + "models_expected", + "period" +]
- Changed
get_opportunity6 fields changed- added
Output schema / properties / data / properties / proof / properties / after / properties / highAdded value: +{ + "description": "High end of the range the value likely sits in (95%).", + "type": [ + "null", + "number" + ] +} - added
Output schema / properties / data / properties / proof / properties / after / properties / lowAdded value: +{ + "description": "Low end of the range the value likely sits in (95%).", + "type": [ + "null", + "number" + ] +} - added
Output schema / properties / data / properties / proof / properties / before / properties / highAdded value: +{ + "description": "High end of the range the value likely sits in (95%).", + "type": [ + "null", + "number" + ] +} - added
Output schema / properties / data / properties / proof / properties / before / properties / lowAdded value: +{ + "description": "Low end of the range the value likely sits in (95%).", + "type": [ + "null", + "number" + ] +} - added
Output schema / properties / data / properties / proof / properties / changedAdded value: +{ + "description": "Whether the after rate differs from the before rate by more than chance. Until then: too early to tell.", + "type": "boolean" +} - changed
Output schema / properties / data / properties / proof / requiredPrevious value: -[ - "since", - "metric", - "before", - "after", - "gap_closed_at", - "suggest_won" -]New value: +[ + "since", + "metric", + "before", + "after", + "changed", + "gap_closed_at", + "suggest_won" +]
- Changed
list_brands15 fields changed- added
Output schema / properties / data / properties / brands / items / properties / recommendation / properties / calibratingAdded value: +{ + "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.", + "type": "boolean" +} - added
Output schema / properties / data / properties / brands / items / properties / recommendation / properties / changedAdded value: +{ + "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.", + "type": "boolean" +} - added
Output schema / properties / data / properties / brands / items / properties / recommendation / properties / highAdded value: +{ + "description": "High end of the range the value likely sits in (95%).", + "type": [ + "null", + "number" + ] +} - added
Output schema / properties / data / properties / brands / items / properties / recommendation / properties / lowAdded value: +{ + "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.", + "type": [ + "null", + "number" + ] +} - changed
Output schema / properties / data / properties / brands / items / properties / recommendation / requiredPrevious value: -[ - "value", - "change", - "answers", - "models_collecting", - "models_expected", - "period" -]New value: +[ + "value", + "change", + "changed", + "calibrating", + "answers", + "models_collecting", + "models_expected", + "period" +] - added
Output schema / properties / data / properties / brands / items / properties / share_of_voice / properties / calibratingAdded value: +{ + "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.", + "type": "boolean" +} - added
Output schema / properties / data / properties / brands / items / properties / share_of_voice / properties / changedAdded value: +{ + "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.", + "type": "boolean" +} - added
Output schema / properties / data / properties / brands / items / properties / share_of_voice / properties / highAdded value: +{ + "description": "High end of the range the value likely sits in (95%).", + "type": [ + "null", + "number" + ] +} - added
Output schema / properties / data / properties / brands / items / properties / share_of_voice / properties / lowAdded value: +{ + "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.", + "type": [ + "null", + "number" + ] +} - changed
Output schema / properties / data / properties / brands / items / properties / share_of_voice / requiredPrevious value: -[ - "value", - "change", - "answers", - "models_collecting", - "models_expected", - "period" -]New value: +[ + "value", + "change", + "changed", + "calibrating", + "answers", + "models_collecting", + "models_expected", + "period" +] - added
Output schema / properties / data / properties / brands / items / properties / visibility / properties / calibratingAdded value: +{ + "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.", + "type": "boolean" +} - added
Output schema / properties / data / properties / brands / items / properties / visibility / properties / changedAdded value: +{ + "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.", + "type": "boolean" +} - added
Output schema / properties / data / properties / brands / items / properties / visibility / properties / highAdded value: +{ + "description": "High end of the range the value likely sits in (95%).", + "type": [ + "null", + "number" + ] +} - added
Output schema / properties / data / properties / brands / items / properties / visibility / properties / lowAdded value: +{ + "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.", + "type": [ + "null", + "number" + ] +} - changed
Output schema / properties / data / properties / brands / items / properties / visibility / requiredPrevious value: -[ - "value", - "change", - "answers", - "models_collecting", - "models_expected", - "period" -]New value: +[ + "value", + "change", + "changed", + "calibrating", + "answers", + "models_collecting", + "models_expected", + "period" +]
1 tool update
- Changed
get_plan1 field changed- changed
Output schema / properties / data / properties / plan / descriptionPrevious value: -"trial, starter, business, enterprise, or custom."New value: +"trial, starter, business, or custom."
1 tool update
- Changed
set_primary_brand2 fields changed- added
Input schema / properties / domain / descriptionAdded value: +"The brand's website domain, for example example.com." - added
Input schema / properties / name / descriptionAdded value: +"The brand's name as answers name it."
1 tool update
- Added
delete_item
37 tool updates
- Changed
act_on_opportunity6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
answer_page_questions6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
approve_brand_setup8 fields changed- changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Input schema / properties / market / descriptionPrevious value: -"The market the user confirmed for this brand."New value: +"The market the user confirmed: kind country with its code, region with key and country_codes, or global. Start from get_brand_setup's segment.market and market_label." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state." - added
Output schema / properties / data / properties / resource / properties / brand_nameAdded value: +{ + "type": "string" +} - changed
Output schema / properties / data / properties / resource / requiredPrevious value: -[ - "setup_id", - "status", - "brand_id", - "segment", - "prompts" -]New value: +[ + "setup_id", + "status", + "brand_id", + "brand_name", + "segment", + "prompts" +]
- Changed
comment_on_opportunity6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
create_page6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
create_report6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
draft_page6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
get_ai_traffic4 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention." - changed
Input schema / properties / provider / descriptionPrevious value: -"Optional AI provider, as the summary's systems name it, for example OpenAI."New value: +"Optional AI provider, as the summary's systems name it, for example OpenAI; capitalisation does not matter. A provider with no traffic in the period is refused as unknown." - changed
Input schema / properties / to / descriptionPrevious value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today." - changed
Output schema / properties / data / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "ai_share": { - "description": "AI visits as a percentage of all visits.", - "type": "number" - }, - "ai_visits": { - "type": "integer" - }, - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "connected": { - "description": "Whether site tracking is set up; when false nothing is measured.", - "type": "boolean" - }, - "crawler_visits": { - "type": "integer" - }, - "crawlers": { - "items": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "pages": { - "type": "integer" - }, - "provider": { - "type": "string" - }, - "visits": { - "type": "integer" - } - }, - "required": [ - "name", - "provider", - "visits", - "pages" - ], - "type": "object" - }, - "type": "array" - }, - "latest_visit_at": { - "type": "string" - }, - "pages_reached": { - "type": "integer" - }, - "pages_to_improve": { - "description": "Pages AI crawlers read but people rarely reach from AI answers.", - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "ai_visits": { - "type": "integer" - }, - "change": { - "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.", - "type": [ - "null", - "number" - ] - }, - "crawler_visits": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "providers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "total_visits": { - "type": "integer" - }, - "url": { - "type": "string" - } - }, - "required": [ - "path", - "url", - "total_visits", - "ai_visits", - "crawler_visits", - "ai_referrals", - "providers", - "change" - ], - "type": "object" - }, - "type": "array" - }, - "period": { - "additionalProperties": false, - "properties": { - "from": { - "description": "First day, YYYY-MM-DD.", - "type": "string" - }, - "to": { - "description": "Last day, YYYY-MM-DD.", - "type": "string" - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - }, - "referral_sources": { - "items": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "pages": { - "type": "integer" - }, - "provider": { - "type": "string" - }, - "referrals": { - "type": "integer" - }, - "source": { - "type": "string" - } - }, - "required": [ - "source", - "name", - "provider", - "referrals", - "pages" - ], - "type": "object" - }, - "type": "array" - }, - "systems": { - "description": "AI providers, by visits.", - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "crawler_visits": { - "type": "integer" - }, - "pages": { - "type": "integer" - }, - "provider": { - "description": "Pass as provider to filter.", - "type": "string" - } - }, - "required": [ - "provider", - "crawler_visits", - "ai_referrals", - "pages" - ], - "type": "object" - }, - "type": "array" - }, - "total_visits": { - "type": "integer" - }, - "view": { - "type": "string" - }, - "weekly": { - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "crawler_visits": { - "type": "integer" - }, - "week_start": { - "type": "string" - } - }, - "required": [ - "week_start", - "crawler_visits", - "ai_referrals" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "brand", - "view", - "period", - "connected", - "total_visits", - "ai_visits", - "ai_share", - "crawler_visits", - "ai_referrals", - "pages_reached", - "latest_visit_at", - "systems", - "crawlers", - "referral_sources", - "pages_to_improve", - "weekly" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "connected": { - "type": "boolean" - }, - "pages": { - "items": { - "additionalProperties": false, - "properties": { - "ai_referrals": { - "type": "integer" - }, - "ai_visits": { - "type": "integer" - }, - "change": { - "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.", - "type": [ - "null", - "number" - ] - }, - "crawler_visits": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "providers": { - "items": { - "type": "string" - }, - "type": "array" - }, - "total_visits": { - "type": "integer" - }, - "url": { - "type": "string" - } - }, - "required": [ - "path", - "url", - "total_visits", - "ai_visits", - "crawler_visits", - "ai_referrals", - "providers", - "change" - ], - "type": "object" - }, - "type": "array" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "period": { - "additionalProperties": false, - "properties": { - "from": { - "description": "First day, YYYY-MM-DD.", - "type": "string" - }, - "to": { - "description": "Last day, YYYY-MM-DD.", - "type": "string" - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "period", - "connected", - "pages", - "pagination" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "connected": { - "type": "boolean" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "period": { - "additionalProperties": false, - "properties": { - "from": { - "description": "First day, YYYY-MM-DD.", - "type": "string" - }, - "to": { - "description": "Last day, YYYY-MM-DD.", - "type": "string" - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - }, - "view": { - "type": "string" - }, - "visits": { - "items": { - "additionalProperties": false, - "properties": { - "captured_at": { - "type": "string" - }, - "name": { - "description": "The crawler or referring AI product.", - "type": "string" - }, - "path": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "type": { - "description": "crawler or referral.", - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "type", - "path", - "url", - "provider", - "name", - "captured_at" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "brand", - "view", - "period", - "connected", - "visits", - "pagination" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "ai_share": { + "description": "AI visits as a percentage of all visits.", + "type": "number" + }, + "ai_visits": { + "type": "integer" + }, + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "connected": { + "description": "Whether site tracking is set up; when false nothing is measured.", + "type": "boolean" + }, + "crawler_visits": { + "type": "integer" + }, + "crawlers": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "pages": { + "type": "integer" + }, + "provider": { + "type": "string" + }, + "visits": { + "type": "integer" + } + }, + "required": [ + "name", + "provider", + "visits", + "pages" + ], + "type": "object" + }, + "type": "array" + }, + "latest_visit_at": { + "type": "string" + }, + "pages_reached": { + "description": "Distinct pages an AI crawler or AI referral reached.", + "type": "integer" + }, + "pages_to_improve": { + "description": "Pages AI crawlers read but people rarely reach from AI answers.", + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "ai_visits": { + "type": "integer" + }, + "change": { + "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.", + "type": [ + "null", + "number" + ] + }, + "crawler_visits": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "providers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "total_visits": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "required": [ + "path", + "url", + "total_visits", + "ai_visits", + "crawler_visits", + "ai_referrals", + "providers", + "change" + ], + "type": "object" + }, + "type": "array" + }, + "period": { + "additionalProperties": false, + "properties": { + "from": { + "description": "First day, YYYY-MM-DD.", + "type": "string" + }, + "to": { + "description": "Last day, YYYY-MM-DD.", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "referral_sources": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "pages": { + "type": "integer" + }, + "provider": { + "type": "string" + }, + "referrals": { + "type": "integer" + }, + "source": { + "type": "string" + } + }, + "required": [ + "source", + "name", + "provider", + "referrals", + "pages" + ], + "type": "object" + }, + "type": "array" + }, + "systems": { + "description": "AI providers, by visits.", + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "crawler_visits": { + "type": "integer" + }, + "pages": { + "type": "integer" + }, + "provider": { + "description": "Pass as provider to filter.", + "type": "string" + } + }, + "required": [ + "provider", + "crawler_visits", + "ai_referrals", + "pages" + ], + "type": "object" + }, + "type": "array" + }, + "total_visits": { + "type": "integer" + }, + "view": { + "type": "string" + }, + "weekly": { + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "crawler_visits": { + "type": "integer" + }, + "week_start": { + "type": "string" + } + }, + "required": [ + "week_start", + "crawler_visits", + "ai_referrals" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "brand", + "view", + "period", + "connected", + "total_visits", + "ai_visits", + "ai_share", + "crawler_visits", + "ai_referrals", + "pages_reached", + "latest_visit_at", + "systems", + "crawlers", + "referral_sources", + "pages_to_improve", + "weekly" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "connected": { + "type": "boolean" + }, + "pages": { + "items": { + "additionalProperties": false, + "properties": { + "ai_referrals": { + "type": "integer" + }, + "ai_visits": { + "type": "integer" + }, + "change": { + "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.", + "type": [ + "null", + "number" + ] + }, + "crawler_visits": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "providers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "total_visits": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "required": [ + "path", + "url", + "total_visits", + "ai_visits", + "crawler_visits", + "ai_referrals", + "providers", + "change" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "period": { + "additionalProperties": false, + "properties": { + "from": { + "description": "First day, YYYY-MM-DD.", + "type": "string" + }, + "to": { + "description": "Last day, YYYY-MM-DD.", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "period", + "connected", + "pages", + "pagination" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "connected": { + "type": "boolean" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "period": { + "additionalProperties": false, + "properties": { + "from": { + "description": "First day, YYYY-MM-DD.", + "type": "string" + }, + "to": { + "description": "Last day, YYYY-MM-DD.", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "view": { + "type": "string" + }, + "visits": { + "items": { + "additionalProperties": false, + "properties": { + "captured_at": { + "type": "string" + }, + "name": { + "description": "The crawler or referring AI product.", + "type": "string" + }, + "path": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "type": { + "description": "crawler or referral.", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "type", + "path", + "url", + "provider", + "name", + "captured_at" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "brand", + "view", + "period", + "connected", + "visits", + "pagination" + ], + "type": "object" + } +]
- Changed
get_answer1 field changed- added
Output schema / properties / data / properties / citations / items / properties / position / descriptionAdded value: +"Character offset of the citation in the answer text; null unless the provider gave spans."
- Changed
get_brand_overview6 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention." - changed
Input schema / properties / to / descriptionPrevious value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today." - changed
Output schema / properties / data / properties / competitors / descriptionPrevious value: -"Every tracked brand, including this one, by share of voice."New value: +"This brand and the competitors mentioned in the period, up to 10 of them, by mentions." - added
Output schema / properties / data / properties / competitors_omittedAdded value: +{ + "description": "Tracked competitors not listed: those with no mentions in the period, and any beyond the first 10. get_brand_settings lists them all.", + "type": "integer" +} - added
Output schema / properties / data / properties / competitors_totalAdded value: +{ + "description": "Competitors the brand tracks, mentioned or not.", + "type": "integer" +} - changed
Output schema / properties / data / requiredPrevious value: -[ - "brand", - "kind", - "segment", - "period", - "visibility", - "share_of_voice", - "recommendation", - "by_model", - "competitors", - "outcomes", - "top_cited_domains", - "readiness", - "collection", - "traffic", - "opportunities", - "pages", - "latest_reports", - "retention" -]New value: +[ + "brand", + "kind", + "segment", + "period", + "visibility", + "share_of_voice", + "recommendation", + "by_model", + "competitors", + "competitors_total", + "competitors_omitted", + "outcomes", + "top_cited_domains", + "readiness", + "collection", + "traffic", + "opportunities", + "pages", + "latest_reports", + "retention" +]
- Changed
get_brand_settings1 field changed- changed
Output schema / properties / data / properties / reanalysis / properties / status / descriptionPrevious value: -"queued, running, or failed."New value: +"queued, running, or failed; done once a write's operation shows the re-read finished."
- Changed
get_brand_setup4 fields changed- changed
Output schema / properties / data / properties / competitors / items / properties / status / descriptionPrevious value: -"pending; superseded when its site could not be assessed; accepted or rejected once approved."New value: +"pending, or accepted or rejected once approved. Superseded proposals are not listed while the setup is open." - added
Output schema / properties / data / properties / segment / properties / market / descriptionAdded value: +"An upper-case country code such as AE, or global. Confirm it with the user: pass it as approve_brand_setup's market, with kind country and this code, or kind global." - added
Output schema / properties / data / properties / segment / properties / market_labelAdded value: +{ + "description": "The market's name, for example United Arab Emirates; pass as market.label.", + "type": "string" +} - changed
Output schema / properties / data / properties / segment / requiredPrevious value: -[ - "name", - "market", - "language" -]New value: +[ + "name", + "market", + "market_label", + "language" +]
- Changed
get_citation_source2 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention." - changed
Input schema / properties / to / descriptionPrevious value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
- Changed
get_opportunity5 fields changed- added
Output schema / properties / data / properties / app_urlAdded value: +{ + "description": "This opportunity in the Cleotic app.", + "type": "string" +} - added
Output schema / properties / data / properties / omitted_competitorsAdded value: +{ + "description": "Content gaps: competitors named in the window but absent from every model's latest answer, so not listed in presence.", + "type": "integer" +} - changed
Output schema / properties / data / properties / presence / descriptionPrevious value: -"Content gaps: how each model's latest answer treats each brand it names."New value: +"Content gaps: how each model's latest answer treats you and the competitors those answers name, up to six." - changed
Output schema / properties / data / properties / presence / items / properties / models / items / properties / presence / descriptionPrevious value: -"ranked, mentioned, caveated, or absent."New value: +"ranked (with rank), recommended (no rank position), mentioned, caveated, or absent." - changed
Output schema / properties / data / requiredPrevious value: -[ - "brand", - "id", - "kind", - "stage", - "title", - "signal", - "segment", - "monthly_ai_searches", - "score", - "assignee", - "found_at", - "stage_changed_at", - "snoozed_until", - "dismissed_at", - "comment_count", - "facts", - "play", - "presence", - "excerpts", - "engine_answers", - "sources", - "trend", - "proof", - "timeline", - "comments" -]New value: +[ + "brand", + "id", + "kind", + "stage", + "title", + "signal", + "segment", + "monthly_ai_searches", + "score", + "assignee", + "found_at", + "stage_changed_at", + "snoozed_until", + "dismissed_at", + "comment_count", + "app_url", + "facts", + "play", + "presence", + "omitted_competitors", + "excerpts", + "engine_answers", + "sources", + "trend", + "proof", + "timeline", + "comments" +]
- Changed
get_perception14 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention." - added
Input schema / properties / max_competitorsAdded value: +{ + "description": "Competitors to include, best overall score first. Defaults to 8; the brand is always included.", + "maximum": 20, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / to / descriptionPrevious value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today." - added
Output schema / properties / data / properties / analysed_atAdded value: +{ + "description": "When the newest analysis in the period ran; empty without data.", + "type": "string" +} - changed
Output schema / properties / data / properties / brands / descriptionPrevious value: -"The brand first, then competitors by overall score."New value: +"The brand first, then up to max_competitors competitors by overall score. Brands without scores are left out." - changed
Output schema / properties / data / properties / brands / items / properties / evidence / descriptionPrevious value: -"Why each dimension scored as it did, with quotes; the brand only."New value: +"Why each dimension scored as it did, with quotes; the brand only. Dimensions with no real evidence are left out." - added
Output schema / properties / data / properties / competitors_omittedAdded value: +{ + "description": "Scored competitors left out by max_competitors.", + "type": "integer" +} - added
Output schema / properties / data / properties / competitors_totalAdded value: +{ + "description": "Competitors with scores in the period.", + "type": "integer" +} - added
Output schema / properties / data / properties / evidence_availableAdded value: +{ + "description": "False when the analysis has scores but no evidence quotes for the brand.", + "type": "boolean" +} - changed
Output schema / properties / data / properties / has_data / descriptionPrevious value: -"False when no perception analysis falls in the period; scores are then empty."New value: +"False when no perception analysis falls in the period; brands is then empty." - added
Output schema / properties / data / properties / latest_analysis_atAdded value: +{ + "description": "Set when the period has no analysis: the newest analysis there is. Ask for a period that includes it.", + "type": "string" +} - added
Output schema / properties / data / properties / models_coveredAdded value: +{ + "description": "Model families the brand's scores come from.", + "type": "integer" +} - added
Output schema / properties / data / properties / models_expectedAdded value: +{ + "description": "Model families the plan collects from.", + "type": "integer" +} - changed
Output schema / properties / data / requiredPrevious value: -[ - "brand", - "period", - "has_data", - "notice", - "brands", - "trend" -]New value: +[ + "brand", + "period", + "has_data", + "notice", + "analysed_at", + "latest_analysis_at", + "models_covered", + "models_expected", + "evidence_available", + "brands", + "competitors_total", + "competitors_omitted", + "trend" +]
- Changed
get_plan1 field changed- added
Output schema / properties / data / properties / limits / items / properties / used / descriptionAdded value: +"What is in use. For segments_per_brand, the most segments any one brand has."
- Changed
get_readiness2 fields changed- added
Input schema / properties / page_idAdded value: +{ + "description": "pages view: a page_id from the pages list, for that page's findings.", + "type": "string" +} - changed
Output schema / properties / data / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "lenses": { - "description": "Readiness, SEO health and security scores.", - "items": { - "additionalProperties": false, - "properties": { - "lens": { - "type": "string" - }, - "score": { - "type": [ - "null", - "number" - ] - }, - "verdict": { - "type": "string" - } - }, - "required": [ - "lens", - "score", - "verdict" - ], - "type": "object" - }, - "type": "array" - }, - "open_findings": { - "additionalProperties": false, - "description": "Checks the site fails or only partly passes, by severity. view action_plan lists them.", - "properties": { - "critical": { - "type": "integer" - }, - "info": { - "type": "integer" - }, - "major": { - "type": "integer" - }, - "minor": { - "type": "integer" - }, - "total": { - "type": "integer" - } - }, - "required": [ - "critical", - "major", - "minor", - "info", - "total" - ], - "type": "object" - }, - "pages_audited": { - "type": "integer" - }, - "passing_checks": { - "type": "integer" - }, - "pillars": { - "items": { - "additionalProperties": false, - "properties": { - "label": { - "type": "string" - }, - "pillar": { - "type": "string" - }, - "points_awarded": { - "type": "number" - }, - "points_possible": { - "type": "number" - } - }, - "required": [ - "pillar", - "label", - "points_awarded", - "points_possible" - ], - "type": "object" - }, - "type": "array" - }, - "poll_after_seconds": { - "description": "While a scan runs, how long to wait before reading again; 0 otherwise.", - "type": "integer" - }, - "progress": { - "additionalProperties": false, - "description": "Set while a scan runs.", - "properties": { - "message": { - "type": "string" - }, - "page_limit": { - "type": "integer" - }, - "pages_fetched": { - "type": "integer" - }, - "percent": { - "type": "integer" - }, - "stage": { - "type": "string" - } - }, - "required": [ - "stage", - "message", - "percent", - "pages_fetched", - "page_limit" - ], - "type": [ - "null", - "object" - ] - }, - "scan": { - "additionalProperties": false, - "description": "The scan summarised; null before the first scan.", - "properties": { - "completed_at": { - "type": "string" - }, - "error": { - "type": "string" - }, - "id": { - "description": "Scan ID, the run_id other readiness calls take.", - "type": "string" - }, - "started_at": { - "type": "string" - }, - "status": { - "description": "queued, processing, complete, or failed.", - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "status", - "url", - "error", - "started_at", - "completed_at" - ], - "type": [ - "null", - "object" - ] - }, - "scan_in_progress": { - "type": "boolean" - }, - "score": { - "description": "Readiness score, 0-100.", - "type": [ - "null", - "number" - ] - }, - "verdict": { - "description": "Excellent (90+), Good (75+), Needs work (60+), Poor (40+), or Critical.", - "type": "string" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "scan", - "score", - "verdict", - "lenses", - "pillars", - "open_findings", - "passing_checks", - "pages_audited", - "scan_in_progress", - "progress", - "poll_after_seconds" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "findings": { - "items": { - "additionalProperties": false, - "properties": { - "affected_pages": { - "type": "integer" - }, - "check_id": { - "description": "Pass to get_readiness_finding or verify_readiness_fix.", - "type": "string" - }, - "consequence": { - "type": "string" - }, - "effort_minutes": { - "type": [ - "null", - "integer" - ] - }, - "fix_type": { - "type": "string" - }, - "label": { - "type": "string" - }, - "latest_check": { - "additionalProperties": false, - "description": "The latest re-check since the scan.", - "properties": { - "check_id": { - "type": "string" - }, - "completed_at": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "error": { - "type": "string" - }, - "id": { - "description": "The check_request_id get_readiness_finding takes.", - "type": "string" - }, - "per_url": { - "items": { - "additionalProperties": false, - "properties": { - "status": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "url", - "status" - ], - "type": "object" - }, - "type": "array" - }, - "recharges_at": { - "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.", - "type": "string" - }, - "resolved": { - "description": "Whether the issue is fixed; null until complete.", - "type": [ - "null", - "boolean" - ] - }, - "status": { - "description": "queued, processing, complete, or failed.", - "type": "string" - } - }, - "required": [ - "id", - "check_id", - "status", - "resolved", - "per_url", - "error", - "created_at", - "completed_at", - "recharges_at" - ], - "type": [ - "null", - "object" - ] - }, - "owner_role": { - "type": "string" - }, - "pillar": { - "type": "string" - }, - "points_recoverable": { - "type": "number" - }, - "severity": { - "description": "critical, major, minor, or info; empty when passing.", - "type": "string" - }, - "site_wide": { - "description": "One fix applies to the whole site.", - "type": "boolean" - }, - "status": { - "description": "fail, warning, pass, or not_applicable.", - "type": "string" - } - }, - "required": [ - "check_id", - "label", - "pillar", - "status", - "severity", - "consequence", - "points_recoverable", - "effort_minutes", - "owner_role", - "fix_type", - "affected_pages", - "site_wide", - "latest_check" - ], - "type": "object" - }, - "type": "array" - }, - "open_findings": { - "additionalProperties": false, - "properties": { - "critical": { - "type": "integer" - }, - "info": { - "type": "integer" - }, - "major": { - "type": "integer" - }, - "minor": { - "type": "integer" - }, - "total": { - "type": "integer" - } - }, - "required": [ - "critical", - "major", - "minor", - "info", - "total" - ], - "type": "object" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "questions_no_page_answers": { - "description": "Tracked prompts no page on the site answers well.", - "items": { - "additionalProperties": false, - "properties": { - "monthly_ai_searches": { - "type": [ - "null", - "integer" - ] - }, - "opportunity_id": { - "description": "The content gap opportunity for it, when there is one.", - "type": "string" - }, - "prompt_id": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "required": [ - "prompt_id", - "text", - "monthly_ai_searches", - "opportunity_id" - ], - "type": "object" - }, - "type": "array" - }, - "scan_id": { - "type": "string" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "scan_id", - "open_findings", - "findings", - "questions_no_page_answers", - "pagination" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "pages": { - "items": { - "additionalProperties": false, - "properties": { - "page_type": { - "type": "string" - }, - "response_time_ms": { - "type": "integer" - }, - "status_code": { - "type": "integer" - }, - "text_chars": { - "type": "integer" - }, - "url": { - "type": "string" - } - }, - "required": [ - "url", - "page_type", - "status_code", - "response_time_ms", - "text_chars" - ], - "type": "object" - }, - "type": "array" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "scan_id": { - "type": "string" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "scan_id", - "pages", - "pagination" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "pagination": { - "additionalProperties": false, - "properties": { - "next_cursor": { - "description": "Pass as cursor to get the next page; empty on the last page.", - "type": "string" - }, - "total": { - "description": "Items across all pages; null when not counted.", - "type": [ - "null", - "integer" - ] - } - }, - "required": [ - "next_cursor", - "total" - ], - "type": "object" - }, - "scans": { - "items": { - "additionalProperties": false, - "properties": { - "completed_at": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "error": { - "type": "string" - }, - "fixed": { - "description": "Findings fixed since the previous scan.", - "type": "integer" - }, - "new": { - "type": "integer" - }, - "pages_audited": { - "type": [ - "null", - "integer" - ] - }, - "readiness": { - "type": [ - "null", - "number" - ] - }, - "regressed": { - "type": "integer" - }, - "scan_id": { - "type": "string" - }, - "security": { - "type": [ - "null", - "number" - ] - }, - "seo": { - "type": [ - "null", - "number" - ] - }, - "status": { - "type": "string" - }, - "trigger": { - "description": "manual or scheduled.", - "type": "string" - } - }, - "required": [ - "scan_id", - "status", - "trigger", - "readiness", - "seo", - "security", - "pages_audited", - "fixed", - "new", - "regressed", - "created_at", - "completed_at", - "error" - ], - "type": "object" - }, - "type": "array" - }, - "view": { - "type": "string" - } - }, - "required": [ - "brand", - "view", - "scans", - "pagination" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "allowed": { - "description": "Whether competitor scans are available.", - "type": "boolean" - }, - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "competitors": { - "items": { - "additionalProperties": false, - "properties": { - "brand": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "url": { - "description": "The brand's website, or empty when none is set.", - "type": "string" - } - }, - "required": [ - "id", - "name", - "url" - ], - "type": "object" - }, - "next_available_at": { - "type": "string" - }, - "scan_id": { - "type": "string" - }, - "scanned_at": { - "type": "string" - }, - "scores": { - "additionalProperties": false, - "properties": { - "readiness": { - "type": [ - "null", - "number" - ] - }, - "security": { - "type": [ - "null", - "number" - ] - }, - "seo": { - "type": [ - "null", - "number" - ] - } - }, - "required": [ - "readiness", - "seo", - "security" - ], - "type": [ - "null", - "object" - ] - }, - "status": { - "type": "string" - } - }, - "required": [ - "brand", - "scan_id", - "status", - "scores", - "scanned_at", - "next_available_at" - ], - "type": "object" - }, - "type": "array" - }, - "gaps": { - "description": "Checks competitors pass and the brand does not.", - "items": { - "additionalProperties": false, - "properties": { - "check_id": { - "type": "string" - }, - "competitors": { - "items": { - "type": "string" - }, - "type": "array" - }, - "fix_summary": { - "type": "string" - }, - "label": { - "type": "string" - }, - "pillar": { - "type": "string" - }, - "points_possible": { - "type": "number" - }, - "your_status": { - "type": "string" - } - }, - "required": [ - "check_id", - "label", - "pillar", - "your_status", - "competitors", - "points_possible", - "fix_summary" - ], - "type": "object" - }, - "type": "array" - }, - "reason": { - "description": "Why not: plan, role, or no_competitors.", - "type": "string" - }, - "view": { - "type": "string" - }, - "you": { - "additionalProperties": false, - "properties": { - "readiness": { - "type": [ - "null", - "number" - ] - }, - "security": { - "type": [ - "null", - "number" - ] - }, - "seo": { - "type": [ - "null", - "number" - ] - } - }, - "required": [ - "readiness", - "seo", - "security" - ], - "type": [ - "null", - "object" - ] - } - }, - "required": [ - "brand", - "view", - "allowed", - "reason", - "you", - "competitors", - "gaps" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "can_start_scan": { + "description": "Whether run_readiness_scan can start a scan for you now.", + "type": "boolean" + }, + "disabled_reason": { + "description": "Why it cannot: scheduled_only (later scans run weekly), run_active, role, or no_site; empty when it can.", + "type": "string" + }, + "lenses": { + "description": "Readiness, SEO health and security scores.", + "items": { + "additionalProperties": false, + "properties": { + "lens": { + "type": "string" + }, + "score": { + "type": [ + "null", + "number" + ] + }, + "verdict": { + "type": "string" + } + }, + "required": [ + "lens", + "score", + "verdict" + ], + "type": "object" + }, + "type": "array" + }, + "next_run_at": { + "description": "When the next weekly scan runs; empty before the first scan completes.", + "type": "string" + }, + "open_findings": { + "additionalProperties": false, + "description": "Checks the site fails or only partly passes, by severity. view action_plan lists them.", + "properties": { + "critical": { + "type": "integer" + }, + "info": { + "type": "integer" + }, + "major": { + "type": "integer" + }, + "minor": { + "type": "integer" + }, + "total": { + "type": "integer" + } + }, + "required": [ + "critical", + "major", + "minor", + "info", + "total" + ], + "type": "object" + }, + "pages_audited": { + "type": "integer" + }, + "passing_checks": { + "type": "integer" + }, + "pillars": { + "items": { + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "pillar": { + "type": "string" + }, + "points_awarded": { + "type": "number" + }, + "points_possible": { + "type": "number" + } + }, + "required": [ + "pillar", + "label", + "points_awarded", + "points_possible" + ], + "type": "object" + }, + "type": "array" + }, + "poll_after_seconds": { + "description": "While a scan runs, how long to wait before reading again; 0 otherwise.", + "type": "integer" + }, + "progress": { + "additionalProperties": false, + "description": "Set while a scan runs.", + "properties": { + "message": { + "type": "string" + }, + "page_limit": { + "type": "integer" + }, + "pages_fetched": { + "type": "integer" + }, + "percent": { + "type": "integer" + }, + "stage": { + "type": "string" + } + }, + "required": [ + "stage", + "message", + "percent", + "pages_fetched", + "page_limit" + ], + "type": [ + "null", + "object" + ] + }, + "scan": { + "additionalProperties": false, + "description": "The scan summarised; null before the first scan.", + "properties": { + "completed_at": { + "type": "string" + }, + "error": { + "type": "string" + }, + "id": { + "description": "Scan ID, the run_id other readiness calls take.", + "type": "string" + }, + "started_at": { + "type": "string" + }, + "status": { + "description": "queued, processing, complete, or failed.", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "status", + "url", + "error", + "started_at", + "completed_at" + ], + "type": [ + "null", + "object" + ] + }, + "scan_in_progress": { + "type": "boolean" + }, + "score": { + "description": "Readiness score, 0-100.", + "type": [ + "null", + "number" + ] + }, + "verdict": { + "description": "Excellent (90+), Good (75+), Needs work (60+), Poor (40+), or Critical.", + "type": "string" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "scan", + "score", + "verdict", + "lenses", + "pillars", + "open_findings", + "passing_checks", + "pages_audited", + "scan_in_progress", + "progress", + "poll_after_seconds", + "can_start_scan", + "disabled_reason", + "next_run_at" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "findings": { + "items": { + "additionalProperties": false, + "properties": { + "affected_pages": { + "type": "integer" + }, + "check_id": { + "description": "Pass to get_readiness_finding or verify_readiness_fix.", + "type": "string" + }, + "consequence": { + "type": "string" + }, + "effort_minutes": { + "type": [ + "null", + "integer" + ] + }, + "fix_type": { + "type": "string" + }, + "label": { + "type": "string" + }, + "latest_check": { + "additionalProperties": false, + "description": "The latest re-check since the scan.", + "properties": { + "check_id": { + "type": "string" + }, + "completed_at": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "error": { + "type": "string" + }, + "id": { + "description": "The check_request_id get_readiness_finding takes.", + "type": "string" + }, + "per_url": { + "items": { + "additionalProperties": false, + "properties": { + "status": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "recharges_at": { + "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.", + "type": "string" + }, + "resolved": { + "description": "Whether the issue is fixed; null until complete.", + "type": [ + "null", + "boolean" + ] + }, + "status": { + "description": "queued, processing, complete, or failed.", + "type": "string" + } + }, + "required": [ + "id", + "check_id", + "status", + "resolved", + "per_url", + "error", + "created_at", + "completed_at", + "recharges_at" + ], + "type": [ + "null", + "object" + ] + }, + "owner_role": { + "type": "string" + }, + "pillar": { + "type": "string" + }, + "points_recoverable": { + "type": "number" + }, + "severity": { + "description": "critical, major, minor, or info; empty when passing.", + "type": "string" + }, + "site_wide": { + "description": "One fix applies to the whole site.", + "type": "boolean" + }, + "status": { + "description": "fail, warning, pass, or not_applicable.", + "type": "string" + } + }, + "required": [ + "check_id", + "label", + "pillar", + "status", + "severity", + "consequence", + "points_recoverable", + "effort_minutes", + "owner_role", + "fix_type", + "affected_pages", + "site_wide", + "latest_check" + ], + "type": "object" + }, + "type": "array" + }, + "open_findings": { + "additionalProperties": false, + "properties": { + "critical": { + "type": "integer" + }, + "info": { + "type": "integer" + }, + "major": { + "type": "integer" + }, + "minor": { + "type": "integer" + }, + "total": { + "type": "integer" + } + }, + "required": [ + "critical", + "major", + "minor", + "info", + "total" + ], + "type": "object" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "questions_no_page_answers": { + "description": "Tracked prompts no page on the site answers well.", + "items": { + "additionalProperties": false, + "properties": { + "monthly_ai_searches": { + "type": [ + "null", + "integer" + ] + }, + "opportunity_id": { + "description": "The content gap opportunity for it, when there is one.", + "type": "string" + }, + "prompt_id": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "prompt_id", + "text", + "monthly_ai_searches", + "opportunity_id" + ], + "type": "object" + }, + "type": "array" + }, + "scan_id": { + "type": "string" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "scan_id", + "open_findings", + "findings", + "questions_no_page_answers", + "pagination" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "pages": { + "items": { + "additionalProperties": false, + "properties": { + "page_id": { + "description": "Pass to get_readiness view pages with page_id for this page's findings.", + "type": "string" + }, + "page_type": { + "type": "string" + }, + "response_time_ms": { + "type": "integer" + }, + "status_code": { + "type": "integer" + }, + "text_chars": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "required": [ + "page_id", + "url", + "page_type", + "status_code", + "response_time_ms", + "text_chars" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "scan_id": { + "type": "string" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "scan_id", + "pages", + "pagination" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "findings": { + "description": "Open findings that affect this page, in fix order; at most 25.", + "items": { + "additionalProperties": false, + "properties": { + "affected_pages": { + "type": "integer" + }, + "check_id": { + "description": "Pass to get_readiness_finding or verify_readiness_fix.", + "type": "string" + }, + "consequence": { + "type": "string" + }, + "effort_minutes": { + "type": [ + "null", + "integer" + ] + }, + "fix_type": { + "type": "string" + }, + "label": { + "type": "string" + }, + "latest_check": { + "additionalProperties": false, + "description": "The latest re-check since the scan.", + "properties": { + "check_id": { + "type": "string" + }, + "completed_at": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "error": { + "type": "string" + }, + "id": { + "description": "The check_request_id get_readiness_finding takes.", + "type": "string" + }, + "per_url": { + "items": { + "additionalProperties": false, + "properties": { + "status": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "recharges_at": { + "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.", + "type": "string" + }, + "resolved": { + "description": "Whether the issue is fixed; null until complete.", + "type": [ + "null", + "boolean" + ] + }, + "status": { + "description": "queued, processing, complete, or failed.", + "type": "string" + } + }, + "required": [ + "id", + "check_id", + "status", + "resolved", + "per_url", + "error", + "created_at", + "completed_at", + "recharges_at" + ], + "type": [ + "null", + "object" + ] + }, + "owner_role": { + "type": "string" + }, + "pillar": { + "type": "string" + }, + "points_recoverable": { + "type": "number" + }, + "severity": { + "description": "critical, major, minor, or info; empty when passing.", + "type": "string" + }, + "site_wide": { + "description": "One fix applies to the whole site.", + "type": "boolean" + }, + "status": { + "description": "fail, warning, pass, or not_applicable.", + "type": "string" + } + }, + "required": [ + "check_id", + "label", + "pillar", + "status", + "severity", + "consequence", + "points_recoverable", + "effort_minutes", + "owner_role", + "fix_type", + "affected_pages", + "site_wide", + "latest_check" + ], + "type": "object" + }, + "type": "array" + }, + "page": { + "additionalProperties": false, + "properties": { + "page_id": { + "description": "Pass to get_readiness view pages with page_id for this page's findings.", + "type": "string" + }, + "page_type": { + "type": "string" + }, + "response_time_ms": { + "type": "integer" + }, + "status_code": { + "type": "integer" + }, + "text_chars": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "required": [ + "page_id", + "url", + "page_type", + "status_code", + "response_time_ms", + "text_chars" + ], + "type": "object" + }, + "scan_id": { + "type": "string" + }, + "total_findings": { + "type": "integer" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "scan_id", + "page", + "findings", + "total_findings" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "pagination": { + "additionalProperties": false, + "properties": { + "next_cursor": { + "description": "Pass as cursor to get the next page; empty on the last page.", + "type": "string" + }, + "total": { + "description": "Items across all pages; null when not counted.", + "type": [ + "null", + "integer" + ] + } + }, + "required": [ + "next_cursor", + "total" + ], + "type": "object" + }, + "scans": { + "items": { + "additionalProperties": false, + "properties": { + "completed_at": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "error": { + "type": "string" + }, + "fixed": { + "description": "Findings fixed since the previous scan.", + "type": "integer" + }, + "new": { + "type": "integer" + }, + "pages_audited": { + "type": [ + "null", + "integer" + ] + }, + "readiness": { + "type": [ + "null", + "number" + ] + }, + "regressed": { + "type": "integer" + }, + "scan_id": { + "type": "string" + }, + "security": { + "type": [ + "null", + "number" + ] + }, + "seo": { + "type": [ + "null", + "number" + ] + }, + "status": { + "type": "string" + }, + "trigger": { + "description": "manual or scheduled.", + "type": "string" + } + }, + "required": [ + "scan_id", + "status", + "trigger", + "readiness", + "seo", + "security", + "pages_audited", + "fixed", + "new", + "regressed", + "created_at", + "completed_at", + "error" + ], + "type": "object" + }, + "type": "array" + }, + "view": { + "type": "string" + } + }, + "required": [ + "brand", + "view", + "scans", + "pagination" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "allowed": { + "description": "Whether competitor scans are available.", + "type": "boolean" + }, + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "competitors": { + "items": { + "additionalProperties": false, + "properties": { + "brand": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "description": "The brand's website, or empty when none is set.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "url" + ], + "type": "object" + }, + "next_available_at": { + "type": "string" + }, + "scan_id": { + "type": "string" + }, + "scanned_at": { + "type": "string" + }, + "scores": { + "additionalProperties": false, + "properties": { + "readiness": { + "type": [ + "null", + "number" + ] + }, + "security": { + "type": [ + "null", + "number" + ] + }, + "seo": { + "type": [ + "null", + "number" + ] + } + }, + "required": [ + "readiness", + "seo", + "security" + ], + "type": [ + "null", + "object" + ] + }, + "status": { + "type": "string" + } + }, + "required": [ + "brand", + "scan_id", + "status", + "scores", + "scanned_at", + "next_available_at" + ], + "type": "object" + }, + "type": "array" + }, + "cooldown_days": { + "description": "Days before a competitor can be scanned again.", + "type": "integer" + }, + "gaps": { + "description": "Checks competitors pass and the brand does not.", + "items": { + "additionalProperties": false, + "properties": { + "check_id": { + "type": "string" + }, + "competitors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "fix_summary": { + "type": "string" + }, + "label": { + "type": "string" + }, + "pillar": { + "type": "string" + }, + "points_possible": { + "type": "number" + }, + "your_status": { + "type": "string" + } + }, + "required": [ + "check_id", + "label", + "pillar", + "your_status", + "competitors", + "points_possible", + "fix_summary" + ], + "type": "object" + }, + "type": "array" + }, + "max_competitors": { + "description": "How many competitors can be scanned.", + "type": "integer" + }, + "note": { + "description": "Where competitor scans are started: in the app, not through MCP.", + "type": "string" + }, + "reason": { + "description": "Why not: plan, role, or no_competitors.", + "type": "string" + }, + "view": { + "type": "string" + }, + "you": { + "additionalProperties": false, + "properties": { + "readiness": { + "type": [ + "null", + "number" + ] + }, + "security": { + "type": [ + "null", + "number" + ] + }, + "seo": { + "type": [ + "null", + "number" + ] + } + }, + "required": [ + "readiness", + "seo", + "security" + ], + "type": [ + "null", + "object" + ] + } + }, + "required": [ + "brand", + "view", + "allowed", + "reason", + "max_competitors", + "cooldown_days", + "note", + "you", + "competitors", + "gaps" + ], + "type": "object" + } +]
- Changed
get_readiness_finding1 field changed- changed
Output schema / properties / data / properties / instances / items / requiredPrevious value: -[ - "url", - "scope", - "page_count", - "current", - "expected", - "detail" -]New value: +[ + "scope", + "page_count" +]
- Changed
list_answers3 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention." - changed
Input schema / properties / model / descriptionPrevious value: -"Optional model family: chatgpt, claude, gemini, perplexity, muse-spark, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model."New value: +"Optional model family: chatgpt, claude, gemini, perplexity, muse-spark, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model. A family is exact: gemini does not include google-ai-mode or google-ai-overviews." - changed
Input schema / properties / to / descriptionPrevious value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
- Changed
list_brands2 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention." - changed
Input schema / properties / to / descriptionPrevious value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
- Changed
list_citations2 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention." - changed
Input schema / properties / to / descriptionPrevious value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
- Changed
list_opportunities1 field changed- changed
Input schema / properties / assignee / descriptionPrevious value: -"Optional: me, or a member ID."New value: +"Optional: me, or a member ID (none is not accepted here). No tool lists members: take an ID from an opportunity's assignee.member_id."
- Changed
list_prompts3 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention." - changed
Input schema / properties / to / descriptionPrevious value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today." - changed
Output schema / properties / data / properties / prompts / items / properties / monthly_ai_searches / descriptionPrevious value: -"Estimated monthly AI searches for the question; null when unknown."New value: +"Estimated monthly AI searches for the question; null until the hourly demand lookup has run for it, or when none was found."
- Changed
mark_page_published6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
redraft_page_section6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Added
revoke_report - Changed
run_readiness_scan6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
save_competitor8 fields changed- added
Input schema / properties / aliases / descriptionAdded value: +"The full list of other names answers use for it. Replaces the current aliases, so include the existing ones; [] clears them." - changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state." - changed
Output schema / properties / data / properties / resource / properties / reanalysis / properties / status / descriptionPrevious value: -"queued, running, or failed."New value: +"queued, running, or failed; done once a write's operation shows the re-read finished."
- Changed
save_prompt7 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - added
Input schema / properties / market / descriptionAdded value: +"A free-text label stored on the prompt. It does not change where the prompt is collected: the segment's geo does." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
save_segment7 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / geo / descriptionPrevious value: -"Country code, for example GB."New value: +"Country code, for example GB, or global: where this segment's answers are collected from." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
set_primary_brand8 fields changed- changed
Input schema / properties / aliases / descriptionPrevious value: -"Other names answers use for the brand."New value: +"The full list of other names answers use for the brand. Replaces the current aliases, so include the existing ones; [] clears them." - changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state." - changed
Output schema / properties / data / properties / resource / properties / reanalysis / properties / status / descriptionPrevious value: -"queued, running, or failed."New value: +"queued, running, or failed; done once a write's operation shows the re-read finished."
- Changed
start_brand_setup5 fields changed- changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
suggest_prompts2 fields changed- changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - changed
Output schema / properties / data / properties / suggestions / descriptionPrevious value: -"Highest AI search demand first."New value: +"Highest AI search demand first when demand data exists; otherwise the model's order."
- Changed
update_brand6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
update_brand_voice6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
update_opportunities8 fields changed- changed
Input schema / properties / assignee / descriptionPrevious value: -"Assign to a member ID, to yourself with me, or unassign with none."New value: +"me (yourself), none (unassign), or a member ID. No tool lists members: take an ID from an opportunity's assignee.member_id." - changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Input schema / properties / snooze_until / descriptionPrevious value: -"Hide until this date (YYYY-MM-DD) or RFC 3339 time."New value: +"Hide until this date (YYYY-MM-DD, taken as 09:00 UTC) or RFC 3339 time." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
- Changed
verify_readiness_fix6 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused." - changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action." - changed
Output schema / properties / data / properties / brand / descriptionPrevious value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet." - changed
Output schema / properties / data / properties / cost / properties / readiness_scans / descriptionPrevious value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance." - added
Output schema / properties / data / properties / created_atAdded value: +{ + "description": "Set on a replay: when the original call was made.", + "type": "string" +} - changed
Output schema / properties / data / properties / replayed / descriptionPrevious value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
5 tool updates
- Changed
get_brand_overview1 field changed- added
Output schema / properties / data / properties / collection / properties / next_collection_atAdded value: +{ + "description": "When the brand's prompts are next collected (00:00 UTC on Mondays, Wednesdays and Fridays). Absent when nothing is set to collect.", + "type": "string" +}
- Changed
get_brand_settings1 field changed- changed
Output schema / properties / data / properties / segments / items / properties / status / descriptionPrevious value: -"active segments collect daily; paused ones do not."New value: +"active segments collect on Mondays, Wednesdays and Fridays; paused ones do not."
- Changed
list_brands1 field changed- added
Output schema / properties / data / properties / brands / items / properties / collection / properties / next_collection_atAdded value: +{ + "description": "When the brand's prompts are next collected (00:00 UTC on Mondays, Wednesdays and Fridays). Absent when nothing is set to collect.", + "type": "string" +}
- Changed
list_prompts1 field changed- changed
Output schema / properties / data / properties / prompts / items / properties / status / descriptionPrevious value: -"active prompts run daily; paused ones do not."New value: +"active prompts run on Mondays, Wednesdays and Fridays; paused ones do not."
- Changed
save_segment1 field changed- changed
Output schema / properties / data / properties / resource / properties / status / descriptionPrevious value: -"active segments collect daily; paused ones do not."New value: +"active segments collect on Mondays, Wednesdays and Fridays; paused ones do not."
Publisher details
- Operator
- Cleotic
- Operator website
- https://cleotic.ai
- Vendor relationship
- Not applicable
- Trust center
- Not available
- Restrictions
- Paid plan required.
Related MCP Connectors
AI visibility analytics for brand mentions, citations, sentiment, and GEO reports
Track how ChatGPT, Gemini & Perplexity mention, rank & cite your brand. AuraCite account required.
AI search visibility: brand mentions, citations, rankings, competitors and top cited sources.
AI visibility analytics for brands across citations, prompts, competitors, research, and reports.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables AI agents to check brand mentions across AI search surfaces like ChatGPT, Claude, Gemini, Perplexity, and Google AI Overviews using natural language queries.49 npm1MIT
- AlicenseAqualityBmaintenanceAI visibility and SEO data for AI agents. Check whether ChatGPT, Claude, Perplexity and Gemini mention your brand and which sources they cite, plus keyword volume and Google Trends.29258 npmMIT

LLM Pulse MCP Serverofficial
AlicenseAqualityBmaintenanceMonitors brand mentions, citations, sentiment, competitor share of voice, and GEO performance across AI search engines.1MIT- AlicenseNot gradedqualityBmaintenanceEnables auditing and monitoring brand visibility, citations, and competitor share-of-voice across ChatGPT, Perplexity, Claude, Gemini, and DeepSeek from MCP-compatible clients such as Cursor and Claude Desktop.1 npm15MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.