Skip to main content
Glama

SEO GSC Wizard MCP

Generate full SEO report

generate_seo_report
Read-only

Use this when the user wants a full SEO report or health check for one property: runs the whole analysis suite in one call (overview, top queries/pages, countries & devices, CTR curve vs benchmark, opportunities, ranking changes, decaying content, query decay matrix, cannibalization, section breakdown, data coverage, sitemaps, GA4 when linked). Far faster than calling each analysis tool separately (one round trip, shared auth + property resolution, server-side parallel reads), and served from the ClickHouse warehouse when available. Not for one headline number: use get_site_summary. format="compact" gives a few numbers per section, each with a drill naming the tool and arguments that reproduce it: use it to answer from the numbers or to chain into those tools for follow-ups. format="html" (default) is a finished, self-contained report styled like the GSC Wizard app, to hand to the user. format="json" is every sub-result in full (large).

Input Schema

NameRequiredDescriptionDefault
daysNoLength of the reporting window (and each comparison window).
formatNohtml
siteUrlYesProperty URL from list_sites (e.g. "sc-domain:example.com").
includeSitemapNoFetch + join the property’s sitemap (adds a network fetch).

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. Changed22 schema fields changed
    • changedInput schema / properties / format / enum
      Previous value: -[
      -  "html",
      -  "json"
      -]New value: +[
      +  "html",
      +  "json",
      +  "compact"
      +]
    • 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."
      +}
  2. 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."
      +}
  3. First observed

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/openWorldHint/destructiveHint=false, so safety is covered; the description adds real behavioral context beyond that: single round trip, shared auth and property resolution, server-side parallel reads, and a ClickHouse warehouse serving path. It stops short of stating latency expectations, failure modes, or cost on large properties.

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?

Dense but front-loaded: the trigger, the scope, the differentiator, and the exclusion all arrive before the format detail. The long parenthetical enumeration of sub-analyses is the only place it could be trimmed, but it doubles as scope disclosure.

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 output schema exists, so return-value explanation is unnecessary, and the description still covers the decisions an agent must make: when to use it, when not to, and which format to request for which downstream behavior. Nothing material is missing for a 4-parameter, non-nested tool.

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 75%, and the description carries the key gap itself: it explains all three format values (compact with `drill` pointers, self-contained html default, full json) even though the schema's format enum has no description. It also gestures at the sitemap inclusion and analysis breadth, though `days` is left entirely 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 ('runs the whole analysis suite in one call' for a 'full SEO report or health check for one property') and enumerates the sub-analyses included. It explicitly distinguishes itself from the sibling get_site_summary, so an agent can pick it 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?

Gives an explicit trigger ('when the user wants a full SEO report or health check for one property') and an explicit exclusion with the alternative named ('Not for one headline number: use get_site_summary'). It also routes by output need via the format values.

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