Skip to main content
Glama

SEO GSC Wizard MCP

Content group performance

get_content_group_performance
Read-only

Use this when the user asks how a section or content group of their site performs. Measures a property's content groups: clicks, impressions, CTR, impression-weighted average position, distinct page count and share of clicks per group (CTR and clickShare 0-100), plus an "uncategorized" bucket for pages no group claims. Pass groupId to drill into one group's top pages instead (by clicks, descending). Matching is first-match-wins in the groups' saved order, the same as the web app, and groups keep that order (matchOrder 1 first), not a ranking by clicks. Served from the GSC Wizard ClickHouse warehouse when available (where group totals are EXACT over every page of the property), otherwise from the live Search Console API over the top 25,000 pages by clicks (see dataSource and truncated). Not for the definitions: use list_content_groups (create_content_group adds one); for folder totals without saved groups use breakdown_by_path. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).

Input Schema

NameRequiredDescriptionDefault
limitNoRow cap for the groupId page drill-down.
endDateNoOptional. Window end as YYYY-MM-DD (e.g. 2026-05-31). You do NOT need to know today's date or the latest available date: omit this and the server uses the latest settled Search Console date (data lags ~2-3 days behind today). Never pass null or the string "null".
groupIdNoDrill into one group: returns its top pages instead of the per-group aggregates. Accepts a content group id or the literal "uncategorized".
siteUrlYes
startDateNoOptional. Window start as YYYY-MM-DD (e.g. 2026-05-03). You do NOT need to know today's date. Omit BOTH startDate and endDate to analyze the last 28 settled days automatically (Search Console data lags ~2-3 days). Never pass null or the string "null".
searchTypeNoSearch type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's "All" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty, and no position: it reads null, not 0.web
comparisonEndDateNoOptional. End of the comparison period as YYYY-MM-DD. Provide BOTH comparison dates to compare two periods; omit both for no comparison (prev* fields are then 0 and hasComparison false).
comparisonStartDateNoOptional. Start of the comparison period as YYYY-MM-DD. Provide BOTH comparison dates to compare two periods; omit both for no comparison (prev* fields are then 0 and hasComparison false).

Output Schema

NameRequiredDescriptionDefault
noteNo
pagesNo
rangeNo
groupsNo
thenByNo
groupIdNo
listKeyNoName of the top-level field that holds the rows sortedBy describes.
siteUrlNo
warningNo
nextStepNo
orderingNo
sortedByNo
groupNameNo
sortOrderNo
thenOrderNo
truncatedNo
dataSourceNo
groupCountNo
searchTypeNo
partialDaysNo
dataMaturityNo
emptyBecauseNo
methodLimitsNo
hasComparisonNo
uncategorizedNo
fallbackReasonNo
settledThroughNo
comparisonRangeNo
warehouseLatestDateNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / listKey
      Added value: +{
      +  "$ref": "#/properties/siteUrl",
      +  "description": "Name of the top-level field that holds the rows sortedBy describes."
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / searchType / description
      Previous value: -"Search type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's \"All\" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty."New value: +"Search type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's \"All\" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty, and no position: it reads null, not 0."
  3. Changed2 schema fields changed
    • addedInput schema / properties / searchType / description
      Added value: +"Search type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's \"All\" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty."
    • changedInput schema / properties / searchType / enum
      Previous value: -[
      -  "web",
      -  "image",
      -  "video",
      -  "news",
      -  "discover"
      -]New value: +[
      +  "web",
      +  "image",
      +  "video",
      +  "news",
      +  "discover",
      +  "googleNews",
      +  "all"
      +]
  4. Changed17 schema fields changed
    • changedOutput schema / additionalProperties
      Previous value: -falseNew value: +true
    • changedOutput schema / properties / dataMaturity / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "dateBasis": {
      -        "$ref": "#/properties/siteUrl"
      -      },
      -      "firstIncompleteDate": {
      -        "$ref": "#/properties/siteUrl"
      -      },
      -      "note": {
      -        "$ref": "#/properties/siteUrl"
      -      },
      -      "probe": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "dataState": {
      -                "$ref": "#/properties/siteUrl"
      -              },
      -              "endDate": {
      -                "$ref": "#/properties/siteUrl"
      -              },
      -              "searchType": {
      -                "$ref": "#/properties/siteUrl"
      -              },
      -              "startDate": {
      -                "$ref": "#/properties/siteUrl"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "settledThrough": {
      -        "$ref": "#/properties/siteUrl"
      -      },
      -      "source": {
      -        "$ref": "#/properties/siteUrl"
      -      },
      -      "warehouseCutoff": {
      -        "$ref": "#/properties/siteUrl"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "dateBasis": {
      +        "$ref": "#/properties/siteUrl"
      +      },
      +      "firstIncompleteDate": {
      +        "$ref": "#/properties/siteUrl"
      +      },
      +      "note": {
      +        "$ref": "#/properties/siteUrl"
      +      },
      +      "probe": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": true,
      +            "properties": {
      +              "dataState": {
      +                "$ref": "#/properties/siteUrl"
      +              },
      +              "endDate": {
      +                "$ref": "#/properties/siteUrl"
      +              },
      +              "searchType": {
      +                "$ref": "#/properties/siteUrl"
      +              },
      +              "startDate": {
      +                "$ref": "#/properties/siteUrl"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "settledThrough": {
      +        "$ref": "#/properties/siteUrl"
      +      },
      +      "source": {
      +        "$ref": "#/properties/siteUrl"
      +      },
      +      "warehouseCutoff": {
      +        "$ref": "#/properties/siteUrl"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / emptyBecause
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • changedOutput schema / properties / groups / items / additionalProperties
      Previous value: -falseNew value: +true
    • addedOutput schema / properties / groups / items / properties / matchOrder
      Added value: +{
      +  "$ref": "#/properties/range/anyOf/0/properties/days"
      +}
    • addedOutput schema / properties / methodLimits
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • addedOutput schema / properties / nextStep
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • addedOutput schema / properties / ordering
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "sortOrder": {
      +            "$ref": "#/properties/siteUrl"
      +          },
      +          "sortedBy": {
      +            "$ref": "#/properties/siteUrl"
      +          },
      +          "thenBy": {
      +            "$ref": "#/properties/siteUrl"
      +          },
      +          "thenOrder": {
      +            "$ref": "#/properties/siteUrl"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / pages / items / additionalProperties
      Previous value: -falseNew value: +true
    • addedOutput schema / properties / partialDays
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / range / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "days": {
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "endDate": {
      -        "$ref": "#/properties/siteUrl"
      -      },
      -      "startDate": {
      -        "$ref": "#/properties/siteUrl"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "days": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "endDate": {
      +        "$ref": "#/properties/siteUrl"
      +      },
      +      "startDate": {
      +        "$ref": "#/properties/siteUrl"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / sortOrder
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • addedOutput schema / properties / sortedBy
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • addedOutput schema / properties / thenBy
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • addedOutput schema / properties / thenOrder
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • changedOutput schema / properties / uncategorized / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "clickShare": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "clicks": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "color": {
      -        "$ref": "#/properties/siteUrl"
      -      },
      -      "ctr": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "groupId": {
      -        "$ref": "#/properties/siteUrl"
      -      },
      -      "impressions": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "name": {
      -        "$ref": "#/properties/siteUrl"
      -      },
      -      "pages": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "position": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "prevClicks": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "prevCtr": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "prevImpressions": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "prevPosition": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "clickShare": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "clicks": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "color": {
      +        "$ref": "#/properties/siteUrl"
      +      },
      +      "ctr": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "groupId": {
      +        "$ref": "#/properties/siteUrl"
      +      },
      +      "impressions": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "name": {
      +        "$ref": "#/properties/siteUrl"
      +      },
      +      "pages": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "position": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "prevClicks": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "prevCtr": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "prevImpressions": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "prevPosition": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / warning
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
  5. Changed2 schema fields changed
    • addedOutput schema / properties / fallbackReason
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • addedOutput schema / properties / warehouseLatestDate
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
  6. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare read-only/non-destructive; the description adds substantive behavior: warehouse vs live-API sourcing with the top-25,000-page truncation exposed via dataSource/truncated, exact vs approximate totals, the ~2-3 day data lag and 28-day default window, first-match-wins group ordering (matchOrder 1 first, not a click ranking), and the 'uncategorized' bucket. These are exactly the caveats an agent would otherwise get wrong.

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?

Front-loaded with the use case, then drill-down behavior, then matching semantics, then data-source caveats — a sensible priority order with no filler sentences. It is dense and long for a single paragraph, but nearly 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.

Completeness5/5

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 enumerate return fields, and it instead spends its words on the things structure cannot convey: data provenance, truncation, group match order, the uncategorized bucket, and default date handling. Nothing required to invoke or interpret it correctly appears missing.

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

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 88%, so the schema already carries most parameter meaning. The description still adds value the schema does not: groupId changes the response shape entirely (top pages, clicks descending) rather than filtering aggregates, and omitting both dates yields the last 28 settled days. It does not touch searchType or the comparison pair beyond what the schema already explains.

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?

States a specific verb and resource: measures a property's saved content groups with named metrics (clicks, impressions, CTR, impression-weighted position, page count, click share). It explicitly carves itself out from list_content_groups, create_content_group, and breakdown_by_path, so an agent can distinguish it from every nearby sibling 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.

Usage Guidelines5/5

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

Gives an explicit trigger ('when the user asks how a section or content group of their site performs'), an explicit mode switch ('pass groupId to drill into one group's top pages'), and explicit exclusions routed to named alternatives ('not for the definitions: use list_content_groups...; for folder totals without saved groups use breakdown_by_path').

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources