Skip to main content
Glama

SEO GSC Wizard MCP

Estimated GA4 value per GSC query

get_query_value_attribution
Read-only

Use this when the user asks which queries bring GA4 value: estimates GA4 sessions, key events, and revenue per Search Console query via proportional click share: a query with 80% of a page's GSC clicks is credited 80% of that page's GA4 outcomes. Not for page totals: use get_blended_landing_pages. Page-level estimates with known blind spots (device/country/date mismatches are invisible; every click is treated as equally likely to convert). matchedClickShare (0-1) reports how much of the named-query click volume the estimates cover, and coverage.hiddenClicksShare (0-1) the share of the property's clicks with no query row, which gets no estimate; estRevenue appears only when the GA4 property records revenue. Rows run clicks descending, period by period with dateGranularity. Requires a GA4 property linked to the site in GSC Wizard; returns a notConfigured explanation otherwise. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).

Input Schema

NameRequiredDescriptionDefault
limitNoRows to return. Applies per period when dateGranularity is set.
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".
organicOnlyNoLimit GA4 outcomes to google / organic sessions so only organic value is distributed across queries. Default true; set false to distribute all-traffic GA4 outcomes.
dateGranularityNoSplit the range into periods and return one set of rows per period, each tagged with a `date` (the period start, clamped to the requested range). Use this to chart a tool's output over time instead of getting a single aggregate: "month" gives month-on-month, "week" gives Monday-aligned weeks, "day" gives a daily series. Default "none" returns one aggregate over the whole range, unchanged. `limit` applies per period when set. Comparison fields (prev*) compare each period against the period before it.none

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. 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."
      +}
  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.8/5.0
Behavior5/5

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

Annotations cover only the safety profile (readOnly/openWorld/non-destructive), and the description goes well beyond them with rich behavioral detail: the proportional-click-share methodology, explicit blind spots (device/country/date mismatches invisible, every click treated as equally likely to convert), the matchedClickShare and coverage.hiddenClicksShare metrics, conditional estRevenue, row ordering, per-period semantics, and data lags ~2-3 days. This is exactly the extra context the annotations cannot supply.

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 usage trigger, alternative, then methodology, then output caveats, then required setup and defaults. Every sentence carries signal, but the single dense paragraph runs long, and some output-field explanation (matchedClickShare, hiddenClicksShare) overlaps with the output schema, slightly diluting conciseness.

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?

For a nuanced estimation tool with 6 params and an output schema, the description covers trigger, method, caveats, prerequisite configuration, defaults and error behavior. An agent has everything needed to decide to call it and to interpret the estimates.

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 83%, so baseline is 3, but the description adds genuine meaning: date range is optional and defaults to the last 28 settled days, limit applies per period, and organicOnly governs whether all-traffic GA4 outcomes are distributed. It clarifies the date/period behavior in a way that complements rather than repeats 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 precise verb and resource: estimates GA4 sessions, key events and revenue per Search Console query, and spells out the estimation method (proportional click share). It explicitly distinguishes itself from the nearest sibling: 'Not for page totals: use get_blended_landing_pages.' An agent can pick it out of the sibling list without opening the 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?

Opens with a direct trigger ('Use this when the user asks which queries bring GA4 value') and names the exclusion plus the alternative tool. The GA4-linkage prerequisite and the notConfigured fallback further tell the agent when the call will and won't succeed.

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