Skip to main content
Glama

SEO GSC Wizard MCP

Cross-site performance summary

get_cross_site_summary
Read-only

Use this when the user asks how all their properties are doing, or which gained or lost most. Aggregates a last-N-days clicks/impressions summary across the account's registered Search Console properties (optionally filtered to those carrying a given tag), with a same-length prior period for comparison and per-site totals. Without a tag it also covers properties shared with the account (marked shared: true; tags are the caller's own, so a tag filter covers owned properties only). The MCP equivalent of the app's Global Reports page. Set includeSearchTypes to also split every property across web / image / video / news / discover, and includeCountries for a country leaderboard aggregated over the whole portfolio; their ctr and clickShare are 0-100. perSite and countries are sorted by clicks, descending. Each site routes independently to the ClickHouse warehouse or the live Search Console API, so dataSource is reported per site; a site whose read fails, or a share that no longer grants access, is reported in errors with a reason rather than failing the whole call, and the totals then cover only sitesIncluded properties, which warning says. Not for one property: use get_site_summary; for a tag's daily trend and top queries and pages use get_tag_group_view. Processes at most maxSites properties per call (default and maximum 100; scope.truncated says when more matched, so narrow by tag). The rate-limit cost scales with the number of properties and the breakdowns requested.

Input Schema

NameRequiredDescriptionDefault
tagNo
daysNo
maxSitesNoHow many properties to process, at most 100 (the default). When more match, `scope.truncated` is true; filter by `tag` to cover the rest.
searchTypeNoSearch type of the headline totals and the per-site comparison; `all` sums web, image, video, news and discover, like the app's "All" filter.web
countryLimitNoHow many countries to return when includeCountries is set.
includeCountriesNoAlso return a country leaderboard aggregated across every property, with the number of properties contributing to each country. Costs one extra read per property.
includeSearchTypesNoAlso break every property down by search type (web, image, video, news, discover) for the current period. Costs five extra reads per property.

Output Schema

NameRequiredDescriptionDefault
rangeNo
scopeNo
deltasNo
errorsNo
thenByNo
currentNo
listKeyNoName of the top-level field that holds the rows sortedBy describes.
perSiteNo
warningNoPresent only when the totals do not cover every property.
nextStepNo
orderingNo
previousNo
sortedByNo
countriesNo
sortOrderNo
thenOrderNo
comparisonNo
searchTypesNo
sitesFailedNoProperties left out of the totals, each named in errors.
countryTotalNo
emptyBecauseNo
methodLimitsNo
sitesIncludedNoProperties whose numbers are in the totals.
sharedLookupFailedNo
sharedLookupPartialNoSome properties shared with the caller could not be listed: the ones that could are in the totals, the rest are missing.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / listKey
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/tag",
      +  "description": "Name of the top-level field that holds the rows sortedBy describes."
      +}
  2. Changed2 schema fields changed
    • changedInput schema / properties / searchType / description
      Previous value: -"Search type of the headline totals and the per-site comparison."New value: +"Search type of the headline totals and the per-site comparison; `all` sums web, image, video, news and discover, like the app's \"All\" filter."
    • changedInput schema / properties / searchType / enum
      Previous value: -[
      -  "web",
      -  "image",
      -  "video",
      -  "news",
      -  "discover"
      -]New value: +[
      +  "web",
      +  "image",
      +  "video",
      +  "news",
      +  "discover",
      +  "all"
      +]
  3. Changed26 schema fields changed
    • changedOutput schema / additionalProperties
      Previous value: -falseNew value: +true
    • changedOutput schema / properties / countries / items / additionalProperties
      Previous value: -falseNew value: +true
    • changedOutput schema / properties / current / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "clicks": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/days"
      -      },
      -      "impressions": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/days"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "clicks": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/days"
      +      },
      +      "impressions": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/days"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / deltas / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "clicks": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/days"
      -      },
      -      "impressions": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/days"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "clicks": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/days"
      +      },
      +      "impressions": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/days"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / emptyBecause
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +}
    • changedOutput schema / properties / errors / items / additionalProperties
      Previous value: -falseNew value: +true
    • addedOutput schema / properties / errors / items / properties / code
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/tag",
      +  "description": "The error code the read failed with, as runTool would answer it."
      +}
    • addedOutput schema / properties / errors / items / properties / reason
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/tag",
      +  "description": "The refusal reason; 'share_inactive' for a share that no longer grants access, else 'read_failed'."
      +}
    • addedOutput schema / properties / errors / items / properties / shared
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/truncated"
      +}
    • addedOutput schema / properties / methodLimits
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +}
    • addedOutput schema / properties / nextStep
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +}
    • addedOutput schema / properties / ordering
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "sortOrder": {
      +            "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +          },
      +          "sortedBy": {
      +            "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +          },
      +          "thenBy": {
      +            "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +          },
      +          "thenOrder": {
      +            "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / perSite / items / additionalProperties
      Previous value: -falseNew value: +true
    • changedOutput schema / properties / previous / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "clicks": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/days"
      -      },
      -      "impressions": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/days"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "clicks": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/days"
      +      },
      +      "impressions": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/days"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / range / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "days": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/days"
      -      },
      -      "endDate": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/tag"
      -      },
      -      "startDate": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/tag"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "days": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/days"
      +      },
      +      "endDate": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +      },
      +      "startDate": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / scope / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "days": {
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "searchType": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/tag"
      -      },
      -      "sharedCount": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/days"
      -      },
      -      "siteCount": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/days"
      -      },
      -      "tag": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "truncated": {
      -        "type": [
      -          "boolean",
      -          "null"
      -        ]
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "days": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "searchType": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +      },
      +      "sharedCount": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/days"
      +      },
      +      "siteCount": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/days"
      +      },
      +      "tag": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "truncated": {
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / searchTypes / items / additionalProperties
      Previous value: -falseNew value: +true
    • addedOutput schema / properties / sharedLookupFailed
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/truncated"
      +}
    • addedOutput schema / properties / sharedLookupPartial
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/truncated",
      +  "description": "Some properties shared with the caller could not be listed: the ones that could are in the totals, the rest are missing."
      +}
    • addedOutput schema / properties / sitesFailed
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/days",
      +  "description": "Properties left out of the totals, each named in errors."
      +}
    • addedOutput schema / properties / sitesIncluded
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/days",
      +  "description": "Properties whose numbers are in the totals."
      +}
    • addedOutput schema / properties / sortOrder
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +}
    • addedOutput schema / properties / sortedBy
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +}
    • addedOutput schema / properties / thenBy
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +}
    • addedOutput schema / properties / thenOrder
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +}
    • addedOutput schema / properties / warning
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/tag",
      +  "description": "Present only when the totals do not cover every property."
      +}
  4. Changed2 schema fields changed
    • addedOutput schema / properties / perSite / items / properties / shared
      Added value: +{
      +  "$ref": "#/properties/scope/anyOf/0/properties/truncated"
      +}
    • changedOutput schema / properties / scope / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "days": {
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "searchType": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/tag"
      -      },
      -      "siteCount": {
      -        "$ref": "#/properties/scope/anyOf/0/properties/days"
      -      },
      -      "tag": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "truncated": {
      -        "type": [
      -          "boolean",
      -          "null"
      -        ]
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "days": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "searchType": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/tag"
      +      },
      +      "sharedCount": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/days"
      +      },
      +      "siteCount": {
      +        "$ref": "#/properties/scope/anyOf/0/properties/days"
      +      },
      +      "tag": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "truncated": {
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  5. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare read-only, open-world, non-destructive behavior. The description adds substantial context beyond them: per-site warehouse-vs-live-API routing, per-site error handling that reports failures in `errors` rather than failing the whole call, truncation via `scope.truncated`, rate-limit cost scaling with properties and breakdowns, and shared-property inclusion semantics.

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

Conciseness5/5

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

Dense but front-loaded: the first sentence states the user scenario, followed by scope, alternatives, failure behavior, and limits. Every sentence contributes operational detail for a tool with many edge cases; nothing is filler.

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?

Given the tool's complexity and the presence of an output schema, the description covers everything an agent needs: when to call, when not to call, scope of shared properties, per-site data sources, error handling, truncation, and cost trade-offs.

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 71%, so the baseline is 3, but the description meaningfully extends several parameters: `tag` is the caller's own and filters to owned properties, `includeSearchTypes` splits each property across web/image/video/news/discover, `includeCountries` aggregates a portfolio-wide leaderboard, and ctr/clickShare are on a 0-100 scale with perSite and countries sorted by clicks descending. `days` and `searchType` are left to the schema.

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: aggregates last-N-days clicks/impressions across all registered Search Console properties with prior-period comparison. Explicitly distinguishes itself from get_site_summary (one property) and get_tag_group_view (tag trend and top queries/pages).

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?

Opens with the exact user question this answers, then names the alternatives and when to use them instead: 'Not for one property: use get_site_summary; for a tag's daily trend and top queries and pages use get_tag_group_view.' Also clarifies that a tag filter covers owned properties only.

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