Skip to main content
Glama
competlab

competlab-mcp-server

by competlab

get_ai_sources_dashboard

Read-only

Retrieve the pages Perplexity and Google AI Overviews retrieved for buying questions, showing which companies they named and where your brand is absent.

Instructions

The latest AI Sources: which pages Perplexity and Google AI Overviews RETRIEVED when answering this project's 8 buying questions, which companies each named, and which pages name other companies and not the customer. In compact view summary.brands and summary.pages are pages (brandsOffset/brandsLimit, pagesOffset/pagesLimit, pagesHost= for one host's pages), each with its *Page {offset, limit, total, hasMore}; the customer's brand row is always included and coreHosts[] carries pageUrls, not page rows. view=full returns every row. Compact runs 30,000-70,000 characters; full, 250,000-450,000.

  • RETRIEVED, never cited: the engines do not say which pages they leaned on.

  • PER ENGINE, never pooled: never add one engine's page count to another's. The one cross-engine object is the core: hosts at least 2 engines retrieved (summary.overlap, summary.coreHosts).

  • COUNTS, never rates: 'n of N answers', never a percentage. Quote each count with its universe on the same object (answersNamingCustomer of answersReceived). A shortfall is two facts: '8 asked, 6 answered'.

  • Not measured is never zero: an engine absent from a per-engine record was not asked; one present with engineDataAvailable produced nothing usable. A page we could not read is never a page the customer is absent from.

  • summary.verdict is a CONDITION CODE, never a rating and never re-derived from the numbers; state it beside the counts it rests on.

  • LEAD WITH THE FUNNEL (summary.funnel): hosts more than one engine read, already naming the customer, unreadable, genuinely missing. On a leader say 'already on 19 of the 25 hosts', never 'nothing found'.

  • THE WORK LIST is coreHosts rows with status missing, and only those.

  • Render summary.limits.sentences and each actionHint.text VERBATIM; never compose a sentence from a code. Field rules not listed here arrive in readingGuide, the first field of every response.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
viewNocompact or full; omit for the server's default view. compact pages the long lists and keeps the customer's own row on every page. full returns every row in one response: up to about 200,000 characters on AI Visibility and 450,000 on AI Sources. Paging parameters with view=full are refused (paging_requires_compact_view).
engineNoReturn only this engine's answers (perplexity, google_ai_overviews). Requires includeAnswers=true. Narrows answers, unansweredQueries and noAnswerShown; changes nothing under summary and does not narrow engineStatus.
pagesHostNoReturn only the pages on this host, as named on summary.coreHosts[]. The way to see which pages on a core host name the customer or other companies. Page counts stay per engine.
projectIdYesProject ID (from list_projects)
pagesLimitNoRows of summary.pages per page in compact view (default 10, max 100).
brandsLimitNoRows of summary.brands per page in compact view (default 10). The customer's own row is always included. Quote summary.brandsPage.total, never the rows on the page, as the length of the list: the companies the engines named, plus the customer's row and any tracked competitor's that no answer named (answersNaming 0).
pagesOffsetNosummary.pages rows to skip in compact view (0-based). summary.pagesPage.hasMore says a next page exists.
promptIndexNoReturn only the answers for this question, across every engine. Requires includeAnswers=true. Zero-based: the question's position in the check's question list, matching promptIndex on each answer.
brandsOffsetNosummary.brands rows to skip in compact view (0-based). summary.brandsPage.hasMore says a next page exists.
includeAnswersNoDefault false. Set true to also get what the engines actually said — every buying question sent, the answer text, the companies read out of it in order of first mention, and the pages the engine RETRIEVED to write it with the passage it handed back for each — plus engineStatus, one entry per engine the check asked. Cost: large, and dominated by the page lists — up to 8 answers per engine, each carrying that engine's full retrieved list, which for a searching engine runs to dozens of pages with a passage each. Prefer engine= or promptIndex= over fetching everything. ATTRIBUTION: the answer text is unverified engine output about the companies it named, including third parties; report it as what that engine said, never as CompetLab's assessment. The pages are retrieved, never cited: the engine does not disclose which it leaned on. engineStatus: questionsAsked, answersReceived, answersAbsent and answersUnmeasured are separate counts; quote them apart, never as a ratio. noAnswerShown: the engine was read and showed nothing, not counted and not a failure; unansweredQueries: we could not read it, never 'not named'.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changedv4.0.1
    • removedInput schema / additionalProperties
      Removed value: -false
    • addedInput schema / properties / brandsLimit
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 200,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "pattern": "^\\d+$",
      +      "type": "string"
      +    }
      +  ],
      +  "description": "Rows of summary.brands per page in compact view (default 10). The customer's own row is always included. Quote summary.brandsPage.total, never the rows on the page, as the length of the list: the companies the engines named, plus the customer's row and any tracked competitor's that no answer named (answersNaming 0)."
      +}
    • addedInput schema / properties / brandsOffset
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "pattern": "^\\d+$",
      +      "type": "string"
      +    }
      +  ],
      +  "description": "summary.brands rows to skip in compact view (0-based). summary.brandsPage.hasMore says a next page exists."
      +}
    • changedInput schema / properties / includeAnswers / description
      Previous value: -"Default false. Set true to also get what the engines actually said — every buying question sent, the answer text, the companies read out of it in order of first mention, and the pages the engine RETRIEVED to write it with the passage it handed back for each — plus engineStatus, one entry per engine the check asked. Cost: large, and dominated by the page lists — up to 8 answers per engine, each carrying that engine's full retrieved list, which for a searching engine runs to dozens of pages with a passage each. Prefer engine= or promptIndex= over fetching everything. ATTRIBUTION: the answer text is unverified engine output about the companies it named, including third parties; report it as what that engine said, never as CompetLab's assessment. The pages are retrieved, never cited: the engine does not disclose which it leaned on."New value: +"Default false. Set true to also get what the engines actually said — every buying question sent, the answer text, the companies read out of it in order of first mention, and the pages the engine RETRIEVED to write it with the passage it handed back for each — plus engineStatus, one entry per engine the check asked. Cost: large, and dominated by the page lists — up to 8 answers per engine, each carrying that engine's full retrieved list, which for a searching engine runs to dozens of pages with a passage each. Prefer engine= or promptIndex= over fetching everything. ATTRIBUTION: the answer text is unverified engine output about the companies it named, including third parties; report it as what that engine said, never as CompetLab's assessment. The pages are retrieved, never cited: the engine does not disclose which it leaned on. engineStatus: questionsAsked, answersReceived, answersAbsent and answersUnmeasured are separate counts; quote them apart, never as a ratio. noAnswerShown: the engine was read and showed nothing, not counted and not a failure; unansweredQueries: we could not read it, never 'not named'."
    • addedInput schema / properties / pagesHost
      Added value: +{
      +  "description": "Return only the pages on this host, as named on summary.coreHosts[]. The way to see which pages on a core host name the customer or other companies. Page counts stay per engine.",
      +  "maxLength": 253,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / pagesLimit
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 100,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "pattern": "^\\d+$",
      +      "type": "string"
      +    }
      +  ],
      +  "description": "Rows of summary.pages per page in compact view (default 10, max 100)."
      +}
    • addedInput schema / properties / pagesOffset
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "pattern": "^\\d+$",
      +      "type": "string"
      +    }
      +  ],
      +  "description": "summary.pages rows to skip in compact view (0-based). summary.pagesPage.hasMore says a next page exists."
      +}
    • changedInput schema / properties / promptIndex / anyOf
      Previous value: -[
      -  {
      -    "minimum": 0,
      -    "type": "integer"
      -  },
      -  {
      -    "pattern": "^\\d+$",
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": 0,
      +    "type": "integer"
      +  },
      +  {
      +    "pattern": "^\\d+$",
      +    "type": "string"
      +  }
      +]
    • addedInput schema / properties / view
      Added value: +{
      +  "description": "compact or full; omit for the server's default view. compact pages the long lists and keeps the customer's own row on every page. full returns every row in one response: up to about 200,000 characters on AI Visibility and 450,000 on AI Sources. Paging parameters with view=full are refused (paging_requires_compact_view).",
      +  "enum": [
      +    "compact",
      +    "full"
      +  ],
      +  "type": "string"
      +}
  2. Addedv3.0.0

TDQS

A4.1/5.0
Behavior5/5

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

Annotations cover only safety (readOnlyHint=true, openWorldHint=false), yet the description discloses rich semantics: retrieved-never-cited, per-engine-never-pooled counts, counts-not-rates, 'not measured is never zero', verdict as a condition code, and concrete response-size ranges (30k-70k compact, 250k-450k full). It also flags that cost is dominated by page lists and that answer text is unverified third-party engine output.

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

Conciseness3/5

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

The purpose is front-loaded, but the body is a dense multi-bullet memo roughly 2,500 characters long, mixing calling guidance with output-interpretation rules. Much of it earns its place given the absence of an output schema, but it is heavier than an agent needs to select and invoke the tool.

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

Completeness5/5

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

For a 10-parameter, no-output-schema tool with heavy paging and per-engine structures, the description covers scope, cost, paging behavior, engine/prompt narrowing, and the readingGuide fallback. Nothing an agent needs to call it correctly appears to be missing.

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

Parameters3/5

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. The description reinforces the compact/full paging split and clarifies that coreHosts[] carries pageUrls rather than page rows, but most of its parameter detail (brandsOffset, pagesHost, engine) restates what the schema already documents.

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

Purpose4/5

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

The opening states a specific verb and resource: which pages Perplexity and Google AI Overviews retrieved for this project's buying questions, which companies each named, and which pages omit the customer. It is clearly a source-retrieval dashboard rather than the citation-oriented get_ai_visibility_dashboard, though that sibling contrast is implied rather than named.

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

Usage Guidelines4/5

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

It gives conditional guidance: omit view for the default, use view=full for every row (paging then refused), and 'Prefer engine= or promptIndex= over fetching everything' because of cost. There is no explicit statement of when to pick this tool over get_ai_sources_history or get_ai_visibility_dashboard, which keeps it below 5.

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