Skip to main content
Glama

SEO GSC Wizard MCP

Merchant Center competitors

get_gmc_competitors
Read-only

Use this when the user asks who their Google Shopping competitors are or how their visibility compares. Competitive visibility from the Google Merchant Center account linked to a GSC Wizard site, for one (country, Google product category, traffic source) cell. "competitor" (default) returns one row per day per competing domain (rank, relativeVisibility, adsOrganicRatio, pageOverlapRate, higherPositionRate) plus a per-domain roll-up over the window; "top_merchant" one aggregate row per domain for the window (Google exposes no date there); "benchmark" one row per day with yourDomainVisibilityTrend and categoryBenchmarkVisibilityTrend, both relative to the start of the window. Rows are ordered by date, then rank (top_merchant: by rank), and domains by avgRank. relativeVisibility and adsOrganicRatio are RATIOS (200 = two hundred times as often as you); pageOverlapRate, higherPositionRate and the trends are 0-1 FRACTIONS as Google reports them (0.12 = 12%), not the 0-100 percentage ctr uses elsewhere in this server. Not for prices or best sellers: use get_gmc_pricing_insights or get_gmc_best_sellers. countryCode (ISO 3166-1 alpha-2) and categoryId (Google product taxonomy id, digits) are both required because the Merchant API answers one cell per request. reportUnavailable (with no rows) means Google refuses this report for the Merchant Center account (eligibility); the other reports are unaffected. Returns a notConfigured result (not an error) when Merchant Center is not connected or no Merchant Center account is linked to the site in the GSC Wizard app. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).

Input Schema

NameRequiredDescriptionDefault
viewNo"competitor" (daily rows per competing domain, the default), "top_merchant" (one aggregate row per domain for the window) or "benchmark" (daily trend of your domain against the category benchmark).competitor
limitNoRows to return, ordered by (date, rank, domain) (default 50, max 200). The per-domain roll-up in `domains` always covers every fetched row regardless of this cap.
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".
siteUrlYesThe property URL as returned by list_sites (e.g. "sc-domain:example.com").
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".
categoryIdYesRequired. Google product taxonomy id as a digits-only string (e.g. "166" for Apparel & Accessories, "222" for Electronics). Top-level ids work for every account.
countryCodeYesRequired. Report country as ISO 3166-1 alpha-2 (e.g. "US", "NL"). Case-insensitive.
trafficSourceNo"ORGANIC" (free listings, the default), "ADS" or "ALL".ORGANIC

Output Schema

NameRequiredDescriptionDefault
hintNo
rowsNo
viewNo
rangeNo
reasonNo
thenByNo
accountNo
domainsNo
hasMoreNo
listKeyNoName of the top-level field that holds the rows sortedBy describes.
siteUrlNo
cachedAtNo
nextStepNo
orderingNo
rowCountNo
sortedByNo
emptyNoteNo
sortOrderNo
thenOrderNo
truncatedNo
unitsNoteNo
categoryIdNo
dataSourceNo
yourDomainNo
countryCodeNo
emptyBecauseNo
gmcAccountIdNo
methodLimitsNo
notConfiguredNo
trafficSourceNo
truncationNoteNo
fetchedRowCountNo
truncationReasonNo
reportUnavailableNo

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. Changed13 schema fields changed
    • changedOutput schema / additionalProperties
      Previous value: -falseNew value: +true
    • changedOutput schema / properties / domains / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "avgAdsOrganicRatio": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "avgHigherPositionRate": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "avgPageOverlapRate": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "avgRank": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "avgRelativeVisibility": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "bestRank": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "days": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "domain": {
      -          "$ref": "#/properties/siteUrl"
      -        },
      -        "isYourDomain": {
      -          "$ref": "#/properties/notConfigured"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "avgAdsOrganicRatio": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "avgHigherPositionRate": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "avgPageOverlapRate": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "avgRank": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "avgRelativeVisibility": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "bestRank": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "days": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "domain": {
      +          "$ref": "#/properties/siteUrl"
      +        },
      +        "isYourDomain": {
      +          "$ref": "#/properties/notConfigured"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • 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 / 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"
      +  }
      +]
    • changedOutput schema / properties / reportUnavailable / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "message": {
      -        "$ref": "#/properties/siteUrl"
      -      },
      -      "reason": {
      -        "$ref": "#/properties/siteUrl"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "message": {
      +        "$ref": "#/properties/siteUrl"
      +      },
      +      "reason": {
      +        "$ref": "#/properties/siteUrl"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / rows / items / additionalProperties
      Previous value: -falseNew value: +true
    • 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"
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / reportUnavailable
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "message": {
      +          "$ref": "#/properties/siteUrl"
      +        },
      +        "reason": {
      +          "$ref": "#/properties/siteUrl"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  4. Changed2 schema fields changed
    • addedOutput schema / properties / cachedAt
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • addedOutput schema / properties / truncationReason
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
  5. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare read-only/non-destructive/open-world; the description adds substantial behavior beyond them: `reportUnavailable` means Google refuses the report for that account and other reports are unaffected, `notConfigured` is returned as a result rather than an error when Merchant Center isn't connected, data lags ~2-3 days, and top_merchant exposes no date dimension. These are exactly the failure-mode details an agent cannot infer.

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 triggering scenario and zero filler sentences — units, ordering, and failure semantics all earn their place. The main cost is density: everything is packed into one long paragraph rather than split into scannable clauses, which makes the view-mode distinctions slower to parse.

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 3-required-param tool with three distinct report modes, the description covers triggers, mode selection, output ordering, units, date-window defaults, and two non-error failure states. With an output schema present it correctly does not waste space re-describing field structure, only the units and ordering an agent needs.

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 100%, so the baseline is 3, but the description adds real meaning the schema lacks: why countryCode and categoryId are mandatory (one cell per request), and that omitting startDate/endDate yields the last 28 settled days. It also documents the unit contract of the returned fields (ratios vs 0-1 fractions), which disambiguates usage of the parameters that drive those outputs.

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+resource (competitive visibility from the GMC account linked to a GSC site) and names the exact scenario that triggers it: "when the user asks who their Google Shopping competitors are or how their visibility compares." It also enumerates the three report shapes so the agent knows what each mode produces.

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?

Explicit when-to-use (competitor/visibility questions), explicit when-not-to-use with named alternatives ("Not for prices or best sellers: use get_gmc_pricing_insights or get_gmc_best_sellers"), and it justifies the two required params ("Merchant API answers one cell per request"). This is the full when/when-not/alternatives triad.

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