Skip to main content
Glama

SEO GSC Wizard MCP

Get site performance summary

get_site_summary
Read-only

Use this when the user asks how a property is doing overall: its total clicks, impressions, CTR and average position over the last N days (default 28), against a same-length prior period. Use it for quick health checks before drilling into details. Not for per-query or per-page rows: use query_search_analytics. Served from the ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). For an explicit window pass startDate/endDate (YYYY-MM-DD) instead: a date you pass always wins, and days only sizes an edge you leave out. The comparison period is always the same length as the window and sits immediately before it. ctr is a 0-100 percentage and avgPosition is impression-weighted, as Search Console reports it. dailyRows is the window day by day and previousDailyRows the comparison period day by day, in the same shape, both sorted by date, oldest first; previousDailyRows is omitted for a window longer than 180 days.

Input Schema

NameRequiredDescriptionDefault
daysNoLength of the trailing window in days (default 28, max 180). Ignored for any edge you pin with startDate/endDate; when exactly one of those is given it sizes the other edge.
brandNoOptional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options.
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 window ends at the latest settled Search Console date (data lags ~2-3 days). Passed alone, the window is `days` long and ends here. Never pass null or the string "null".
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 use the trailing `days` window instead (Search Console data lags ~2-3 days, so the window ends at the latest settled date). Passed alone, the window runs from here to the latest settled date. 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
contentGroupIdNoOptional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which.
topicClusterIdNoOptional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused.

Output Schema

NameRequiredDescriptionDefault
hintNo
kindNoWidget variant: "kpis", "table", or "sections".
kpisNoKPI cards (kind="kpis").
noteNoCaveat about the result, when the tool returned one.
rowsNoData rows (kind="table").
notesNoCaveats about the result, when the tool returned several.
scopeNoThe brand, content group or topic cluster filter these numbers are narrowed to; absent when the call was unscoped and the numbers cover the whole property.
titleNo
blocksNoStacked sub-blocks (kind="sections").
reasonNo
sourceNo
thenByNoSecondary sort field, when the tool states one.
accountNo
columnsNoColumn defs (kind="table").
warningNoA caveat that changes how the numbers read.
coverageNoHow much of the property total the returned rows cover, with the property totals inline. Quote totals from here; do not sum the rows.
nextStepNo
orderingNoSort order per list, when the result holds several lists.
sortedByNoRow field the rows are sorted by.
timeZoneNoGA4 property's IANA reporting time zone.
emptyTextNo
siteScopeNoSet when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites.
sortOrderNo"asc" or "desc".
thenOrderNoThe tie-break's direction, present only when it differs from sortOrder.
partialDaysNoRequested days after settledThrough; their numbers are still incomplete.
dataMaturityNo
emptyBecauseNo
methodLimitsNo
notConfiguredNo
reauthRequiredNo
settledThroughNoLast day the data is complete through.
comparisonHasDataNofalse when the comparison period has no data at all, so there is no comparison.
coverageUnavailableNoWhy coverage is null, when it is.

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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."
  2. Changed1 schema field changed
    • addedInput schema / properties / searchType
      Added value: +{
      +  "default": "web",
      +  "description": "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.",
      +  "enum": [
      +    "web",
      +    "image",
      +    "video",
      +    "news",
      +    "discover",
      +    "googleNews",
      +    "all"
      +  ],
      +  "type": "string"
      +}
  3. Changed21 schema fields changed
    • changedOutput schema / additionalProperties
      Previous value: -falseNew value: +true
    • addedOutput schema / properties / account
      Added value: +{
      +  "$ref": "#/properties/title"
      +}
    • addedOutput schema / properties / coverage
      Added value: +{
      +  "description": "How much of the property total the returned rows cover, with the property totals inline. Quote totals from here; do not sum the rows."
      +}
    • addedOutput schema / properties / coverageUnavailable
      Added value: +{
      +  "$ref": "#/properties/kind",
      +  "description": "Why coverage is null, when it is."
      +}
    • changedOutput schema / properties / dataMaturity / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "dateBasis": {
      -        "$ref": "#/properties/title"
      -      },
      -      "firstIncompleteDate": {
      -        "$ref": "#/properties/title"
      -      },
      -      "note": {
      -        "$ref": "#/properties/title"
      -      },
      -      "probe": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "dataState": {
      -                "$ref": "#/properties/title"
      -              },
      -              "endDate": {
      -                "$ref": "#/properties/title"
      -              },
      -              "searchType": {
      -                "$ref": "#/properties/title"
      -              },
      -              "startDate": {
      -                "$ref": "#/properties/title"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "settledThrough": {
      -        "$ref": "#/properties/title"
      -      },
      -      "source": {
      -        "$ref": "#/properties/title"
      -      },
      -      "warehouseCutoff": {
      -        "$ref": "#/properties/title"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "dateBasis": {
      +        "$ref": "#/properties/title"
      +      },
      +      "firstIncompleteDate": {
      +        "$ref": "#/properties/title"
      +      },
      +      "note": {
      +        "$ref": "#/properties/title"
      +      },
      +      "probe": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": true,
      +            "properties": {
      +              "dataState": {
      +                "$ref": "#/properties/title"
      +              },
      +              "endDate": {
      +                "$ref": "#/properties/title"
      +              },
      +              "searchType": {
      +                "$ref": "#/properties/title"
      +              },
      +              "startDate": {
      +                "$ref": "#/properties/title"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "settledThrough": {
      +        "$ref": "#/properties/title"
      +      },
      +      "source": {
      +        "$ref": "#/properties/title"
      +      },
      +      "warehouseCutoff": {
      +        "$ref": "#/properties/title"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / emptyBecause
      Added value: +{
      +  "$ref": "#/properties/title"
      +}
    • addedOutput schema / properties / hint
      Added value: +{
      +  "$ref": "#/properties/title"
      +}
    • addedOutput schema / properties / methodLimits
      Added value: +{
      +  "$ref": "#/properties/title"
      +}
    • addedOutput schema / properties / nextStep
      Added value: +{
      +  "$ref": "#/properties/title"
      +}
    • addedOutput schema / properties / notConfigured
      Added value: +{
      +  "$ref": "#/properties/comparisonHasData"
      +}
    • addedOutput schema / properties / ordering
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "sortOrder": {
      +            "$ref": "#/properties/title"
      +          },
      +          "sortedBy": {
      +            "$ref": "#/properties/title"
      +          },
      +          "thenBy": {
      +            "$ref": "#/properties/title"
      +          },
      +          "thenOrder": {
      +            "$ref": "#/properties/title"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Sort order per list, when the result holds several lists."
      +}
    • addedOutput schema / properties / partialDays
      Added value: +{
      +  "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames",
      +  "description": "Requested days after settledThrough; their numbers are still incomplete."
      +}
    • addedOutput schema / properties / reason
      Added value: +{
      +  "$ref": "#/properties/title"
      +}
    • addedOutput schema / properties / reauthRequired
      Added value: +{
      +  "$ref": "#/properties/notConfigured"
      +}
    • addedOutput schema / properties / scope
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": true,
      +      "properties": {
      +        "brand": {
      +          "$ref": "#/properties/kind",
      +          "description": "\"branded\" or \"non_branded\"."
      +        },
      +        "brandKeywordsSkipped": {
      +          "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames",
      +          "description": "Branded keywords that could not be compiled and were left out of the filter."
      +        },
      +        "contentGroup": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": true,
      +              "properties": {
      +                "id": {
      +                  "$ref": "#/properties/title"
      +                },
      +                "name": {
      +                  "$ref": "#/properties/title"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "topicCluster": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": true,
      +              "properties": {
      +                "id": {
      +                  "$ref": "#/properties/title"
      +                },
      +                "name": {
      +                  "$ref": "#/properties/title"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The brand, content group or topic cluster filter these numbers are narrowed to; absent when the call was unscoped and the numbers cover the whole property."
      +}
    • changedOutput schema / properties / siteScope / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "hostnames": {
      -        "anyOf": [
      -          {
      -            "items": {
      -              "type": "string"
      -            },
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "includesSubdomainsOf": {
      -        "$ref": "#/properties/title"
      -      },
      -      "note": {
      -        "$ref": "#/properties/title"
      -      },
      -      "sharedWithSites": {
      -        "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "hostnames": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "includesSubdomainsOf": {
      +        "$ref": "#/properties/title"
      +      },
      +      "note": {
      +        "$ref": "#/properties/title"
      +      },
      +      "sharedWithSites": {
      +        "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / sortOrder
      Added value: +{
      +  "$ref": "#/properties/kind",
      +  "description": "\"asc\" or \"desc\"."
      +}
    • addedOutput schema / properties / sortedBy
      Added value: +{
      +  "$ref": "#/properties/kind",
      +  "description": "Row field the rows are sorted by."
      +}
    • addedOutput schema / properties / thenBy
      Added value: +{
      +  "$ref": "#/properties/kind",
      +  "description": "Secondary sort field, when the tool states one."
      +}
    • addedOutput schema / properties / thenOrder
      Added value: +{
      +  "$ref": "#/properties/kind",
      +  "description": "The tie-break's direction, present only when it differs from sortOrder."
      +}
    • addedOutput schema / properties / warning
      Added value: +{
      +  "$ref": "#/properties/kind",
      +  "description": "A caveat that changes how the numbers read."
      +}
  4. Changed4 schema fields changed
    • addedOutput schema / properties / comparisonHasData
      Added value: +{
      +  "description": "false when the comparison period has no data at all, so there is no comparison.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / note
      Added value: +{
      +  "$ref": "#/properties/kind",
      +  "description": "Caveat about the result, when the tool returned one."
      +}
    • addedOutput schema / properties / notes
      Added value: +{
      +  "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames",
      +  "description": "Caveats about the result, when the tool returned several."
      +}
    • addedOutput schema / properties / siteScope
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "hostnames": {
      +          "anyOf": [
      +            {
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "includesSubdomainsOf": {
      +          "$ref": "#/properties/title"
      +        },
      +        "note": {
      +          "$ref": "#/properties/title"
      +        },
      +        "sharedWithSites": {
      +          "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Set when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites."
      +}
  5. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations it discloses non-obvious runtime behavior: served from the ClickHouse warehouse when available, otherwise the live Search Console API, surfaced via `dataSource`. It also defines the comparison period as always same-length and immediately prior, explains that `ctr` is a 0-100 percentage and `avgPosition` is impression-weighted, and notes `previousDailyRows` is omitted for windows over 180 days.

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 trigger condition and scope, then constraints, then return-shape notes; every clause carries information. It is dense and long for a summary tool, and the trailing dailyRows/previousDailyRows sentences could be trimmed somewhat given an output schema exists, which keeps it off a 5.

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?

An 8-parameter tool with an output schema; the description still covers defaults, the date-lag behavior (~2-3 days) so the agent needn't compute the latest settled date, comparison-period semantics, and the >180-day truncation rule. Nothing an agent needs in order to call it correctly or interpret the result is 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 already 88%, so the baseline is 3; the description earns above that by stating the precedence rule compactly ("a date you pass always wins, and `days` only sizes an edge you leave out") and by supplying the date format, which ties the interacting window parameters together in one place. It does not add new coverage for the enum filters (brand, searchType, contentGroupId, topicClusterId), which the schema already handles well.

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+resource (property-level summary of clicks, impressions, CTR, avg position) and pins the scope: whole-property totals over a trailing window versus a same-length prior period. It explicitly names the sibling it is not (per-query/per-page rows → query_search_analytics), so an agent can route without opening either 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?

"Use this when the user asks how a property is doing overall" plus "quick health checks before drilling into details" gives a concrete when, and "Not for per-query or per-page rows: use query_search_analytics" gives the explicit exclusion and alternative. Both directions of the routing decision are stated.

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