Skip to main content
Glama

SEO GSC Wizard MCP

GA4 error pages

get_ga4_error_pages
Read-only

Use this when the user asks which pages show visitors an error (a 404 or server error page) and how much traffic they get. Reports GA4 error pages for the property linked to a site: sessions, page views, active users and bounce rate per error page, broken down by page title AND URL, sorted by sessions, highest first. Not for Google's crawl or indexing status of a URL: use inspect_url. GA4 has no native 404 signal, so error pages are identified by matching the pageTitle dimension against saved patterns (operators contains / equals / starts_with / ends_with / regex, case-insensitive, OR-ed together). By default it uses the patterns saved for the site in GSC Wizard; pass titleFilters to override them for one call without saving anything. Returns notConfigured when Google Analytics is not connected or no GA4 property is linked, and noPatterns when the site has no saved patterns and none were passed. totals counts each session and user once across all matching pages (not the sum of the rows), and bounceRate is a fraction 0-1, not a percentage. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).

Input Schema

NameRequiredDescriptionDefault
limitNoHow many error-page rows to return, ordered by sessions.
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".
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".
titleFiltersNoOverride the page-title patterns for this call only (nothing is saved). Omit to use the patterns saved on the site in GSC Wizard's Error Pages report.
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
hintNo
rangeNo
reasonNo
thenByNo
totalsNo
accountNo
listKeyNoName of the top-level field that holds the rows sortedBy describes.
siteUrlNo
nextStepNo
orderingNo
patternsNo
sortedByNo
timeZoneNo
siteScopeNo
sortOrderNo
thenOrderNo
truncatedNo
dataSourceNo
errorPagesNo
noPatternsNo
prevTotalsNo
propertyIdNo
emptyBecauseNo
methodLimitsNo
hasComparisonNo
notConfiguredNo
patternSourceNo
reauthRequiredNo
comparisonRangeNo
matchedRowCountNo

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. Changed14 schema fields changed
    • changedOutput schema / additionalProperties
      Previous value: -falseNew value: +true
    • addedOutput schema / properties / emptyBecause
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • 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 / patterns / items / additionalProperties
      Previous value: -falseNew value: +true
    • changedOutput schema / properties / prevTotals / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "activeUsers": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "screenPageViews": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "sessions": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "activeUsers": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "screenPageViews": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "sessions": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "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 / siteScope
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": true,
      +      "properties": {
      +        "hostnames": {
      +          "anyOf": [
      +            {
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "includesSubdomainsOf": {
      +          "$ref": "#/properties/siteUrl"
      +        },
      +        "note": {
      +          "$ref": "#/properties/siteUrl"
      +        },
      +        "sharedWithSites": {
      +          "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames"
      +        }
      +      },
      +      "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 / totals / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "activeUsers": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "screenPageViews": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "sessions": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "activeUsers": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "screenPageViews": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "sessions": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed2 schema fields changed
    • addedOutput schema / properties / prevTotals
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "activeUsers": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "screenPageViews": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "sessions": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / reauthRequired
      Added value: +{
      +  "$ref": "#/properties/hasComparison"
      +}
  4. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly, openWorld, and non-destructive behavior, but the description adds substantial context beyond them: GA4 has no native 404 signal, error pages are identified by matching pageTitle with saved patterns, operators are case-insensitive and OR-ed, and titleFilters override saved patterns for one call without saving. It also discloses the notConfigured and noPatterns error responses, the meaning of totals (unique sessions/users, not row sums), bounceRate as a 0-1 fraction, and the default 28-day settled window with ~2-3 day lag.

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 description is front-loaded with the primary use case and sibling exclusion, then moves into mechanics and edge cases. It is longer than typical but dense with useful information; some sentences, such as the totals and bounceRate clarifications, are valuable, though the overall length could be tightened slightly.

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, annotations, output schema, and 86% schema description coverage, the description fills the remaining gaps an agent needs: how error pages are identified, what defaults apply, what error states mean, and how special return values should be interpreted. Nothing essential for correct invocation 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 description coverage is high at 86%, so the schema already explains most parameters. The description adds meaningful semantics for titleFilters (operators, case-insensitive matching, OR logic, override-only behavior) and the date range default, but does not explain limit or the comparison-period parameters, which the schema covers.

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 description states a specific verb, resource, and scope: reports GA4 error pages for the property linked to a site, including sessions, page views, active users, bounce rate, broken down by page title and URL. It clearly distinguishes itself from the sibling inspect_url by saying it is not for Google's crawl or indexing status.

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?

It explicitly names the triggering user question (which pages show visitors an error and how much traffic they get) and names the alternative tool, inspect_url, for crawl/index status. It also explains when to pass titleFilters versus relying on saved patterns, which covers the main usage decision.

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