SEO GSC Wizard MCP
Server Details
Ask your Search Console data in plain language and get real numbers, not guesses. The GSC Wizard MCP plugs your live Google Search Console data straight into Claude, ChatGPT, and any MCP-capable assistant - so the model reads your actual clicks, impressions, position and CTR instead of inventing them.
Glama couldn't complete the latest health check. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 10.1% over 58 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 126 tools
Most tool groups are described carefully and are distinct (Bing/Yandex/GA4/GMC families are clearly separated by source prefix), but there are real overlaps: query_search_analytics is explicitly a superset of query_top_queries/query_top_pages/query_countries/query_devices; get_site_summary vs get_cross_site_summary vs get_tag_group_view describe similar aggregations; inspect_url vs bulk_inspect_urls vs check_tracked_url_now all trigger URL inspections; and add_site vs create_gsc_property are close cousins. Descriptions give enough guidance to pick correctly in most cases, but the surface is large enough that misselection is plausible.
Strong, predictable verb_noun snake_case convention throughout (list_*, get_*, create_*, update_*, delete_*, analyze_*, find_*, detect_*, compare_*, submit_*, manage_*), with consistent data-source prefixes get_bing_*, get_yandex_*, get_ga4_*, get_gmc_*. A few outliers break the pattern (breakdown_by_path, check_tracked_url_now, get_cross_site_summary) but the overall scheme is readable and consistent.
126 tools is far past any reasonable agent-facing surface, well above the 50+ extreme-mismatch threshold. The scope spans at least ten distinct domains (GSC analytics, Bing, Yandex, GA4, Merchant Center, indexing/IndexNow, sitemaps, tagging, shared reports, experiments, migrations), and even within a domain the set is bloated, making discovery and correct selection costly.
Coverage of the primary domains is very broad, with full CRUD on content groups, topic clusters, saved filters, annotations, tags, and migration redirects. Minor dead ends exist: experiments can be listed and scored but not created, report clients can be created/listed but not deleted, and sitemaps can be submitted but not removed.
Available Tools
128 toolsadd_migration_redirectsAdd migration redirect mappingsAInspect
Saves redirect mappings (old URL -> new URL) for a site migration, tied to the source property A and target property B they move traffic between. These back the Migration Compare workflow: use compare_migration for the before/after performance read, and these mappings to record which old URL became which new one. Pass label to keep several migrations apart on one account. Rows are APPENDED, never deduplicated against what is already stored, so re-sending the same list stores it twice; clear a set first with delete_migration_redirects if you are re-uploading.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Groups this batch, e.g. "2026-blog-restructure". Also what delete targets. | |
| siteUrlA | Yes | Source property (the old site), as registered in GSC. | |
| siteUrlB | Yes | Target property (the new site), as registered in GSC. | |
| redirects | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| label | No | |
| skipped | No | |
| inserted | No | |
| siteUrlA | No | |
| siteUrlB | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a non-obvious behavioral trait beyond the annotations: rows are APPENDED, never deduplicated, so re-sending the same list stores it twice, with the remedy (delete first). Annotations only cover the safety profile (readOnly/destructive/openWorld), so this append semantics detail is genuinely additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then routing and the append caveat. Four sentences that mostly earn their place, though the compare_migration reference is slightly more verbose than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for this tool: output schema exists so return values needn't be described, annotations cover the safety profile, and the description supplies the append/dedup caveat, sibling routing, and label grouping semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema already documents siteUrlA/B, redirects, and label. The description reinforces A/B as source/target and explains label as the mechanism to keep migrations apart on one account, but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Saves redirect mappings (old URL -> new URL) for a site migration') and ties it to the source/target properties. It clearly distinguishes itself from siblings compare_migration (read) and delete_migration_redirects (clear).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use compare_migration for the before/after read, use these mappings to record old->new, and clear a set first with delete_migration_redirects when re-uploading. Both the when-to-use and the alternative are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_siteAdd a property to GSC WizardInspect
Registers a GSC property the user already has access to (in Google Search Console) inside GSC Wizard. The property URL must appear in Search Console and be VERIFIED for the connected Google account: an unverified property is rejected, because Google refuses every data request for one. It is not provisioned by this call. Pass a URL prefix (https://example.com/) or a domain property (sc-domain:example.com); the scheme and host are matched case-insensitively and a missing trailing slash is added. Adding a property that is already registered is not an error: the result has alreadyRegistered: true and the existing row (with activated, as in list_sites).
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| site | No | |
| message | No | |
| accountRepaired | No | |
| alreadyRegistered | No |
add_tracked_urlsAdd URLs to the indexing trackerAInspect
Adds URLs to the GSC Wizard Indexing Tracker for a property, creating the tracker if it does not exist yet. Each URL must belong to the property's domain. Enforces the 1,800-URL-per-tracker cap (URLs over the cap are skipped and reported). Newly added URLs start as "pending"; call check_tracked_url_now to inspect them immediately, or wait for the app's hourly cron.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | ||
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| added | No | |
| siteUrl | No | |
| requested | No | |
| trackerId | No | |
| alreadyTracked | No | |
| skippedOverCap | No | |
| capacityRemaining | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag readOnly=false, destructive=false, openWorld=true; the description adds substantial non-obvious behavior: tracker is created if absent, domain membership is enforced, the 1,800-URL cap silently skips and reports overflow, and new entries land in a 'pending' state. This is exactly the kind of side-effect and state-transition detail annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then constraints, then next-step guidance. Every sentence carries distinct, load-bearing information with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 creation behavior, the domain constraint, the cap edge case, and the resulting URL state. An agent has everything needed to call it correctly and interpret the outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the schema alone leaves the two parameters under-explained. The description compensates by clarifying that each URL must belong to the property's domain and that the 1800 limit is enforced with skip-and-report semantics rather than schema-level rejection, though it does not say what siteUrl format (property vs. full URL) is expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Adds URLs to the GSC Wizard Indexing Tracker for a property') and includes the auto-creation scope detail. It also names the follow-up sibling check_tracked_url_now, letting an agent distinguish this ingest tool from the inspection tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear operational context: URLs must belong to the property's domain, the 1,800 cap causes skips that are reported, and newly added URLs can be inspected via check_tracked_url_now rather than waiting for the hourly cron. It stops short of an explicit when-not-to-use statement (e.g., versus submit_indexnow_urls), so it falls just short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_cannibalizationAnalyze keyword cannibalizationRead-onlyInspect
Finds queries where multiple pages of the property compete for the same search, ranked by a cannibalization score (Shannon entropy over the pages’ impressions: higher means impressions split more evenly across pages, i.e. worse cannibalization). Served from the GSC Wizard ClickHouse warehouse when available: it keeps only queries ranked by at least two pages before any cut, then scores them most impressions first, up to 10,000 queries or 25,000 page-query rows, whichever comes first. Each query lists at most 50 pages (most impressions first); pageCount, totalClicks and totalImpressions always cover every competing page, and the score is taken over the listed ones. Otherwise the live Search Console API (see dataSource) reads the top 25,000 page-query rows by clicks, which drops zero-click competing pages first. truncated: true means the cut was hit; scanLimit is that cut (on the warehouse, the number of queries scored when truncated, else the query cap; on the live API, page-query rows). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| minImpressions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| siteUrl | No | |
| scanLimit | No | |
| truncated | No | |
| dataSource | No | |
| cannibalized | No | |
| dataMaturity | No | |
| minImpressions | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
analyze_ctr_curveAnalyze CTR-by-position curveRead-onlyInspect
Builds the property’s actual click-through-rate curve bucketed by average position (1-20) and compares each bucket to one or more industry benchmarks. Available sources: awr (Advanced Web Ranking 2026), awr2026 (AWR 2026 CTR study, organic across all SERPs), awrAio (same study, SERPs carrying an AI Overview), firstPageSage (First Page Sage 2026), sistrix (Sistrix 2024), backlinko (Backlinko 2019), or "all" (default) to compare against every source at once. Comparing awr2026 with awrAio is the AI Overview click tax for that position. Each bucket reports a benchmarks map (expected CTR per source) and a deltas map (actual minus expected; negative = underperforming); when a single source is selected the bucket also carries flat expectedCtr/ctrDelta. CTR values are percentages (0-100); deltas are percentage points. Served from the GSC Wizard ClickHouse warehouse when available, where every query in the window is measured; otherwise the live Search Console API (see dataSource), which returns only the top 25,000 queries by clicks. truncated: true means that cut was hit: zero-click queries are dropped first, so bucket CTRs read HIGH, not low. scanLimit is the cut applied (null on the warehouse, which has none). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| minImpressions | No | ||
| benchmarkSource | No | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| buckets | No | |
| siteUrl | No | |
| sources | No | |
| scanLimit | No | |
| truncated | No | |
| dataSource | No | |
| dataMaturity | No | |
| minImpressions | No | |
| settledThrough | No | |
| benchmarkSource | No | |
| warehouseLatestDate | No |
analyze_query_shapesQuery shape analysis (AI Mode fingerprints)ARead-onlyInspect
Classifies a property's queries by SHAPE to surface the fingerprints of AI Overviews / AI Mode fan-out traffic (the app's Query Analysis report). Buckets: reply artefacts ("yes", "show me"), pivot follow-ups ("what about gemini"), conversational questions, LLM tracker probes, agent harnesses, pasted strings, long uncategorised, and conventional keywords. Returns per-bucket query/click/impression counts and shares, zero-click counts, average position, and top example queries, plus an aiShaped roll-up of the conversational buckets. Heuristic pattern matching in 27 languages: it judges how a query LOOKS, not what the searcher meant, so treat single rows as evidence rather than proof. Reads the ClickHouse warehouse when available, else the live Search Console API. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| buckets | No | Optional. Only return these buckets, e.g. ["reply_artefact","pivot_follow_up","conversational_question"] for the AI-conversation shapes. Omit for all buckets. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| examplesPerBucket | No | How many top example queries (by impressions) to return per bucket. 0 returns counts only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| totals | No | |
| buckets | No | |
| siteUrl | No | |
| aiShaped | No | |
| languages | No | |
| truncated | No | |
| dataSource | No | |
| searchType | No | |
| candidateFiltered | No | |
| candidatesScanned | No | |
| questionFormQueries | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only safety (readOnly/openWorld), and the description adds real behavioral depth beyond them: the data-source fallback (ClickHouse warehouse else live Search Console API), the heuristic limitation ('judges how a query LOOKS, not what the searcher meant'), the single-row caveat, and the ~2-3 day settling lag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, followed by the taxonomy, then returns, then caveats and defaults. It is long, but every sentence carries information; the bucket parenthetical examples slightly pad the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter analytical tool with an output schema, an agent has everything needed: what it computes, the allowed buckets, the date defaults and lag, the data-source fallback, and the interpretation caveat. Return values are covered by the output schema and additionally summarized.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the description compensates: it enumerates the conceptual bucket groups with example queries, restates the optional date-range default behavior, and explains the aiShaped roll-up. It does not describe siteUrl or searchType, but the remaining schema descriptions are adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (classifies by SHAPE) and resource (a property's queries) with a clearly named goal (surfacing AI Overviews / AI Mode fan-out fingerprints). The bucket taxonomy and the aiShaped roll-up make it unmistakably distinct from siblings like get_query_shape_trend or query_top_queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the context of use (the app's Query Analysis report) and gives concrete operating instructions — omit dates for last 28 settled days, data lags 2-3 days. It does not explicitly name a sibling alternative or state when NOT to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_sampling_impactAnalyze GSC sampling / anonymization impactRead-onlyInspect
Estimates how much click/impression data Google Search Console hides through anonymization (privacy-threshold row dropping) for a property over a date range. Compares the per-day totals against the summed top query rows and top page rows; the gap is the lost share. On the live API path this reveals true GSC sampling. On the ClickHouse warehouse path the data is unsampled, so the reported loss reflects only top-N row truncation (see the note field). The response dataSource says which path served the request. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| totals | No | |
| siteUrl | No | |
| dataSource | No | |
| dataMaturity | No | |
| pageSampling | No | |
| querySampling | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
audit_onpage_seoOn-page SEO auditRead-onlyInspect
Crawls a property's pages and runs a technical on-page/SEO audit per URL: HTTP status, indexability (noindex / canonicalised), title & meta-description length, H1s, word count, canonical, internal/external links, image alt coverage, structured data, Open Graph, viewport, hreflang, and a scored list of issues by severity. Pass explicit urls, or omit them to audit the top pages by Search Console impressions. URLs must belong to the property. Fetches each page live and stops after about 50 seconds: when truncated is true, the pages in notAudited were not fetched, so call again with urls set to that list to finish.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | Explicit page URLs to audit (max 25). Omit to auto-pick top pages. | |
| maxUrls | No | How many pages to audit when auto-picking (default 10, max 25). | |
| siteUrl | Yes | ||
| minImpressions | No | When auto-picking, only consider pages with at least this many impressions (28-day). |
Output Schema
| Name | Required | Description |
|---|---|---|
| pages | No | |
| message | No | |
| siteUrl | No | |
| skipped | No | |
| summary | No | |
| crawlNote | No | |
| truncated | No | |
| budgetNote | No | |
| dataSource | No | |
| notAudited | No | |
| robotsNote | No | |
| contextNote | No | |
| auditedCount | No | |
| contextRange | No |
breakdown_by_pathBreakdown by subdomain / pathRead-onlyInspect
Aggregates page-level performance into a subdomain and first-folder breakdown. Each page URL is parsed and grouped by its host plus the first depth path segments (depth 1 -> /folder, depth 2 -> /folder/subfolder, etc.). Returns per-group clicks, impressions, CTR, impression-weighted average position, and the number of distinct pages. Served from the ClickHouse warehouse when available (every page is grouped), otherwise the live Search Console API (up to 25,000 page rows are grouped; see dataSource). truncated says when pages or groups were left out. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| limit | No | ||
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| depth | No | |
| range | No | |
| groups | No | |
| siteUrl | No | |
| truncated | No | |
| dataSource | No | |
| groupCount | No | |
| dataMaturity | No | |
| pageRowsCapped | No | |
| settledThrough | No | |
| truncationNote | No | |
| warehouseLatestDate | No |
bulk_inspect_urlsInspect multiple URLsInspect
Runs the Google URL Inspection API against a list of URLs, persisting each result to GSC Wizard's inspection history. Each result carries the verdict, coverage, the Google-selected and user-declared canonicals (null when Google did not report one) and a Search Console link. Google caps inspections at 2,000 per property per day (shared across the UI and every MCP call); this tool counts each inspection against that cap and stops once it is reached, returning the URLs it could not get to. A Google rate limit, quota refusal or property-level permission refusal also stops the run: the URLs not yet inspected come back skipped, with skipReason, and the result carries stopReason (and retryAfterSeconds when Google gave one). Call get_inspection_quota first if you want to see remaining headroom. Each inspection takes about 7 seconds at Google, run 5 at a time, so a call takes up to 25 URLs (about 35 seconds); for larger sets add them with add_tracked_urls and let the Indexing Tracker inspect them in the background (check_tracked_url_now inspects a few of them immediately).
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | Up to 25 URLs per call; use add_tracked_urls for more. | |
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| quota | No | |
| failed | No | |
| message | No | |
| results | No | |
| siteUrl | No | |
| skipped | No | |
| succeeded | No | |
| stopReason | No | |
| quotaExhausted | No | |
| retryAfterSeconds | No |
check_tracked_url_nowCheck tracked URLs nowInspect
Triggers an immediate Google URL Inspection for up to 10 tracked URLs in the GSC Wizard Indexing Tracker, updating each URL's status, warnings, and append-only history. Each result carries the Google-selected and user-declared canonicals (null when Google did not report one). Counts against the daily 2,000-inspection/property quota. If the quota is exhausted, the call returns a quota message instead of running. URLs are inspected five at a time (about 7 seconds each at Google). If Google rate-limits the property or refuses access to it, the URLs not yet inspected come back with skipped: true and a skipReason (plus retryAfterSeconds when Google gave one) and are left untouched; retry them later. Use sparingly; the app's hourly cron checks tracked URLs automatically. This is a server-side write and is audit-logged.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | ||
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| message | No | |
| results | No | |
| siteUrl | No | |
| stopped | No | |
| notChecked | No | |
| quotaExhausted | No |
compare_migrationCompare a site migration (A vs B)Read-onlyInspect
Before/after Search Console comparison for a site migration or restructure. Three modes: "cross-property" compares two GSC properties (old domain vs new); "two-urls" compares two URL-prefix sections within one property; "regex" splits one property by two regexes. Returns the daily clicks/impressions trend for each side, per-side totals, and the query and page winners/losers by click delta. Without goLiveDate both sides use the same date window (startDate/endDate): A vs B over one period. With goLiveDate it becomes a before/after comparison around the launch: side A is read over the before window and side B over the after window, placed by windowStrategy ("recent", the default: the last windowDays settled days vs the windowDays days before go-live; "from-go-live": the first windowDays days from go-live vs the windowDays days before it; "full": the 90 days before go-live vs everything since). windowDays defaults to 28; yoyBaseline compares with the same weeks a year earlier instead. The go-live result adds windows (dates, days since go-live, warnings), recoveryPct (B clicks per day as a % of A clicks per day; null under 10 baseline clicks) and trend buckets (lost / declined / stable / improved / new) for queries and pages; pages of two properties are joined by path. For the full health verdict (risk score, redirect checks, recommendations, projected recovery) use get_migration_health. Reads the ClickHouse warehouse when available, else the live Search Console API. Query and page lists cover at most the top 25,000 rows by clicks per side; truncated and truncationNote say when a cap was reached. Regexes are capped at 2,000 characters and must not nest quantifiers (for example (a+)+). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | cross-property | two-urls | regex. | |
| limit | No | Max query/page winners and losers to return per list (default 50). | |
| regexA | No | Side A page regex (required for regex mode). | |
| regexB | No | Side B page regex (required for regex mode). | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | Side A property (and the single property for two-urls/regex). | |
| siteUrlB | No | Side B property (required for cross-property). | |
| startDate | No | Optional. 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". | |
| goLiveDate | No | Optional. First day the new setup was live, as YYYY-MM-DD. When given, side A is read over the before window and side B over the after window around this date (see windowStrategy), and the result adds windows, recoveryPct and trend buckets. Do not combine with startDate/endDate. | |
| urlPrefixA | No | Side A URL prefix (required for two-urls): a full URL ("https://acme.com/old-blog/"), a host ("blog.acme.com/") or a path on any host ("/old-blog/"), as list_migrations returns them. | |
| urlPrefixB | No | Side B URL prefix (required for two-urls), in the same forms as urlPrefixA. | |
| windowDays | No | Only with goLiveDate. Window length in days for "recent" and "from-go-live" (default 28). Shortened to the post-launch days available. | |
| yoyBaseline | No | Only with goLiveDate. Compare the after window with the same weeks one year (364 days) earlier instead of the days before go-live, which removes seasonality. Default false. | |
| windowStrategy | No | Only with goLiveDate. "recent" (default): the last windowDays days vs the windowDays days before go-live, where the migration stands now. "from-go-live": the first windowDays days after go-live vs the windowDays days before, the launch dip included. "full": the 90 days before go-live vs every day since (lengths differ; per-day figures and recovery stay comparable). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| note | No | |
| pages | No | |
| range | No | |
| sides | No | |
| queries | No | |
| summary | No | |
| windows | No | |
| truncated | No | |
| dailyTrend | No | |
| dataSource | No | |
| recoveryPct | No | |
| recoveryNote | No | |
| truncationNote | No |
create_annotationCreate a chart annotationAInspect
Adds a chart annotation. Scope is "account" by default (visible only to the user); pass siteUrl to scope the annotation to a single property. Platform-wide annotations are reserved for system events and cannot be created via this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | ||
| label | Yes | ||
| siteUrl | No | Omit for account-wide; pass to scope to a property. | |
| category | No | ||
| eventDate | Yes | Required. The date the event occurred, as YYYY-MM-DD (e.g. 2026-06-08). | |
| description | No | ||
| clientRequestId | No | Optional idempotency key (a UUID, one per form session). Resending the same key returns the row the first call created instead of inserting a duplicate. |
Output Schema
| Name | Required | Description |
|---|---|---|
| annotation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the description's job is lighter. It adds real value by disclosing the default account-level visibility, the siteUrl scoping behavior, and the reserved platform-wide scope — none of which the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then scope semantics, then the exclusion. Every sentence carries information and none is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the safety profile is covered by annotations. The description is complete enough for an agent to call the tool correctly, with the main residual gap being its silence on the non-required fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 43% across 7 parameters, so the description is expected to compensate, but it only touches siteUrl — and largely repeats that parameter's own schema description. Terms like label, color, category, and description receive no clarification the schema doesn't already imply, leaving the low-coverage params underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Adds a chart annotation'), which is unambiguous against siblings like list_annotations, update_annotation, and delete_annotation. It does not, however, explicitly name a sibling or contrast with one, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: account scope is the default, pass siteUrl to narrow to a property, and platform-wide annotations are not creatable here. That last clause is a genuine when-not condition. It stops short of a 5 because it never names an alternative tool or workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_content_groupCreate a content groupInspect
Creates a content group partition on a property. Rules are an array of { type, value } objects (prefix / contains / regex / equals) that match URLs into the group. Group names are unique per site. A regex rule that cannot compile is rejected; one that is valid but unsupported by the warehouse (a lookahead, lookbehind or backreference) or skipped as ReDoS-prone is accepted and reported in ruleWarnings. Relay those to the user, since a skipped pattern matches no pages at all.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| color | No | ||
| rules | Yes | ||
| siteUrl | Yes | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| group | No |
create_gsc_propertyCreate GSC propertiesInspect
Creates one or more URL-prefix properties in Google Search Console (Webmasters sites.add) and registers them in GSC Wizard. Use this to add folder-level properties (e.g. https://example.com/blog/) that do not yet exist in Search Console. They are auto-verified if the connected Google account owns the parent domain property. parentSiteUrl is an existing GSC Wizard property whose Google account has access; the new properties inherit it. Every property URL must be under the parentSiteUrl domain (that domain or a subdomain of it). Created properties are added hidden and consume no plan slot until you show them with set_dashboard_visibility, which enforces the dashboard limit. For properties that already exist in GSC, use add_site instead.
| Name | Required | Description | Default |
|---|---|---|---|
| register | No | Also register the created properties in GSC Wizard (default true). | |
| propertyUrls | Yes | URL-prefix properties to create, e.g. ["https://example.com/blog/"]. Max 50. Each must be under the parentSiteUrl domain (that domain or a subdomain). | |
| parentSiteUrl | Yes | An already-registered GSC Wizard property whose Google account owns the domain. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| failed | No | |
| created | No | |
| results | No | |
| registered | No | |
| parentSiteUrl | No |
create_report_clientAdd a report clientInspect
Adds a client contact (an email address, plus an optional name) that shareable reports can then be granted to with manage_report_access. Adding a client does NOT email them and does not give them access to anything on its own; it only creates the contact. Emails are stored lowercased and must be unique per account; adding an address that already exists returns the existing client rather than failing.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| client | No | |
| created | No |
create_saved_filterCreate a saved filterAInspect
Stores a filter preset against a property, as the dashboard's filter panel would. filters is the list of filter rows (dimension / operator / value), in the same shape list_saved_filters returns, and filterLogic says whether they combine with AND or OR. Saving a preset does not apply it to anything on its own: it appears in the property's filter presets for the user to pick.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| filters | Yes | The filter rows, in the shape list_saved_filters returns. Pass [] for a preset with no rows. | |
| siteUrl | Yes | ||
| filterLogic | No | How the rows combine: "and" (default, every row must match) or "or" (any one row). Matches the dashboard's Match All / Match Any toggle. | |
| clientRequestId | No | Optional idempotency key (a UUID, one per form session). Resending the same key returns the row the first call created instead of inserting a duplicate. |
Output Schema
| Name | Required | Description |
|---|---|---|
| filter | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=false (a write) and destructiveHint=false, so the safety profile is covered. The description adds real behavioral value beyond that: a newly saved preset is inert until picked, and it surfaces in the property's presets. It does not mention error modes or duplicate-name handling, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then parameter semantics, then the key side-effect caveat. No filler and nothing repeated from the schema verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description supplies the essential side-effect behavior plus the shape reference for `filters`. It omits any auth/permission context and does not mention the idempotency behavior, which the schema covers for clientRequestId.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 60%, so the schema documents enum values and the filterLogic toggle reasonably well. The description adds a meaningful cross-reference by stating `filters` matches the shape that list_saved_filters returns, which helps an agent build the array. It does not cover the undocumented name/siteUrl parameters, so it falls short of full compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Stores a filter preset against a property.' It also clarifies the intended analogue ('as the dashboard's filter panel would'), which removes ambiguity about what a preset is. It stops short of explicitly contrasting with update_saved_filter or delete_saved_filter, so sibling differentiation is only implicit via the referencing of list_saved_filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (create a new preset that appears in the property's filter presets) but there is no explicit when-to-use versus update_saved_filter, nor prerequisites such as required scopes or property setup. The caveat that saving 'does not apply it to anything on its own' is genuinely useful context, though it describes effect rather than selecting between tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_topic_clusterCreate a topic clusterAInspect
Creates a topic cluster on a property by grouping keywords under a name. Cluster names are unique per property, and the call is idempotent: if the name already exists the existing cluster is returned with alreadyExisted: true instead of an error, so there is never anything to retry. Use update_topic_cluster to change an existing cluster's keywords. Keywords are stored as text and matched against GSC queries in the dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| siteUrl | Yes | ||
| keywords | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| cluster | No | |
| alreadyExisted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false. The description adds genuinely non-obvious behavior: idempotency with alreadyExisted: true returned instead of an error, name uniqueness per property, and that keywords are stored as text and matched against GSC queries. This exceeds what structured fields disclose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and effect, then the idempotency rule and sibling routing. Every clause earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format need not be spelled out, and the description still highlights the alreadyExisted flag. It omits permission/scope requirements and behavior on invalid input (e.g., empty or oversized keyword lists), leaving minor gaps for a write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning. It explains name (unique per property, with the already-exists consequence) and keywords (stored as text, matched against GSC queries); siteUrl's role is only implied by "on a property" and the 1000-keyword ceiling is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+effect: "Creates a topic cluster on a property by grouping keywords under a name." It distinguishes itself from update_topic_cluster and list_topic_clusters by scoping to creation/grouping, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative ("Use update_topic_cluster to change an existing cluster's keywords") and states the condition that selects it, plus the idempotent already-exists case so the agent knows a duplicate call needs no retry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_annotationDelete a chart annotationADestructiveInspect
Deletes a chart annotation by id. Only annotations the user owns can be removed; platform-scoped annotations cannot be deleted via this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| annotationId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| label | No | |
| deleted | No | |
| annotationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the destructive nature is covered. The description adds real value beyond the annotations by disclosing an authorization/ownership constraint on which annotations are eligible for deletion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action front-loaded and the constraint following immediately. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be explained, and the destructive annotation covers the safety profile. The ownership constraint completes the practical picture; only edge cases like deleting a non-existent id are left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the schema documents nothing about the single annotationId parameter. The description adds only 'by id', confirming the param's role but giving no format or sourcing guidance beyond the uuid type already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Deletes') and resource ('chart annotation') scoped by id. The purpose is unmistakable, though it does not explicitly name or contrast with siblings like create_annotation, update_annotation, or list_annotations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear exclusion: only user-owned annotations can be removed, while platform-scoped annotations cannot be deleted via this tool. This tells the agent when NOT to use it, though it doesn't route to alternatives (e.g., list_annotations to discover ids).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_content_groupDelete a content groupDestructiveInspect
Deletes a content group by id. The property it belongs to must be one you own or one shared with you with full access.
| Name | Required | Description | Default |
|---|---|---|---|
| groupId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| deleted | No | |
| groupId | No |
delete_migration_redirectsDelete migration redirect mappingsADestructiveInspect
Permanently deletes saved redirect mappings. Narrow the deletion with label and/or the A/B property pair; to delete EVERY mapping on the account you must pass confirmDeleteAll: true, since an unnarrowed delete would also wipe unrelated migrations. Preview exactly what would go with list_migration_redirects using the same filters first.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Only mappings carrying this label. | |
| siteUrlA | No | Only mappings whose source property is this. | |
| siteUrlB | No | Only mappings whose target property is this. | |
| confirmDeleteAll | No | Required when no label or property filter is given: deletes every mapping. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | |
| filters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description adds the critical guard behavior: unnarrowed deletes are blocked unless confirmDeleteAll is passed, and deletions are permanent. This is genuine behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all load-bearing: purpose, narrowing + guard, and the preview recommendation. The destructive scope is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. For a destructive, no-required-param tool, the description covers everything an agent needs to call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema baseline is 3, but the description adds the interplay between filters and confirmDeleteAll (that the flag is required precisely when no filter is supplied) and explains the A/B pair as source/target property narrowing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ("Permanently deletes saved redirect mappings") and its scope is unmistakable. It is clearly distinguishable from the sibling add_migration_redirects and from the read-only list_migration_redirects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to narrow (label and/or A/B property pair), when confirmDeleteAll: true is mandatory, and why (an unnarrowed delete would also wipe unrelated migrations). It also routes the agent to list_migration_redirects with the same filters as a preview step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_saved_filterDelete a saved filterDestructiveInspect
Deletes a saved filter preset by id. Presets belong to the property, so its owner or anyone with full access to it may delete any of them, as in the GSC Wizard app; read-only access is not enough.
| Name | Required | Description | Default |
|---|---|---|---|
| filterId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| deleted | No | |
| filterId | No |
delete_siteRemove a property from GSC WizardDestructiveInspect
Unregisters a property from GSC Wizard. Cascades to topic clusters, content groups, saved filters, inspections, and annotations scoped to this property. Does NOT remove the property from Google Search Console itself. Pass confirm=true to acknowledge; this guards against accidental deletes.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Required confirmation. Must be true. | |
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | |
| siteUrl | No |
delete_topic_clusterDelete a topic clusterDestructiveInspect
Deletes a topic cluster by id. The property it belongs to must be one you own or one shared with you with full access.
| Name | Required | Description | Default |
|---|---|---|---|
| clusterId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| deleted | No | |
| clusterId | No |
detect_anomaliesDetect traffic anomaliesRead-onlyInspect
Flags statistically anomalous days in a property's Search Console series for a chosen metric (clicks, impressions, CTR, or position). Uses a robust Modified Z-score with median absolute deviation and day-of-week baselines (mean absolute deviation when most days are identical, as on a low-traffic property), then scores each spike/drop by severity (critical → info). Days without rows count as zero for clicks and impressions, so a drop to zero (deindexing) is flagged; the 21-day minimum is measured in calendar days from the first day with data. CTR and position use only days with impressions. coverage reports the days analysed and how an empty tail at the end of the window was treated. Good for "did something break / spike on a specific day?". Reads the ClickHouse warehouse when available, else the live Search Console API.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Trailing days of daily data to analyze (min 21, default 90). | |
| metric | No | Which metric to scan for anomalies. | clicks |
| siteUrl | Yes | ||
| sensitivity | No | Modified Z-score threshold: lower = more sensitive (more anomalies). Default 3.5; 3-4 is typical. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| metric | No | |
| siteUrl | No | |
| summary | No | |
| coverage | No | |
| anomalies | No | |
| dataSource | No | |
| sensitivity | No | |
| dataMaturity | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
detect_change_pointsDetect traffic change pointsRead-onlyInspect
Finds the dates where a property's clicks or impressions shifted to a new sustained level (step changes / level shifts), reporting the before vs after average and the % change at each break. Unlike anomaly detection (one-off spikes), this locates durable regime changes: a migration, an algorithm update, a redesign. Each date is the day the shift is strongest (the first day of the new level). Days without rows count as zero, so a drop to zero (deindexing) is a change point; coverage reports how an empty tail at the end of the window was treated. Reads the ClickHouse warehouse when available, else the live Search Console API. When a shift starts from a zero baseline (beforeMean 0) it has no percentage: changePercent is 0 by convention, which does not mean no change; describe it as new traffic from zero using afterMean.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Trailing days of daily data to analyze (min 14, default 180). | |
| metric | No | Which metric to segment. | clicks |
| siteUrl | Yes | ||
| sensitivity | No | Mean-shift threshold in std-devs: lower = more sensitive (more change points). Default 2. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | No | |
| range | No | |
| metric | No | |
| siteUrl | No | |
| coverage | No | |
| dataSource | No | |
| sensitivity | No | |
| changePoints | No | |
| dataMaturity | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
find_decaying_contentFind decaying contentRead-onlyInspect
Finds queries or pages losing traffic between a baseline (earlier) period and a recent period, bucketed by severity of click loss (severe > 50%, moderate 20-50%, mild < 20%). Only keys with a meaningful baseline (clicks > 0 and impressions >= minImpressions) are considered. startDate/endDate is the RECENT period; comparisonStartDate/comparisonEndDate is the BASELINE period. For a full period-by-period matrix (clicks/impressions/position per month or week, like the app's Query Decay / Content Decay pages) use get_decay_overview instead. Returns at most limit rows (default 100, max 1000), worst decliners first. The baseline is scanned for its top scanLimit keys by clicks (warehouse: max(limit*10, 1000), capped at 50000; live API: 25000 rows per period). On the warehouse every scanned key's recent figure is exact. On the live API the recent period is its own top 25000, so a key missing from a full recent read is not known to be at zero: its recent clicks are at most the smallest count that read kept. When that ceiling is still below the key's baseline, the row is reported with recentIsUpperBound: true: recentClicks is the ceiling, the real loss is AT LEAST |clickChangePct|, severity is a floor, and its recent impressions and position are unknown (0). When the ceiling shows no loss, the key is left out and counted in unresolvedKeys. When the baseline window has a different length than the recent one, the comparison is per day: baseline clicks are scaled to the recent window's length (windowNormalization says so, and each row adds baselineClicksScaled; baselineClicks stays the raw total). positionDelta is 0 for a key with no recent row. truncated: true means a read hit its cap, so counts are measured within the scan, not across the whole property. Served from the GSC Wizard ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum decaying rows to return (1-1000). | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| dimension | No | page | |
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| minImpressions | No | ||
| comparisonEndDate | No | Optional. End of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to end a baseline of the same length here. | |
| comparisonStartDate | No | Optional. Start of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to start a baseline of the same length here. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| counts | No | |
| recent | No | |
| siteUrl | No | |
| baseline | No | |
| decaying | No | |
| dimension | No | |
| scanLimit | No | |
| truncated | No | |
| dataSource | No | |
| dataMaturity | No | |
| minImpressions | No | |
| settledThrough | No | |
| unresolvedKeys | No | |
| warehouseLatestDate | No | |
| windowNormalization | No |
find_page_poaching_opportunitiesFind page poaching opportunitiesRead-onlyInspect
Finds queries ranking just outside the top positions (between minPosition and maxPosition) and estimates the click upside of pushing them to a target position. The upside is computed from the property's OWN CTR at the target position (measured over every query in the window on the warehouse), not a broad industry benchmark, so the estimate reflects how this site actually converts impressions at that position. When the property has no queries at the target position, or fewer than 100 impressions there, it falls back to the industry benchmark named by fallbackBenchmark: awr (Advanced Web Ranking 2026, default), awr2026 (AWR 2026 CTR study, organic), awrAio (same study, SERPs with an AI Overview), firstPageSage (First Page Sage 2026), sistrix (Sistrix 2024), or backlinko (Backlinko 2019). The response reports targetCtr (the expected CTR used), ctrSource ("own" or the benchmark key) and ctrSourceNote (why). Sorted by potential click gain. Scans up to 25,000 queries: on the warehouse the ones with the most impressions; on the live API its click order. truncated: true means the scan hit that cap (scanNote says what that left out). Served from the GSC Wizard ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| maxPosition | No | ||
| minPosition | No | ||
| minImpressions | No | ||
| targetPosition | No | ||
| fallbackBenchmark | No | awr |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| params | No | |
| siteUrl | No | |
| scanNote | No | |
| ctrSource | No | |
| scanLimit | No | |
| targetCtr | No | |
| truncated | No | |
| dataSource | No | |
| dataMaturity | No | |
| ctrSourceNote | No | |
| opportunities | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
forecast_trafficForecast organic trafficRead-onlyInspect
Projects future Search Console clicks (or impressions) for a property using the app's forecasting model: multiplicative seasonal decomposition (ratio-to-moving-average) plus an auto-selected trendline (linear / polynomial / log / exponential / power by best R-squared), re-seasonalised for each future period. Optionally applies a manual growth rate and derives revenue from a conversion rate and average order value. History needs: weekly needs 13 complete weeks and monthly 6 complete months, after the first and last (possibly partial) period are dropped, so about 105 days (weekly) or 240 days (monthly) of data. Days and periods without rows count as zero. A constant history (for example all zero) gets a flat forecast with forecastNote. Reads the ClickHouse warehouse when available, else the live Search Console API.
| Name | Required | Description | Default |
|---|---|---|---|
| aov | No | Optional average order value (in currency units) used with cvr for revenue. | |
| cvr | No | Optional conversion rate as a decimal (0.025 = 2.5%) to derive forecast revenue. | |
| metric | No | Metric to forecast (treated as "sessions" by the model). | clicks |
| siteUrl | Yes | ||
| currency | No | Currency label for the revenue fields (display only). | USD |
| growthRate | No | Optional manual growth rate per period as a decimal (0.05 = +5%). Default 0. | |
| granularity | No | Forecast granularity. Weekly needs about 105 days of history (13 complete weeks), monthly about 240 days (6 complete months). | weekly |
| historyDays | No | Trailing days of history to fit on (default 480 ≈ 16 months; more improves seasonality). | |
| trendlineType | No | Force a trendline model, or "auto" for the best R-squared (default). | auto |
| compoundGrowth | No | Compound the growth rate across periods (default true). | |
| forecastPeriods | No | How many future periods (weeks or months) to project. Default 26. | |
| additionalSessions | No | Optional flat sessions added to every forecast period. Default 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| metric | No | |
| siteUrl | No | |
| currency | No | |
| forecast | No | |
| trendline | No | |
| dataSource | No | |
| granularity | No | |
| dataMaturity | No | |
| forecastNote | No | |
| historyRange | No | |
| settledThrough | No | |
| seasonalIndices | No | |
| historicalPeriods | No | |
| candidateTrendlines | No | |
| warehouseLatestDate | No |
generate_seo_reportGenerate full SEO reportARead-onlyInspect
Runs the full analysis suite for one property in a single call and returns a complete, self-contained HTML report styled like the GSC Wizard app (overview, top queries/pages, countries & devices, CTR curve vs benchmark, opportunities, ranking changes, decaying content, query decay matrix, cannibalization, section breakdown, data coverage, sitemaps). This is far faster than calling each analysis tool separately (one round trip, shared auth + property resolution, server-side parallel reads) and is served from the ClickHouse warehouse when available. Use format="html" (default) for a ready-to-open report, or format="json" for the underlying data bundle.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Length of the reporting window (and each comparison window). | |
| format | No | html | |
| siteUrl | Yes | Property URL from list_sites (e.g. "sc-domain:example.com"). | |
| includeSitemap | No | Fetch + join the property’s sitemap (adds a network fetch). |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Widget variant: "kpis", "table", or "sections". |
| kpis | No | KPI cards (kind="kpis"). |
| note | No | Caveat about the result, when the tool returned one. |
| rows | No | Data rows (kind="table"). |
| notes | No | Caveats about the result, when the tool returned several. |
| title | No | |
| blocks | No | Stacked sub-blocks (kind="sections"). |
| source | No | |
| columns | No | Column defs (kind="table"). |
| timeZone | No | GA4 property's IANA reporting time zone. |
| emptyText | No | |
| siteScope | No | Set when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites. |
| dataMaturity | No | |
| settledThrough | No | Last day the data is complete through. |
| comparisonHasData | No | false when the comparison period has no data at all, so there is no comparison. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so safety is covered. The description adds genuine behavioral context beyond them: single round trip, shared auth + property resolution, server-side parallel reads, and ClickHouse warehouse sourcing when available. It does not discuss cost/rate limits of the heavy aggregate call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first clause before the long section list, then closes with the performance rationale and format guidance. Every sentence carries information, though the parenthetical section catalog is dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need not be described, annotations cover the safety profile, and the description still supplies the aggregate-vs-single-tool framing and format semantics. Nothing an agent needs to select or invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 75% schema coverage, the schema already documents days, siteUrl and includeSitemap. The description adds meaning to the format enum by explaining html = ready-to-open report versus json = underlying data bundle, which the bare enum does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Runs the full analysis suite for one property in a single call') and enumerates the sections produced (overview, top queries/pages, CTR curve, cannibalization, etc.). It is clearly distinguishable from the individual analyze_* / get_* siblings by explicitly framing itself as the one-call aggregate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly contrasts with the alternative workflow ('far faster than calling each analysis tool separately') and gives format selection guidance (html default vs json for the data bundle). It lacks an explicit when-not-to-use statement (e.g. when you only need one section), so it falls short of the top mark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_infoGet account infoARead-onlyInspect
Returns the authenticated user, the connected Google accounts (email + scopes), and the subscription status. Useful as a first call to confirm the MCP server is wired up correctly and the user has the data sources you expect.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| user | No | |
| access | No | |
| apiKey | No | |
| subscription | No | |
| googleAccounts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds useful context beyond that by disclosing the payload contents (email, scopes, subscription) and the intended diagnostic role, though it says nothing about auth requirements or behavior when accounts are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both earning their place: the first enumerates the return payload, the second routes the agent to the right moment to call it. Front-loaded with the substantive content and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description is not obliged to detail return structure, yet it still summarizes the payload and gives the agent a clear reason to invoke the tool. For a zero-parameter read operation this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so per the rubric the baseline is 4. There is no parameter surface for the description to illuminate, and it does not need to compensate for any schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (returns) and enumerates the exact resource set: authenticated user, connected Google accounts with email + scopes, and subscription status. No sibling tool surfaces account/auth state, so it is unmistakably distinct from the list_* and get_* analytics tools around it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the use case as a diagnostic first call to verify the server is wired up and expected data sources are present. It does not need to name alternatives, since nothing else in the sibling set returns account context, but it stops short of stating any exclusions or failure conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bing_crawl_issuesBing crawl issuesARead-onlyInspect
URLs where Bing found crawl issues for a property: HTTP 4xx/5xx, 301/302 redirects, robots.txt blocks, DNS/timeout errors and malware, each with the HTTP code, inbound-link count, and decoded human-readable issue labels. Returns notConfigured: true when no Bing Webmaster API key is set up for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max issue URLs to return, most inbound links first (default 200, uncapped). | |
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| range | No | |
| issues | No | |
| siteUrl | No | |
| rowCount | No | |
| dataSource | No | |
| bingSiteUrl | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint, so the safety profile is covered. The description adds genuinely extra behavior beyond the annotations: the per-row output shape (HTTP code, inbound-link count, decoded labels) and the notConfigured:true fallback when no Bing Webmaster API key exists — useful edge-case disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core purpose and issue enumeration, then the fallback-state caveat. Every clause carries information; no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be restated. The description covers the resource, its issue taxonomy, and the missing-key edge case, so an agent has enough to call it correctly. The one omission is guidance on when to pick this over get_bing_crawl_stats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: limit is well documented in the schema, but siteUrl has no description. The description adds only a loose hint ('for a property') that maps to siteUrl, and does nothing to clarify the limit semantics already in the schema. Adequate but with a clear gap it does not compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('URLs where Bing found crawl issues for a property') and enumerates the exact issue categories (4xx/5xx, redirects, robots.txt, DNS/timeout, malware) plus per-row fields. This detail naturally distinguishes it from the sibling get_bing_crawl_stats, which is aggregated counts rather than a per-URL list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use, when-not, or alternative is named. Usage is only implied by the resource itself, and the sibling get_bing_crawl_stats (closest alternative) is never referenced. The stated notConfigured prerequisite is the only contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bing_crawl_statsBing crawl statsARead-onlyInspect
Bing's daily crawl statistics for a property (roughly the last 6 months): pages crawled, pages in the index, inbound links, and a breakdown of response codes (2xx, 301, 302, 4xx, 5xx), robots.txt blocks, crawl errors and malware flags. Returns notConfigured: true when no Bing Webmaster API key is set up for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". | |
| siteUrl | Yes | ||
| startDate | No | Optional. Window start as YYYY-MM-DD (e.g. 2026-01-01). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| daily | No | |
| range | No | |
| siteUrl | No | |
| rowCount | No | |
| dataSource | No | |
| bingSiteUrl | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely new behavior: the default window is 'roughly the last 6 months' when dates are omitted, and the call degrades to notConfigured: true when no Bing Webmaster API key exists for the property — a failure mode annotations do not capture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and scope, then a compact metric enumeration, then the notConfigured caveat. Two sentences, no filler. The metric list is long but each item is a distinct return dimension, so it earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers target, default window, returned metrics and the missing-API-key state for a read-only, single-required-param tool. Since an output schema exists, enumerating return fields in the description is optional rather than necessary, and pagination/cardinality behavior is unaddressed — minor gaps only.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: startDate and endDate are well documented in the schema (format, examples, 'never pass null'), while siteUrl has no description at all. The description partially compensates by calling the target a 'property', but it adds no date syntax, timezone, or window semantics beyond what the schema already states. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (Bing daily crawl statistics for a property) and enumerates exactly which metrics come back: pages crawled, index size, inbound links, response-code breakdown, robots.txt blocks, crawl errors and malware flags. That level of specificity lets an agent separate it from neighbors like get_bing_page_stats, get_bing_link_counts and get_bing_crawl_issues.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool for crawl/indexing health of a Bing property, and the notConfigured note signals a prerequisite. But there is no explicit when-to-use statement, no exclusion, and no routing to alternatives such as get_bing_crawl_issues for issue detail or get_bing_page_stats for traffic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bing_feedsBing submitted sitemapsARead-onlyInspect
Sitemaps and feeds submitted to Bing Webmaster Tools for a property, with each feed's decoded status (Success / Pending / Warning / Error), type (Sitemap / RSS / Atom / ...), submitted and last-crawled dates, URL count and file size. The Bing counterpart to list_sitemaps. Returns notConfigured: true when no Bing Webmaster API key is set up for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| feeds | No | |
| range | No | |
| siteUrl | No | |
| rowCount | No | |
| dataSource | No | |
| bingSiteUrl | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful behavioral context beyond the annotations: the decoded status vocabulary and the special return 'notConfigured: true when no Bing Webmaster API key is set up', which lets the agent anticipate an auth-related edge case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded and dense, with the field enumeration and the sibling comparison arriving early and no filler sentences. The two long sentences are somewhat packed, but every clause carries information (fields, statuses, counterpart, notConfigured behavior).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't detail return shapes, yet it still summarizes key fields and the notConfigured edge case, making the tool fully actionable. It is complete for a single-param read tool; only the siteUrl value expectation is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (siteUrl) with 0% schema description coverage, so the description carries the burden but only implicitly references it via 'for a property'. The parameter is largely self-describing by name, so little is lost, but the description adds no format, URL-normalization, or example guidance that would compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Sitemaps and feeds submitted to Bing Webmaster Tools for a property') and enumerates the returned fields so the agent knows exactly what data it gets. It explicitly distinguishes itself from the sibling list_sitemaps by calling itself 'the Bing counterpart', so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'The Bing counterpart to list_sitemaps' gives a clear context for when to reach for this tool over the general sitemap lister, which is strong routing guidance. However, it stops short of stating explicit when-not conditions or prerequisites (e.g., that a Bing property/API key must exist) beyond the notConfigured note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bing_keyword_statsBing keyword impression historyARead-onlyInspect
Bing Webmaster Tools' historical impression volume for a single keyword (weekly buckets), plus its broad-match impressions. This is Bing marketplace demand data, not tied to any of your properties, so it needs no siteUrl. Useful for gauging Bing search demand and seasonality for a term. Returns notConfigured: true when no Bing Webmaster API key is set up in the GSC Wizard app.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | Two-letter market/country code Bing scopes the demand to (default "us"). | us |
| keyword | Yes | The keyword / search term to look up. | |
| language | No | BCP-47 language tag for the market (default "en-US"). | en-US |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| count | No | |
| stats | No | |
| country | No | |
| keyword | No | |
| language | No | |
| dataSource | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful context beyond that: it is not tied to any property (no siteUrl), and it returns notConfigured: true when no API key is configured, which surfaces an auth-state behavior an agent would otherwise miss.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, then the property-independence, then the auth edge case. Efficient and no filler, though slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description still covers the notable notConfigured case. Complete enough for a single-keyword read tool; a note on how it differs from sibling Bing query tools would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so country/language/keyword are already documented in the schema. The description adds only the negative detail that no siteUrl is needed, which is helpful but not parameter-level semantics beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (historical impression volume for a single keyword) with scope qualifiers (weekly buckets, broad-match impressions) and explicitly anchors it to Bing Webmaster Tools marketplace data. Clear enough to distinguish from the sibling get_bing_query_stats/get_bing_query_page_stats calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Says it is 'useful for gauging Bing search demand and seasonality,' which implies the use case, but never states when to prefer it over the many sibling Bing tools (e.g., get_bing_query_stats) or any exclusion conditions. Context is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bing_link_countsBing inbound link countsARead-onlyInspect
Inbound (backlink) counts per URL that Bing Webmaster Tools has recorded for a property, one page of results at a time (Bing returns roughly 100 rows per page). Pass page to paginate; totalPages tells you how many pages exist. Returns notConfigured: true when no Bing Webmaster API key is set up for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Zero-based page index for pagination (default 0). | |
| limit | No | Max link rows to return from the page (default 100). Bing returns up to ~100 rows per page but large properties can exceed that; lower this to keep the payload small. | |
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| page | No | |
| links | No | |
| range | No | |
| siteUrl | No | |
| rowCount | No | |
| truncated | No | |
| dataSource | No | |
| totalPages | No | |
| bingSiteUrl | No | |
| pageRowCount | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=true, so the safety profile is covered. The description adds genuinely useful non-annotation context: ~100 rows per page, the totalPages pagination signal, and the notConfigured: true behavior when no Bing API key exists for the property.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what the tool returns before covering pagination and the notConfigured edge case. Tight and free of repetition, though the parenthetical about ~100 rows is partly duplicated by the `limit` schema description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 detail is not strictly required, yet the description still helpfully flags the totalPages and notConfigured fields. Combined with annotations covering safety, an agent has enough to call the tool correctly; the only gap is the undocumented siteUrl parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the schema already documents `page` and `limit` in detail with defaults and notes on large properties. The description reiterates the `page` semantics and adds totalPages, but does not compensate for the undocumented required `siteUrl` (only minLength: 1 in the schema).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: inbound/backlink counts per URL recorded by Bing Webmaster Tools for a property. It is meaningfully distinct from siblings like get_bing_page_stats or get_bing_traffic_stats, though it does not explicitly name those siblings to sharpen the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage of the pagination parameter is explained (pass `page`, totalPages tells you how many pages exist), which implies the tool is a paginated listing. However, there is no guidance on when to choose this tool over the many other Bing/GSC data tools, and no exclusions or prerequisites beyond the notConfigured note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bing_page_queriesBing queries for a pageARead-onlyInspect
The Bing search queries that led to ONE landing page (clicks, impressions, CTR as a 0-100 percentage, and impression-weighted average position per query). The per-page keyword view Bing Webmaster Tools shows when you drill into a URL, and the natural drill-down after get_bing_page_stats. Pass the page URL exactly as get_bing_page_stats returns it. Returns notConfigured: true when no Bing Webmaster API key is set up for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | The landing page URL to break down, exactly as get_bing_page_stats returns it (e.g. https://example.com/blog/post/). Bing matches the full URL, not a prefix. | |
| limit | No | Max queries to return, ranked by clicks then impressions (default 100, uncapped). | |
| endDate | No | Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". | |
| siteUrl | Yes | ||
| startDate | No | Optional. Window start as YYYY-MM-DD (e.g. 2026-01-01). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| page | No | |
| range | No | |
| queries | No | |
| siteUrl | No | |
| rowCount | No | |
| dataSource | No | |
| bingSiteUrl | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, destructiveHint false, openWorldHint), so the bar is lower. The description adds real behavioral context beyond them: the exact-URL matching requirement and the notConfigured: true fallback when no Bing API key exists for the property. It does not discuss rate limits or quota consumption, which would have earned a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the tool's purpose, then the drill-down relationship, the URL pitfall, and the notConfigured edge case. Each sentence earns its place; the first is dense but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value documentation is not required, yet the description still clarifies that CTR is a 0-100 percentage and position is impression-weighted. It also covers the no-API-key edge case. Only a note on result volume/pagination beyond the schema's 'uncapped' limit is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the schema already documents page, limit, startDate, and endDate including the exact-URL and no-null pitfalls. The description mostly repeats the URL-matching instruction rather than adding syntax or format meaning, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('The Bing search queries that led to ONE landing page') and enumerates the returned metrics, then explicitly positions itself against sibling get_bing_page_stats as its 'natural drill-down'. An agent can distinguish this from get_bing_query_stats or get_bing_page_stats without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context ('the natural drill-down after get_bing_page_stats') and a concrete prerequisite ('Pass the page URL exactly as get_bing_page_stats returns it'), which routes the agent correctly. It does not state when NOT to use it or name a competing per-page alternative, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bing_page_statsBing top pagesARead-onlyInspect
Top landing pages on Bing Webmaster Tools for a property, aggregated across the window (clicks, impressions, CTR as a 0-100 percentage, and impression-weighted average position). The Bing counterpart to query_top_pages. Returns notConfigured: true when no Bing Webmaster API key is set up for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max pages to return, ranked by clicks then impressions (default 100, uncapped). | |
| endDate | No | Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". | |
| siteUrl | Yes | ||
| startDate | No | Optional. Window start as YYYY-MM-DD (e.g. 2026-01-01). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| pages | No | |
| range | No | |
| siteUrl | No | |
| rowCount | No | |
| dataSource | No | |
| bingSiteUrl | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that: it discloses the aggregation window semantics and, importantly, the notConfigured: true return when no Bing API key is set up, which is non-obvious failure behavior an agent should anticipate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. Purpose and scope are front-loaded, and the counterpart routing hint follows immediately, so the most decision-relevant information comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it still covers purpose, scope, counterpart, and the key notConfigured error state. Only minor gaps remain, such as nothing on limit/ranking behavior, but those are handled by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75% and the parameters (limit, startDate, endDate, siteUrl) are largely self-documented in the schema. The description only indirectly touches the window parameters via 'aggregated across the window' and adds no syntax or default guidance beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (top landing pages on Bing Webmaster Tools) with explicit scope (aggregated across the window) and enumerates the metrics returned (clicks, impressions, CTR as 0-100 percentage, impression-weighted average position). It also positions itself against the sibling query_top_pages as the Bing counterpart, so an agent can route between Google and Bing data 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Naming query_top_pages as the counterpart implies when to reach for it (Bing instead of Google data), which is useful routing context. However, there is no explicit when-to-use/when-not statement or distinction from the other close Bing siblings such as get_bing_page_queries or get_bing_query_page_stats, leaving selection partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bing_query_page_statsBing query + page pairsRead-onlyInspect
Bing Webmaster Tools query+landing-page pairs for a property, aggregated across the window (clicks, impressions, CTR as a 0-100 percentage, and impression-weighted average position per pair). Shows which query drives each page on Bing, the basis for per-page keyword analysis and cannibalisation checks. Bing has no endpoint that returns these combinations, so they are assembled with one request per top page; pass query to pair from a single query instead, or use get_bing_page_queries for one page's queries. Coverage is bounded by seedLimit and by Bing's own top-value sampling, so totals are a lower bound (truncated says when). Returns notConfigured: true when no Bing Webmaster API key is set up for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max query/page pairs, ranked by clicks then impressions (default 100, uncapped). | |
| query | No | Optional. Pair from this single search query (Bing lists the pages that ranked for it) instead of fanning out over the top pages. Use it to answer "which pages compete for this term?". | |
| endDate | No | Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". | |
| siteUrl | Yes | ||
| seedLimit | No | How many top pages to expand into pairs (default 25, max 100). Each one is a separate Bing request, so raising it widens coverage but is slower and likelier to hit Bing rate limits. Only applies to the page fan-out, so a call that passes `query` uses it only if that path has to fall back to pairing by page. | |
| startDate | No | Optional. Window start as YYYY-MM-DD (e.g. 2026-01-01). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| notes | No | |
| pairs | No | |
| range | No | |
| siteUrl | No | |
| pairedBy | No | |
| rowCount | No | |
| seedCount | No | |
| truncated | No | |
| dataSource | No | |
| bingSiteUrl | No | |
| notConfigured | No |
get_bing_query_page_trendBing query + page daily trendARead-onlyInspect
Daily clicks, impressions, CTR (0-100 percentage) and average position for ONE exact query+landing-page combination on Bing. The only Bing endpoint that carries a true pair-level position, so this is what a "did this page slip for this term?" check needs. Take the query and page verbatim from get_bing_query_page_stats or get_bing_page_queries. Returns notConfigured: true when no Bing Webmaster API key is set up for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | The landing page URL, exactly as Bing reports it (full URL, not a prefix). | |
| query | Yes | The search query, exactly as Bing reports it. | |
| endDate | No | Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". | |
| siteUrl | Yes | ||
| startDate | No | Optional. Window start as YYYY-MM-DD (e.g. 2026-01-01). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| page | No | |
| daily | No | |
| query | No | |
| range | No | |
| totals | No | |
| siteUrl | No | |
| rowCount | No | |
| dataSource | No | |
| bingSiteUrl | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly, non-destructive, openWorld), so the description earns credit by adding non-obvious behavior: the CTR scale is a 0-100 percentage, and the tool returns notConfigured: true when no Bing Webmaster key exists. That failure-mode disclosure is genuinely useful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the returned metrics, then the differentiator, then parameter sourcing, then the edge case. Three tight sentences with no filler and no repetition of schema-declared facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained. The description still covers the key edge case (notConfigured), the distinguishing capability (pair-level position), and where to derive inputs, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so structured fields already do most of the work (verbatim page/query, date omission behavior). The description still adds value by insisting query and page be taken verbatim from specific sibling endpoints, clarifying how to supply correct values rather than just what the fields are.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (daily clicks, impressions, CTR, average position) scoped to ONE exact query+landing-page pair on Bing. It also explicitly distinguishes itself from siblings as 'the only Bing endpoint that carries a true pair-level position,' so an agent can differentiate it from get_bing_query_page_stats or get_bing_page_queries without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use case ('did this page slip for this term?') and tells the agent where to source required parameter values from (get_bing_query_page_stats / get_bing_page_queries). It stops short of stating when NOT to reach for it versus the sibling stats endpoints, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bing_query_statsBing top queriesARead-onlyInspect
Top search queries on Bing Webmaster Tools for a property, aggregated across the window (clicks, impressions, CTR as a 0-100 percentage, and impression-weighted average position). The Bing counterpart to query_top_queries. rowCount is how many rows this response holds (at most limit); totalRows is how many distinct queries Bing reported for the window before that cut. Returns notConfigured: true when no Bing Webmaster API key is set up for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max queries to return, ranked by clicks then impressions (default 100, uncapped). | |
| endDate | No | Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". | |
| siteUrl | Yes | ||
| startDate | No | Optional. Window start as YYYY-MM-DD (e.g. 2026-01-01). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| range | No | |
| queries | No | |
| siteUrl | No | |
| rowCount | No | |
| totalRows | No | |
| dataSource | No | |
| bingSiteUrl | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, open-world), and the description adds substantial context on top: aggregation across a window, CTR expressed as a 0-100 percentage, impression-weighted average position, the rowCount/totalRows distinction, and the notConfigured: true condition when no API key exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then metric details, then rowCount/totalRows semantics, then the notConfigured edge case. Every sentence carries information, though the three-sentence structure is slightly dense rather than maximally scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a windowed-stats read tool with a rich output schema and full annotation coverage, the description supplies everything an agent needs: scope, metric definitions, truncation semantics, and the no-API-key state. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the schema itself documents limit, startDate, and endDate thoroughly (format, defaults, 'never pass null'). The description adds only the limit-related rowCount semantics and the unset-API-key behavior, so it largely leaves parameter meaning to the schema — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('top search queries on Bing Webmaster Tools for a property') and enumerates the metrics returned. It also explicitly positions itself as 'the Bing counterpart to query_top_queries', letting an agent distinguish it from the many sibling get_* stats tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The reference to query_top_queries gives a clear routing cue for when to pick this tool over the Google-side equivalent. It does not, however, state exclusions or contrast it with get_bing_keyword_stats / get_bing_query_page_stats, so it stops short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bing_traffic_statsBing daily trafficARead-onlyInspect
Daily clicks and impressions from Bing Webmaster Tools (Bing/Yahoo/DuckDuckGo organic) for a property, roughly the last 6 months. Complements Google Search Console data with the Bing side of organic search. Returns notConfigured: true when no Bing Webmaster API key is set up for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". | |
| siteUrl | Yes | ||
| startDate | No | Optional. Window start as YYYY-MM-DD (e.g. 2026-01-01). Omit BOTH startDate and endDate to return everything Bing has (roughly the last 6 months). Never pass null or the string "null". |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| daily | No | |
| range | No | |
| totals | No | |
| siteUrl | No | |
| dataSource | No | |
| bingSiteUrl | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the ~6-month data horizon and, importantly, that it returns notConfigured: true when no Bing API key is configured — a non-obvious failure mode the agent must anticipate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with purpose, then data scope, then the notable edge-case return. No filler, though the Google-comparison sentence is more contextual than essential.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is unnecessary, and annotations carry the safety profile. The description supplies the data window and the notConfigured failure mode, leaving only minor gaps like auth requirements covered indirectly via openWorldHint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the startDate/endDate descriptions are already thorough (format, omit-both behavior, no-null warning). The description adds only "for a property" context and the 6-month default window; siteUrl itself is undocumented in both. Baseline 3 is appropriate given the schema does most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: daily clicks and impressions from Bing Webmaster Tools for a property, and clarifies it covers Bing/Yahoo/DuckDuckGo organic. An agent can distinguish it from other Bing tools (crawl, query, page stats), though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Complements Google Search Console data with the Bing side of organic search" gives a reasonable context for when the tool is relevant, but there is no explicit when-to-use vs alternatives guidance or exclusions. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bing_url_submission_quotaBing URL submission quotaARead-onlyInspect
Remaining Bing Webmaster Tools URL-submission quota for a property: the daily and monthly allowances left for submitting URLs to Bing's index. Returns notConfigured: true when no Bing Webmaster API key is set up for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| range | No | |
| siteUrl | No | |
| dailyQuota | No | |
| dataSource | No | |
| bingSiteUrl | No | |
| monthlyQuota | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=true, openWorldHint=true), so the bar is lower. The description still adds real value by disclosing the notConfigured:true fallback when no API key exists, which is behavior an agent could not infer from annotations or schema. It doesn't mention rate limits or caching, but the key edge case is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose and the return shape. Slightly redundant repetition of 'Bing Webmaster Tools URL-submission quota' across title and description, but no wasted clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return-value structure needn't be explained. For a single-parameter read tool with full annotation coverage, the description adds the notConfigured edge case and the daily/monthly distinction, giving enough to call it correctly. Missing only the siteUrl format hint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One required parameter (siteUrl) at 0% schema description coverage, but zero parameters means baseline 4; with one parameter it drops to a 3. The description mentions 'for a property' which implies siteUrl maps to a property identifier, but gives no format, source, or validation guidance, and the schema provides only minLength:1.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-resource ('Remaining Bing Webmaster Tools URL-submission quota') and scopes it to a property. Distinguishes from siblings like get_inspection_quota (different engine) and submit_indexnow_urls (different submission path). An agent can identify the tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool returns but never says when to call it, what triggers it, or how it relates to sibling tools such as submit_sitemap or get_crawl_stats. No alternatives are named and no conditions are given for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_blended_landing_pagesBlended GSC + GA4 landing pagesRead-onlyInspect
Joins Search Console (clicks, impressions, CTR, position) with GA4 (sessions, bounce rate, key events, revenue) per landing page, on the canonical path (no query/hash, no trailing slash). Flags GSC-only and GA4-only pages so neither side is silently dropped. By default GA4 metrics are limited to google / organic sessions so both sides describe the same traffic (set organicOnly to false for all-traffic GA4 metrics). Units differ by source: ctr is a percentage 0-100 (like every GSC CTR here) while bounceRate is a GA4 fraction 0-1. For a URL-prefix property with a path (e.g. https://example.com/blog/) only GA4 landing pages under that path are joined. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows to return. Applies per period when dateGranularity is set. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| organicOnly | No | Limit GA4 metrics to google / organic sessions so they line up with GSC. Default true; set false for all-traffic GA4 metrics. | |
| dateGranularity | No | Split 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 |
| comparisonEndDate | No | Optional. 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). | |
| comparisonStartDate | No | Optional. 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
| Name | Required | Description |
|---|---|---|
| kind | No | Widget variant: "kpis", "table", or "sections". |
| kpis | No | KPI cards (kind="kpis"). |
| note | No | Caveat about the result, when the tool returned one. |
| rows | No | Data rows (kind="table"). |
| notes | No | Caveats about the result, when the tool returned several. |
| title | No | |
| blocks | No | Stacked sub-blocks (kind="sections"). |
| source | No | |
| columns | No | Column defs (kind="table"). |
| timeZone | No | GA4 property's IANA reporting time zone. |
| emptyText | No | |
| siteScope | No | Set when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites. |
| dataMaturity | No | |
| settledThrough | No | Last day the data is complete through. |
| comparisonHasData | No | false when the comparison period has no data at all, so there is no comparison. |
get_branded_performanceBranded vs non-branded performanceRead-onlyInspect
Splits a property's search performance into BRANDED and NON-BRANDED using the branded keywords saved on the property (set them with update_site; a keyword wrapped in slashes like /acme ?corp/ is treated as a regex, otherwise it is a case-insensitive substring). Returns totals, the branded share of clicks, a daily clicks trend for both sides, and the top queries on each side, with optional comparison-period totals. nonBranded is the property total minus branded, so the two sides add up to the property total (total) and brandedClickShare is branded clicks over that total. Search Console leaves anonymised queries out of any query-filtered read, so they cannot be matched against the keywords; they are rare, long-tail searches, counted in nonBranded and also reported on their own as anonymized. topNonBrandedQueries lists named queries only. Returns notConfigured (not an error) when the property has no branded keywords yet. Served from the GSC Wizard ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many top queries to return per side. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| comparisonEndDate | No | Optional. 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). | |
| comparisonStartDate | No | Optional. 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
| Name | Required | Description |
|---|---|---|
| hint | No | |
| note | No | |
| daily | No | |
| range | No | |
| total | No | |
| reason | No | |
| branded | No | |
| siteUrl | No | |
| previous | No | |
| anonymized | No | |
| dataSource | No | |
| nonBranded | No | |
| searchType | No | |
| dataMaturity | No | |
| hasComparison | No | |
| notConfigured | No | |
| savedKeywords | No | |
| settledThrough | No | |
| brandedKeywords | No | |
| comparisonRange | No | |
| brandedClickShare | No | |
| topBrandedQueries | No | |
| brandedKeywordCount | No | |
| warehouseLatestDate | No | |
| topNonBrandedQueries | No |
get_content_group_performanceContent group performanceRead-onlyInspect
Measures a property's content groups: clicks, impressions, CTR, impression-weighted average position, distinct page count and share of clicks per group, plus an "uncategorized" bucket for pages no group claims. Pass groupId to drill into one group's top pages instead. Matching is first-match-wins in the groups' saved order, the same as the web app. Served from the GSC Wizard ClickHouse warehouse when available (where group totals are EXACT over every page of the property), otherwise from the live Search Console API over the top 25,000 pages by clicks (see dataSource and truncated). Use list_content_groups to see or create_content_group to add the definitions this reports on. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Row cap for the groupId page drill-down. | |
| endDate | No | Optional. 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". | |
| groupId | No | Drill into one group: returns its top pages instead of the per-group aggregates. Accepts a content group id or the literal "uncategorized". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| comparisonEndDate | No | Optional. 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). | |
| comparisonStartDate | No | Optional. 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
| Name | Required | Description |
|---|---|---|
| note | No | |
| pages | No | |
| range | No | |
| groups | No | |
| groupId | No | |
| siteUrl | No | |
| groupName | No | |
| truncated | No | |
| dataSource | No | |
| groupCount | No | |
| searchType | No | |
| dataMaturity | No | |
| hasComparison | No | |
| uncategorized | No | |
| fallbackReason | No | |
| settledThrough | No | |
| comparisonRange | No | |
| warehouseLatestDate | No |
get_core_web_vitalsCore Web Vitals history (CrUX)Read-onlyInspect
Chrome UX Report field data for a property (or a single page): the weekly history of Core Web Vitals (LCP, INP, CLS) plus FCP and TTFB, each with its p75 value, good/needs-improvement/poor rating, and the good-bucket density trend. Also reports any week-over-week rating regressions. Where Chrome detected ads, adMetrics adds its four experimental ad metrics (ad count, ad density, ad CPU, ad network weight) as a p75 trend each. These have no thresholds and no rating, and are absent for sites with no ads. Needs a Chrome UX Report API key configured in the app; returns notConfigured otherwise, or noData when CrUX has too little real-world traffic for the target.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional single page URL to measure instead of the whole origin. | |
| siteUrl | Yes | ||
| formFactor | No | Device class: ALL (default), PHONE, DESKTOP, or TABLET. | ALL |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| noData | No | |
| target | No | |
| docsUrl | No | |
| message | No | |
| metrics | No | |
| periods | No | |
| siteUrl | No | |
| adMetrics | No | |
| keySource | No | |
| formFactor | No | |
| periodCount | No | |
| regressions | No | |
| latestPeriod | No | |
| periodLabels | No | |
| notConfigured | No |
get_cross_site_summaryCross-site performance summaryRead-onlyInspect
Aggregates a last-N-days clicks/impressions summary across the authenticated account's registered Search Console properties (optionally filtered to those carrying a given tag), with a same-length prior period for comparison and per-site totals. Without a tag it also covers properties shared with the account (marked shared: true; tags are the caller's own, so a tag filter covers owned properties only). Useful for a portfolio-level health check, and the MCP equivalent of the app's Global Reports page. Set includeSearchTypes to also split every property across web / image / video / news / discover, and includeCountries for a country leaderboard aggregated over the whole portfolio. Each site routes independently to the ClickHouse warehouse or the live Search Console API, so dataSource is reported per site. A site whose read fails is reported in errors rather than failing the whole call. Processes at most maxSites properties per call (default and maximum 100; scope.truncated says when more matched, so narrow by tag). The rate-limit cost scales with the number of properties and the breakdowns requested.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| days | No | ||
| maxSites | No | How many properties to process, at most 100 (the default). When more match, `scope.truncated` is true; filter by `tag` to cover the rest. | |
| searchType | No | Search type of the headline totals and the per-site comparison. | web |
| countryLimit | No | How many countries to return when includeCountries is set. | |
| includeCountries | No | Also return a country leaderboard aggregated across every property, with the number of properties contributing to each country. Costs one extra read per property. | |
| includeSearchTypes | No | Also break every property down by search type (web, image, video, news, discover) for the current period. Costs five extra reads per property. |
Output Schema
| Name | Required | Description |
|---|---|---|
| range | No | |
| scope | No | |
| deltas | No | |
| errors | No | |
| current | No | |
| perSite | No | |
| previous | No | |
| countries | No | |
| comparison | No | |
| searchTypes | No | |
| countryTotal | No |
get_decay_overviewDecay overview (per-period matrix)Read-onlyInspect
Per-query or per-page performance broken down by month or week: the same matrix the app's Query Decay and Content Decay pages render (a row per query/page, one column per period). Use this to SEE how traffic trended period by period; use find_decaying_content instead when you only need decliners between two fixed ranges. Returns the top limit rows by total clicks, each with a values array aligned to periods for the chosen metric, plus a TOTALS-style per-period aggregate across all matched rows. Defaults to the last months complete months (through the end of last month). Served from the GSC Wizard ClickHouse warehouse when available (longer history, no GSC sampling), otherwise the live Search Console API (see dataSource). On the live API each period is read separately; truncated: true with a note means a period's read was capped or did not finish in time, and incompletePeriods lists any period that reads 0 because it was not read.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| metric | No | clicks | |
| months | No | ||
| search | No | ||
| endDate | No | Optional. Window end as YYYY-MM-DD. Provide BOTH startDate and endDate to override the default window, or omit both to use the last `months` complete months. Never pass null or "null". | |
| siteUrl | Yes | ||
| dimension | No | query | |
| startDate | No | Optional. Window start as YYYY-MM-DD. Provide BOTH startDate and endDate to override the default window, or omit both to use the last `months` complete months. Never pass null or "null". | |
| searchType | No | web | |
| granularity | No | month | |
| clusterKeywords | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| rows | No | |
| range | No | |
| metric | No | |
| totals | No | |
| periods | No | |
| siteUrl | No | |
| dimension | No | |
| truncated | No | |
| dataSource | No | |
| granularity | No | |
| dataMaturity | No | |
| rowsReturned | No | |
| rowsConsidered | No | |
| settledThrough | No | |
| incompletePeriods | No | |
| warehouseLatestDate | No |
get_experiment_resultsScore an SEO experimentRead-onlyInspect
Scores one SEO experiment: assigns the property's landing pages to the experiment's control and variant URL groups, then compares each variant against the control (group 0) on click growth period-over-period. Returns per-group clicks/impressions/CTR (with a confidence interval) and an impression-weighted average position, plus for each variant the uplift in growth (percentage points) with its CI, a significance test of that growth difference (significant exactly when the CI excludes 0), the winner, and a low-power warning. ctrPValue is a separate test of the CTR difference, for reference only. The comparison window is the prior same-length period. Reads the ClickHouse warehouse when available, else the live Search Console API.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| experimentId | Yes | The experiment id from list_experiments. | |
| confidenceLevel | No | Confidence level for the significance test and CIs (default 0.95). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| groups | No | |
| siteUrl | No | |
| truncated | No | |
| comparison | No | |
| dataSource | No | |
| experiment | No | |
| comparisons | No | |
| truncationNote | No | |
| windowNormalization | No |
get_feed_audit_resultsFeed audit resultsRead-onlyInspect
Results of the Merchant Center feed audit for a GSC Wizard site: the latest run (or the run of a given runDate) with its status, Feed Score (0-100, split into scoreFeed and scorePage), failure counts by severity, per-check applicable / failed / passed counts with pass rates, offers audited, pages fetched and crawl coverage, plus the score history of earlier runs for the trend. coverage and the rates are 0-1 fractions (0.12 = 12%), not the 0-100 percentage ctr uses elsewhere. checkKey narrows the checks list to one check; severity is accepted for parity with the app report, but the per-offer issue rows behind either filter live in the ClickHouse warehouse this server cannot read, so such a call answers issuesAvailable: false with a pointer at the Feed Audit report in the GSC Wizard app. run.crawlBlocked: true means the page crawl stopped early because the site refused GSCWizard-Bot (401/403 or robots.txt), so the page-plane checks and scorePage cover few or no pages; allow the crawler and queue a new run. run: null means no audit has run yet (queue one with run_feed_audit). syncPaused (with a one-line staleNote) means the Merchant Center sync is paused because Merchant Center no longer lets the connected Google account read the merchant: the stored results are still returned but may be stale, and syncPaused.message says how to fix it. syncNotice (reason "gmc_on_other_account") means Merchant Center is connected on another Google login than the property's Search Console one, so no new audit can run; stored results are still returned. Returns a notConfigured result (not an error) when Merchant Center is not connected, its credentials were revoked, no Merchant Center account is linked to the site, or (reason "gmc_on_other_account") no audit was ever stored because Merchant Center sits on another Google login.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum checks rows to return (default 100, max 500). Reserved for the per-offer issue list once a warehouse reader exists; the checks list never exceeds 21 rows. | |
| runDate | No | Optional run date (YYYY-MM-DD, the runDate returned by run_feed_audit). Omit for the latest run. | |
| siteUrl | Yes | The property URL as returned by list_sites (e.g. "sc-domain:example.com"). | |
| checkKey | No | Optional check key to narrow the checks list to (e.g. "title_length", "jsonld_product_schema", "price_mismatch"). Per-offer issues for it are not readable here (see issuesAvailable). | |
| severity | No | Optional severity filter ("critical", "warning" or "info") for the per-offer issue list, which this server cannot serve (see issuesAvailable); accepted for parity with the app report. |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | No | |
| hint | No | |
| range | No | |
| checks | No | |
| reason | No | |
| account | No | |
| filters | No | |
| history | No | |
| siteUrl | No | |
| cachedAt | No | |
| checkNote | No | |
| crawlNote | No | |
| emptyNote | No | |
| staleNote | No | |
| unitsNote | No | |
| checkCount | No | |
| dataSource | No | |
| issuesHint | No | |
| statusNote | No | |
| syncNotice | No | |
| syncPaused | No | |
| gmcAccountId | No | |
| historyCount | No | |
| notConfigured | No | |
| issuesAvailable | No | |
| issuesRequested | No | |
| requestedRunDate | No | |
| truncationReason | No |
get_filter_optionsGet report filter optionsARead-onlyInspect
Lists the scope filters available on a property for get_site_summary, query_top_queries, query_top_pages, query_countries and query_devices: whether branded keywords are set (for brand: 'branded' | 'non_branded'), and every content group (contentGroupId) and topic cluster (topicClusterId) with filterable and, when false, the reason. Works on properties shared with you as well as your own. Reads configuration only; no Search Console data is fetched.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| brand | No | |
| siteUrl | No | |
| contentGroups | No | |
| topicClusters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered; the description adds meaningful non-schema context by clarifying it reads configuration only and fetches no Search Console data, plus that shared properties are supported. It does not mention auth/permission nuances or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence front-loads the purpose and the consuming tools; it is efficient and free of filler, though the long colon-delimited enumeration makes it slightly run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be described; the description still covers the returned structure (brand annotation and its branded/non_branded values, content groups, topic clusters with filterable flags and failure reasons), which is complete for a single-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (siteUrl) and schema coverage is 0%, so the schema does not document it. The description hints the identifier is a 'property' but gives no format guidance (URL vs property ID), leaving the single required argument under-explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Lists the scope filters available on a property') and enumerates exactly which downstream tools consume them (get_site_summary, query_top_queries, query_top_pages, query_countries, query_devices), clearly distinguishing it from sibling list tools like list_content_groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the five tools this feeds and notes it works on shared-as-well-as-owned properties, giving strong routing context. It stops short of stating when it must be called before those tools (e.g., 'call first to discover valid filter values'), so it is not a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ga4_ecommerceGA4 ecommerce reportRead-onlyInspect
GA4 ecommerce performance for the GA4 property linked to a GSC Wizard site: a revenue / transactions / purchasers summary plus channel, source-medium, page, landing-page, and product (itemName) breakdowns. Revenue is in the property currency (currencyCode). hasEcommerce is false when the property shows no ecommerce activity in the period. When active filters are incompatible with the item-scoped Products report, itemsFilterSkipped is true and items is unfiltered while every other table reflects the filters. totalRows gives the full row count of every table before limit. Returns a notConfigured result (not an error) when Google Analytics is not connected or no GA4 property 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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| endDate | No | Optional. 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". | |
| filters | No | Optional GA4 dimension filters applied to every report in the call. Within a list field the values OR together; different fields AND together. Omit entirely for unfiltered data. | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| comparisonEndDate | No | Optional. 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). | |
| comparisonStartDate | No | Optional. 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
| Name | Required | Description |
|---|---|---|
| hint | No | |
| note | No | |
| items | No | |
| pages | No | |
| range | No | |
| reason | No | |
| account | No | |
| siteUrl | No | |
| sources | No | |
| channels | No | |
| timeZone | No | |
| siteScope | No | |
| totalRows | No | |
| dataSource | No | |
| propertyId | No | |
| currencyCode | No | |
| hasEcommerce | No | |
| landingPages | No | |
| hasComparison | No | |
| notConfigured | No | |
| reauthRequired | No | |
| comparisonRange | No | |
| ecommerceSummary | No | Metric totals keyed by GA4 metric name. |
| itemsFilterSkipped | No | |
| propertyDisplayName | No | |
| prevEcommerceSummary | No |
get_ga4_error_pagesGA4 error pagesRead-onlyInspect
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. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many error-page rows to return, ordered by sessions. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| titleFilters | No | Override 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. | |
| comparisonEndDate | No | Optional. 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). | |
| comparisonStartDate | No | Optional. 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
| Name | Required | Description |
|---|---|---|
| hint | No | |
| range | No | |
| reason | No | |
| totals | No | |
| account | No | |
| siteUrl | No | |
| patterns | No | |
| timeZone | No | |
| truncated | No | |
| dataSource | No | |
| errorPages | No | |
| noPatterns | No | |
| prevTotals | No | |
| propertyId | No | |
| hasComparison | No | |
| notConfigured | No | |
| patternSource | No | |
| reauthRequired | No | |
| comparisonRange | No | |
| matchedRowCount | No |
get_ga4_key_eventsGA4 key events (conversions)Read-onlyInspect
Segments the GA4 property linked to the site on ONE key event (conversion, e.g. form_submit): totals, session/user conversion rates, and per channel, source, landing page, page, country and device breakdowns. Also lists the available key events on the property. When keyEvent is omitted, the most active key event in the period is picked automatically. A keyEvent that is not marked as a key event in GA4 returns plain event counts instead (isKeyEvent: false, with a note). A key event whose name has characters other than letters, digits and _ (e.g. "Sign Up") is reported through an event filter instead, with metricMode "event_filter" and a note on what the numbers mean. rawEventCount is the plain count of the event; when GA4 counted fewer key events than that (marked as a key event after it fired, or counted once per session), a note explains the gap. Rates (sessionKeyEventRate, userKeyEventRate) are fractions 0-1, not percentages. Returns a notConfigured result when Google Analytics is not connected or no GA4 property is linked. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of rows per breakdown table. | |
| endDate | No | Optional. 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". | |
| filters | No | Optional GA4 dimension filters applied to every report in the call. Within a list field the values OR together; different fields AND together. Omit entirely for unfiltered data. | |
| siteUrl | Yes | ||
| keyEvent | No | GA4 key event name to segment on (e.g. form_submit). Omit to pick the most active key event of the period automatically; the response lists all available names. | |
| startDate | No | Optional. 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". | |
| comparisonEndDate | No | Optional. 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). | |
| comparisonStartDate | No | Optional. 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
| Name | Required | Description |
|---|---|---|
| hint | No | |
| note | No | |
| pages | No | |
| range | No | |
| reason | No | |
| account | No | |
| devices | No | |
| siteUrl | No | |
| sources | No | |
| summary | No | Metric totals keyed by GA4 metric name. |
| channels | No | |
| keyEvent | No | |
| timeZone | No | |
| countries | No | |
| keyEvents | No | |
| siteScope | No | |
| dataSource | No | |
| isKeyEvent | No | |
| metricMode | No | |
| propertyId | No | |
| prevSummary | No | |
| currencyCode | No | |
| landingPages | No | |
| hasComparison | No | |
| keyEventNames | No | |
| notConfigured | No | |
| rawEventCount | No | |
| reauthRequired | No | |
| comparisonRange | No | |
| prevRawEventCount | No | |
| propertyDisplayName | No |
get_ga4_llm_trafficGA4 traffic from AI assistantsRead-onlyInspect
Sessions, engagement, conversions (key events) and revenue referred to the site by ChatGPT, Perplexity, Microsoft Copilot, Google Gemini, Claude and 13 other AI assistants (identified by referrer domain and combined with GA4’s own "AI Assistant" channel), from the GA4 property linked to the site, with the share of total traffic they represent and per-assistant and per-landing-page breakdowns. Note: Google AI Overviews / AI Mode traffic carries no distinct referrer, is indistinguishable from google/organic, and is NOT included. llmShareOfSessions, engagementRate and bounceRate are fractions 0-1, not percentages. An assistant's activeUsers adds up its referrer domains (e.g. chatgpt.com + chat.openai.com), so a user who came through two of them counts twice; summary.activeUsers is exact. Returns a notConfigured result when Google Analytics is not connected or no GA4 property is linked. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of landing page rows returned. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| comparisonEndDate | No | Optional. 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). | |
| includeDailySplit | No | Include a per-assistant daily sessions split for the current period. | |
| comparisonStartDate | No | Optional. 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
| Name | Required | Description |
|---|---|---|
| kind | No | Widget variant: "kpis", "table", or "sections". |
| kpis | No | KPI cards (kind="kpis"). |
| note | No | Caveat about the result, when the tool returned one. |
| rows | No | Data rows (kind="table"). |
| notes | No | Caveats about the result, when the tool returned several. |
| title | No | |
| blocks | No | Stacked sub-blocks (kind="sections"). |
| source | No | |
| columns | No | Column defs (kind="table"). |
| timeZone | No | GA4 property's IANA reporting time zone. |
| emptyText | No | |
| siteScope | No | Set when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites. |
| dataMaturity | No | |
| settledThrough | No | Last day the data is complete through. |
| comparisonHasData | No | false when the comparison period has no data at all, so there is no comparison. |
get_ga4_overviewGA4 traffic overviewRead-onlyInspect
Google Analytics 4 summary for the GA4 property linked to a GSC Wizard site: sessions, active/total/new users, page views, engagement rate, session duration, bounce rate, event count, and key events, with an automatic previous-period comparison (prevSummary). When the comparison period has no GA4 data at all (e.g. before the data stream existed), comparisonHasData is false and prevSummary is null instead of all zeros. Set includeTimeseries for daily points. engagementRate and bounceRate are fractions 0-1, not percentages; averageSessionDuration is in seconds. Returns notConfigured (with a reason and hint) instead of data when Google Analytics is not connected or no GA4 property 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).
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional. 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". | |
| filters | No | Optional GA4 dimension filters applied to every report in the call. Within a list field the values OR together; different fields AND together. Omit entirely for unfiltered data. | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| comparisonEndDate | No | Optional. End of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to end a baseline of the same length here. | |
| includeTimeseries | No | ||
| comparisonStartDate | No | Optional. Start of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to start a baseline of the same length here. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Widget variant: "kpis", "table", or "sections". |
| kpis | No | KPI cards (kind="kpis"). |
| note | No | Caveat about the result, when the tool returned one. |
| rows | No | Data rows (kind="table"). |
| notes | No | Caveats about the result, when the tool returned several. |
| title | No | |
| blocks | No | Stacked sub-blocks (kind="sections"). |
| source | No | |
| columns | No | Column defs (kind="table"). |
| timeZone | No | GA4 property's IANA reporting time zone. |
| emptyText | No | |
| siteScope | No | Set when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites. |
| dataMaturity | No | |
| settledThrough | No | Last day the data is complete through. |
| comparisonHasData | No | false when the comparison period has no data at all, so there is no comparison. |
get_gmc_best_sellersMerchant Center best sellersRead-onlyInspect
Google's best sellers ranking for one country from the Google Merchant Center account linked to a GSC Wizard site: the most popular product clusters ("product_cluster", the default) or brands ("brand") per Google product category, with rank, previous rank, relative demand (VERY_LOW..VERY_HIGH), its direction (SINKER / FLAT / RISER) and, for product clusters, whether any of your offers matches (inventoryStatus). Each product-cluster row carries demandGap: true when Google ranks the cluster but you do not stock it, the classic assortment-gap signal; note that inventory status ignores the report country. Pick WEEKLY (Monday-dated) or MONTHLY (1st-dated) reports; omit reportDate for the newest report Google has published (reports lag up to two weeks). countryCode is required because the Merchant API answers one country per request; categoryId (Google product taxonomy id) narrows to one category, otherwise every top-level category is returned. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | "product_cluster" (ranked product clusters with title, category path, GTINs and your inventory status, the default) or "brand" (ranked brands, no inventory data). | product_cluster |
| limit | No | Rows to return, ordered by (country, category, rank) (default 100, max 1000). | |
| siteUrl | Yes | The property URL as returned by list_sites (e.g. "sc-domain:example.com"). | |
| categoryId | No | Optional. Google product taxonomy id as a digits-only string (e.g. "166" for Apparel & Accessories). Omit for every top-level category. | |
| reportDate | No | Optional. The report to read as YYYY-MM-DD: a Monday for WEEKLY, the 1st of a month for MONTHLY. Omit for the newest published report (recommended: reports lag up to two weeks). Never pass null or the string "null". | |
| countryCode | Yes | Required. Report country as ISO 3166-1 alpha-2 (e.g. "US", "NL"). Case-insensitive. | |
| granularity | No | "WEEKLY" (Monday-dated reports, the default) or "MONTHLY" (1st-of-month reports). | WEEKLY |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| rows | No | |
| view | No | |
| range | No | |
| reason | No | |
| account | No | |
| hasMore | No | |
| lagNote | No | |
| siteUrl | No | |
| cachedAt | No | |
| rowCount | No | |
| emptyNote | No | |
| truncated | No | |
| categoryId | No | |
| dataSource | No | |
| reportDate | No | |
| countryCode | No | |
| granularity | No | |
| reportsSeen | No | |
| gmcAccountId | No | |
| countryCaveat | No | |
| notConfigured | No | |
| demandGapCount | No | |
| truncationNote | No | |
| fetchedRowCount | No | |
| truncationReason | No | |
| reportUnavailable | No | |
| requestedReportDate | No |
get_gmc_competitorsMerchant Center competitorsRead-onlyInspect
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" returns one aggregate row per domain for the window (Google does not expose a date on that view); "benchmark" returns one row per day with yourDomainVisibilityTrend and categoryBenchmarkVisibilityTrend, both relative to the start of the window. 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. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | "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 |
| limit | No | Rows 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. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | The property URL as returned by list_sites (e.g. "sc-domain:example.com"). | |
| startDate | No | Optional. 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". | |
| categoryId | Yes | Required. 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. | |
| countryCode | Yes | Required. Report country as ISO 3166-1 alpha-2 (e.g. "US", "NL"). Case-insensitive. | |
| trafficSource | No | "ORGANIC" (free listings, the default), "ADS" or "ALL". | ORGANIC |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| rows | No | |
| view | No | |
| range | No | |
| reason | No | |
| account | No | |
| domains | No | |
| hasMore | No | |
| siteUrl | No | |
| cachedAt | No | |
| rowCount | No | |
| emptyNote | No | |
| truncated | No | |
| unitsNote | No | |
| categoryId | No | |
| dataSource | No | |
| yourDomain | No | |
| countryCode | No | |
| gmcAccountId | No | |
| notConfigured | No | |
| trafficSource | No | |
| truncationNote | No | |
| fetchedRowCount | No | |
| truncationReason | No | |
| reportUnavailable | No |
get_gmc_pricing_insightsMerchant Center pricing insightsRead-onlyInspect
Price competitiveness and sale-price suggestions from the Google Merchant Center account linked to a GSC Wizard site, joined per product: your price against the market benchmark for the same product (priceGapFraction, positive = you are more expensive), and Google's suggested sale price with the predicted change in impressions, clicks and conversions if you adopt it. Sort by "opportunity" (largest predicted clicks gain first, the default) or "gap" (largest absolute price gap first). Both views are dateless snapshots of the current catalog. All predicted*ChangeFraction and *Fraction fields are 0-1 FRACTIONS as Google reports them (0.12 = +12%), not the 0-100 percentage ctr uses elsewhere in this server. Benchmarks need valid GTINs and suggestions need conversion reporting, so an empty result usually means "not eligible", not "no data"; reportUnavailable (with no rows) means Google refuses the pricing report for the Merchant Center account outright, and 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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | "opportunity" (largest predictedClicksChangeFraction first, the default) or "gap" (largest absolute priceGapFraction first). Products without the sort key go last. | opportunity |
| limit | No | Products to return after sorting (default 100, max 1000). | |
| siteUrl | Yes | The property URL as returned by list_sites (e.g. "sc-domain:example.com"). | |
| countryCode | No | Optional. Restrict price benchmarks to one country (ISO 3166-1 alpha-2, e.g. "US"). Omit for every benchmark country; a product benchmarked in several countries then keeps its first benchmark and reports benchmarkCountryCode. Sale-price suggestions are never country-filtered. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| rows | No | |
| sort | No | |
| range | No | |
| reason | No | |
| account | No | |
| hasMore | No | |
| siteUrl | No | |
| summary | No | |
| cachedAt | No | |
| rowCount | No | |
| truncated | No | |
| unitsNote | No | |
| dataSource | No | |
| countryCode | No | |
| gmcAccountId | No | |
| snapshotDate | No | |
| notConfigured | No | |
| truncationNote | No | |
| eligibilityNote | No | |
| truncationReason | No | |
| reportUnavailable | No |
get_gmc_title_hygieneMerchant Center title hygieneRead-onlyInspect
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. Computed over a sample of the live catalog: the first limit products in feed order (default 2000, max 5000); truncated: true means the catalog had more. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Products to sample from the catalog, in feed order (default 2000, max 5000). The summary describes this sample; truncated says when the catalog had more. | |
| siteUrl | Yes | The property URL as returned by list_sites (e.g. "sc-domain:example.com"). | |
| topWords | No | Most frequent title words to return (default 50, max 100). |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| note | No | |
| limit | No | |
| range | No | |
| reason | No | |
| account | No | |
| cjkNote | No | |
| sampled | No | |
| siteUrl | No | |
| cachedAt | No | |
| topWords | No | |
| emptyNote | No | |
| truncated | No | |
| unitsNote | No | |
| dataSource | No | |
| offerCount | No | |
| gmcAccountId | No | |
| snapshotDate | No | |
| cjkTitleCount | No | |
| notConfigured | No | |
| avgTitleLength | No | |
| truncationNote | No | |
| truncationReason | No | |
| medianTitleLength | No | |
| variantsCollapsed | No | |
| descriptionMissing | No | |
| repeatedWordOffers | No | |
| duplicateTitleGroups | No | |
| titleLengthHistogram | No | |
| duplicateTitleGroupsLimit | No | |
| descriptionLengthHistogram | No | |
| duplicateTitleGroupsCapped | No |
get_indexing_trackerGet indexing tracker config + statsBRead-onlyInspect
Returns the GSC Wizard Indexing Tracker configuration for a property plus summary stats (total tracked URLs, indexed / not-indexed / pending / error counts, active warnings, and the most recent check time). Returns tracker: null if no tracker is configured for the property.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| stats | No | |
| message | No | |
| siteUrl | No | |
| tracker | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuine value by disclosing the null-tracker case, but says nothing about permissions, error behavior, or freshness of the check time beyond the stat list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the primary behavior and finishing with the important null edge case. Minimal waste, though the stat enumeration is somewhat redundant with the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, the return-value detail is not strictly needed, and the description instead omits the more valuable missing piece: how this differs from get_indexing_tracker_report. Adequate for a simple single-parameter read tool, but with a clear routing gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (siteUrl) and the schema description coverage is 0%, so the description carries some burden. It implies the tool is property-scoped via 'for a property', which loosely maps to siteUrl, but adds no format or validation guidance beyond the schema's minLength constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (returns the Indexing Tracker config plus summary stats) and even enumerates the stat categories, so the agent knows exactly what comes back. It does not, however, distinguish itself from the close sibling get_indexing_tracker_report, leaving the agent to guess which to call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of the obvious alternative get_indexing_tracker_report (or list_tracked_urls for URL-level data). The only usage hint is implicit in the null-return note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_indexing_tracker_reportIndexing tracker health reportRead-onlyInspect
Aggregate indexing-health report for a property over the last N days (default 30, max 90). Computes a 0-100 health score from indexed %, crawl freshness, and warning-free %, plus a coverage-state breakdown, crawl-freshness buckets, recently lost pages, and newly indexed pages. A property with no tracker yet answers configured: false with empty figures; add URLs with add_tracked_urls to start one.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | |
| message | No | |
| siteUrl | No | |
| breakdown | No | |
| lostPages | No | |
| truncated | No | |
| configured | No | |
| healthScore | No | |
| newlyIndexed | No | |
| crawlFreshness | No | |
| coverageBreakdown | No |
get_indexnow_settingsGet IndexNow settingsRead-onlyInspect
Reports whether IndexNow is set up for a property: whether an API key is configured (masked to its last four characters, the full key is never returned) AND whether the key file is actually reachable on the site. Both are required before search engines accept submissions. When keyFileVerified is false, keyFileUrl is the exact file the site owner must publish, containing the key and nothing else. keyFileVerified is null when the check was inconclusive (timeout or a bot rule), which is not a failure. Check here before submit_indexnow_urls and whenever a submission fails. When no key is set, call update_indexnow_settings with generateKey: true and publish the key file it returns.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| siteUrl | No | |
| keyFileUrl | No | |
| keySiteUrl | No | |
| keyFileError | No | |
| keyFileUrlHint | No | |
| keyFileVerified | No | |
| indexnowApiKeySet | No | |
| indexnowApiKeyMasked | No |
get_inspection_quotaGet URL inspection quotaARead-onlyInspect
Returns the remaining URL inspection quota for a property today. GSC enforces a 2,000 inspection/day/property cap; GSC Wizard tracks usage across both UI and MCP calls. Call this before bulk inspections to avoid surprises.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| limit | No | |
| siteUrl | No | |
| remaining | No | |
| unavailable | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds the genuinely useful behavioral facts that aren't in annotations: the 2,000/day/property cap and that usage is tracked across both UI and MCP calls, which explains why local counters may disagree.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is returned, then the constraint, then the when-to-call advice. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation here. The description covers the cap, cross-surface usage tracking, and the recommended call timing — everything needed to use this quota-check tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single siteUrl parameter, so the description carries some burden. It says "for a property," hinting that siteUrl identifies a GSC property, but adds no format details (full URL vs. sc-domain: prefix) beyond that. Baseline 3 given only one simple parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (returns) and resource (remaining URL inspection quota) with scope (for a property today). An agent can immediately distinguish this from sibling tools like bulk_inspect_urls or inspect_url.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit timing guidance: "Call this before bulk inspections to avoid surprises." It implies the alternative (bulk_inspect_urls) and the precondition for using this tool, though it doesn't name that sibling directly or state when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_longtail_clustersLong-tail page clusteringRead-onlyInspect
Segments a property's pages into Head / Chunky Middle / Long Tail tiers by elbow detection on the cumulative-clicks curve (the app's Long-tail Clustering report). Returns each tier's page count, click/impression share, average CTR/position/query-diversity, the knee points, and the top pages per tier. Useful for spotting over-reliance on a few pages or a bloated long tail to prune. Reads the ClickHouse warehouse when available, else the live Search Console API. truncated: true (with truncationNote) means a cap cut the low-click tail: the warehouse clusters at most the 100,000 pages with the most clicks, the live API reads at most 100,000 query x page rows. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| preset | No | Tuning preset: default | content | ecommerce | small_site | enterprise. | default |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| sensitivity | No | Override the preset's knee sensitivity: low | normal | high. | |
| pagesPerCluster | No | How many top pages to list per tier (default 10). 0 returns tier stats only. | |
| includeZeroClicks | No | Include pages with zero clicks (impressions only). Defaults per preset (usually true). |
Output Schema
| Name | Required | Description |
|---|---|---|
| knees | No | |
| range | No | |
| preset | No | |
| totals | No | |
| siteUrl | No | |
| clusters | No | |
| warnings | No | |
| truncated | No | |
| dataSource | No | |
| sensitivity | No | |
| truncationNote | No | |
| apiRowCapReached | No |
get_merchant_listings_performanceMerchant listings performanceRead-onlyInspect
Search Console performance for one search appearance, defaulting to MERCHANT_LISTINGS: the appearance inventory of the property, a daily clicks / impressions / CTR / position timeline, and the top pages (product URLs) behind it. Answers "how visible are my product results in Search, and which products carry it". Search Console merchant listings counts enriched product results in web Search only, while Google Merchant Center free-listing numbers (get_organic_shopping_performance) cover the Shopping tab, Images, Lens, YouTube and Maps too, so the two do not reconcile to one figure. Always served from the live Search Console API: search appearance is never stored in the GSC Wizard warehouse, and it can be filtered on but never grouped with another dimension. hasAppearance is false when the property has no rows for the requested appearance, which is normal for non-ecommerce sites. The window may span at most 16 months (Search Console retention); a longer one is rejected with bad_request. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Top pages to return, ordered by clicks (default 25, max 1000). | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | The property URL as returned by list_sites (e.g. "sc-domain:example.com"). | |
| startDate | No | Optional. 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". | |
| appearance | No | Search appearance code to report on. Defaults to MERCHANT_LISTINGS; other common values are PRODUCT_SNIPPETS and ORGANIC_SHOPPING. Read `appearances` in the response to see which codes this property actually has. | MERCHANT_LISTINGS |
| includeAppearances | No | Include the unfiltered per-appearance breakdown, which is the only way to learn which appearance codes the property has and how big each one is. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| pages | No | |
| totals | No | |
| endDate | No | |
| hasMore | No | |
| siteUrl | No | |
| rowCount | No | |
| timeline | No | |
| emptyNote | No | |
| startDate | No | |
| appearance | No | |
| dataSource | No | |
| searchType | No | |
| appearances | No | |
| dataMaturity | No | |
| hasAppearance | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
get_migration_healthGet migration healthRead-onlyInspect
Health check of a site migration around its go-live date: the Migration Compare analysis of the GSC Wizard app (without brand terms, the search-type split or the country / device filters of a saved migration; notes says what differs). Returns recovery (side B clicks per day as a % of side A clicks per day before go-live), pace against the recovery a migration on track reaches by now, momentum, a projected recovery with milestone dates, URL success per migration unit, a 0-100 risk score with its factors, prioritised recommendations, redirect status counts from the stored redirect checks, the top lost pages, redirect problems, lost queries and losing sections, the old-to-new impression handover, the click change split into demand / position / CTR effects, the country and device splits (segments) with their recommendations, and a launch checklist. siteUrl is the OLD property (side A); pass siteUrlB (the new property) for a domain move and omit it when the migration happened inside one property. Pass goLiveDate, or a migrationId from list_migrations to reuse a migration saved in the app (its properties, URL prefixes or regexes, go-live date, windows, mapping label and Only mapped URLs setting; explicit arguments override it). Redirect mappings are the ones saved for the property pair (add_migration_redirects or the app); without any, pages are joined by path. onlyMapped is the app's "Only mapped URLs": with saved mappings, the totals, recovery and health count only the pages the mappings claim, and so do the country and device splits of a side read from the warehouse (segments.scope says which; each 10 warehouse queries of those splits cost one more rate-limit unit). Windows as in compare_migration: windowStrategy "recent" (default), "from-go-live" or "full", windowDays (default 28), yoyBaseline. Page and query reads cover at most the top 25,000 rows by clicks per side and window, and at most 10,000 redirect mappings are analysed (each 2,000 costs one more rate-limit unit); truncated says when a cap was reached. health is null until a post-launch day has final data.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes | The OLD property (side A), as returned by list_sites. With migrationId it must be the saved migration's old property. | |
| siteUrlB | No | The NEW property (side B) for a move between properties. Omit when the migration happened inside one property. | |
| goLiveDate | No | First day the new setup was live, as YYYY-MM-DD. Required unless migrationId supplies one. | |
| onlyMapped | No | Only mapped URLs: count only the pages the redirect mappings claim (the old URLs' pages on side A, their new URLs' pages on side B) in the totals, recovery and health. Default: the saved migration's setting with migrationId, else false. No effect without saved mappings. | |
| windowDays | No | Window length in days for "recent" and "from-go-live" (default 28). | |
| migrationId | No | Id of a migration saved in the app (list_migrations). Its setup supplies everything the arguments leave out. | |
| yoyBaseline | No | Compare with the same weeks one year (364 days) earlier instead of the days before go-live. Default false. | |
| mappingLabel | No | Only the redirect mappings carrying this label ("__none__" = only unlabelled ones). Omit to use every mapping saved for the property pair. | |
| windowStrategy | No | "recent" (default): the last windowDays days vs the windowDays days before go-live. "from-go-live": the first windowDays days after go-live vs the windowDays days before. "full": the 90 days before go-live vs every day since. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | No | |
| setup | No | |
| health | No | |
| summary | No | |
| windows | No | |
| handover | No | |
| mappings | No | |
| segments | No | |
| warnings | No | |
| checklist | No | |
| migration | No | |
| redirects | No | |
| truncated | No | |
| waterfall | No | |
| dataSource | No | |
| pageTrends | No | |
| queryTrends | No | |
| topLostPages | No | |
| topLostQueries | No | |
| truncatedReads | No | |
| topLosingSections | No | |
| topRedirectProblems | No |
get_organic_shopping_performanceOrganic shopping performanceRead-onlyInspect
Organic (free listing) product performance from the Google Merchant Center account linked to a GSC Wizard site: a daily clicks / impressions / conversions timeline plus the top offers, groupable by brand, Google category or merchant product type. Optionally includes the non-product timeline (category and home pages reached from Merchant Center surfaces). Merchant Center free-listing numbers cover the Shopping tab, Search, Images, Lens, YouTube and Maps, while Search Console merchant listings (get_merchant_listings_performance) counts enriched product results in web Search only, so the two do not reconcile to one figure. Conversions exist only where the merchant configured a Merchant Center conversion source. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Table rows to return, ordered by organic clicks (default 25, max 200). | |
| endDate | No | Optional. 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". | |
| groupBy | No | How the table rows are grouped: "offer" (one row per product / offer id, the default), "brand", "category" (Google product taxonomy level 1) or "productType" (the merchant's own taxonomy level 1). | offer |
| siteUrl | Yes | The property URL as returned by list_sites (e.g. "sc-domain:example.com"). | |
| startDate | No | Optional. 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". | |
| includeNonProduct | No | Include the non-product timeline: clicks to category / home pages from Merchant Center surfaces, which never appear in the product numbers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| note | No | |
| rows | No | |
| range | No | |
| reason | No | |
| totals | No | |
| account | No | |
| groupBy | No | |
| hasMore | No | |
| siteUrl | No | |
| cachedAt | No | |
| rowCount | No | |
| timeline | No | |
| truncated | No | |
| dataSource | No | |
| currencyCode | No | |
| gmcAccountId | No | |
| notConfigured | No | |
| conversionNote | No | |
| definitionNote | No | |
| truncationNote | No | |
| marketingMethod | No | |
| nonProductTotals | No | |
| truncationReason | No | |
| nonProductTimeline | No |
get_page_performancePage performance over timeRead-onlyInspect
Daily performance for a single page (clicks, impressions, CTR, position). Useful for diagnosing post-deploy regressions on a specific URL. Served from the ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional. 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". | |
| pageUrl | Yes | ||
| siteUrl | Yes | ||
| startDate | No | Optional. 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". |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| daily | No | |
| range | No | |
| pageUrl | No | |
| siteUrl | No | |
| dataSource | No | |
| dataMaturity | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
get_position_distributionRanking position distributionRead-onlyInspect
Slices a property by where it ranks, using the same 1-3 / 4-10 / 11-20 / 21+ bands as the GSC Wizard dashboard. granularity "period" (default) returns impressions, clicks and the number of queries (or pages) in each band over the whole range, showing how top-heavy the property's visibility is. granularity "daily" returns one row per day with the count of DISTINCT queries ranking in each band, which is how you see a ranking shift build up or a drop land on a specific date. Positions are impression-weighted averages, so a row sits in one band only. Served from the GSC Wizard ClickHouse warehouse when available (both views are computed in the warehouse over every query or page, never truncated; scanLimit is null there), otherwise from the live Search Console API over the top scanLimit rows by clicks, which drops zero-click rows first and so understates the deep bands when truncated is true (see dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| dimension | No | What a "row" is on the period path: a search query or a page. | query |
| scanLimit | No | How many top rows by clicks to bucket on the live Search Console API. Raise it when a long-tail property reports `truncated: true`. Ignored on the ClickHouse warehouse, which buckets every row in SQL. | |
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| granularity | No | "period" = one bucket summary over the range; "daily" = distinct query counts per band per day (always keyed on query, ignores `dimension`). | period |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | |
| note | No | |
| range | No | |
| totals | No | |
| buckets | No | |
| siteUrl | No | |
| dayTotals | No | |
| dimension | No | |
| scanLimit | No | |
| truncated | No | |
| dataSource | No | |
| searchType | No | |
| granularity | No | |
| dataMaturity | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
get_product_listing_statusProduct free-listing statusRead-onlyInspect
Free-listing eligibility and item issues per product, from the Google Merchant Center account linked to a GSC Wizard site, sorted by clickPotentialRank (1 = the product Google expects the most clicks from). Answers "which products are invisible in free listings, and why": each row carries the aggregated status (ELIGIBLE / ELIGIBLE_LIMITED / PENDING / NOT_ELIGIBLE_OR_DISAPPROVED), the free-listings status when the synced catalog has it, the top issue code and whether fixing it needs a merchant action or is just pending Google processing. statusCounts, issueCounts, problemCount and merchantActionCount (problems that need a feed or site fix) summarise the whole scan, not just the returned page; page through every row with offset, passing back nextOffset until it is null. Answered from the catalog snapshot GSC Wizard syncs daily into its warehouse when the site has one (dataSource: "clickhouse", syncedAt says when, stale: true when it is more than two days old; every offer is counted), with a live Merchant API scan of up to 5,000 products as the fallback (dataSource: "merchant-api", truncated when the catalog had more or Merchant Center was too slow to read it all within about 40 seconds; truncationReason says which). itemIssuesUnavailable: true means Google refused the issue data, so a missing issue code is unknown rather than clean. syncPaused (with a one-line staleNote) means the daily sync is paused because Merchant Center no longer lets the connected Google account read the merchant: the data is still returned but may be stale, and syncPaused.message says how to fix it. syncNotice (reason "gmc_on_other_account") means Merchant Center is connected on another Google login than the property's Search Console one, so the snapshot cannot refresh; the data is still returned. This is catalog state, not traffic: pair it with get_organic_shopping_performance for the clicks a product actually got. Returns a notConfigured result (not an error) when Merchant Center is not connected, its credentials were revoked, no Merchant Center account is linked to the site in the GSC Wizard app, or (reason "gmc_on_other_account") nothing was ever synced because Merchant Center sits on another Google login and no live read is possible.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Product rows to return, highest click potential first (default 25, max 200). | |
| offset | No | Rows to skip, for reading past the first page: pass the previous answer's nextOffset (default 0, max 100,000). | |
| siteUrl | Yes | The property URL as returned by list_sites (e.g. "sc-domain:example.com"). | |
| onlyProblems | No | Return only products that are not plainly serving (limited, pending, disapproved, or carrying an item issue). Set false to list the whole catalog by click potential. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| note | No | |
| rows | No | |
| range | No | |
| stale | No | |
| offset | No | |
| reason | No | |
| account | No | |
| hasMore | No | |
| scanned | No | |
| siteUrl | No | |
| cachedAt | No | |
| rowCount | No | |
| syncedAt | No | |
| staleNote | No | |
| truncated | No | |
| dataSource | No | |
| nextOffset | No | |
| syncNotice | No | |
| syncPaused | No | |
| issueCounts | No | |
| gmcAccountId | No | |
| onlyProblems | No | |
| problemCount | No | |
| statusCounts | No | |
| notConfigured | No | |
| itemIssuesNote | No | |
| truncationNote | No | |
| truncationReason | No | |
| merchantActionCount | No | |
| itemIssuesUnavailable | No |
get_query_performanceQuery performance over timeRead-onlyInspect
Daily performance for a single search query, optionally restricted to one landing page. Useful for tracking position changes after on-page edits. Served from the ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| endDate | No | Optional. 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". | |
| pageUrl | No | ||
| siteUrl | Yes | ||
| startDate | No | Optional. 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". |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| daily | No | |
| query | No | |
| range | No | |
| pageUrl | No | |
| siteUrl | No | |
| dataSource | No | |
| dataMaturity | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
get_query_shape_trendQuery shape trend over timeRead-onlyInspect
Tracks how much of a property's search traffic comes from AI-shaped queries over time: the trend chart on the app's Query Analysis report. Returns one row per month (or week) with clicks and impressions split into AI-shaped (reply artefacts, pivot follow-ups, conversational questions) versus conventional keywords, plus the AI-shaped share of each metric. Use this to answer "are AI Overviews / AI Mode queries growing on this site?", which no single-period report can show. Defaults to the last 12 complete months. Served from the GSC Wizard ClickHouse warehouse when available (longer history, no sampling), otherwise the live Search Console API.
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | How many complete months to cover, ending with last month (1-16; Search Console keeps ~16 months). | |
| endDate | No | Optional. Window end as YYYY-MM-DD. Provide BOTH startDate and endDate to override the default window, or omit both to use the last `months` complete months. Never pass null or "null". | |
| siteUrl | Yes | ||
| startDate | No | Optional. Window start as YYYY-MM-DD. Provide BOTH startDate and endDate to override the default window, or omit both to use the last `months` complete months. Never pass null or "null". | |
| searchType | No | web | |
| granularity | No | month |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| periods | No | |
| siteUrl | No | |
| shapeNote | No | |
| truncated | No | |
| dataSource | No | |
| granularity | No | |
| dataMaturity | No | |
| settledThrough | No | |
| truncationNote | No | |
| warehouseLatestDate | No |
get_query_value_attributionEstimated GA4 value per GSC queryARead-onlyInspect
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. Page-level estimates with known blind spots (device/country/date mismatches are invisible; every click is treated as equally likely to convert). matchedClickShare reports how much of the click volume the estimates cover; estRevenue appears only when the GA4 property records revenue. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows to return. Applies per period when dateGranularity is set. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| organicOnly | No | Limit GA4 outcomes to google / organic sessions so only organic value is distributed across queries. Default true; set false to distribute all-traffic GA4 outcomes. | |
| dateGranularity | No | Split 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
| Name | Required | Description |
|---|---|---|
| kind | No | Widget variant: "kpis", "table", or "sections". |
| kpis | No | KPI cards (kind="kpis"). |
| note | No | Caveat about the result, when the tool returned one. |
| rows | No | Data rows (kind="table"). |
| notes | No | Caveats about the result, when the tool returned several. |
| title | No | |
| blocks | No | Stacked sub-blocks (kind="sections"). |
| source | No | |
| columns | No | Column defs (kind="table"). |
| timeZone | No | GA4 property's IANA reporting time zone. |
| emptyText | No | |
| siteScope | No | Set when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites. |
| dataMaturity | No | |
| settledThrough | No | Last day the data is complete through. |
| comparisonHasData | No | false when the comparison period has no data at all, so there is no comparison. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint=true, destructiveHint=false), so the bar is lower, yet the description adds substantial context beyond them: the proportional-attribution method, known blind spots ('device/country/date mismatches are invisible; every click is treated as equally likely to convert'), the notConfigured failure mode, and the ~2-3 day data lag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single paragraph is front-loaded with the core purpose and stays dense, with almost every clause carrying information (method, blind spots, prerequisites, defaults). It is slightly long and repeats the date-lag detail already present in the schema, but nothing is truly wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with an output schema already defined, the description covers all that remains: methodology, coverage caveats, conditional fields (matchedClickShare, estRevenue), configuration prerequisites, and default window behavior. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (83%), which sets the baseline at 3, and the description mostly restates what the schema already documents (the optional date range and the last-28-settled-days default). It adds little parameter semantics beyond the structured fields, though the 28-day default framing is mildly reinforcing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Estimates GA4 sessions, key events, and revenue per Search Console query') and even spells out the estimation methodology (proportional click share). This niche purpose is not duplicated by any sibling like query_search_analytics or get_ga4_key_events, so an agent can recognize it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides useful preconditions ('Requires a GA4 property linked to the site in GSC Wizard; returns a notConfigured explanation otherwise') and default date behavior, which implies when it is applicable. However, it never states when to prefer this over adjacent tools (e.g. query_search_analytics) or when-not to use it, leaving alternatives to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ranking_changesGet ranking changes between two periodsRead-onlyInspect
Compares a current period against a comparison period and classifies movers by query or page into new, lost, improved, and declined buckets (improvement = better/lower average position). Useful for spotting what gained or lost visibility between two date ranges. limit (1-10000, default 50) applies PER BUCKET; counts gives the full size of each bucket before that cut. Each period reads its top scanLimit rows ranked by clicks (warehouse: max(limit*10, 1000), capped at 50000; live API: 25000), so counts are measured within those keys. On the warehouse every key in either period's top scanLimit is read in both periods, so new and lost are real; on the live API the two reads are independent, and a key just below one cut can show as new or lost. It is served from the GSC Wizard ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| dimension | No | query | |
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| comparisonEndDate | No | Optional. End of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to end a baseline of the same length here. | |
| comparisonStartDate | No | Optional. Start of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to start a baseline of the same length here. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Widget variant: "kpis", "table", or "sections". |
| kpis | No | KPI cards (kind="kpis"). |
| note | No | Caveat about the result, when the tool returned one. |
| rows | No | Data rows (kind="table"). |
| notes | No | Caveats about the result, when the tool returned several. |
| title | No | |
| blocks | No | Stacked sub-blocks (kind="sections"). |
| source | No | |
| columns | No | Column defs (kind="table"). |
| timeZone | No | GA4 property's IANA reporting time zone. |
| emptyText | No | |
| siteScope | No | Set when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites. |
| dataMaturity | No | |
| settledThrough | No | Last day the data is complete through. |
| comparisonHasData | No | false when the comparison period has no data at all, so there is no comparison. |
get_sitemap_performanceSitemap URL performanceRead-onlyInspect
Fetches a sitemap belonging to the property, extracts its URLs, and joins them with Search Console page performance over a date range. Each URL gets its clicks, impressions, CTR, and average position (zeros if the page has no GSC data). Reports how many sitemap URLs actually received impressions (indexedInGscCount). The warehouse reads the sitemap URLs themselves, so a zero is exact. The live API cannot, so it pages through the property's pages (top 100,000 by clicks at most) until every URL is found; truncated: true means some URLs were not reached, so their zeros are unknown rather than "no impressions" (scanLimit is the rows read). Expands one level of a sitemap index (up to 5 child sitemaps; a child that cannot be read is named in childSitemapNote instead of failing the call), caps extracted URLs at maxUrls (default 500, max 2000), and only fetches http(s) URLs on the property host or a subdomain of it. Served from the ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). The sitemap is fetched with the user agent "GSCWizard-Bot/1.0 (On-Page SEO Checker)"; if the server blocks it (403/401/429) or no URLs come back, relay the whitelisting advice in the error or crawlNote. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional. 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". | |
| maxUrls | No | ||
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| sitemapUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| urls | No | |
| range | No | |
| siteUrl | No | |
| urlCount | No | |
| crawlNote | No | |
| scanLimit | No | |
| truncated | No | |
| dataSource | No | |
| sitemapUrl | No | |
| sitemapNote | No | |
| dataMaturity | No | |
| settledThrough | No | |
| truncationNote | No | |
| childSitemapNote | No | |
| indexedInGscCount | No | |
| failedChildSitemaps | No | |
| warehouseLatestDate | No |
get_site_summaryGet site performance summaryARead-onlyInspect
Returns clicks, impressions, CTR, and average position for a property over the last N days (default 28), with a same-length prior period for comparison. Use this for quick health checks before drilling into details. Served from the ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). For an explicit window pass startDate/endDate (YYYY-MM-DD) instead: a date you pass always wins, and days only sizes an edge you leave out. The comparison period is always the same length as the window and sits immediately before it. avgPosition is impression-weighted, as Search Console reports it. dailyRows is the window day by day and previousDailyRows the comparison period day by day, in the same shape; previousDailyRows is omitted for a window longer than 180 days.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Length of the trailing window in days (default 28, max 180). Ignored for any edge you pin with startDate/endDate; when exactly one of those is given it sizes the other edge. | |
| brand | No | Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options. | |
| endDate | No | Optional. 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 window ends at the latest settled Search Console date (data lags ~2-3 days). Passed alone, the window is `days` long and ends here. Never pass null or the string "null". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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 use the trailing `days` window instead (Search Console data lags ~2-3 days, so the window ends at the latest settled date). Passed alone, the window runs from here to the latest settled date. Never pass null or the string "null". | |
| contentGroupId | No | Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which. | |
| topicClusterId | No | Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Widget variant: "kpis", "table", or "sections". |
| kpis | No | KPI cards (kind="kpis"). |
| note | No | Caveat about the result, when the tool returned one. |
| rows | No | Data rows (kind="table"). |
| notes | No | Caveats about the result, when the tool returned several. |
| title | No | |
| blocks | No | Stacked sub-blocks (kind="sections"). |
| source | No | |
| columns | No | Column defs (kind="table"). |
| timeZone | No | GA4 property's IANA reporting time zone. |
| emptyText | No | |
| siteScope | No | Set when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites. |
| dataMaturity | No | |
| settledThrough | No | Last day the data is complete through. |
| comparisonHasData | No | false when the comparison period has no data at all, so there is no comparison. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds meaningful behavior beyond that: the ClickHouse-vs-live-API data source fallback, impression-weighted avgPosition semantics, and the fact that previousDailyRows is dropped for windows longer than 180 days. It omits any permission or quota considerations, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the return values and primary use case, then handles window semantics. The closing sentence explaining dailyRows/previousDailyRows is somewhat redundant given an output schema exists, but the 180-day omission caveat inside it is a genuine behavioral detail, so the length is mostly earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema and annotations covering safety, the description supplies exactly what structured fields cannot: data-source behavior, comparison-period construction, edge-case precedence between days and explicit dates, and a return-shape caveat. An agent can invoke this correctly for a 7-parameter tool without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 86%, so the baseline is 3 and the schema already carries most parameter meaning. The description adds real edge-case semantics the schema only implies: 'a date you pass always wins, and `days` only sizes an edge you leave out,' plus the rule that the comparison period is always equal-length and immediately preceding. It leaves the filter params (brand, contentGroupId, topicClusterId) entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (site-level clicks, impressions, CTR, average position over a trailing window) and explicitly positions itself as a high-level health check 'before drilling into details,' which separates it from get_page_performance, get_query_performance, and query_search_analytics. The agent can identify its role 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage cue ('quick health checks before drilling into details') and explains when to switch to explicit startDate/endDate rather than relying on `days`. It does not name which drill-down sibling to use next or state any conditions where this tool should be avoided, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tag_group_viewTag group performance viewARead-onlyInspect
Aggregated cross-site report for every property carrying a given tag (the data behind the app's /group/tag/ dashboard). Returns last-N-days totals with a same-length prior-period comparison, a merged daily clicks/impressions trend, per-site totals, and merged top-N breakdowns by query, page, country, and device. Each site routes independently to the ClickHouse warehouse (longer history, no sampling) or the live Search Console API; dataSource is reported per site and a site whose read fails is reported in errors rather than failing the whole call. Use list_tags first to discover tag names; use get_cross_site_summary for a lighter totals-only view across all properties. Processes at most maxSites properties per call (default and maximum 100; scope.truncated says when more carry the tag). The rate-limit cost scales with the number of properties and dimensions.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | ||
| days | No | ||
| limit | No | ||
| maxSites | No | How many tagged properties to process, at most 100 (the default). When more carry the tag, `scope.truncated` is true. | |
| dimensions | No | ||
| searchType | No | web |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| daily | No | |
| pages | No | |
| range | No | |
| scope | No | |
| deltas | No | |
| errors | No | |
| current | No | |
| devices | No | |
| perSite | No | |
| queries | No | |
| previous | No | |
| countries | No | |
| comparison | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/open-world safety; the description adds substantial behavioral detail: each site routes to ClickHouse (longer history, no sampling) or live Search Console API, dataSource is reported per site, and a failed site lands in `errors` rather than failing the whole call. It also discloses that rate-limit cost scales with property count and dimensions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return shape are front-loaded, then routing, error handling, and constraints follow in dense sentences with no filler. It is on the long side, but nearly every clause conveys operational information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex cross-site aggregation tool with routing, partial-failure semantics, and truncation, the description covers discovery (list_tags), alternatives (get_cross_site_summary), limits, and cost. An output schema exists, so the description needn't fully enumerate return fields, and its summary of returns is a bonus.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17%, so the description must carry parameter meaning. It does explain days ('last-N-days totals'), dimensions ('merged top-N breakdowns by query, page, country, and device'), and maxSites with its truncation behavior, but limit and searchType are left to the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Aggregated cross-site report for every property carrying a given tag') and grounds it in a concrete dashboard path, so the agent knows exactly what this produces. It distinguishes itself from near siblings like get_cross_site_summary and get_content_group_performance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use list_tags first to discover tag names; use get_cross_site_summary for a lighter totals-only view.' It also states the maxSites processing ceiling and that scope.truncated signals truncation, covering when this tool is and isn't the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topic_cluster_performanceTopic cluster performanceRead-onlyInspect
Measures a property's topic clusters: clicks, impressions, CTR, impression-weighted average position, matched query count and share of clicks per cluster, plus an "unclustered" bucket for queries no cluster claims. Pass clusterId to drill into one cluster's top queries (each row lists which of the cluster's keywords matched). A cluster keyword is a case-insensitive substring unless wrapped in slashes (/seo ?tools/), which makes it a regex. IMPORTANT: clusters may OVERLAP (a query matching two clusters counts fully in both), so cluster totals do not sum to the property total; overlappingQueries reports how many queries are double-counted. Matching runs over the top scanLimit queries by clicks (default 50,000), read from the GSC Wizard ClickHouse warehouse when available (which scans at most 50,000 queries; scanLimit in the response is the limit actually applied), otherwise the live Search Console API (see dataSource). Use list_topic_clusters / create_topic_cluster to see or add the definitions this reports on. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Row cap for the clusterId query drill-down. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| clusterId | No | Drill into one cluster: returns its top matched queries instead of the per-cluster aggregates. Accepts a topic cluster id or the literal "unclustered". | |
| scanLimit | No | How many top queries by clicks to match against the clusters. Raise it when a long-tail property reports `truncated: true`. Clamped at 50,000 on the ClickHouse path. | |
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| comparisonEndDate | No | Optional. 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). | |
| comparisonStartDate | No | Optional. 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
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| queries | No | |
| siteUrl | No | |
| clusters | No | |
| clusterId | No | |
| scanLimit | No | |
| truncated | No | |
| dataSource | No | |
| searchType | No | |
| clusterName | No | |
| overlapNote | No | |
| unclustered | No | |
| clusterCount | No | |
| dataMaturity | No | |
| hasComparison | No | |
| scannedClicks | No | |
| scannedQueries | No | |
| settledThrough | No | |
| comparisonRange | No | |
| matchedQueryCount | No | |
| overlappingQueries | No | |
| warehouseLatestDate | No |
get_yandex_indexing_historyYandex indexing historyRead-onlyInspect
How Yandex crawls and indexes a property over time: the HTTP status codes Yandex's crawler received by day, how many pages are in Yandex search, and the count of pages that appeared in or were removed from Yandex results each day. Use the appeared/removed series to spot day-to-day indexing swings in Yandex: it has no Google Search Console equivalent, so it is the one place to watch pages entering and leaving an index day by day. These series carry no country or device dimension and no previous-period comparison; the response repeats that in limitations. When one of the two secondary series could not be read (a Yandex rate limit or timeout), it comes back empty and warnings says so. Returns notConfigured: true (with a reason) when no Yandex account is connected, the connection has to be granted again, the property is not in it, or the caller holds a share of the property rather than owning it: Yandex data is owner-only.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | End date (YYYY-MM-DD). Defaults to what Yandex returns by default. | |
| siteUrl | Yes | ||
| startDate | No | Start date (YYYY-MM-DD). Defaults to what Yandex returns by default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| hostId | No | |
| reason | No | |
| siteUrl | No | |
| warnings | No | |
| dataSource | No | |
| limitations | No | |
| notConfigured | No | |
| pagesInSearch | No | |
| crawlResponses | No | |
| searchAppearanceChanges | No |
get_yandex_query_statsYandex query statsRead-onlyInspect
Search queries from Yandex Webmaster for a property, with impressions, clicks, average impression position and average clicked position. IMPORTANT COVERAGE LIMIT: Yandex exposes its top queries for the period, at most 3,000 of them, so totals derived from these rows are a floor, not a complete figure; say so when reporting them. Yandex serves 500 rows per request and this tool pages through as many as limit allows, defaulting to the first 500 by orderBy; totalAvailable and truncated say how much of the pool was left. CTR is a percentage (0-100, like every other CTR this server returns), calculated from impressions and clicks because Yandex publishes no CTR metric; null when there were no impressions. Yandex has no query-by-page report, so these queries cannot be attributed to URLs. The dates select a real window, so a longer range returns more queries and larger totals; omitting them gives the last week only. Yandex finishes a day about four days late, so range echoes the window it actually served. The full set of caveats is in limitations on every response. Returns notConfigured: true (with a reason) when no Yandex account is connected, the connection has to be granted again, the property is not in it, or the caller holds a share of the property rather than owning it: Yandex data is owner-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows to return, across pages. Yandex serves 500 per request and at most 3,000 for a window, so a limit above 500 costs one extra round trip per 500 rows. The default is one page: ask for more only when the long tail matters, since a few thousand rows can exceed a host response-size ceiling and be refused. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to the last week Yandex holds. | |
| orderBy | No | Which metric decides the 500 queries Yandex returns. | TOTAL_SHOWS |
| siteUrl | Yes | ||
| startDate | No | Start date (YYYY-MM-DD). Defaults to the last week Yandex holds. | |
| deviceType | No | Device filter. Yandex filters rather than breaking down by device, so each value is a separate query. MOBILE_AND_TABLET overlaps MOBILE and TABLET, so do not sum them. | ALL |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| range | No | |
| hostId | No | |
| reason | No | |
| queries | No | |
| siteUrl | No | |
| warnings | No | |
| truncated | No | |
| dataSource | No | |
| deviceType | No | |
| limitations | No | |
| coverageNote | No | |
| notConfigured | No | |
| totalAvailable | No |
get_yandex_site_summaryYandex site summaryRead-onlyInspect
Yandex Webmaster's summary for a property: site quality index (SQI), pages in search, excluded pages, and the problems Yandex is currently reporting, by severity. Complements Google Search Console with the Yandex side of organic search, which matters for Russian, Turkish, Kazakh, Belarusian and Uzbek traffic. SQI and the problem severities are Yandex's own taxonomy with no Google equivalent, and Yandex serves no previous-period series, so there is nothing to compare against: the response carries these caveats in limitations, which should be passed on when reporting the numbers. When the problem list could not be read (a Yandex rate limit or timeout), problems is empty and warnings says so. Returns notConfigured: true (with a reason) when no Yandex account is connected, the connection has to be granted again, the property is not in it, or the caller holds a share of the property rather than owning it: Yandex data is owner-only.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| sqi | No | |
| hint | No | |
| hostId | No | |
| reason | No | |
| siteUrl | No | |
| problems | No | |
| warnings | No | |
| dataSource | No | |
| limitations | No | |
| excludedPages | No | |
| notConfigured | No | |
| pagesInSearch | No | |
| problemCountsBySeverity | No |
inspect_urlInspect a URLInspect
Runs the Google URL Inspection API for one URL and stores the result in the GSC Wizard inspection history. Returns the verdict, coverage state, robots.txt state, last crawl time, the fetched/crawled-as info, the Google-selected canonical (googleCanonical), the user-declared canonical (userCanonical), and a link to the result in Search Console (inspectionResultLink). A canonical field is null when Google did not report it for this URL (common for pages it has not indexed); it is never inferred from the page. GSC enforces a daily per-property quota, so call get_inspection_quota first if you plan to inspect many URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes | ||
| inspectionUrl | Yes | The fully-qualified URL to inspect. Must belong to siteUrl. |
Output Schema
| Name | Required | Description |
|---|---|---|
| siteUrl | No | |
| verdict | No | |
| crawledAs | No | |
| coverageState | No | |
| indexingState | No | |
| inspectionUrl | No | |
| lastCrawlTime | No | |
| referringUrls | No | |
| userCanonical | No | |
| pageFetchState | No | |
| robotsTxtState | No | |
| googleCanonical | No | |
| inspectionResultLink | No |
list_algo_updatesList Google algorithm updatesRead-onlyInspect
Fetches confirmed Google ranking/algorithm updates from the official Search Status Dashboard. Filters to service_name="Ranking" so indexing/crawling incidents are excluded. Optionally clip to a date range: an update is included when its rollout (beginISO to endISO) overlaps the range, so one that started before startDate but was still rolling out inside it is listed. The feed is cached for 15 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional filter: only include updates that began on or before this date (YYYY-MM-DD). Omit to include all. Never pass null or "null". | |
| startDate | No | Optional filter: only include updates still rolling out on or after this date (YYYY-MM-DD). Omit to include all. Never pass null or "null". |
Output Schema
| Name | Required | Description |
|---|---|---|
| updates | No |
list_annotationsList chart annotationsRead-onlyInspect
Lists chart annotations visible to the user across scopes: platform-wide (Google ranking updates synced from the Search Status dashboard), account-wide (user notes), and property-scoped. Optionally restrict to one property. Property-scoped annotations are returned only when siteUrl is passed, and include every note on that property, whoever added it (the owner or a collaborator it is shared with), as on the GSC Wizard chart.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional filter: only include annotations on or before this date (YYYY-MM-DD). Omit to include all. Never pass null or "null". | |
| siteUrl | No | ||
| startDate | No | Optional filter: only include annotations on or after this date (YYYY-MM-DD). Omit to include all. Never pass null or "null". |
Output Schema
| Name | Required | Description |
|---|---|---|
| annotations | No |
list_bing_sitesList Bing Webmaster sitesARead-onlyInspect
Lists the sites verified in the Bing Webmaster Tools account linked to GSC Wizard (via the stored Bing Webmaster API key). Use this to discover the exact site URLs Bing recognises before calling the other get_bing_* tools. Returns notConfigured: true when no Bing Webmaster API key is set up in the GSC Wizard app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| count | No | |
| sites | No | |
| dataSource | No | |
| notConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only profile, but the description adds genuinely useful context beyond them: it depends on a stored Bing Webmaster API key and returns notConfigured: true when that key is absent. It does not describe the shape of the successful site list, though the output schema presumably covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action, then the usage rule, then the edge case. Every sentence carries information an agent needs; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with an output schema, this covers action, when to call it, credentials dependency, and the no-key failure mode. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The mention of the underlying API key is contextual rather than a caller-supplied parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Lists') and resource ('sites verified in the Bing Webmaster Tools account linked to GSC Wizard'), and explicitly positions itself relative to the get_bing_* sibling family. An agent can tell it apart from the other Bing tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use rule: discover the exact site URLs Bing recognises before calling the other get_bing_* tools. It names the related tool family but offers no explicit exclusion conditions (e.g. which Bing tool to use if the key is missing, or what to fall back on).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_content_groupsList content groupsBRead-onlyInspect
Lists content groups for a property. Content groups partition the URL space using JSON rules (e.g. prefix matches, regex). Used in the dashboard for page-level aggregations.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| groups | No | |
| siteUrl | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful domain context by defining what a content group is and its JSON-rule basis, but discloses nothing about return shape, pagination, or scoping that goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences with the core action front-loaded and zero filler. Efficient and readable, though the dashboard sentence is more color than operational necessity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. For a simple read-only single-parameter list tool, the description covers purpose and domain meaning adequately; only pagination/ordering behavior is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden for the single siteUrl parameter. 'For a property' weakly signals that the argument is a property URL, but there is no format or validation detail. With only one mostly self-evident required param, a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource ('Lists content groups') scoped to a property, and the follow-up sentence explains what content groups are ('partition the URL space using JSON rules'). This distinguishes it from get_content_group_performance or create/update/delete_content_group, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusion ('use X instead'), and no mention of the create/update/delete_content_group alternatives a caller might confuse it with. The dashboard reference gives context but not a trigger condition for invoking the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_experimentsList SEO experimentsARead-onlyInspect
Lists the SEO experiments (split tests) defined for a property in GSC Wizard, each with its control/variant URL groups, source, status, and start date. Use get_experiment_results to score one. By default only active experiments are returned.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes | ||
| includeArchived | No | Include archived experiments as well as active ones. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| error | No | |
| siteUrl | No | |
| experiments | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the burden is low. The description still adds useful behavioral context: the default active-only filtering and the shape of returned records, which is more than the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler; the core purpose leads, the sibling routing follows, and the default filter closes. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed further, and the description still summarizes what each record contains. Combined with the default-filter note and sibling routing, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%: includeArchived is documented in the schema, but siteUrl is not. The description partially compensates by stating the default filter ('only active experiments are returned'), which clarifies includeArchived's semantics, and implies siteUrl via 'for a property'. It does not, however, specify the siteUrl format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Lists') plus resource ('SEO experiments (split tests)') and enumerates the returned fields (control/variant URL groups, source, status, start date). It is clearly distinguishable from the sibling get_experiment_results, which it explicitly positions as the scoring counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative tool and the condition that selects it ('Use get_experiment_results to score one'), and states the default scoping behavior. It lacks explicit when-not guidance (e.g., what to do if no experiments exist), but the routing context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ga4_custom_dimensionsGA4 custom dimensions & metricsRead-onlyInspect
Lists the custom dimensions and custom metrics REGISTERED on the GA4 property linked to a site (GA4 Admin > Custom definitions) - the event parameters and user properties that property collects on top of the standard GA4 fields, such as a source_format or target_path sent with an internal_link_click event. Each entry carries the exact apiName (e.g. customEvent:source_format) that query_ga4_custom_dimensions takes. Call this FIRST: an event parameter that is not registered cannot be reported on at all, and GA4 answers an unregistered name with an empty report rather than an error, so a name must never be guessed. Returns a notConfigured result (not an error) when Google Analytics is not connected or no GA4 property is linked to the site in the GSC Wizard app.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| note | No | |
| count | No | |
| reason | No | |
| account | No | |
| siteUrl | No | |
| dataSource | No | |
| propertyId | No | |
| definitions | No | |
| metricNames | No | |
| notConfigured | No | |
| dimensionNames | No | |
| reauthRequired | No |
list_ga4_propertiesList GA4 propertiesRead-onlyInspect
Lists every Google Analytics 4 property readable by the connected Google accounts of the authenticated user, and which GSC Wizard sites each property is linked to (via linkedSiteUrls). Use it to discover GA4 property IDs or to verify the Analytics setup of a site. linkedSiteUrls covers only the sites of the GSC Wizard account this connection is authenticated as (returned as account): links made from a different GSC Wizard account come back empty here even though the app shows them. An empty result with connected: false means the Google Analytics consent has not been granted in the GSC Wizard app yet (connect Google Analytics at tool.gscwizard.com first), or, with reauthRequired: true, that it was granted but Google now rejects every such account, so it has to be reconnected. errors lists every Google account whose properties could not be read (its properties are missing from the list), with the reason.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| note | No | |
| count | No | |
| error | No | |
| errors | No | |
| account | No | |
| connected | No | |
| properties | No | |
| reauthRequired | No |
list_gmc_accountsList Merchant Center accountsRead-onlyInspect
Lists every Google Merchant Center account readable by the connected Google accounts of the authenticated user, and which GSC Wizard sites each account is linked to (via linkedSiteUrls). Use it to discover the Merchant Center account id to link to a property, or to verify the Shopping setup of a site. isAdvanced: true marks a multi-client parent account: reporting runs against a standalone account or one of its sub-accounts, never the parent itself. linkedSiteUrls covers only the sites of the GSC Wizard account this connection is authenticated as (returned as account). incomplete: true means the list is a floor, not the whole set: gaps and unprobedAccountIds say what could not be read or checked for sub-accounts, and errors names each connected Google account whose listing failed; retry for a complete list. An empty result with connected: false carries a reason: "no_scope" means the Merchant Center consent has not been granted in the GSC Wizard app yet (connect Merchant Center at tool.gscwizard.com first); "credentials_revoked" means it was granted but Google now rejects the stored credentials, so the Google account has to be reconnected on the Account page. On a shared property, linkedAccountId is withheld (null, with a note) until the owner enables the Merchant Center opt-in on your invite.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | No | Optional property URL as returned by list_sites. When given, the response also reports which Merchant Center account is currently linked to that property (`linkedAccountId`). |
Output Schema
| Name | Required | Description |
|---|---|---|
| gaps | No | |
| hint | No | |
| note | No | |
| count | No | |
| error | No | |
| errors | No | |
| reason | No | |
| account | No | |
| siteUrl | No | |
| accounts | No | |
| connected | No | |
| incomplete | No | |
| incompleteNote | No | |
| linkedAccountId | No | |
| gcpProjectNumber | No | |
| unprobedAccountIds | No | |
| registrationRequired | No |
list_indexnow_submissionsList IndexNow submissionsRead-onlyInspect
Returns the IndexNow submission history for a property: URL, response code, submission source (manual / cron / mcp), and timestamp. Most recent first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| siteUrl | No | |
| submissions | No |
list_migration_redirectsList migration redirect mappingsARead-onlyInspect
Lists the saved redirect mappings (old URL -> new URL) used by the Migration Compare report, newest first. Mappings are grouped by the A/B property pair they belong to and optionally by a label, so one account can hold several migrations at once. Pass label or siteUrlA/siteUrlB to narrow. Use summaryOnly to get just the per-migration counts instead of the rows, which is the right call on a large mapping.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Only mappings carrying this label. | |
| limit | No | ||
| siteUrlA | No | Only mappings whose source property is this. | |
| siteUrlB | No | Only mappings whose target property is this. | |
| summaryOnly | No | Return only the per-migration row counts, not the individual mappings. |
Output Schema
| Name | Required | Description |
|---|---|---|
| redirects | No | |
| truncated | No | |
| migrations | No | |
| totalMappings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and non-destructive, so safety is covered. The description adds real behavioral detail beyond that: results are newest-first, grouped by A/B property pair and optionally by label, and summaryOnly switches from rows to per-migration counts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences; ordering and grouping behavior is front-loaded, then filtering, then the summaryOnly shortcut. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no prose, and the description covers behavior, grouping, and filtering adequately. The only material gap is the undocumented limit parameter, a minor omission for an otherwise complete read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so baseline is 3, but the description explains the effect of label, siteUrlA/siteUrlB (narrowing) and summaryOnly (counts vs rows) in terms of intent rather than just field names. Only the limit parameter is left unexplained in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Lists) and resource (saved redirect mappings, old URL -> new URL) and ties it to the Migration Compare report. It is clearly distinguishable from the add/delete_migration_redirects siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete narrowing guidance (pass label or siteUrlA/siteUrlB) and a conditional recommendation (use summaryOnly on a large mapping). It doesn't explicitly contrast with sibling mutation tools, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_migrationsList saved migrationsRead-onlyInspect
Lists the site migrations saved on the account in the GSC Wizard app (Migration Compare), most recently updated first: id, name, mode (cross-property, two-urls or regex), the old (siteUrlA) and new (siteUrlB) property, go-live date, window settings, the redirect-mapping label, whether daily re-check alerts are on, and the last health snapshot from that re-check (status, recovery, risk score, redirect problem counts). Pass an id to get_migration_health as migrationId for the full analysis. Takes no arguments.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | No | |
| truncated | No | |
| migrations | No |
list_report_clientsList report clientsRead-onlyInspect
Lists the client contacts on the account: the people who can be granted access to a shareable report. A client is just an email address (plus an optional name); they sign in with it to view reports shared with them. Use this to find a clientId for manage_report_access, or create_report_client to add a new contact.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| clients | No |
list_saved_filtersList saved filtersRead-onlyInspect
Lists saved filter presets, optionally restricted to one property. Each preset stores a JSON filter spec that mirrors the filter UI in the GSC Wizard dashboard. Presets belong to the property: with siteUrl you get every preset on it, including a property shared with you; without it you get the presets on the properties you own.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | No | Restrict to the presets on one property (one you own or one shared with you). Omit to list the presets on every property you own. |
Output Schema
| Name | Required | Description |
|---|---|---|
| filters | No |
list_sitemapsList submitted sitemapsARead-onlyInspect
Lists every sitemap submitted to Google Search Console for a property, including submission timestamps, warning/error counts, and per-content-type submitted/indexed URL counts.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| siteUrl | No | |
| sitemaps | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=true, destructiveHint=false). The description adds return-content context (timestamps, warning/error counts, URL counts), which is useful but not deep behavioral detail. It doesn't state authentication requirements despite openWorldHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, information-dense sentence with no filler. Purpose and return contents are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values needn't be explained, yet the description still summarizes them helpfully. The main gap is lack of usage guidance relative to siblings like get_sitemap_performance and submit_sitemap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and only one parameter (siteUrl) exists. The description says 'for a property' but doesn't explicitly name siteUrl or clarify its format, so it adds minimal meaning beyond the schema's required field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Lists every sitemap submitted to Google Search Console for a property.' Distinguishes from submit_sitemap (write) and get_sitemap_performance (metrics), though it doesn't explicitly name those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance. The agent must infer that this is for enumerating submitted sitemaps vs. get_sitemap_performance for performance data or submit_sitemap for adding one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sitesList Search Console propertiesRead-onlyInspect
Lists all Google Search Console properties connected to the authenticated GSC Wizard account. Returns the site URL (which may be a domain property prefixed with sc-domain: or a URL prefix property), tags, and which data source backs the property. Properties another user has shared with you are included too, badged with sharedBy (the owner) and accessLevel (READ_ONLY or FULL). permissionLevel is the Google Search Console permission (siteOwner / siteFullUser / siteRestrictedUser / siteUnverifiedUser), and readable: false means Google will refuse every data request for that property: it is listed in Search Console but not verified, so the user must verify it at search.google.com/search-console before any report will work. Do not attempt reads on a property with readable: false; tell the user to verify it instead. activated: false means the property is connected but is not shown on the account dashboard and is not synced to full storage, so every other property-scoped tool will refuse it with a selection error. Do not attempt reads on those either: either call set_dashboard_visibility to activate the property first, or choose one with activated: true. Properties shared with the caller are always activated: true, because the grant is itself the selection; a share whose owner no longer has an active GSC Wizard plan is left out, since no tool can read it. gscScope is the Search Console access of the Google connection behind the property: "full" allows submit_sitemap and create_gsc_property, "readonly" means Google will refuse those two (reads still work); absent when unknown.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Widget variant: "kpis", "table", or "sections". |
| kpis | No | KPI cards (kind="kpis"). |
| note | No | Caveat about the result, when the tool returned one. |
| rows | No | Data rows (kind="table"). |
| notes | No | Caveats about the result, when the tool returned several. |
| title | No | |
| blocks | No | Stacked sub-blocks (kind="sections"). |
| source | No | |
| columns | No | Column defs (kind="table"). |
| timeZone | No | GA4 property's IANA reporting time zone. |
| emptyText | No | |
| siteScope | No | Set when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites. |
| dataMaturity | No | |
| settledThrough | No | Last day the data is complete through. |
| comparisonHasData | No | false when the comparison period has no data at all, so there is no comparison. |
list_tagsList property tagsARead-onlyInspect
Lists every tag defined on the account: account-level global tags plus any tag attached to a registered Search Console property, with the number of properties carrying each tag. Tags group properties into portfolios; feed a tag name to get_tag_group_view for an aggregated cross-site report, or to get_cross_site_summary for a totals-only view. Pass includeSites=true to also get the list of property URLs under each tag.
| Name | Required | Description | Default |
|---|---|---|---|
| includeSites | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | No | |
| totalTags | No | |
| totalSites | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds value beyond annotations by disclosing the composition of the result set (global tags plus property-attached tags with per-tag property counts) and the effect of includeSites. It does not discuss auth, rate limits, or pagination, so it is not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core definition of what is listed, then routing guidance, then the parameter behavior. Every sentence adds distinct actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not enumerate return fields; it still usefully summarizes that per-tag property counts are returned. For a simple read-only listing with one optional flag, it covers what is listed, how to interpret tags, downstream use, and the parameter effect. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides no descriptions (0% coverage) for the single optional parameter includeSites. The description fully compensates: 'Pass includeSites=true to also get the list of property URLs under each tag.' That is exactly the semantic an agent needs to decide whether to set it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Lists every tag defined on the account: account-level global tags plus any tag attached to a registered Search Console property.' It also quantifies the return ('with the number of properties carrying each tag'), so an agent can distinguish this from siblings like manage_tags (mutation) or get_tag_group_view (report generation) without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: tags group properties into portfolios and the output feeds get_tag_group_view for aggregated cross-site reports or get_cross_site_summary for totals-only views. However, these are downstream tools, not same-purpose alternatives, and there is no explicit when-not or prerequisite statement (e.g., that a registered property is required). Clear context but not a full when/when-not/alternatives treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_topic_clustersList topic clustersARead-onlyInspect
Lists topic clusters for a property. Each cluster groups a set of keywords under a name and is used by the dashboard to aggregate query-level metrics.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| siteUrl | No | |
| clusters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds useful context about what a cluster contains (a name grouping keywords) and its role in dashboard metric aggregation, but says nothing about return shape beyond the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, fully front-loaded with the action and scope, no filler. Every clause earns its place by defining the resource and its consumer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and annotations cover the safety profile. The description covers purpose and resource semantics but omits any handling of empty/absent clusters or pagination, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 0% schema description coverage, so the description's mention of 'for a property' is the sole signal that siteUrl scopes the listing. That is minimal but sufficient for a single required param; no format details (URL shape) are given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Lists') and resource ('topic clusters') scoped to a property, and explains what a cluster is. Does not explicitly differentiate from sibling create_topic_cluster/update_topic_cluster/delete_topic_cluster, but the read semantics are clear from the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage by mentioning the dashboard aggregation purpose, but never states when to call this vs. get_topic_cluster_performance or how to manage clusters. No explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tracked_urlsList tracked URLsRead-onlyInspect
Paginated list of URLs in the GSC Wizard Indexing Tracker for a property, with optional status filter and URL substring search. Filter options: all, indexed, not_indexed, pending, errors, warnings. Returns the current verdict / coverage / indexing state, last-crawl time, the Google-selected and user-declared canonicals, and the Search Console link per URL, all from the latest inspection. A canonical is null when Google did not report it or the URL has not been inspected yet.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| filter | No | all | |
| search | No | ||
| siteUrl | Yes | ||
| pageSize | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | |
| urls | No | |
| total | No | |
| message | No | |
| siteUrl | No | |
| pageSize | No | |
| configured | No |
list_url_inspectionsList URL inspection historyRead-onlyInspect
Returns the inspection history GSC Wizard has stored for a property: verdict, coverage, indexing state, last-crawl time, the Google-selected and user-declared canonicals, and the Search Console link per URL. Most recent first. A null canonical with a non-null inspection_result_link means Google did not report it; when the link is null too, the row predates canonical storage (re-run inspect_url for a fresh result). Paged: follow pagination.nextOffset to walk the whole stored history.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows to return per call (default 100, max 500). | |
| offset | No | Rows to skip. Use pagination.nextOffset from a previous call to get the next page. | |
| siteUrl | Yes | ||
| urlContains | No | ||
| latestPerUrl | No | Collapse repeat inspections of the same URL to the most recent one. Applied to the page after paging, so a page can return fewer rows than limit. |
Output Schema
| Name | Required | Description |
|---|---|---|
| siteUrl | No | |
| pagination | No | |
| inspections | No |
list_yandex_sitesYandex sitesRead-onlyInspect
Lists the sites in the connected Yandex Webmaster account, with their verification status and the canonical mirror Yandex resolved for each. Use this to find out which properties have Yandex data available. Only sites already added AND verified in Yandex Webmaster itself report data. The list is cached for ten minutes. Returns notConfigured: true when no Yandex account is connected, or when the connection has to be granted again (reason: reauth).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| sites | No | |
| reason | No | |
| dataSource | No | |
| limitations | No | |
| notConfigured | No |
manage_report_accessGrant or revoke report accessDestructiveInspect
Grants or revokes client access to a saved shareable report. This is what makes a report openable at all: an ungranted report opens for nobody, including the account owner. After granting, the client opens the report URL, enters their email, and GSC Wizard emails them a login link. That self-serve sign-in only works once they hold a grant. Clients must already exist on the account: add them with create_report_client, find ids with list_report_clients. NOTE: unlike the web app's share dialog, this tool does NOT itself send a "report shared with you" notification. Either pass the recipient the report URL, or send the notification from Account > Shared Reports in GSC Wizard (https://tool.gscwizard.com/account/shared-reports), where each client has a Resend button. action "revoke" withdraws access. Granting is idempotent: a client who already had access stays granted and is reported as unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| reportId | Yes | ||
| clientIds | Yes | Client ids from list_report_clients / create_report_client. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| note | No | |
| action | No | |
| granted | No | |
| revoked | No | |
| reportId | No | |
| emailsSent | No | |
| reportTitle | No | |
| alreadyHadAccess | No | |
| didNotHaveAccess | No | |
| unknownClientIds | No |
manage_tagsManage property tagsDestructiveInspect
Create, assign, unassign, rename, or delete property tags. Tags group Search Console properties into portfolios surfaced by list_tags and get_tag_group_view. Actions: "create" defines an account-level global tag (so it appears before any property uses it); "assign" adds a tag to the given properties; "unassign" removes it from the given properties; "rename" renames a tag across every property and the global list; "delete" removes a tag from every property and the global list. siteUrls is required for assign/unassign and ignored otherwise; newName is required for rename. assign/unassign also work on a property shared with you with full access (the tag is stored on that property, as in the app); create, rename and delete only touch your own properties and global tag list. A batch that would push any property past 50 tags changes nothing. For wholesale replacement of one property's tag set, use update_site instead.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | ||
| action | Yes | ||
| newName | No | ||
| siteUrls | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| tag | No | |
| action | No | |
| newName | No | |
| updated | No | |
| notTagged | No | |
| requested | No | |
| globalTags | No | |
| updatedSites | No | |
| alreadyTagged | No | |
| globalTagRemoved | No | |
| globalTagRenamed | No | |
| removedFromSites | No |
query_countriesCountry breakdownRead-onlyInspect
Returns per-country performance (clicks, impressions, CTR, position) for a property over a date range. Country codes are ISO 3166-1 alpha-3. Served from the ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options. | |
| limit | No | Rows to return per call (default 100, max 1000). | |
| offset | No | Rows to skip. Use pagination.nextOffset from a previous call to get the next page. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| contentGroupId | No | Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which. | |
| topicClusterId | No | Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| siteUrl | No | |
| countries | No | |
| dataSource | No | |
| pagination | No | |
| dataMaturity | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
query_devicesDevice breakdownRead-onlyInspect
Returns per-device-category performance (DESKTOP, MOBILE, TABLET) for a property over a date range. Served from the ClickHouse warehouse when available, otherwise the live Search Console API (see the response dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| contentGroupId | No | Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which. | |
| topicClusterId | No | Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| devices | No | |
| siteUrl | No | |
| dataSource | No | |
| dataMaturity | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
query_ga4_custom_dimensionsGA4 custom dimension breakdownRead-onlyInspect
Breaks GA4 traffic down by ONE custom dimension registered on the property linked to a site (the site's own event parameters or user properties, e.g. customEvent:source_format), optionally CROSSED with a second dimension - which is how a question like "which article sent how many readers to which page" is answered: primary customEvent:source_path, secondary customEvent:target_path, filtered to the one event that carries them. Metrics per row are eventCount, sessions, activeUsers and keyEvents, plus any registered custom metrics asked for. Run list_ga4_custom_dimensions first for the exact names; an unregistered name is rejected here rather than silently returning an empty report. Returns a notConfigured result (not an error) when Google Analytics is not connected or no GA4 property is linked. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of breakdown rows returned. | |
| endDate | No | Optional. 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". | |
| filters | No | Optional GA4 dimension filters applied to every report in the call. Within a list field the values OR together; different fields AND together. Omit entirely for unfiltered data. | |
| siteUrl | Yes | ||
| dimension | No | apiName of the custom dimension to break down by, from list_ga4_custom_dimensions (e.g. customEvent:source_format). Omit to use the property's first registered custom dimension; the response reports the choice. | |
| startDate | No | Optional. 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". | |
| valueFilters | No | Narrow the whole report to rows whose custom dimension matches a value - the way to drill from "every source_path" into "the target pages of ONE source_path". Filters AND together. | |
| customMetrics | No | Up to 3 registered custom METRIC apiNames to add as extra columns (from list_ga4_custom_dimensions metricNames). | |
| comparisonEndDate | No | Optional. 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). | |
| secondaryDimension | No | Optional second dimension to cross the first with, producing one row per PAIR of values. Either another custom dimension apiName, or one of: eventName, pagePath, landingPage, sessionDefaultChannelGroup, sessionSourceMedium, country, deviceCategory. | |
| comparisonStartDate | No | Optional. 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
| Name | Required | Description |
|---|---|---|
| hint | No | |
| note | No | |
| rows | No | |
| range | No | |
| reason | No | |
| account | No | |
| metrics | No | |
| siteUrl | No | |
| summary | No | Metric totals keyed by GA4 metric name. |
| rowCount | No | |
| timeZone | No | |
| dimension | No | |
| siteScope | No | |
| totalRows | No | |
| truncated | No | |
| dataSource | No | |
| propertyId | No | |
| prevSummary | No | |
| hasComparison | No | |
| notConfigured | No | |
| reauthRequired | No | |
| comparisonRange | No | |
| availableMetrics | No | |
| secondaryDimension | No | |
| availableDimensions | No |
query_ga4_reportGA4 breakdown reportRead-onlyInspect
Runs ONE Google Analytics 4 dimension breakdown for the GA4 property linked to a GSC Wizard site: channel, sourceMedium, page, landingPage, country, device, event, date (daily trend) or hostName. Each dimension carries its own metric set (returned in metrics). Set secondaryDimension to "date" or "hostName" to split every row further, e.g. dimension "event" + secondaryDimension "date" shows on which days an event fired; each row then carries that field (dates as YYYY-MM-DD). Rows include prev* fields that are only meaningful when a comparison range is given (hasComparison); date breakdowns take no comparison range. Only the first limit rows are returned (truncated and note say when more exist); to follow one event, pass filters: { event: [""] }. When the GA4 property is shared with other sites, results are limited to this site's hostnames and siteScope says so (on a shared property a hostName filter narrows within that scope; only the owner can replace it). Rates (engagementRate, bounceRate) are fractions 0-1, not percentages. Returns a notConfigured result (not an error) when Google Analytics is not connected or no GA4 property 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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| endDate | No | Optional. 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". | |
| filters | No | Optional GA4 dimension filters applied to every report in the call. Within a list field the values OR together; different fields AND together. Omit entirely for unfiltered data. | |
| siteUrl | Yes | ||
| dimension | Yes | ||
| startDate | No | Optional. 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". | |
| comparisonEndDate | No | Optional. 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). | |
| secondaryDimension | No | Optional second dimension that splits every row: "date" (per day) or "hostName" (per site/stream host). Must differ from `dimension`. | |
| comparisonStartDate | No | Optional. 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
| Name | Required | Description |
|---|---|---|
| hint | No | |
| note | No | |
| rows | No | |
| range | No | |
| reason | No | |
| account | No | |
| metrics | No | |
| siteUrl | No | |
| rowCount | No | |
| timeZone | No | |
| dimension | No | |
| siteScope | No | |
| totalRows | No | |
| truncated | No | |
| dataSource | No | |
| propertyId | No | |
| hasComparison | No | |
| notConfigured | No | |
| reauthRequired | No | |
| comparisonRange | No | |
| secondaryDimension | No |
query_search_analyticsQuery Search Console analyticsRead-onlyInspect
Runs a Search Console searchAnalytics.query against one of the user's properties. Supports date / query / page / country / device / searchAppearance dimensions, dimension filters, and any of the supported search types (web, image, video, news, discover, googleNews). Use this for ad-hoc questions like "top queries last 28 days" or "page-level performance for /pricing". Eligible requests are served from the GSC Wizard ClickHouse warehouse (longer history, no sampling); requests using searchAppearance, the googleNews type or 3+ distinct dimensions fall back to the live Search Console API. The response dataSource says which path ran. Rows are sorted by clicks, or by date first when date is one of the dimensions. Regex filters use RE2 (no lookahead or backreferences; use excludingRegex to exclude). Returns 100 rows by default: read pagination in the response to see whether the result was truncated, and page through with startRow or ask for more at once with rowLimit. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional. 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". | |
| filters | No | Dimension filters joined with AND. Pass an empty list or omit for no filtering. | |
| siteUrl | Yes | The property URL as returned by list_sites (e.g. "sc-domain:example.com"). | |
| rowLimit | No | Rows to return per call (default 100, max 25000). Large values return a lot of raw rows; prefer paging with startRow. | |
| startRow | No | Rows to skip. Use pagination.nextOffset from a previous call to get the next page. | |
| startDate | No | Optional. 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". | |
| dimensions | No | ||
| searchType | No | web |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| rows | No | |
| endDate | No | |
| siteUrl | No | |
| rowCount | No | |
| startDate | No | |
| dataSource | No | |
| dimensions | No | |
| pagination | No | |
| searchType | No | |
| dataMaturity | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
query_top_pagesTop landing pagesARead-onlyInspect
Returns the top landing pages for a property over a date range, sorted by clicks. Convenience wrapper around query_search_analytics. Served from the ClickHouse warehouse when available, otherwise the live Search Console API (see the response dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options. | |
| limit | No | Rows to return per call (default 100, max 1000). | |
| offset | No | Rows to skip. Use pagination.nextOffset from a previous call to get the next page. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| contentGroupId | No | Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which. | |
| topicClusterId | No | Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Widget variant: "kpis", "table", or "sections". |
| kpis | No | KPI cards (kind="kpis"). |
| note | No | Caveat about the result, when the tool returned one. |
| rows | No | Data rows (kind="table"). |
| notes | No | Caveats about the result, when the tool returned several. |
| title | No | |
| blocks | No | Stacked sub-blocks (kind="sections"). |
| source | No | |
| columns | No | Column defs (kind="table"). |
| timeZone | No | GA4 property's IANA reporting time zone. |
| emptyText | No | |
| siteScope | No | Set when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites. |
| dataMaturity | No | |
| settledThrough | No | Last day the data is complete through. |
| comparisonHasData | No | false when the comparison period has no data at all, so there is no comparison. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-destructive, but the description adds real behavioural context: it may be served from the ClickHouse warehouse or the live Search Console API (surfaced in `dataSource`), and data lags ~2-3 days. That backend variability is not derivable from the annotations or schema and is genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: purpose and sort first, then wrapper relationship, then data-source and date-default behaviour. No redundant filler; each clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and annotations cover the safety profile; the description fills in backend provenance and date-window defaults. It is essentially complete for a 9-param read tool, with only explicit alternative-selection guidance missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 78%, so most parameters (brand, limit, offset, dates, content/topic filters) are already documented inline, including the 28-settled-day default. The description largely restates the date-range behaviour rather than adding syntax or format meaning, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns the top landing pages for a property over a date range, sorted by clicks') and anchors it to the underlying primitive ('Convenience wrapper around query_search_analytics'). An agent can distinguish it from query_top_queries and query_search_analytics without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Naming query_search_analytics as the parent implies this is the convenient preset for landing-page rankings, and the date-omission guidance is actionable. However, it never says when to prefer this over siblings like get_page_performance or breakdown_by_path, nor any when-not condition, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_top_queriesTop search queriesARead-onlyInspect
Returns the top search queries for a property over a date range, sorted by clicks. Convenience wrapper around query_search_analytics for the most common request. Served from the GSC Wizard ClickHouse warehouse (longer history, no sampling) when available, otherwise from the live Search Console API; the response dataSource field says which. Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options. | |
| limit | No | Rows to return per call (default 100, max 1000). | |
| offset | No | Rows to skip. Use pagination.nextOffset from a previous call to get the next page. | |
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| contentGroupId | No | Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which. | |
| topicClusterId | No | Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Widget variant: "kpis", "table", or "sections". |
| kpis | No | KPI cards (kind="kpis"). |
| note | No | Caveat about the result, when the tool returned one. |
| rows | No | Data rows (kind="table"). |
| notes | No | Caveats about the result, when the tool returned several. |
| title | No | |
| blocks | No | Stacked sub-blocks (kind="sections"). |
| source | No | |
| columns | No | Column defs (kind="table"). |
| timeZone | No | GA4 property's IANA reporting time zone. |
| emptyText | No | |
| siteScope | No | Set when GA4 numbers were narrowed to this site's hostnames because the property is shared with other sites. |
| dataMaturity | No | |
| settledThrough | No | Last day the data is complete through. |
| comparisonHasData | No | false when the comparison period has no data at all, so there is no comparison. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, openWorld), so the description goes well beyond structured data: it discloses the dual data source (ClickHouse warehouse vs live API), the no-sampling/longer-history tradeoff, that the response `dataSource` field reports which was used, and the ~2-3 day data lag. This is exactly the operational context an agent cannot infer elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core purpose before moving to the wrapper relationship, data-source behavior, and date defaults. Every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter analytics tool with an output schema and rich annotations, the description supplies the missing operational pieces: source selection, sampling behavior, and default date-window logic. Since an output schema exists, it correctly avoids explaining return values beyond the one useful `dataSource` note.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (78%), and the description largely restates what the schema already documents about the optional date range and its 28-day default rather than adding new meaning. It does not compensate for the undocumented params (siteUrl, searchType), so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (returns top search queries), the sort order (by clicks), and the scope (for a property over a date range). It explicitly frames itself as a wrapper around query_search_analytics, letting an agent separate it from that sibling and from query_top_pages without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the underlying alternative (query_search_analytics) and positions this as 'the most common request', which gives clear context for when to reach for it. It lacks an explicit when-not clause (e.g. 'use query_search_analytics for advanced filtering'), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_tracked_urlsRemove URLs from the indexing trackerBDestructiveInspect
Removes URLs from the GSC Wizard Indexing Tracker for a property. Pass the full URL strings to stop tracking. Returns the number of rows actually removed.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | ||
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| removed | No | |
| siteUrl | No | |
| requested | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation/safety profile is covered. The description adds a genuinely useful nuance with 'Returns the number of rows actually removed,' implying partial/no-op removal when URLs were not tracked, but it says nothing about permissions, the 1800-item cap, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler, and the action plus scope are front-loaded ahead of the parameter hint and return note. Nothing is redundant enough to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return-count sentence is a bonus rather than a necessity, and the core destructive operation is described. However, for a destructive 2-param mutation with no schema descriptions, the definition leaves the batching limit and the handling of untracked URLs for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and neither parameter has a description, so the description must compensate. It clarifies that 'urls' must be full URL strings (not paths) and that siteUrl identifies the property, but it omits the minItems=1 / maxItems=1800 bounds and required-ness context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Removes URLs from the GSC Wizard Indexing Tracker') and scopes it 'for a property,' so an agent can distinguish it from get_indexing_tracker or list_tracked_urls. It does not explicitly name its inverse sibling add_tracked_urls, but 'stop tracking' makes the direction unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Pass the full URL strings to stop tracking' implies how to invoke it, but there is no explicit when-to-use vs. when-not guidance and no mention of alternatives such as add_tracked_urls or list_tracked_urls. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_feed_auditRun feed auditInspect
Queues a Merchant Center feed audit for a GSC Wizard site: 21 deterministic checks over the synced product catalog (title and description length, duplicate titles / descriptions / images / URLs, GTIN, category, product type and required attributes, image size and ratio) plus a crawl of the product pages on the owner-approved host allowlist (HTTP status, JSON-LD Product schema, price and title consistency, H1 and title-element counts, page images missing from the feed), rolled up into a 0-100 Feed Score. The tool only ENQUEUES: the audit runs in the GSC Wizard app worker (the feed plane within minutes, the page crawl at a politeness-bounded pace over every distinct product URL, so a large catalog can take hours), and enqueued: false with a skipReason means a run is still in progress (run_in_progress, with the run summary in run), a run for today already exists, or one completed inside the 28-day cadence (pass force: true to override the cadence; the one-per-day rule cannot be overridden). Each user may start at most 3 runs per 24 hours (rate_limited beyond that; a call that queues nothing does not count). Poll get_feed_audit_results with the returned runDate for status and the score. Returns a notConfigured result (not an error) when Merchant Center is not connected, is connected on another Google login than the property's Search Console one (reason "gmc_on_other_account": the audit runs through the sync, which reads only through the Search Console account), its credentials were revoked, or no Merchant Center account is linked to the site in the GSC Wizard app. Requires full access on a shared property.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Queue an audit even when one completed inside the last 28 days (default false). Cannot bypass the one-audit-per-property-per-day rule or a run still in progress. | |
| siteUrl | Yes | The property URL as returned by list_sites (e.g. "sc-domain:example.com"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | No | |
| hint | No | |
| force | No | |
| range | No | |
| reason | No | |
| account | No | |
| runDate | No | |
| siteUrl | No | |
| cachedAt | No | |
| enqueued | No | |
| dataSource | No | |
| skipReason | No | |
| gmcAccountId | No | |
| notConfigured | No | |
| truncationReason | No |
score_opportunitiesScore ranking opportunitiesRead-onlyInspect
Ranks queries by an impression-weighted opportunity score that favours near-threshold positions (positions 3-30) with low current CTR, and estimates the extra clicks available if CTR improved. potentialClicks is the extra clicks a 25% CTR would bring a query ranked lower than position 3. It is 0 when the query already clicks at or above that benchmark (common for small or navigational queries), which says nothing about its rank. Sorted by score. CTR values are percentages (0-100). Scans up to 25,000 queries: on the warehouse the ones with the most impressions; on the live API its click order. truncated: true means the scan hit that cap (scanNote says what that left out). Served from the GSC Wizard ClickHouse warehouse when available, otherwise the live Search Console API (see dataSource). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| endDate | No | Optional. 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". | |
| siteUrl | Yes | ||
| startDate | No | Optional. 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". | |
| searchType | No | web | |
| minImpressions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| range | No | |
| siteUrl | No | |
| scanNote | No | |
| scanLimit | No | |
| truncated | No | |
| dataSource | No | |
| dataMaturity | No | |
| opportunities | No | |
| minImpressions | No | |
| settledThrough | No | |
| warehouseLatestDate | No |
set_dashboard_visibilityShow or hide properties on the dashboardInspect
Shows or hides registered properties on the GSC Wizard dashboard, the same switch as the app's Dashboard Management page. Visibility is also what makes a property usable by the other MCP tools, so use this to bring a newly added property into scope. Showing a property consumes a dashboard slot from the plan and is refused when the plan limit is reached; ClickHouse-synced properties are always shown and consume no slot. Hiding a property only removes it from the workspace: no data is deleted, and it can be shown again at any time. The response reports slot usage before and after.
| Name | Required | Description | Default |
|---|---|---|---|
| visible | Yes | true = show on the dashboard (consumes a slot), false = hide. | |
| siteUrls | Yes | Registered property URLs, as returned by list_sites. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| slots | No | |
| updated | No | |
| visible | No | |
| unchanged | No | |
| notRegistered | No |
submit_indexnow_urlsSubmit URLs to IndexNowInspect
Pings IndexNow for the given URLs, telling participating search engines (Bing, Yandex, Seznam) that the pages have changed. The property needs an IndexNow API key and a published key file: check get_indexnow_settings first. If no key is set: 1) call update_indexnow_settings with generateKey: true; 2) publish the returned keyFileContent as a plain-text file at the returned keyFileUrl (the root of every host you submit URLs for); 3) call submit_indexnow_urls again. URLs are grouped by host before submission. Up to 100 URLs per call. Note that the usual 202 response means "accepted, key validation pending", not delivered: engines fetch the site key file afterwards and silently discard the batch if it is not reachable, so do not report a 202 as confirmed indexing.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | ||
| siteUrl | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| failed | No | |
| actions | No | |
| batchId | No | |
| keyFile | No | |
| message | No | |
| outcome | No | |
| siteUrl | No | |
| attempted | No | |
| submitted | No | |
| keySiteUrl | No | |
| submissions | No | |
| historyLogged | No | |
| skippedOffProperty | No | |
| pendingKeyValidation | No |
submit_sitemapSubmit a sitemap to Search ConsoleIdempotentInspect
Submits (or re-submits) an existing sitemap URL to Google Search Console for a property, the same action as "Add a new sitemap" in the Sitemaps report. It does not create or host a sitemap: the file must already be published and reachable at the URL you pass; this only registers it with Google or asks Google to fetch it again after new content went live. Every sitemap URL must be on the property host or a subdomain of it. Up to 20 sitemaps per call. Submitting is idempotent and queues a download; it does not index anything by itself, and Google reports parse warnings/errors only after it has fetched the file, so a freshly submitted sitemap normally comes back pending. Requires a Google account connected with full Search Console access (a read-only connection is refused before anything is sent). If a rate limit or a permission refusal stops a batch after some sitemaps were accepted, the accepted ones are still reported and the rest are listed in notAttempted, with stopReason. Use list_sitemaps to see what is already submitted.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes | ||
| sitemapUrls | Yes | Absolute URLs of already-published sitemaps, e.g. ["https://example.com/sitemap_index.xml"]. Each must be on the property host or a subdomain of it. Max 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| failed | No | |
| actions | No | |
| message | No | |
| results | No | |
| siteUrl | No | |
| attempted | No | |
| submitted | No | |
| stopReason | No | |
| notAttempted | No | |
| retryAfterSeconds | No |
update_annotationUpdate a chart annotationDestructiveInspect
Edits a chart annotation the user owns: its date, label, description, category or colour. Only the fields you pass change. Scope cannot be changed (an account-wide annotation cannot be moved onto a property or vice versa); delete it and create a new one instead. Platform-scoped annotations are system events and cannot be edited via this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | ||
| label | No | ||
| category | No | ||
| eventDate | No | The date the event occurred, as YYYY-MM-DD (e.g. 2026-06-08). | |
| description | No | ||
| annotationId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| annotation | No |
update_content_groupUpdate a content groupDestructiveInspect
Edits an existing content group: its name, description, color, or matching rules. Only the fields you pass change; omit a field to leave it untouched. Passing rules REPLACES the whole rule list (rules have no stable ids across edits), so read the current rules with list_content_groups first if you mean to add one. Changing rules reassigns pages immediately in every report that uses the group; nothing is recomputed or stored, so the next get_content_group_performance call reflects the edit. A regex rule that cannot compile is rejected; one that is valid but unsupported by the warehouse or skipped as ReDoS-prone is accepted and reported in ruleWarnings. Relay those, since a skipped pattern matches no pages at all.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| color | No | ||
| rules | No | Replaces the entire rule list. Same { type, value } shape as create_content_group. | |
| groupId | Yes | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| group | No |
update_indexnow_settingsSet the IndexNow API keyDestructiveInspect
Sets, generates, rotates or clears the IndexNow API key for a property. The key is what search engines use to verify submissions from submit_indexnow_urls. To set IndexNow up, pass generateKey: true: a valid key is created and returned with keyFileUrl and keyFileContent. IMPORTANT: the site owner must then publish keyFileContent as a plain-text file at keyFileUrl (at the root of every host whose URLs will be submitted), or every submission is discarded. generateKey refuses to replace an existing key; to rotate, pass clear: true first. You can also pass your own indexnowApiKey (8-128 letters, digits and hyphens), for example one whose key file the site already publishes: the file is checked right after saving and keyFileVerified reports the result (true = ready to submit). Pass clear: true to remove the key, which disables IndexNow submissions for the property. Reading the key back later (get_indexnow_settings) only ever returns it masked.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Remove the stored key instead of setting one. Disables IndexNow submissions. | |
| siteUrl | Yes | ||
| generateKey | No | Create a new valid key and return the key file to publish. Only when the property has no key yet; clear the old key first to rotate. | |
| indexnowApiKey | No | The new key. Omit when using generateKey or clear. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cleared | No | |
| siteUrl | No | |
| nextStep | No | |
| generated | No | |
| keyFileUrl | No | |
| keyFileUrls | No | |
| keyFileError | No | |
| keyFileContent | No | |
| keyFileVerified | No | |
| indexnowApiKeySet | No | |
| indexnowApiKeyMasked | No |
update_saved_filterUpdate a saved filterDestructiveInspect
Renames a saved filter preset and/or replaces its filter rows. Only the fields you pass change. filters is the list of filter rows (dimension / operator / value), in the same shape list_saved_filters returns, and is REPLACED wholesale, not merged: read the current rows with list_saved_filters and pass them back with your edits applied. Passing filters without filterLogic resets the preset to AND, so pass both when the preset used OR. The property's owner or anyone with full access to it may edit any preset on it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| filters | No | Replaces the stored filter rows. Omit to keep the current ones. | |
| filterId | Yes | ||
| filterLogic | No | Only read when `filters` is passed; the two are stored together. |
Output Schema
| Name | Required | Description |
|---|---|---|
| filter | No |
update_siteUpdate a propertyDestructiveInspect
Updates the GSC Wizard metadata for a property: tags, branded keywords, sitemap URL list, and how fast GSC Wizard may crawl the site. Only fields you pass are updated; omit a field to leave it unchanged. Pass null for a crawl-rate field to clear the override and go back to the app default. On a property shared with you, FULL access is needed (as in the property settings of the web app); READ_ONLY access is refused.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| siteUrl | Yes | ||
| sitemapUrls | No | ||
| brandedKeywords | No | ||
| crawlMinDelayMs | No | Minimum milliseconds between crawl batches (0-60000). Composes with robots.txt Crawl-delay; the longer wait wins. null = app default. | |
| crawlMaxConcurrency | No | Pages GSC Wizard may fetch from this site at once (1-10). Lower it if the site answers 429 during an audit. null = app default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| site | No |
update_topic_clusterUpdate a topic clusterADestructiveInspect
Edits an existing topic cluster's name or keyword list. Only the fields you pass change. keywords REPLACES the whole list by default; pass mode "add" or "remove" to merge into or subtract from the current keywords instead, which is what you usually want when extending a cluster. A keyword is matched as a case-insensitive substring unless it is wrapped in slashes (/seo ?tools/), which makes it a regex. Read the current list with list_topic_clusters first when replacing.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | How `keywords` is applied: "replace" (default) swaps the list, "add" merges new keywords in (deduplicated, case-insensitively), "remove" deletes the listed ones. | replace |
| name | No | ||
| keywords | No | ||
| clusterId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| cluster | No | |
| keywordsAfter | No | |
| keywordsBefore | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true, and the description justifies it by explaining that keywords REPLACES the whole list by default and how to avoid that with mode add/remove. It also discloses the partial-update semantics ('Only the fields you pass change'). It stops short of auth/permission or reversibility notes, but adds real context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then dense but relevant detail on replacement vs merge and keyword matching. Four sentences, each carrying information (destructive default, mode alternatives, regex syntax, list-first tip). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with an output schema already present, the description covers partial-update behavior, the destructive default, merge modes, and matching rules. Nothing critical to correct invocation is missing, though permission requirements are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low (25%), so the description must carry the load, and it does: it explains keywords semantics (full replacement vs add/remove merge), substring vs slash-delimited regex matching, and mode behavior. clusterId and name constraints are left to the schema, but the high-value keyword semantics are well covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Edits') and resource ('an existing topic cluster') plus the fields it operates on (name, keyword list). 'Existing' implicitly distinguishes it from create_topic_cluster and delete_topic_cluster among its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear mode-selection guidance ('mode "add" or "remove" ... which is what you usually want when extending a cluster') and a prerequisite ('Read the current list with list_topic_clusters first when replacing'). It doesn't state when to reach for a different tool entirely, but the routing within the tool is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
- Changed
compare_migration11 fields changed- added
Input schema / properties / goLiveDateAdded value: +{ + "description": "Optional. First day the new setup was live, as YYYY-MM-DD. When given, side A is read over the before window and side B over the after window around this date (see windowStrategy), and the result adds windows, recoveryPct and trend buckets. Do not combine with startDate/endDate.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - changed
Input schema / properties / urlPrefixA / descriptionPrevious value: -"Side A URL prefix (required for two-urls)."New value: +"Side A URL prefix (required for two-urls): a full URL (\"https://acme.com/old-blog/\"), a host (\"blog.acme.com/\") or a path on any host (\"/old-blog/\"), as list_migrations returns them." - changed
Input schema / properties / urlPrefixB / descriptionPrevious value: -"Side B URL prefix (required for two-urls)."New value: +"Side B URL prefix (required for two-urls), in the same forms as urlPrefixA." - added
Input schema / properties / windowDaysAdded value: +{ + "description": "Only with goLiveDate. Window length in days for \"recent\" and \"from-go-live\" (default 28). Shortened to the post-launch days available.", + "maximum": 365, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / windowStrategyAdded value: +{ + "description": "Only with goLiveDate. \"recent\" (default): the last windowDays days vs the windowDays days before go-live, where the migration stands now. \"from-go-live\": the first windowDays days after go-live vs the windowDays days before, the launch dip included. \"full\": the 90 days before go-live vs every day since (lengths differ; per-day figures and recovery stay comparable).", + "enum": [ + "recent", + "from-go-live", + "full" + ], + "type": "string" +} - added
Input schema / properties / yoyBaselineAdded value: +{ + "description": "Only with goLiveDate. Compare the after window with the same weeks one year (364 days) earlier instead of the days before go-live, which removes seasonality. Default false.", + "type": "boolean" +} - added
Output schema / properties / recoveryNoteAdded value: +{ + "$ref": "#/properties/mode" +} - added
Output schema / properties / recoveryPctAdded value: +{ + "$ref": "#/properties/range/anyOf/0/properties/days" +} - added
Output schema / properties / truncated / $refAdded value: +"#/properties/windows/anyOf/0/properties/yoyBaseline" - removed
Output schema / properties / truncated / typeRemoved value: -[ - "boolean", - "null" -] - added
Output schema / properties / windowsAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "after": { + "$ref": "#/properties/windows/anyOf/0/properties/before" + }, + "before": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "days": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "end": { + "$ref": "#/properties/mode" + }, + "start": { + "$ref": "#/properties/mode" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "daysSinceGoLive": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "equalLength": { + "$ref": "#/properties/windows/anyOf/0/properties/yoyBaseline" + }, + "goLiveDate": { + "$ref": "#/properties/mode" + }, + "latestDate": { + "$ref": "#/properties/mode" + }, + "strategy": { + "$ref": "#/properties/mode" + }, + "timeline": { + "$ref": "#/properties/windows/anyOf/0/properties/before" + }, + "warnings": { + "items": { + "additionalProperties": false, + "properties": { + "code": { + "$ref": "#/properties/mode" + }, + "message": { + "$ref": "#/properties/mode" + }, + "severity": { + "$ref": "#/properties/mode" + } + }, + "type": "object" + }, + "type": "array" + }, + "windowScale": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "yoyBaseline": { + "type": [ + "boolean", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +}
- Changed
create_shared_report1 field changed- changed
Input schema / properties / dataSourceType / enumPrevious value: -[ - "inline", - "queries", - "pages", - "countries", - "rankings", - "content-group", - "page-performance" -]New value: +[ + "inline", + "queries", + "pages", + "countries", + "rankings", + "content-group", + "page-performance", + "migration" +]
- Added
get_migration_health - Added
list_migrations
5 tool updates
- Changed
get_feed_audit_results3 fields changed- added
Output schema / properties / staleNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / syncNoticeAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "message": { + "$ref": "#/properties/siteUrl" + }, + "reason": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / syncPausedAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "message": { + "$ref": "#/properties/siteUrl" + }, + "reason": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +}
- Changed
get_gmc_best_sellers1 field changed- added
Output schema / properties / reportUnavailableAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "message": { + "$ref": "#/properties/siteUrl" + }, + "reason": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +}
- Changed
get_gmc_competitors1 field changed- added
Output schema / properties / reportUnavailableAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "message": { + "$ref": "#/properties/siteUrl" + }, + "reason": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +}
- Changed
get_gmc_pricing_insights1 field changed- added
Output schema / properties / reportUnavailableAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "message": { + "$ref": "#/properties/siteUrl" + }, + "reason": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +}
- Changed
get_product_listing_status2 fields changed- added
Output schema / properties / syncNoticeAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "message": { + "$ref": "#/properties/siteUrl" + }, + "reason": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / syncPausedAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "message": { + "$ref": "#/properties/siteUrl" + }, + "reason": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +}
2 tool updates
- Changed
get_product_listing_status4 fields changed- added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Rows to skip, for reading past the first page: pass the previous answer's nextOffset (default 0, max 100,000).", + "maximum": 100000, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / merchantActionCountAdded value: +{ + "$ref": "#/properties/range/anyOf/0/properties/days" +} - added
Output schema / properties / nextOffsetAdded value: +{ + "$ref": "#/properties/range/anyOf/0/properties/days" +} - added
Output schema / properties / offsetAdded value: +{ + "$ref": "#/properties/range/anyOf/0/properties/days" +}
- Changed
get_yandex_query_stats1 field changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Rows to return, across pages. Yandex serves 500 per request and holds 3,000, so a limit above 500 costs one extra round trip per 500 rows. The default is one page: ask for more only when the long tail matters, since a few thousand rows can exceed a host response-size ceiling and be refused."New value: +"Rows to return, across pages. Yandex serves 500 per request and at most 3,000 for a window, so a limit above 500 costs one extra round trip per 500 rows. The default is one page: ask for more only when the long tail matters, since a few thousand rows can exceed a host response-size ceiling and be refused."
63 tool updates
- Changed
add_site9 fields changed- added
Output schema / properties / accountRepairedAdded value: +{ + "$ref": "#/properties/alreadyRegistered" +} - added
Output schema / properties / alreadyRegisteredAdded value: +{ + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / messageAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / site / properties / activatedAdded value: +{ + "$ref": "#/properties/alreadyRegistered" +} - changed
Output schema / properties / site / properties / connectedAt / $refPrevious value: -"#/properties/site/properties/id"New value: +"#/properties/message" - added
Output schema / properties / site / properties / id / $refAdded value: +"#/properties/message" - removed
Output schema / properties / site / properties / id / typeRemoved value: -[ - "string", - "null" -] - changed
Output schema / properties / site / properties / permissionLevel / $refPrevious value: -"#/properties/site/properties/id"New value: +"#/properties/message" - changed
Output schema / properties / site / properties / siteUrl / $refPrevious value: -"#/properties/site/properties/id"New value: +"#/properties/message"
- Changed
analyze_cannibalization1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
analyze_ctr_curve1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
analyze_sampling_impact1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
audit_onpage_seo4 fields changed- added
Output schema / properties / budgetNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / contextNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / notAuditedAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / truncatedAdded value: +{ + "type": [ + "boolean", + "null" + ] +}
- Changed
breakdown_by_path5 fields changed- added
Output schema / properties / groupCountAdded value: +{ + "$ref": "#/properties/range/anyOf/0/properties/days" +} - added
Output schema / properties / pageRowsCappedAdded value: +{ + "$ref": "#/properties/truncated" +} - added
Output schema / properties / truncatedAdded value: +{ + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / truncationNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
bulk_inspect_urls6 fields changed- added
Output schema / properties / results / items / properties / googleCanonicalAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / results / items / properties / inspectionResultLinkAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / results / items / properties / skipReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / results / items / properties / userCanonicalAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / retryAfterSecondsAdded value: +{ + "$ref": "#/properties/count" +} - added
Output schema / properties / stopReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
check_tracked_url_now7 fields changed- added
Output schema / properties / notCheckedAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / results / items / properties / googleCanonicalAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / results / items / properties / inspectionResultLinkAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / results / items / properties / retryAfterSecondsAdded value: +{ + "$ref": "#/properties/count" +} - added
Output schema / properties / results / items / properties / skipReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / results / items / properties / userCanonicalAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / stoppedAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "message": { + "$ref": "#/properties/siteUrl" + }, + "reason": { + "$ref": "#/properties/siteUrl" + }, + "retryAfterSeconds": { + "$ref": "#/properties/count" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +}
- Changed
compare_migration2 fields changed- added
Output schema / properties / truncatedAdded value: +{ + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / truncationNoteAdded value: +{ + "$ref": "#/properties/mode" +}
- Changed
detect_anomalies2 fields changed- added
Output schema / properties / coverageAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "calendarDays": { + "$ref": "#/properties/sensitivity" + }, + "daysAnalyzed": { + "$ref": "#/properties/sensitivity" + }, + "daysWithData": { + "$ref": "#/properties/sensitivity" + }, + "firstDataDate": { + "$ref": "#/properties/siteUrl" + }, + "lastDataDate": { + "$ref": "#/properties/siteUrl" + }, + "trailingGap": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "lastDataDate": { + "$ref": "#/properties/siteUrl" + }, + "missingDays": { + "$ref": "#/properties/sensitivity" + }, + "note": { + "$ref": "#/properties/siteUrl" + }, + "status": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "zeroFilledDays": { + "$ref": "#/properties/sensitivity" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
detect_change_points2 fields changed- added
Output schema / properties / coverageAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "calendarDays": { + "$ref": "#/properties/sensitivity" + }, + "daysWithData": { + "$ref": "#/properties/sensitivity" + }, + "firstDataDate": { + "$ref": "#/properties/siteUrl" + }, + "lastDataDate": { + "$ref": "#/properties/siteUrl" + }, + "trailingGap": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "lastDataDate": { + "$ref": "#/properties/siteUrl" + }, + "missingDays": { + "$ref": "#/properties/sensitivity" + }, + "note": { + "$ref": "#/properties/siteUrl" + }, + "status": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "zeroFilledDays": { + "$ref": "#/properties/sensitivity" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
find_decaying_content5 fields changed- changed
Input schema / properties / comparisonEndDate / descriptionPrevious value: -"Optional. End of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window."New value: +"Optional. End of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to end a baseline of the same length here." - changed
Input schema / properties / comparisonStartDate / descriptionPrevious value: -"Optional. Start of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window."New value: +"Optional. Start of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to start a baseline of the same length here." - added
Output schema / properties / decaying / items / properties / baselineClicksScaledAdded value: +{ + "$ref": "#/properties/recent/anyOf/0/properties/days" +} - added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / windowNormalizationAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "comparisonDays": { + "$ref": "#/properties/recent/anyOf/0/properties/days" + }, + "currentDays": { + "$ref": "#/properties/recent/anyOf/0/properties/days" + }, + "note": { + "$ref": "#/properties/siteUrl" + }, + "scale": { + "$ref": "#/properties/recent/anyOf/0/properties/days" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +}
- Changed
find_page_poaching_opportunities5 fields changed- added
Output schema / properties / ctrSourceNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / scanLimitAdded value: +{ + "$ref": "#/properties/range/anyOf/0/properties/days" +} - added
Output schema / properties / scanNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / truncatedAdded value: +{ + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
forecast_traffic3 fields changed- changed
Input schema / properties / granularity / descriptionPrevious value: -"Forecast granularity. Weekly needs >= 13 weeks of history, monthly >= 6 months."New value: +"Forecast granularity. Weekly needs about 105 days of history (13 complete weeks), monthly about 240 days (6 complete months)." - added
Output schema / properties / forecastNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_branded_performance1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_content_group_performance2 fields changed- added
Output schema / properties / fallbackReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_cross_site_summary2 fields changed- added
Output schema / properties / perSite / items / properties / sharedAdded value: +{ + "$ref": "#/properties/scope/anyOf/0/properties/truncated" +} - changed
Output schema / properties / scope / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "days": { - "type": [ - "number", - "null" - ] - }, - "searchType": { - "$ref": "#/properties/scope/anyOf/0/properties/tag" - }, - "siteCount": { - "$ref": "#/properties/scope/anyOf/0/properties/days" - }, - "tag": { - "type": [ - "string", - "null" - ] - }, - "truncated": { - "type": [ - "boolean", - "null" - ] - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "days": { + "type": [ + "number", + "null" + ] + }, + "searchType": { + "$ref": "#/properties/scope/anyOf/0/properties/tag" + }, + "sharedCount": { + "$ref": "#/properties/scope/anyOf/0/properties/days" + }, + "siteCount": { + "$ref": "#/properties/scope/anyOf/0/properties/days" + }, + "tag": { + "type": [ + "string", + "null" + ] + }, + "truncated": { + "type": [ + "boolean", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_decay_overview2 fields changed- added
Output schema / properties / incompletePeriodsAdded value: +{ + "$ref": "#/properties/periods" +} - added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_experiment_results3 fields changed- added
Output schema / properties / truncatedAdded value: +{ + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / truncationNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / windowNormalizationAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "comparisonDays": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "currentDays": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "note": { + "$ref": "#/properties/siteUrl" + }, + "scale": { + "$ref": "#/properties/range/anyOf/0/properties/days" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +}
- Changed
get_feed_audit_results4 fields changed- added
Output schema / properties / cachedAtAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / crawlNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - changed
Output schema / properties / run / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "bySeverity": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "critical": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "info": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "warning": { - "$ref": "#/properties/range/anyOf/0/properties/days" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "completedAt": { - "$ref": "#/properties/siteUrl" - }, - "coverage": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "createdAt": { - "$ref": "#/properties/siteUrl" - }, - "error": { - "$ref": "#/properties/siteUrl" - }, - "offersAudited": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "offersTotal": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "pageScored": { - "$ref": "#/properties/notConfigured" - }, - "pagesFailed": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "pagesFetched": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "pagesTotal": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "perCheck": { - "anyOf": [ - { - "additionalProperties": { - "additionalProperties": false, - "properties": { - "applicable": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "failed": { - "$ref": "#/properties/range/anyOf/0/properties/days" - } - }, - "type": "object" - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "runDate": { - "$ref": "#/properties/siteUrl" - }, - "runId": { - "$ref": "#/properties/siteUrl" - }, - "score": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "scoreFeed": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "scorePage": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "scoreVersion": { - "$ref": "#/properties/siteUrl" - }, - "startedAt": { - "$ref": "#/properties/siteUrl" - }, - "status": { - "$ref": "#/properties/siteUrl" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "bySeverity": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "critical": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "info": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "warning": { + "$ref": "#/properties/range/anyOf/0/properties/days" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "completedAt": { + "$ref": "#/properties/siteUrl" + }, + "coverage": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "crawlBlocked": { + "$ref": "#/properties/notConfigured" + }, + "createdAt": { + "$ref": "#/properties/siteUrl" + }, + "error": { + "$ref": "#/properties/siteUrl" + }, + "offersAudited": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "offersTotal": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "pageScored": { + "$ref": "#/properties/notConfigured" + }, + "pagesFailed": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "pagesFetched": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "pagesTotal": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "perCheck": { + "anyOf": [ + { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "applicable": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "failed": { + "$ref": "#/properties/range/anyOf/0/properties/days" + } + }, + "type": "object" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "runDate": { + "$ref": "#/properties/siteUrl" + }, + "runId": { + "$ref": "#/properties/siteUrl" + }, + "score": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "scoreFeed": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "scorePage": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "scoreVersion": { + "$ref": "#/properties/siteUrl" + }, + "startedAt": { + "$ref": "#/properties/siteUrl" + }, + "status": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / truncationReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_ga4_ecommerce2 fields changed- changed
Input schema / properties / filters / properties / hostName / descriptionPrevious value: -"GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response); setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once."New value: +"GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response). For the property owner, setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once; on a property shared with you it only narrows within the scope." - added
Output schema / properties / reauthRequiredAdded value: +{ + "$ref": "#/properties/hasComparison" +}
- Changed
get_ga4_error_pages2 fields changed- added
Output schema / properties / prevTotalsAdded 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" + } + ] +} - added
Output schema / properties / reauthRequiredAdded value: +{ + "$ref": "#/properties/hasComparison" +}
- Changed
get_ga4_key_events3 fields changed- changed
Input schema / properties / filters / properties / hostName / descriptionPrevious value: -"GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response); setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once."New value: +"GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response). For the property owner, setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once; on a property shared with you it only narrows within the scope." - added
Output schema / properties / metricModeAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / reauthRequiredAdded value: +{ + "$ref": "#/properties/hasComparison" +}
- Changed
get_ga4_overview3 fields changed- changed
Input schema / properties / comparisonEndDate / descriptionPrevious value: -"Optional. End of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window."New value: +"Optional. End of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to end a baseline of the same length here." - changed
Input schema / properties / comparisonStartDate / descriptionPrevious value: -"Optional. Start of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window."New value: +"Optional. Start of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to start a baseline of the same length here." - changed
Input schema / properties / filters / properties / hostName / descriptionPrevious value: -"GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response); setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once."New value: +"GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response). For the property owner, setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once; on a property shared with you it only narrows within the scope."
- Changed
get_gmc_best_sellers2 fields changed- added
Output schema / properties / cachedAtAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / truncationReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_gmc_competitors2 fields changed- added
Output schema / properties / cachedAtAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / truncationReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_gmc_pricing_insights3 fields changed- added
Output schema / properties / cachedAtAdded value: +{ + "$ref": "#/properties/siteUrl" +} - changed
Output schema / properties / summary / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "aboveBenchmark": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "atBenchmark": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "belowBenchmark": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "competitivenessRows": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "effectivenessCounts": {}, - "insightsRows": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "products": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "withBenchmark": { - "$ref": "#/properties/range/anyOf/0/properties/days" - }, - "withSuggestion": { - "$ref": "#/properties/range/anyOf/0/properties/days" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "aboveBenchmark": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "atBenchmark": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "belowBenchmark": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "competitivenessRows": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "currencyMismatch": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "effectivenessCounts": {}, + "insightsRows": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "products": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "withBenchmark": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "withSuggestion": { + "$ref": "#/properties/range/anyOf/0/properties/days" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / truncationReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_gmc_title_hygiene3 fields changed- added
Output schema / properties / cachedAtAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / truncationReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / variantsCollapsedAdded value: +{ + "$ref": "#/properties/range/anyOf/0/properties/days" +}
- Changed
get_indexing_tracker_report3 fields changed- added
Output schema / properties / configuredAdded value: +{ + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / messageAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / truncatedAdded value: +{ + "$ref": "#/properties/configured" +}
- Changed
get_indexnow_settings1 field changed- added
Output schema / properties / keySiteUrlAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_longtail_clusters2 fields changed- added
Output schema / properties / truncatedAdded value: +{ + "$ref": "#/properties/apiRowCapReached" +} - added
Output schema / properties / truncationNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_merchant_listings_performance1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_organic_shopping_performance4 fields changed- added
Output schema / properties / cachedAtAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / truncatedAdded value: +{ + "$ref": "#/properties/notConfigured" +} - added
Output schema / properties / truncationNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / truncationReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_page_performance1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_position_distribution2 fields changed- changed
Input schema / properties / scanLimit / descriptionPrevious value: -"How many top rows by clicks to bucket. Raise it when a long-tail property reports `truncated: true`. The ClickHouse period path clamps it at 50,000; ignored by the ClickHouse daily path, which aggregates in SQL."New value: +"How many top rows by clicks to bucket on the live Search Console API. Raise it when a long-tail property reports `truncated: true`. Ignored on the ClickHouse warehouse, which buckets every row in SQL." - added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_product_listing_status8 fields changed- added
Output schema / properties / cachedAtAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / itemIssuesNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / itemIssuesUnavailableAdded value: +{ + "$ref": "#/properties/notConfigured" +} - added
Output schema / properties / rows / items / properties / freeListingsStatusAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / staleAdded value: +{ + "$ref": "#/properties/notConfigured" +} - added
Output schema / properties / staleNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / syncedAtAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / truncationReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_query_performance1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_query_shape_trend1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_ranking_changes2 fields changed- changed
Input schema / properties / comparisonEndDate / descriptionPrevious value: -"Optional. End of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window."New value: +"Optional. End of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to end a baseline of the same length here." - changed
Input schema / properties / comparisonStartDate / descriptionPrevious value: -"Optional. Start of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window."New value: +"Optional. Start of the baseline / comparison period as YYYY-MM-DD. Omit both comparison dates to use the same-length period immediately before the current window; give only this one to start a baseline of the same length here."
- Changed
get_sitemap_performance3 fields changed- added
Output schema / properties / childSitemapNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / failedChildSitemapsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": false, + "properties": { + "error": { + "$ref": "#/properties/siteUrl" + }, + "sitemapUrl": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_topic_cluster_performance1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
get_yandex_indexing_history2 fields changed- added
Output schema / properties / reasonAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / warningsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +}
- Changed
get_yandex_query_stats2 fields changed- added
Output schema / properties / reasonAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / warningsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +}
- Changed
get_yandex_site_summary2 fields changed- added
Output schema / properties / reasonAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / warningsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +}
- Changed
inspect_url3 fields changed- added
Output schema / properties / googleCanonicalAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / inspectionResultLinkAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / userCanonicalAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
list_algo_updates2 fields changed- changed
Input schema / properties / endDate / descriptionPrevious value: -"Optional filter: only include updates on or before this date (YYYY-MM-DD). Omit to include all. Never pass null or \"null\"."New value: +"Optional filter: only include updates that began on or before this date (YYYY-MM-DD). Omit to include all. Never pass null or \"null\"." - changed
Input schema / properties / startDate / descriptionPrevious value: -"Optional filter: only include updates on or after this date (YYYY-MM-DD). Omit to include all. Never pass null or \"null\"."New value: +"Optional filter: only include updates still rolling out on or after this date (YYYY-MM-DD). Omit to include all. Never pass null or \"null\"."
- Changed
list_ga4_custom_dimensions1 field changed- added
Output schema / properties / reauthRequiredAdded value: +{ + "$ref": "#/properties/notConfigured" +}
- Changed
list_ga4_properties2 fields changed- added
Output schema / properties / errorsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": false, + "properties": { + "accountEmail": { + "$ref": "#/properties/hint" + }, + "message": { + "$ref": "#/properties/hint" + }, + "reason": { + "$ref": "#/properties/hint" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / reauthRequiredAdded value: +{ + "$ref": "#/properties/connected" +}
- Changed
list_gmc_accounts18 fields changed- changed
Output schema / properties / account / $refPrevious value: -"#/properties/hint"New value: +"#/properties/reason" - changed
Output schema / properties / accounts / items / properties / accountEmail / $refPrevious value: -"#/properties/hint"New value: +"#/properties/reason" - changed
Output schema / properties / accounts / items / properties / accountId / $refPrevious value: -"#/properties/hint"New value: +"#/properties/reason" - changed
Output schema / properties / accounts / items / properties / accountName / $refPrevious value: -"#/properties/hint"New value: +"#/properties/reason" - changed
Output schema / properties / accounts / items / properties / name / $refPrevious value: -"#/properties/hint"New value: +"#/properties/reason" - changed
Output schema / properties / error / $refPrevious value: -"#/properties/hint"New value: +"#/properties/reason" - added
Output schema / properties / errorsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": false, + "properties": { + "accountEmail": { + "$ref": "#/properties/reason" + }, + "error": { + "$ref": "#/properties/reason" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / gapsAdded value: +{ + "$ref": "#/properties/accounts/items/properties/linkedSiteUrls" +} - changed
Output schema / properties / gcpProjectNumber / $refPrevious value: -"#/properties/hint"New value: +"#/properties/reason" - added
Output schema / properties / hint / $refAdded value: +"#/properties/reason" - removed
Output schema / properties / hint / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / incompleteAdded value: +{ + "$ref": "#/properties/connected" +} - added
Output schema / properties / incompleteNoteAdded value: +{ + "$ref": "#/properties/reason" +} - changed
Output schema / properties / linkedAccountId / $refPrevious value: -"#/properties/hint"New value: +"#/properties/reason" - changed
Output schema / properties / note / $refPrevious value: -"#/properties/hint"New value: +"#/properties/reason" - added
Output schema / properties / reasonAdded value: +{ + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / siteUrl / $refPrevious value: -"#/properties/hint"New value: +"#/properties/reason" - added
Output schema / properties / unprobedAccountIdsAdded value: +{ + "$ref": "#/properties/accounts/items/properties/linkedSiteUrls" +}
- Changed
list_saved_filters1 field changed- changed
Input schema / properties / siteUrl / descriptionPrevious value: -"Restrict to filters for one property. Omit to list all of the user's filters."New value: +"Restrict to the presets on one property (one you own or one shared with you). Omit to list the presets on every property you own."
- Changed
list_tracked_urls5 fields changed- added
Output schema / properties / configuredAdded value: +{ + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / messageAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / urls / items / properties / googleCanonicalAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / urls / items / properties / inspectionResultLinkAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / urls / items / properties / userCanonicalAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
list_url_inspections3 fields changed- added
Output schema / properties / inspections / items / properties / google_canonicalAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / inspections / items / properties / inspection_result_linkAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / inspections / items / properties / user_canonicalAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
list_yandex_sites1 field changed- added
Output schema / properties / reasonAdded value: +{ + "$ref": "#/properties/limitations/items" +}
- Changed
query_countries1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
query_devices1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
query_ga4_custom_dimensions2 fields changed- changed
Input schema / properties / filters / properties / hostName / descriptionPrevious value: -"GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response); setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once."New value: +"GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response). For the property owner, setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once; on a property shared with you it only narrows within the scope." - added
Output schema / properties / reauthRequiredAdded value: +{ + "$ref": "#/properties/hasComparison" +}
- Changed
query_ga4_report2 fields changed- changed
Input schema / properties / filters / properties / hostName / descriptionPrevious value: -"GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response); setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once."New value: +"GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response). For the property owner, setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once; on a property shared with you it only narrows within the scope." - added
Output schema / properties / reauthRequiredAdded value: +{ + "$ref": "#/properties/hasComparison" +}
- Changed
query_search_analytics1 field changed- added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
run_feed_audit4 fields changed- changed
Input schema / properties / force / descriptionPrevious value: -"Queue an audit even when one completed inside the last 28 days (default false). Cannot bypass the one-audit-per-property-per-day rule."New value: +"Queue an audit even when one completed inside the last 28 days (default false). Cannot bypass the one-audit-per-property-per-day rule or a run still in progress." - added
Output schema / properties / cachedAtAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / runAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bySeverity": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "critical": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "info": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "warning": { + "$ref": "#/properties/range/anyOf/0/properties/days" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "completedAt": { + "$ref": "#/properties/siteUrl" + }, + "coverage": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "crawlBlocked": { + "$ref": "#/properties/notConfigured" + }, + "createdAt": { + "$ref": "#/properties/siteUrl" + }, + "error": { + "$ref": "#/properties/siteUrl" + }, + "offersAudited": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "offersTotal": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "pageScored": { + "$ref": "#/properties/notConfigured" + }, + "pagesFailed": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "pagesFetched": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "pagesTotal": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "perCheck": { + "anyOf": [ + { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "applicable": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "failed": { + "$ref": "#/properties/range/anyOf/0/properties/days" + } + }, + "type": "object" + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "runDate": { + "$ref": "#/properties/siteUrl" + }, + "runId": { + "$ref": "#/properties/siteUrl" + }, + "score": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "scoreFeed": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "scorePage": { + "$ref": "#/properties/range/anyOf/0/properties/days" + }, + "scoreVersion": { + "$ref": "#/properties/siteUrl" + }, + "startedAt": { + "$ref": "#/properties/siteUrl" + }, + "status": { + "$ref": "#/properties/siteUrl" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / truncationReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
score_opportunities4 fields changed- added
Output schema / properties / scanLimitAdded value: +{ + "$ref": "#/properties/range/anyOf/0/properties/days" +} - added
Output schema / properties / scanNoteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / truncatedAdded value: +{ + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / warehouseLatestDateAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
submit_indexnow_urls2 fields changed- added
Output schema / properties / historyLoggedAdded value: +{ + "$ref": "#/properties/pendingKeyValidation" +} - added
Output schema / properties / keySiteUrlAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
submit_sitemap5 fields changed- added
Output schema / properties / actions / $refAdded value: +"#/properties/notAttempted" - removed
Output schema / properties / actions / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Output schema / properties / notAttemptedAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / retryAfterSecondsAdded value: +{ + "$ref": "#/properties/attempted" +} - added
Output schema / properties / stopReasonAdded value: +{ + "$ref": "#/properties/siteUrl" +}
- Changed
update_indexnow_settings8 fields changed- added
Input schema / properties / generateKeyAdded value: +{ + "default": false, + "description": "Create a new valid key and return the key file to publish. Only when the property has no key yet; clear the old key first to rotate.", + "type": "boolean" +} - changed
Input schema / properties / indexnowApiKey / descriptionPrevious value: -"The new key. Omit together with clear: true to remove the current key."New value: +"The new key. Omit when using generateKey or clear." - added
Output schema / properties / generatedAdded value: +{ + "$ref": "#/properties/indexnowApiKeySet" +} - added
Output schema / properties / keyFileContentAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / keyFileErrorAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / keyFileUrlAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / keyFileUrlsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / keyFileVerifiedAdded value: +{ + "$ref": "#/properties/indexnowApiKeySet" +}
1 tool update
- Changed
get_yandex_query_stats3 fields changed- changed
Input schema / properties / deviceType / descriptionPrevious value: -"Device filter. Yandex filters rather than breaking down by device, so each value is a separate query. MOBILE_AND_TABLET overlaps MOBILE and TABLET — do not sum them."New value: +"Device filter. Yandex filters rather than breaking down by device, so each value is a separate query. MOBILE_AND_TABLET overlaps MOBILE and TABLET, so do not sum them." - added
Input schema / properties / limit / descriptionAdded value: +"Rows to return, across pages. Yandex serves 500 per request and holds 3,000, so a limit above 500 costs one extra round trip per 500 rows. The default is one page: ask for more only when the long tail matters, since a few thousand rows can exceed a host response-size ceiling and be refused." - changed
Input schema / properties / limit / maximumPrevious value: -500New value: +3000
4 tool updates
- Changed
get_yandex_indexing_history1 field changed- added
Output schema / properties / limitationsAdded value: +{ + "items": { + "$ref": "#/properties/siteUrl" + }, + "type": "array" +}
- Changed
get_yandex_query_stats1 field changed- added
Output schema / properties / limitationsAdded value: +{ + "items": { + "$ref": "#/properties/siteUrl" + }, + "type": "array" +}
- Changed
get_yandex_site_summary1 field changed- added
Output schema / properties / limitationsAdded value: +{ + "items": { + "$ref": "#/properties/siteUrl" + }, + "type": "array" +}
- Changed
list_yandex_sites8 fields changed- changed
Output schema / properties / dataSource / $refPrevious value: -"#/properties/sites/items/properties/hostId"New value: +"#/properties/limitations/items" - changed
Output schema / properties / hint / $refPrevious value: -"#/properties/sites/items/properties/hostId"New value: +"#/properties/limitations/items" - added
Output schema / properties / limitationsAdded value: +{ + "items": { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + "type": "array" +} - added
Output schema / properties / sites / items / properties / hostId / $refAdded value: +"#/properties/limitations/items" - removed
Output schema / properties / sites / items / properties / hostId / typeRemoved value: -[ - "string", - "null" -] - changed
Output schema / properties / sites / items / properties / mainMirrorUrl / $refPrevious value: -"#/properties/sites/items/properties/hostId"New value: +"#/properties/limitations/items" - changed
Output schema / properties / sites / items / properties / unicodeUrl / $refPrevious value: -"#/properties/sites/items/properties/hostId"New value: +"#/properties/limitations/items" - changed
Output schema / properties / sites / items / properties / url / $refPrevious value: -"#/properties/sites/items/properties/hostId"New value: +"#/properties/limitations/items"
2 tool updates
- Changed
get_ga4_key_events2 fields changed- added
Output schema / properties / prevRawEventCountAdded value: +{ + "$ref": "#/properties/range/anyOf/0/properties/days" +} - added
Output schema / properties / rawEventCountAdded value: +{ + "$ref": "#/properties/range/anyOf/0/properties/days" +}
- Changed
query_ga4_report2 fields changed- added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / truncatedAdded value: +{ + "$ref": "#/properties/hasComparison" +}
10 tool updates
- Changed
generate_seo_report4 fields changed- added
Output schema / properties / comparisonHasDataAdded value: +{ + "description": "false when the comparison period has no data at all, so there is no comparison.", + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/kind", + "description": "Caveat about the result, when the tool returned one." +} - added
Output schema / properties / notesAdded value: +{ + "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames", + "description": "Caveats about the result, when the tool returned several." +} - added
Output schema / properties / siteScopeAdded 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." +}
- Changed
get_blended_landing_pages4 fields changed- added
Output schema / properties / comparisonHasDataAdded value: +{ + "description": "false when the comparison period has no data at all, so there is no comparison.", + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/kind", + "description": "Caveat about the result, when the tool returned one." +} - added
Output schema / properties / notesAdded value: +{ + "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames", + "description": "Caveats about the result, when the tool returned several." +} - added
Output schema / properties / siteScopeAdded 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." +}
- Changed
get_ga4_llm_traffic4 fields changed- added
Output schema / properties / comparisonHasDataAdded value: +{ + "description": "false when the comparison period has no data at all, so there is no comparison.", + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/kind", + "description": "Caveat about the result, when the tool returned one." +} - added
Output schema / properties / notesAdded value: +{ + "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames", + "description": "Caveats about the result, when the tool returned several." +} - added
Output schema / properties / siteScopeAdded 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." +}
- Changed
get_ga4_overview4 fields changed- added
Output schema / properties / comparisonHasDataAdded value: +{ + "description": "false when the comparison period has no data at all, so there is no comparison.", + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/kind", + "description": "Caveat about the result, when the tool returned one." +} - added
Output schema / properties / notesAdded value: +{ + "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames", + "description": "Caveats about the result, when the tool returned several." +} - added
Output schema / properties / siteScopeAdded 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." +}
- Changed
get_query_value_attribution4 fields changed- added
Output schema / properties / comparisonHasDataAdded value: +{ + "description": "false when the comparison period has no data at all, so there is no comparison.", + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/kind", + "description": "Caveat about the result, when the tool returned one." +} - added
Output schema / properties / notesAdded value: +{ + "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames", + "description": "Caveats about the result, when the tool returned several." +} - added
Output schema / properties / siteScopeAdded 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." +}
- Changed
get_ranking_changes4 fields changed- added
Output schema / properties / comparisonHasDataAdded value: +{ + "description": "false when the comparison period has no data at all, so there is no comparison.", + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/kind", + "description": "Caveat about the result, when the tool returned one." +} - added
Output schema / properties / notesAdded value: +{ + "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames", + "description": "Caveats about the result, when the tool returned several." +} - added
Output schema / properties / siteScopeAdded 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." +}
- Changed
get_site_summary4 fields changed- added
Output schema / properties / comparisonHasDataAdded value: +{ + "description": "false when the comparison period has no data at all, so there is no comparison.", + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/kind", + "description": "Caveat about the result, when the tool returned one." +} - added
Output schema / properties / notesAdded value: +{ + "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames", + "description": "Caveats about the result, when the tool returned several." +} - added
Output schema / properties / siteScopeAdded 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." +}
- Changed
list_sites4 fields changed- added
Output schema / properties / comparisonHasDataAdded value: +{ + "description": "false when the comparison period has no data at all, so there is no comparison.", + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/kind", + "description": "Caveat about the result, when the tool returned one." +} - added
Output schema / properties / notesAdded value: +{ + "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames", + "description": "Caveats about the result, when the tool returned several." +} - added
Output schema / properties / siteScopeAdded 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." +}
- Changed
query_top_pages4 fields changed- added
Output schema / properties / comparisonHasDataAdded value: +{ + "description": "false when the comparison period has no data at all, so there is no comparison.", + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/kind", + "description": "Caveat about the result, when the tool returned one." +} - added
Output schema / properties / notesAdded value: +{ + "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames", + "description": "Caveats about the result, when the tool returned several." +} - added
Output schema / properties / siteScopeAdded 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." +}
- Changed
query_top_queries4 fields changed- added
Output schema / properties / comparisonHasDataAdded value: +{ + "description": "false when the comparison period has no data at all, so there is no comparison.", + "type": [ + "boolean", + "null" + ] +} - added
Output schema / properties / noteAdded value: +{ + "$ref": "#/properties/kind", + "description": "Caveat about the result, when the tool returned one." +} - added
Output schema / properties / notesAdded value: +{ + "$ref": "#/properties/siteScope/anyOf/0/properties/hostnames", + "description": "Caveats about the result, when the tool returned several." +} - added
Output schema / properties / siteScopeAdded 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." +}
5 tool updates
- Changed
get_ga4_ecommerce2 fields changed- added
Input schema / properties / filters / properties / hostNameAdded value: +{ + "description": "GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response); setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once.", + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "maxItems": 300, + "type": "array" +} - added
Output schema / properties / siteScopeAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "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" + } + ] +}
- Changed
get_ga4_key_events5 fields changed- added
Input schema / properties / filters / properties / hostNameAdded value: +{ + "description": "GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response); setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once.", + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "maxItems": 300, + "type": "array" +} - added
Output schema / properties / isKeyEventAdded value: +{ + "$ref": "#/properties/hasComparison" +} - added
Output schema / properties / keyEventNames / $refAdded value: +"#/properties/siteScope/anyOf/0/properties/hostnames" - removed
Output schema / properties / keyEventNames / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Output schema / properties / siteScopeAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "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" + } + ] +}
- Changed
get_ga4_overview1 field changed- added
Input schema / properties / filters / properties / hostNameAdded value: +{ + "description": "GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response); setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once.", + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "maxItems": 300, + "type": "array" +}
- Changed
query_ga4_custom_dimensions6 fields changed- added
Input schema / properties / filters / properties / hostNameAdded value: +{ + "description": "GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response); setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once.", + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "maxItems": 300, + "type": "array" +} - changed
Output schema / properties / availableDimensions / $refPrevious value: -"#/properties/metrics"New value: +"#/properties/siteScope/anyOf/0/properties/hostnames" - changed
Output schema / properties / availableMetrics / $refPrevious value: -"#/properties/metrics"New value: +"#/properties/siteScope/anyOf/0/properties/hostnames" - added
Output schema / properties / metrics / $refAdded value: +"#/properties/siteScope/anyOf/0/properties/hostnames" - removed
Output schema / properties / metrics / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Output schema / properties / siteScopeAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "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" + } + ] +}
- Changed
query_ga4_report7 fields changed- changed
Input schema / properties / dimension / enumPrevious value: -[ - "channel", - "sourceMedium", - "page", - "landingPage", - "country", - "device", - "event" -]New value: +[ + "channel", + "sourceMedium", + "page", + "landingPage", + "country", + "device", + "event", + "date", + "hostName" +] - added
Input schema / properties / filters / properties / hostNameAdded value: +{ + "description": "GA4 hostName values, matched exactly (any of), e.g. [\"www.example.com\"]. When the linked GA4 property is shared with other sites, results are already limited to this site's hostnames (see `siteScope` in the response); setting hostName replaces that automatic scope, e.g. to read another stream or several hosts at once.", + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "maxItems": 300, + "type": "array" +} - added
Input schema / properties / secondaryDimensionAdded value: +{ + "description": "Optional second dimension that splits every row: \"date\" (per day) or \"hostName\" (per site/stream host). Must differ from `dimension`.", + "enum": [ + "date", + "hostName" + ], + "type": "string" +} - added
Output schema / properties / metrics / $refAdded value: +"#/properties/siteScope/anyOf/0/properties/hostnames" - removed
Output schema / properties / metrics / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - added
Output schema / properties / secondaryDimensionAdded value: +{ + "$ref": "#/properties/siteUrl" +} - added
Output schema / properties / siteScopeAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "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" + } + ] +}
126 tool updates
- First observed
add_migration_redirects - First observed
add_site - First observed
add_tracked_urls - First observed
analyze_cannibalization - First observed
analyze_ctr_curve - First observed
analyze_query_shapes - First observed
analyze_sampling_impact - First observed
audit_onpage_seo - First observed
breakdown_by_path - First observed
bulk_inspect_urls - First observed
check_tracked_url_now - First observed
compare_migration - First observed
create_annotation - First observed
create_content_group - First observed
create_gsc_property - First observed
create_report_client - First observed
create_saved_filter - First observed
create_shared_report - First observed
create_topic_cluster - First observed
delete_annotation - First observed
delete_content_group - First observed
delete_migration_redirects - First observed
delete_saved_filter - First observed
delete_shared_report - First observed
delete_site - First observed
delete_topic_cluster - First observed
detect_anomalies - First observed
detect_change_points - First observed
find_decaying_content - First observed
find_page_poaching_opportunities - First observed
forecast_traffic - First observed
generate_seo_report - First observed
get_account_info - First observed
get_bing_crawl_issues - First observed
get_bing_crawl_stats - First observed
get_bing_feeds - First observed
get_bing_keyword_stats - First observed
get_bing_link_counts - First observed
get_bing_page_queries - First observed
get_bing_page_stats - First observed
get_bing_query_page_stats - First observed
get_bing_query_page_trend - First observed
get_bing_query_stats - First observed
get_bing_traffic_stats - First observed
get_bing_url_submission_quota - First observed
get_blended_landing_pages - First observed
get_branded_performance - First observed
get_content_group_performance - First observed
get_core_web_vitals - First observed
get_cross_site_summary - First observed
get_decay_overview - First observed
get_experiment_results - First observed
get_feed_audit_results - First observed
get_filter_options - First observed
get_ga4_ecommerce - First observed
get_ga4_error_pages - First observed
get_ga4_key_events - First observed
get_ga4_llm_traffic - First observed
get_ga4_overview - First observed
get_gmc_best_sellers - First observed
get_gmc_competitors - First observed
get_gmc_pricing_insights - First observed
get_gmc_title_hygiene - First observed
get_indexing_tracker - First observed
get_indexing_tracker_report - First observed
get_indexnow_settings - First observed
get_inspection_quota - First observed
get_longtail_clusters - First observed
get_merchant_listings_performance - First observed
get_organic_shopping_performance - First observed
get_page_performance - First observed
get_position_distribution - First observed
get_product_listing_status - First observed
get_query_performance - First observed
get_query_shape_trend - First observed
get_query_value_attribution - First observed
get_ranking_changes - First observed
get_site_summary - First observed
get_sitemap_performance - First observed
get_tag_group_view - First observed
get_topic_cluster_performance - First observed
get_yandex_indexing_history - First observed
get_yandex_query_stats - First observed
get_yandex_site_summary - First observed
inspect_url - First observed
list_algo_updates - First observed
list_annotations - First observed
list_bing_sites - First observed
list_content_groups - First observed
list_experiments - First observed
list_ga4_custom_dimensions - First observed
list_ga4_properties - First observed
list_gmc_accounts - First observed
list_indexnow_submissions - First observed
list_migration_redirects - First observed
list_report_clients - First observed
list_saved_filters - First observed
list_shared_reports - First observed
list_sitemaps - First observed
list_sites - First observed
list_tags - First observed
list_topic_clusters - First observed
list_tracked_urls - First observed
list_url_inspections - First observed
list_yandex_sites - First observed
manage_report_access - First observed
manage_tags - First observed
query_countries - First observed
query_devices - First observed
query_ga4_custom_dimensions - First observed
query_ga4_report - First observed
query_search_analytics - First observed
query_top_pages - First observed
query_top_queries - First observed
remove_tracked_urls - First observed
run_feed_audit - First observed
score_opportunities - First observed
set_dashboard_visibility - First observed
submit_indexnow_urls - First observed
submit_sitemap - First observed
update_annotation - First observed
update_content_group - First observed
update_indexnow_settings - First observed
update_saved_filter - First observed
update_site - First observed
update_topic_cluster
Publisher details
- Operator
- GSC Wizard · Publisher source
- Operator website
- https://www.gscwizard.com · Publisher source
- Vendor relationship
- First-party
- Trust center
- Not available
- Restrictions
- Unknown
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1611 npm1MIT
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs117 npm54 PyPIMIT
- AlicenseAqualityCmaintenanceRevnuvo Company Intelligence tells AI agents what changed at a company, with evidence. It observes company websites, technologies, and DNS over time and returns timestamped, confidence-aware changes, signals, and monitoring.9MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.