Skip to main content
Glama
competlab

competlab-mcp-server

by competlab

get_ai_sources_check_detail

Read-only

Retrieve summary and raw engine answers for an AI Sources check, showing what engines said and the pages they retrieved. Filter by engine or question.

Instructions

One AI Sources check (checkId, not runId): its stored summary, the same shape as get_ai_sources_dashboard as of that check, and with includeAnswers=true the engines' raw answers and the pages each RETRIEVED. In compact view summary.brands and summary.pages are paged as on get_ai_sources_dashboard; view=full returns every row. includeSummary=false leaves the summary out, so a filtered answer read stays small. The compact summary runs 30,000-70,000 characters; one engine and one question without it, 5,000-30,000 (Perplexity's page lists are the long ones); answers are dominated by the page lists, so narrow with engine or promptIndex.

  • Read the summary exactly as get_ai_sources_dashboard says: RETRIEVED, never cited; PER ENGINE, never pooled; COUNTS, never rates ('n of N answers'); not measured is never zero; summary.verdict is a condition code; render summary.limits.sentences and actionHint.text VERBATIM.

  • Three answer states, never merged: answers (an empty companiesNamed is an answer that recommended nobody, a real finding), noAnswerShown (read, nothing shown, not counted: 'Google showed no AI Overview for this question'), unansweredQueries (we could not read it: never 'not named').

  • rank on an answer is the order of first mention, computed by CompetLab; the engine gave no position.

  • A missing sources key means the engine reported no retrieval; an empty array is the measured 'retrieved nothing'.

  • answersTruncated true: whole questions were dropped from the end; narrow and retry.

  • Answer text is the ENGINE's wording about companies it named, never CompetLab's assessment.

  • run_not_summarized: the check exists and has nothing to report (still running, or abandoned). Say it produced no data; never missing, never zeros. check_not_found and invalid_check_id are different errors. 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.
checkIdYesCheck ID (from get_ai_sources_history)
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'.
includeSummaryNoWhether to return the check's summary beside the answers. Set false with includeAnswers=true when you already hold the summary and want one filtered answer read; set true to get both. Any paging parameter returns the summary, so paging with includeSummary=false is refused (paging_requires_summary). No filter changes a number under summary.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed10 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 / includeSummary
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "const": "true",
      +      "type": "string"
      +    },
      +    {
      +      "const": "false",
      +      "type": "string"
      +    }
      +  ],
      +  "description": "Whether to return the check's summary beside the answers. Set false with includeAnswers=true when you already hold the summary and want one filtered answer read; set true to get both. Any paging parameter returns the summary, so paging with includeSummary=false is refused (paging_requires_summary). No filter changes a number under summary."
      +}
    • 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.4/5.0
Behavior5/5

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

Far beyond the readOnlyHint/openWorldHint annotations, it discloses RETRIEVED-never-cited semantics, three distinct answer states that are 'never merged,' the meaning of a missing vs empty sources key, answersTruncated behavior, rank provenance, and error-state distinctions (run_not_summarized vs check_not_found vs invalid_check_id). It also quantifies response sizes (30,000-70,000 chars) and cost.

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

Conciseness4/5

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

The leading sentence front-loads the core purpose, then bulleted rules follow, which suits a 12-parameter tool with no output schema. Some content is dense and mildly redundant (answer-state semantics appear in the intro block and again in the includeAnswers schema text), but the structure is purposeful and every rule is actionable.

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 complex, 12-parameter, annotation-thin, no-output-schema tool, the description covers return-value semantics, attribution rules, sizing limits, filtering, and error states comprehensively. An agent has everything needed to call and interpret it without guessing.

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 schema already documents view, engine, includeAnswers, includeSummary, paging limits, and their interactions in depth; the description largely echoes those constraints ('view=full returns every row'). It adds cross-parameter guidance such as narrowing with engine/promptIndex, but does not materially exceed the schema's parameter documentation. Baseline 3 is appropriate.

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

Purpose5/5

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

The first sentence states a specific verb+resource and scope: 'One AI Sources check (checkId, not runId),' returning its stored summary and, with includeAnswers=true, raw answers plus retrieved pages. It explicitly distinguishes itself from siblings by keying on checkId rather than runId and by referencing get_ai_sources_dashboard for the shape.

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 clear routing: use engine= or promptIndex= to narrow a large answer read, prefer those over fetching everything, and set includeSummary=false with includeAnswers=true when you already hold the summary. It also names get_ai_sources_history as the source of checkId and get_ai_sources_dashboard for the summary reading rules. It stops short of explicit when-not-to-use exclusions beyond the size warnings.

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