Skip to main content
Glama

SEO GSC Wizard MCP

Merchant Center title hygiene

get_gmc_title_hygiene
Read-only

Use this when the user asks whether their Merchant Center titles or descriptions are too short, too long or duplicated. Title and description hygiene of the product catalog in the Google Merchant Center account linked to a GSC Wizard site: title length distribution (0-29 / 30-69 / 70-150 / 151+ characters), description length distribution (0-49 / 50-499 / 500-5000 / 5001+) and how many offers have no description, mean and median title length, duplicate titles (offers sharing the same normalised title, largest groups first), offers whose title repeats a word, and the most frequent title words with brand tokens flagged. Bands run shortest first and topWords most frequent first. Not for the scored 21-check feed audit: use get_feed_audit_results. Unlike the Title Hygiene report in the GSC Wizard app, which summarises every offer in the synced catalog, this tool always reads a live sample: the first limit products in feed order (default 2000, max 5000). truncated: true means the catalog had more, so the counts describe that sample; say so when quoting them, and point the user to the app report for full-catalog counts. topWords[].share is a 0-1 FRACTION of the sampled offers, not the 0-100 ctr percentage; lengths are in characters, CJK titles included. A catalog snapshot, so it takes no date range. 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.

Input Schema

NameRequiredDescriptionDefault
limitNoProducts to sample from the catalog, in feed order (default 2000, max 5000). The summary describes this sample; truncated says when the catalog had more.
siteUrlYesThe property URL as returned by list_sites (e.g. "sc-domain:example.com").
topWordsNoMost frequent title words to return (default 50, max 100).

Output Schema

NameRequiredDescriptionDefault
hintNo
noteNo
limitNo
rangeNo
reasonNo
thenByNo
accountNo
cjkNoteNo
listKeyNoName of the top-level field that holds the rows sortedBy describes.
sampledNo
siteUrlNo
cachedAtNo
nextStepNo
orderingNo
sortedByNo
topWordsNo
emptyNoteNo
sortOrderNo
thenOrderNo
truncatedNo
unitsNoteNo
dataSourceNo
offerCountNo
emptyBecauseNo
gmcAccountIdNo
methodLimitsNo
snapshotDateNo
cjkTitleCountNo
notConfiguredNo
avgTitleLengthNo
truncationNoteNo
truncationReasonNo
medianTitleLengthNo
variantsCollapsedNo
descriptionMissingNo
repeatedWordOffersNo
duplicateTitleGroupsNo
titleLengthHistogramNo
duplicateTitleGroupsLimitNo
descriptionLengthHistogramNo
duplicateTitleGroupsCappedNo

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
    • changedOutput schema / properties / duplicateTitleGroups / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "count": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "exampleOfferIds": {
      -          "anyOf": [
      -            {
      -              "items": {
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "key": {
      -          "$ref": "#/properties/siteUrl"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "count": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "exampleOfferIds": {
      +          "anyOf": [
      +            {
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "key": {
      +          "$ref": "#/properties/siteUrl"
      +        }
      +      },
      +      "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 / repeatedWordOffers / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "count": {
      -        "$ref": "#/properties/range/anyOf/0/properties/days"
      -      },
      -      "examples": {
      -        "anyOf": [
      -          {
      -            "items": {
      -              "additionalProperties": false,
      -              "properties": {
      -                "offerId": {
      -                  "$ref": "#/properties/siteUrl"
      -                },
      -                "title": {
      -                  "$ref": "#/properties/siteUrl"
      -                },
      -                "word": {
      -                  "$ref": "#/properties/siteUrl"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "count": {
      +        "$ref": "#/properties/range/anyOf/0/properties/days"
      +      },
      +      "examples": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "additionalProperties": true,
      +              "properties": {
      +                "offerId": {
      +                  "$ref": "#/properties/siteUrl"
      +                },
      +                "title": {
      +                  "$ref": "#/properties/siteUrl"
      +                },
      +                "word": {
      +                  "$ref": "#/properties/siteUrl"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "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 / titleLengthHistogram / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "count": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "key": {
      -          "$ref": "#/properties/siteUrl"
      -        },
      -        "label": {
      -          "$ref": "#/properties/siteUrl"
      -        },
      -        "max": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "min": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "count": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "key": {
      +          "$ref": "#/properties/siteUrl"
      +        },
      +        "label": {
      +          "$ref": "#/properties/siteUrl"
      +        },
      +        "max": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "min": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / topWords / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "brandTitles": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "isBrand": {
      -          "$ref": "#/properties/notConfigured"
      -        },
      -        "share": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "titles": {
      -          "$ref": "#/properties/range/anyOf/0/properties/days"
      -        },
      -        "word": {
      -          "$ref": "#/properties/siteUrl"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "brandTitles": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "isBrand": {
      +          "$ref": "#/properties/notConfigured"
      +        },
      +        "share": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "titles": {
      +          "$ref": "#/properties/range/anyOf/0/properties/days"
      +        },
      +        "word": {
      +          "$ref": "#/properties/siteUrl"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed3 schema fields changed
    • addedOutput schema / properties / cachedAt
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • addedOutput schema / properties / truncationReason
      Added value: +{
      +  "$ref": "#/properties/siteUrl"
      +}
    • addedOutput schema / properties / variantsCollapsed
      Added value: +{
      +  "$ref": "#/properties/range/anyOf/0/properties/days"
      +}
  4. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the read-only/non-destructive annotations: it discloses that results come from a live sample of the first `limit` products in feed order, that `truncated: true` means counts describe only that sample with an instruction to say so, that `topWords[].share` is a 0-1 fraction rather than a CTR percentage, and that a `notConfigured` result is returned instead of an error when Merchant Center is not linked.

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 and scoping facts, and most sentences carry distinct information. It is on the long side, with a few clauses (band boundaries, mean/median, brand-token flagging) that partially restate what the output schema already enumerates, but nothing is genuinely wasted.

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 sampled catalog tool with a 3-param schema, full schema descriptions and an output schema, the description supplies everything an agent still needs: sampling limits, truncation caveats, unit conventions, no-date-range semantics, and the not-configured behavior. Nothing material 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 100%, so the baseline is 3; the description adds real value by explaining the consequence of `limit` (the summary describes only that sample, with truncation flagging) and by stating that bands run shortest-first and topWords most-frequent-first, an ordering the schema does not specify. It does not add anything for `siteUrl` beyond the GSC Wizard linkage already implied.

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 resource (Merchant Center title/description hygiene) with a concrete enumeration of what is measured (length bands, duplicates, word frequency). It explicitly distinguishes itself from the sibling get_feed_audit_results and from the in-app Title Hygiene report, so an agent can tell it apart 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 an explicit trigger ("Use this when the user asks whether their ... titles or descriptions are too short, too long or duplicated") and names the exclusion plus alternative ("Not for the scored 21-check feed audit: use get_feed_audit_results"). It also routes the user to the app report when full-catalog counts are needed, covering the when-not case.

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