Google Search Console Audit MCP
Provides tools for querying Google Search Console data, including performance reports (queries, pages, devices, countries), URL inspection, indexing checks, sitemaps listing, and generating complete HTML SEO audit reports.
Google Search Console MCP
English · Italiano
Seventeen read-only tools over the Google Search Console API, plus a deterministic white-label HTML audit report an agency can put its own name on and send to a client, in English or Italian.

Regenerate that report from committed synthetic data, with no credentials:
python scripts/render_sample_report.py --lang en --openInstall
Claude Code
/plugin marketplace add acamolese/google-search-console-mcp
/plugin install google-search-console@acamoleseThe plugin brings the MCP server, five skills (weekly review, cannibalisation check, indexing audit, content opportunities, white-label client audit) and a config prompt for the three credentials.
Claude Desktop
Download google-search-console.mcpb from the
latest release
and open it. It needs uv installed. Or edit the
config file directly:
{
"mcpServers": {
"google-search-console": {
"command": "uvx",
"args": ["mcp-google-search-console"],
"env": {
"GSC_CLIENT_ID": "...",
"GSC_CLIENT_SECRET": "...",
"GSC_REFRESH_TOKEN": "..."
}
}
}
}Cursor, Codex, Gemini CLI, Zed
Any MCP client takes the same three lines: command uvx, argument
mcp-google-search-console, and the three GSC_* environment variables.
# Codex
codex mcp add google-search-console -- uvx mcp-google-search-console
# Gemini CLI
gemini mcp add google-search-console uvx mcp-google-search-consoleDocker
docker build -t mcp-gsc .
docker run --rm -p 127.0.0.1:8765:8765 \
-e GSC_CLIENT_ID -e GSC_CLIENT_SECRET -e GSC_REFRESH_TOKEN \
-v "$PWD/reports:/reports" mcp-gscThe container speaks streamable HTTP on /mcp. It has no authentication of its
own: keep it on loopback or behind a reverse proxy.
Related MCP server: flin-google-search-console-mcp
Authentication
The OAuth scope is webmasters.readonly and nothing else. No tool in this server
can modify a property, a sitemap or anything else in Search Console.
Credentials are resolved in this order:
GSC_AUTH_MODEif set (oauth,service_account,adc)GSC_SERVICE_ACCOUNT_FILEorGSC_SERVICE_ACCOUNT_JSONGSC_CLIENT_ID+GSC_CLIENT_SECRET+GSC_REFRESH_TOKENA token file in
~/.config/mcp-google-search-console/Application Default Credentials
OAuth, once
In Google Cloud Console, enable the Google Search Console API and create an OAuth client of type Desktop app.
Export the client, or save the downloaded JSON as
~/.config/mcp-google-search-console/oauth_credentials.json:export GSC_CLIENT_ID="...apps.googleusercontent.com" export GSC_CLIENT_SECRET="..." uvx mcp-google-search-console authThe browser flow prints the three
exportlines for a stateless setup, and also stores a token at~/.config/mcp-google-search-console/token.jsonwith0600permissions.
On a headless machine, run auth on your laptop and copy the three environment
variables across. --no-browser prints the URL instead of opening one, but still
needs a local redirect.
Service account
Grant the service account's email read access to the property in Search Console, then point the server at the key:
export GSC_SERVICE_ACCOUNT_FILE=/path/to/key.json
# or, for a container:
export GSC_SERVICE_ACCOUNT_JSON='{"type":"service_account",...}'Check it works
uvx mcp-google-search-console doctorPrints the auth mode in use, when the token expires, how many properties the account can read, and the defaults every tool applies. Secrets are masked. Exits 1 when nothing resolves, which is the answer to most "the server won't start" reports.
Tools
Tool | What it answers |
| Which properties can this account read, and in what exact format |
| Permission level and type for one property |
| The Search Analytics report, with filters, dimensions and pagination |
| Is the site up or down, against the previous period |
| What changed between two periods, ranked by click delta |
| Queries close enough to the top that a push would pay off |
| Pages that rank but are not clicked |
| Queries where several pages compete against each other |
| Pages that lost clicks, with a likely cause for each |
| Pages sliding down month after month |
| What moved sharply enough to be worth a message today |
| Every property at a glance, worst first |
| Which of these URLs are indexed, and why not |
| Full URL Inspection for one page |
| Which sitemaps Google knows about, with errors and warnings |
| What is configured, and does the API answer |
| The full HTML report |
Three prompts wrap the workflows that repeat: gsc_weekly_report,
gsc_indexing_audit, gsc_content_opportunities.
Why this server
Here | Typical GSC MCP server | |
Client-ready report | Self-contained HTML, English or Italian, white-label | none |
Analysis | Cannibalisation, CTR gaps, decay, drop diagnosis, run server-side | raw rows, analysed by the model |
Thresholds | Adapt to the size of the property | fixed, or none |
Dates |
| explicit dates only |
Freshness |
|
|
Auth | OAuth, service account, ADC | OAuth only |
Output | TSV by default, roughly a third of the tokens of pretty JSON |
|
Errors | Google's reason plus what to do about it | bare HTTP status |
Tests | 280+, on both | usually none |
Report customisation
Colours, logo, report name, brand terms and thresholds come from a JSON file.
Pass branding_path, or place it at
~/.config/mcp-google-search-console/branding.json to apply it everywhere:
{
"brand_name": "Your Agency",
"logo": "logo.png",
"brand_terms": ["clientbrand", "client brand"],
"colors": { "primary": "#2b6cb0", "primary_dark": "#1a365d" },
"thresholds": { "min_impressions": 200 }
}A local logo is base64-encoded into the document. A remote one is only kept if
allow_external_fonts is true, because the report is otherwise guaranteed to
contain no external URL at all: no CDN, no font service, nothing that phones home
when a client opens it.
brand_terms matters more than it looks. Without it, the first label of the
domain is used as the brand, which is wrong for abbreviations, holding companies
and invented names, and it silently mislabels the brand/non-brand split. The
report says when it had to guess.
Quotas and limits
16 months of daily data. Anything older is not available at any price.
Hourly data: the last 10 days only.
URL Inspection: 600 per minute and 2,000 per day per property. This is the limit that bites on a large site.
Search Analytics: 1,200 queries per minute per site. Responses are cached in memory for 6 hours (1 hour for inspections);
no_cache=truebypasses it.Rows: 25,000 per API call. Tools default to 100 and cap at 1,000, with
start_rowfor pagination; the cap is reported in the response, never applied silently.
Environment variables
Variable | Default | Purpose |
| Stateless OAuth | |
| Service account | |
| auto | Force |
|
| Report language: |
|
|
|
|
| Response cache TTL; |
|
| Parallel URL inspections |
|
| Logging, always to stderr |
|
| Transport |
Troubleshooting
spawn uvx ENOENT — the client cannot find uvx on its PATH. GUI apps do
not inherit a shell PATH. Use the absolute path: which uvx gives it, typically
/Users/you/.local/bin/uvx.
403 forbidden on every call — almost always the property format. A domain
property is sc-domain:example.com; a URL-prefix property is
https://example.com/, trailing slash included. gsc_sites returns the exact
strings.
401 invalid_grant — the refresh token was revoked or expired. Google expires
refresh tokens for OAuth apps still in "testing" after seven days; publish the
app, or re-run auth.
403 quotaExceeded — the daily URL Inspection quota is gone. It resets
tomorrow; nothing retries past it.
Empty report on a small site — check the thresholds in the response meta. They
adapt to the property, but the floors (50 impressions, 10 clicks) still apply.
Pass thresholds to lower them.
Anything else — run doctor and include its output in the issue.
Security
Read-only scope, requested and never widened.
Token files are written atomically with
0600permissions. Credentials supplied through the environment are never written to disk.gsc_doctormasks the client ID and never returns a token.No telemetry, no analytics, no request to any host other than Google's API.
See SECURITY.md for the reporting policy.
Development
uv venv && uv pip install -e ".[dev]"
ruff check src tests scripts && ruff format --check src tests scripts
pytest -q --cov=google_search_console_mcp
python scripts/sync_versions.py
python scripts/render_sample_report.py --lang it --openTests never hit the network. Live tests exist behind -m live and require
GSC_LIVE_TESTS=1 plus credentials; they never run in CI.
Releases: see docs/RELEASING.md. Decisions not covered by the code are logged in docs/DECISIONS.md.
License
MIT. Chart.js 4.5.1 is vendored under src/google_search_console_mcp/static/,
also MIT, with its licence alongside.
Available Tools
17 toolsgsc_alertsARead-onlyIdempotent
What changed sharply enough to be worth a message today.
Compares the last window_days against the window before it across both
queries and pages, and returns only movements past the alerting rules:
lost positions, collapsed CTR, dropped or vanished pages.
| Name | Required | Description | Default |
|---|---|---|---|
| date_to | No | End date YYYY-MM-DD. Defaults to today. | |
| no_cache | No | ||
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| row_limit | No | Rows returned. Default 100, capped at 1000. | |
| thresholds | No | Override the adaptive thresholds: min_impressions, min_clicks, high_visibility_impressions, ctr_curve. | |
| window_days | No | Length of the window to compare. | |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint, idempotentHint, and destructiveHint, the description adds valuable detail about the comparison logic and the types of movements detected (lost positions, collapsed CTR, dropped/vanished pages). It explains that only movements past alerting rules are returned, which is behavior beyond the schema. No contradiction with 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?
The description is two sentences long and front-loads the purpose with a question-like hook. The second sentence explains mechanics efficiently. The first sentence is a bit vague, but overall it is compact and free of fluff.
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?
The description covers the core algorithm and output filtering, and an output schema exists so return format is not required here. It does not mention usage context or alternatives, which is a minor completeness gap for a complex alerting tool, but it is sufficient for basic invocation.
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 most parameters are already documented in the schema. The description adds no new meaning about parameter format or semantics; it only mentions window_days implicitly via the comparison logic. This meets the baseline for high schema coverage.
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 clearly states the tool compares two windows and returns only movements that pass alerting rules, which is a specific and concrete purpose. It mentions both queries and pages, distinguishing it from tools focused only on one. However, it does not explicitly differentiate itself from siblings like gsc_traffic_drops or gsc_compare_periods, leaving some ambiguity.
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 provides no guidance on when to use this tool versus alternatives. It does not mention exclusions, prerequisites, or recommended contexts beyond a vague 'today' cue. This is a gap, especially given the large set of sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_auditARead-onlyIdempotent
Build a complete, self-contained HTML SEO audit for one property.
Collects the period and its baseline, top queries and pages, devices, countries, the daily trend, six months of history, sitemaps and an indexing check, then detects issues and builds a prioritised strategy and roadmap. Thresholds adapt to the size of the property, so small sites get a report too. Available in English and Italian.
Ask the user for the period if they have not named one: the 28-day default is rarely what a client report wants.
Returns a compact JSON summary first (KPIs with deltas, issue counts, top quick wins, roadmap), so the findings can be discussed without reading the HTML, followed by the report path or the document itself.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Rolling window length ending today. | |
| output | No | `file` writes the report and returns its path, `inline` returns the HTML as an embedded resource, `both` does both, `auto` picks by transport. | auto |
| period | No | Named range: last_7_days, last_28_days, last_3_months, last_month, this_month, last_16_months. | |
| date_to | No | End date YYYY-MM-DD. Defaults to today. | |
| language | No | Report language: en, it. Defaults to en. | |
| sections | No | Subset of sections to render: overview, issues, top_queries, top_pages, countries, sitemaps, indexing, strategy, roadmap. | |
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| date_from | No | Start date YYYY-MM-DD. Overrides period and days. | |
| output_dir | No | Where to write the report. Defaults to ~/gsc-reports/. | |
| thresholds | No | Override the adaptive thresholds: min_impressions, min_clicks, high_visibility_impressions, ctr_curve. | |
| brand_terms | No | Words that mark a query as branded. Without them the first label of the domain is used, which is often wrong. | |
| branding_path | No | Path to a branding.json overriding colours, logo, name and thresholds. | |
| inspect_top_pages | No | How many top pages to run through URL Inspection. 0 disables it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish read-only, idempotent behavior. The description adds meaningful context beyond that: adaptive thresholds for small sites, English/Italian availability, the instruction to ask for a period, and the two-stage return of a compact JSON summary followed by the report path/document. This gives the agent a clear picture of what to expect without contradicting 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?
Every sentence earns its place: scope, contents, adaptive behavior, language, user-interaction guidance, and return format. The description is dense but not bloated, and the most important identifying sentence is first. No filler or repetition of schema details.
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 13-parameter tool with no output schema, the description is remarkably complete. It explains the report scope, the adaptive thresholds, the language options, the critical 'ask about period' behavior, and the JSON-first return strategy. Combined with the fully described schema and safety annotations, an agent has enough context to invoke 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 description coverage is 100%, so the schema carries the parameter definitions. The description adds value beyond the schema by explaining why the default period is often wrong, that thresholds adapt to property size, and that output can be a summary plus report. This helps the agent make better parameter choices, especially around `period` and `language`.
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: 'Build a complete, self-contained HTML SEO audit for one property.' It then enumerates the major components (top queries, pages, devices, countries, sitemaps, indexing, strategy, roadmap), making the tool's scope unmistakable and clearly broader than the focused sibling tools like gsc_query or gsc_sitemaps.
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 provides explicit operational guidance: 'Ask the user for the period if they have not named one,' including why the 28-day default is inadequate for client reports. It does not directly name alternatives or state when not to use this tool, but the comprehensive scope makes its role as the full-audit tool clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_cannibalizationARead-onlyIdempotent
Queries where several pages of the site compete for the same result.
Reads one page of up to 25,000 query/page pairs; on a very large property the tail is cut off, and the meta says how many pairs were analysed. Each row lists the competing pages with their own clicks and positions.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Rolling window length ending today. | |
| period | No | Named range: last_7_days, last_28_days, last_3_months, last_month, this_month, last_16_months. | |
| date_to | No | End date YYYY-MM-DD. Defaults to today. | |
| no_cache | No | ||
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| date_from | No | Start date YYYY-MM-DD. Overrides period and days. | |
| min_pages | No | Minimum competing pages per query. | |
| min_share | No | A page must hold this share of the query's impressions to count. | |
| row_limit | No | Rows returned. Default 100, capped at 1000. | |
| thresholds | No | Override the adaptive thresholds: min_impressions, min_clicks, high_visibility_impressions, ctr_curve. | |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses a real operational limitation: only one page of up to 25,000 query/page pairs is read, the tail is cut off on large properties, and a meta field reports how many pairs were analyzed. This is valuable context that an agent cannot derive from annotations or the 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?
The description is three short sentences with the core purpose front-loaded, followed by the scale caveat and output layout. There is no filler or repetition.
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?
Given the read-only annotations, high schema coverage, and an output schema, the description covers the key operational caveats: page limit, tail cutoff, and meta reporting. It is complete enough for an agent to call and interpret this 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 description coverage is 91%, so the schema already documents nearly all parameters. The description adds no parameter-specific detail beyond saying rows list competing pages with clicks and positions, which is more about the output than the parameters; the 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?
The description clearly identifies the subject: queries where several pages compete for the same result, and the title reinforces the concept of keyword cannibalisation. It is specific enough to know what the tool returns, though it lacks an explicit verb and does not name a sibling to distinguish itself.
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 guidance is given on when to use this tool versus siblings such as gsc_query, gsc_quick_wins, or gsc_content_decay. The topic is implied but there are no conditions, exclusions, or alternatives stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_compare_periodsARead-onlyIdempotent
Join two periods on one dimension and rank the rows by click delta.
Answers "what changed" without the model diffing two tables by hand. Rows present in only one period are kept, with zeros on the missing side; the biggest movers in both directions are returned, worst first. The meta counts how many rows gained and how many lost clicks.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Rolling window length ending today. | |
| period | No | Named range: last_7_days, last_28_days, last_3_months, last_month, this_month, last_16_months. | |
| date_to | No | End date YYYY-MM-DD. Defaults to today. | |
| no_cache | No | Bypass the response cache for this call. | |
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| date_from | No | Start date YYYY-MM-DD. Overrides period and days. | |
| dimension | No | One of query, page, country, device, searchAppearance. | query |
| row_limit | No | Rows returned. Default 100, capped at 1000. | |
| prev_date_to | No | Baseline end YYYY-MM-DD. | |
| prev_date_from | No | Baseline start YYYY-MM-DD. Defaults to the equally long period ending the day before date_from. | |
| min_impressions | No | Drop rows below this impression count in both periods. | |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description adds valuable behavioral detail: rows missing from one period are kept with zeros, movers are returned worst-first, and meta reports gained versus lost click counts. This goes well beyond the annotation hints.
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 description is compact and front-loaded: the first sentence states the core operation, and each subsequent sentence adds a distinct, necessary behavioral detail. There is no filler and no repetition of schema content.
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?
Given the rich input schema, output schema, and annotations, the description still covers the non-obvious behaviors an agent needs: one-sided rows are retained with zeros, ordering is worst-first, and meta counts gains versus losses. 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?
Schema description coverage is 100% and every parameter already has its own useful description, so the baseline of 3 applies. The description reinforces the period-comparison concept but does not add parameter syntax or date semantics 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?
The opening sentence names a specific operation: joining two periods on a dimension and ranking rows by click delta. Framing it as the 'what changed' comparison tool distinguishes it from more specific sibling trend tools like gsc_traffic_drops and gsc_content_decay.
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 gives a clear use case: answer 'what changed' between periods without manually diffing tables. It does not explicitly name sibling alternatives or exclusion criteria, but the context is clear and not misleading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_content_decayARead-onlyIdempotent
Pages sliding down month after month.
A period comparison hides this: a page that halves over six months never shows a sharp drop in any single month-on-month check. One query per month runs in parallel.
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | How many months of history to read (2-16). | |
| date_to | No | End date YYYY-MM-DD. Defaults to today. | |
| no_cache | No | ||
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| row_limit | No | Rows returned. Default 100, capped at 1000. | |
| thresholds | No | Override the adaptive thresholds: min_impressions, min_clicks, high_visibility_impressions, ctr_curve. | |
| min_peak_clicks | No | Ignore pages that never reached this many clicks in a month. | |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
| consecutive_months | No | Months of uninterrupted decline required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, so the bar is lower. The description adds useful operational context: 'One query per month runs in parallel,' which tells an agent the call may be partitioned and slower, and explains why it catches decay that period comparisons 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 short sentences cover the problem statement, the reason a dedicated tool is needed, and the parallel-query behavior with no filler. The rationale is front-loaded before the operational note.
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 tool with an output schema and safety annotations, the description explains the key conceptual model and runtime behavior without needing to repeat parameter documentation. It could be more complete by explicitly naming the type of result returned, but the output schema fills that 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 89%, so parameters like months, date_to, row_limit, and site_url already carry meaning. The description adds no direct parameter syntax or examples beyond the schema, which is acceptable at this coverage level.
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 phrase 'Pages sliding down month after month' communicates the tool's focus on gradual multi-month decay, and the note that period comparison misses it differentiates this from a generic month-over-month diff. It lacks an explicit verb like 'detect' or 'return,' so it stops short of a crisp statement.
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 implies when to use the tool: for slow declines that a period comparison would hide. It does not name sibling tools or state an explicit when-not-to-use, so the routing guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_ctr_gapsARead-onlyIdempotent
Rows that rank well but are clicked far less than their position implies.
The snippet, not the ranking, is the problem, which makes these the
cheapest fixes available. expected_ctr is what a result at that position
normally earns.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Rolling window length ending today. | |
| entity | No | Analyse by `page` (default) or by `query`. | page |
| period | No | Named range: last_7_days, last_28_days, last_3_months, last_month, this_month, last_16_months. | |
| date_to | No | End date YYYY-MM-DD. Defaults to today. | |
| no_cache | No | ||
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| date_from | No | Start date YYYY-MM-DD. Overrides period and days. | |
| gap_ratio | No | Flag rows whose CTR is below this fraction of the expected CTR. | |
| row_limit | No | Rows returned. Default 100, capped at 1000. | |
| thresholds | No | Override the adaptive thresholds: min_impressions, min_clicks, high_visibility_impressions, ctr_curve. | |
| max_position | No | Only consider rows at or above this position. | |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior, so the description is free to add conceptual depth. It explains that the snippet, not ranking, is the problem, and defines expected_ctr as the position-based benchmark, which is valuable beyond the structured 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?
The description is three short sentences with no filler. The opening sentence states the core concept, the second adds strategic value, and the third defines the key benchmark term.
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?
Given rich parameter schemas, safety annotations, and an output schema, the description provides enough conceptual context for an agent to understand what the tool offers. The only clear gap is explicit routing among sibling tools, which is already penalized under usage guidelines.
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 92%, so the schema itself documents nearly every parameter. The description only adds context for the expected_ctr field, which is an output concept rather than a parameter, so it does not materially enhance parameter understanding.
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 clearly identifies Search Console rows that rank well but earn fewer clicks than their position implies, which defines the CTR-gap analysis concept. It lacks an explicit verb like 'list' or 'find', but the resource and analytical angle are 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 'cheapest fixes available' implies a prioritization use case, but the description never explicitly states when to use this tool instead of siblings such as gsc_quick_wins or gsc_query. This is implied context rather than actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_doctorARead-onlyIdempotent
Report the server's configuration and whether Search Console answers.
Call this first when something fails: it names the auth mode in use, when the token expires, how many properties the account can read, the cache state and the defaults every other tool applies. Secrets are masked.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| auth | Yes | |
| cache | Yes | |
| paths | Yes | |
| defaults | Yes | |
| platform | Yes | |
| mcp_major | Yes | |
| transport | Yes | |
| properties | Yes | |
| mcp_version | Yes | |
| python_version | Yes | |
| package_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and idempotent; the description adds what the report contains (auth mode, token expiry, property count, cache state, defaults) and promises secrets are masked. This gives the agent confidence about side effects and output contents. No contradiction with 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?
Two short sentences with the core purpose first, followed by valuable specifics. Every word earns its place; the 'Secrets are masked' note is important but not over-explained.
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 diagnostic tool with an output schema, the description explains when to call it and what information it will surface. It covers purpose, usage timing, and behavior without omitting anything the agent needs to invoke 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?
The tool takes zero parameters, so the schema carries no burden and the description doesn't need to explain parameter meanings. Per the baseline for zero-parameter tools, this is a 4.
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 ('Report') and resource (server configuration and Search Console connectivity). Clearly distinguishes from sibling tools that query search data. The 'Call this first' line reinforces its role as a diagnostic entry point.
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 instructs 'Call this first when something fails', which is a clear trigger condition. Also explains that it reveals defaults every other tool applies, so it is meant as a pre-flight check for subsequent calls. No exclusions are needed because it's unambiguously the diagnostic tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_indexing_issuesARead-onlyIdempotent
Check whether a batch of URLs is indexed, and why not when they are not.
Runs the inspections concurrently and returns one row per input URL, in input
order. A URL that fails gets an error column instead of a verdict; the rest
of the batch still comes back. For the full payload of a single page
(mobile usability, rich results, AMP) use gsc_inspect_url.
Quota: 600 inspections per minute and 2,000 per day, per property.
Columns: url, verdict (PASS / PARTIAL / FAIL / NEUTRAL), coverage_state, robots_txt_state, indexing_state, page_fetch_state, crawled_as, last_crawl_time, google_canonical, user_canonical, error. The meta carries a verdict summary.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | Yes | Fully qualified URLs under site_url. At most 100 per call. | |
| no_cache | No | Bypass the response cache for this call. | |
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses concurrency, one row per input URL in input order, per-URL error columns, partial batch results, quota limits, and the exact result columns. This is rich behavioral context an agent cannot infer from annotations alone.
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 description is well-structured and front-loaded: the core purpose appears in the first sentence, followed by behavioral details, alternative routing, quota, and output columns. Every sentence adds usable information without 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?
The description covers purpose, behavior, error handling, quotas, output columns, and the relevant sibling tool. Combined with the thorough input schema and output schema, an agent has everything needed to select and invoke this 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?
The input schema already documents all four parameters with 100% coverage, so the baseline is 3. The description does not add parameter-level detail, but it does provide output-column context and quota constraints that indirectly help the agent understand what the parameters produce.
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: 'Check whether a batch of URLs is indexed, and why not when they are not.' It clearly distinguishes this batch tool from the single-page alternative by naming gsc_inspect_url and contrasting batch rows versus full payload.
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 explicitly tells an agent when to use this tool versus gsc_inspect_url: for batch indexing checks versus full single-page payloads. This gives clear selection guidance without ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_inspect_urlARead-onlyIdempotent
Full URL Inspection for one page: index, mobile, rich results and AMP.
Use this when one page needs a diagnosis. For an indexed-or-not sweep across
many URLs use gsc_indexing_issues.
Quota: 600 inspections per minute and 2,000 per day, per property.
| Name | Required | Description | Default |
|---|---|---|---|
| no_cache | No | Bypass the response cache for this call. | |
| page_url | Yes | Fully qualified URL under site_url. | |
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. |
Output Schema
| Name | Required | Description |
|---|---|---|
| amp | No | |
| verdict | No | |
| page_url | Yes | |
| site_url | Yes | |
| index_status | No | |
| rich_results | No | |
| coverage_state | No | |
| mobile_usability | No | |
| inspection_result_link | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable rate-limit context (600/min and 2,000/day per property) and signals that a single URL is being inspected, extending beyond what annotations say without contradicting them.
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 description is three short, purposeful sentences: what it does, when to use it, and its quota. It is front-loaded with the core action and contains no filler. Every sentence 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?
For a single-URL inspection tool with a complete input schema, rich annotations, and an output schema, the description covers the essential behavioral, quota, and sibling-selection context. Nothing needed to select or call the tool 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?
Schema description coverage is 100%, so the schema already explains all parameters, including the site_url format and the no_cache option. The description does not add parameter-level detail beyond what is in the schema, so the baseline score 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?
The description opens with 'Full URL Inspection for one page' and enumerates the inspected dimensions: index, mobile, rich results, and AMP. It also names the sibling tool gsc_indexing_issues for the multi-URL sweep, making the tool's scope unambiguous. This clearly differentiates it from 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?
The description states 'Use this when one page needs a diagnosis' and contrasts this with 'an indexed-or-not sweep across many URLs' pointing to gsc_indexing_issues. This gives the agent an explicit decision rule between the tool and its closest alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_performance_overviewARead-onlyIdempotent
Site totals for a period, compared with the preceding one by default.
Start here: it answers "is the site up or down" in one call, with the
percentage change on every metric. position_delta is negative when the
average position improves.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Rolling window length ending today. | |
| type | No | web, image, video, news, discover or googleNews. | web |
| period | No | Named range: last_7_days, last_28_days, last_3_months, last_month, this_month, last_16_months. | |
| date_to | No | End date YYYY-MM-DD. Defaults to today. | |
| no_cache | No | Bypass the response cache for this call. | |
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| date_from | No | Start date YYYY-MM-DD. Overrides period and days. | |
| data_state | No | `all` (default, includes today's partial data) or `final`. | |
| compare_previous | No | Also fetch the equally long preceding period. |
Output Schema
| Name | Required | Description |
|---|---|---|
| delta | No | |
| current | Yes | |
| date_to | Yes | |
| previous | No | |
| site_url | Yes | |
| date_from | Yes | |
| data_state | No | |
| previous_range | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a safe read-only operation. The description adds useful behavioral context beyond that: comparison with the previous period is the default, and position_delta semantics ('negative when the average position improves') are explained. This helps the agent interpret results correctly.
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, each earning its place: the first states function, the second gives the primary use case, and the third clarifies an important metric interpretation. Information is front-loaded 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?
For a read-only overview tool with a full input schema and an output schema present, the description provides all the behavioral guidance an agent needs: what it returns, the default comparison behavior, and the key metric nuance. Nothing important 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 100%, so the parameters are already fully documented. The description adds no new parameter-level meaning; it mainly reinforces compare_previous default behavior implicitly. This is the expected baseline when the schema carries the load.
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 clearly states the tool's function: 'Site totals for a period' with comparison to the preceding period and 'percentage change on every metric.' The 'Start here' framing and 'is the site up or down' metaphor make the purpose immediately understandable, though no sibling tool is explicitly named for differentiation.
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 explicitly tells the agent when to use this tool: 'Start here: it answers "is the site up or down" in one call.' This provides clear context for choosing this tool first, but it does not explicitly state when to prefer alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_portfolioARead-onlyIdempotent
Every accessible property at a glance, ranked worst first.
One row per property with the current period, the previous one and a health flag: critical below -30% clicks, warning below -15%. Use it to decide which property to look at before running anything else.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Rolling window length ending today. | |
| limit | No | How many properties to check. | |
| date_to | No | End date YYYY-MM-DD. Defaults to today. | |
| no_cache | No | ||
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only, idempotent, and non-destructive, so the description only needs to add context beyond that. It adds meaningful behavioral details: results are ranked worst first, each row compares current vs. previous period, and health thresholds are explicitly defined (critical below -30% clicks, warning below -15%). This is useful behavior that the annotations do not 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?
The description is compact, front-loaded with the tool's core purpose, and every sentence adds useful information. It avoids restating schema fields or repeating annotation hints, containing only the essential decision-making context 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 portfolio overview tool with an output schema and strong annotations, the description covers the key context: scope (all accessible properties), ranking, period comparison, health thresholds, and when to use it. It does not explain every parameter in prose, but the schema already covers most of those. Minor gaps like the meaning of 'accessible' or the effect of no_cache are understandable given the availability of schema and output 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 80%, and the parameter descriptions already handle days, limit, date_to, and response_format. The description does not add parameter-specific semantics beyond what the schema provides. The health-flag thresholds describe output behavior, not parameter meaning, 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?
The description clearly states that the tool returns every accessible property at a glance, ranked worst first, with one row per property and a health flag. This distinguishes it from sibling tools like gsc_site_details or gsc_query, which operate on individual properties or specific metrics, by establishing its role as a portfolio-level overview.
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 gives clear usage context: 'Use it to decide which property to look at before running anything else.' This tells the agent that this should be the first triage step. It does not explicitly name alternatives or exclusions, but the 'before running anything else' guidance makes the intended placement in a workflow clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_queryARead-onlyIdempotent
Query the Search Analytics report: clicks, impressions, CTR, position.
This is the general-purpose tool. With no dates it covers the last 28 days ending today (UTC), with data_state=all so today's partial data is included, matching what the Search Console UI shows.
Example: site_url="sc-domain:example.com", dimensions="query,page", period="last_28_days", row_limit=100.
Returns a # meta ... line then a TSV table, or JSON with meta and rows.
The meta names the exact range, the row count, whether more rows exist and
the start_row to pass next.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Rolling window length ending today. | |
| type | No | web, image, video, news, discover or googleNews. | web |
| period | No | Named range: last_7_days, last_28_days, last_3_months, last_month, this_month, last_16_months. | |
| date_to | No | End date YYYY-MM-DD. Defaults to today. | |
| filters | No | List of {dimension, operator, expression}. Operators: equals, notEquals, contains, notContains, includingRegex, excludingRegex. | |
| no_cache | No | Bypass the response cache for this call. | |
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| date_from | No | Start date YYYY-MM-DD. Overrides period and days. | |
| row_limit | No | Rows returned. Default 100, capped at 1000. | |
| start_row | No | Zero-based pagination offset. | |
| data_state | No | `all` (default, includes today's partial data) or `final`. | |
| dimensions | No | Comma-separated dimensions: query, page, country, device, date, searchAppearance, hour. `hour` covers only the last 10 days. | query |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
| aggregation_type | No | auto, byPage or byProperty. | auto |
| filter_group_type | No | Only `and` is supported by the API within one group. | and |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds meaningful behavioral context beyond the schema and annotations: the default 28-day end-to-today window, inclusion of today's partial data via data_state=all, the TSV or JSON output shape, and the meta fields needed for pagination such as start_row and whether more rows exist.
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 description is compact and front-loaded: purpose first, then key defaults, then an example, then the return envelope. Every sentence earns its place, and the example is a high-signal compact illustration of how the parameters combine.
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?
Given the large 15-parameter schema with 100% coverage, plus an output schema and strong annotations, the description supplies exactly the missing context: default period semantics, UI parity, API-style pagination, and a representative call. An agent has enough to both select and invoke the 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 description coverage is 100%, so the baseline is 3, and the schema already documents every parameter clearly. The description adds value with a concrete example tying site_url, dimensions, period, and row_limit together, and it clarifies default date behavior and the pagination contract. That moves it above baseline without duplicating 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?
The description opens with a specific verb and resource: 'Query the Search Analytics report: clicks, impressions, CTR, position.' It then labels the tool as 'the general-purpose tool,' which distinguishes it from specialized sibling tools like gsc_quick_wins or gsc_ctr_gaps. This gives an agent a clear and immediate sense of scope.
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 provides clear context: it covers defaults, date behavior, and the UI-matching data_state, and it demonstrates usage with an explicit example. It identifies the tool as the general-purpose option, implicitly routing agents away from specialized siblings, though it does not name those alternatives or state explicit when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_quick_winsARead-onlyIdempotent
Queries close enough to the top that a push would pay off.
Ranked by the clicks each query would gain at target_position, not by
impressions: a big query already near its ceiling is not an opportunity.
The meta reports the thresholds that were applied.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Rolling window length ending today. | |
| period | No | Named range: last_7_days, last_28_days, last_3_months, last_month, this_month, last_16_months. | |
| date_to | No | End date YYYY-MM-DD. Defaults to today. | |
| no_cache | No | ||
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| date_from | No | Start date YYYY-MM-DD. Overrides period and days. | |
| row_limit | No | Rows returned. Default 100, capped at 1000. | |
| thresholds | No | Override the adaptive thresholds: min_impressions, min_clicks, high_visibility_impressions, ctr_curve. | |
| max_position | No | Ignore queries below this position. | |
| min_position | No | Ignore queries above this position. | |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
| target_position | No | Position to size the opportunity against. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, covering safety. The description adds valuable behavioral details: ranking by potential clicks rather than impressions, and the existence of adaptive thresholds reported in the meta. This goes beyond what the annotations provide.
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 description is two concise sentences. The first sentence clearly states the core function, and the second adds the critical ranking nuance. Every word earns its place; no fluff or 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?
Given the output schema exists, return values need not be explained. The description covers the key behavioral aspects, but it does not mention how conditions like threshold overrides interact with defaults, or any caveats about caching. Still, for a read-only analysis tool, it is sufficiently 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?
Schema coverage is 92%, so most parameters are already documented. The description adds meaning by explaining the role of target_position in the ranking logic, which is not obvious from the schema alone. This supplements the parameter semantics usefully without needing to repeat schema details.
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 states a specific purpose: finding queries close enough to the top that a push would pay off. It clearly differentiates from other GSC tools by explaining the ranking logic (based on potential clicks at target_position, not impressions), which distinguishes it from similar tools like gsc_ctr_gaps or gsc_query.
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 implies the use case (identifying quick-win queries worth pushing) but does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions. The context is clear enough, but explicit routing to a sibling tool like gsc_query for general query analysis would improve it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_site_detailsBRead-onlyIdempotent
Permission level and property type for one property.
| Name | Required | Description | Default |
|---|---|---|---|
| no_cache | No | Bypass the response cache for this call. | |
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds that the tool exposes permission level and property type, but it does not disclose additional behavioral traits such as caching behavior or response details. There is no contradiction with 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?
The description is a single short declarative sentence with no filler. It front-loads the essential output information and earns its place entirely.
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?
The tool is simple, has an output schema, full parameter descriptions, and strong safety annotations, so the structured fields carry most of the context. The main description is minimal but adequate for invoking the tool; some additional context about interpreting 'permission level' would have been useful, but it is not critical given the output 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 100%, and every parameter already has a meaningful description, including the site_url format, response_format options, and no_cache behavior. The tool description itself adds no parameter-level detail beyond the schema, so the baseline score 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?
The description clearly identifies the resource scope ('for one property') and states the output focus: 'Permission level and property type.' It lacks an explicit retrieval verb such as 'Get' or 'Return', but it is still distinguishable from the sibling gsc_sites tool, which lists properties.
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 main description provides no when-to-use guidance and does not mention alternatives. The only routing hint, 'Call gsc_sites if unsure,' appears inside the site_url parameter description and concerns resolving a parameter value, not deciding whether this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_sitemapsARead-onlyIdempotent
List the sitemaps Google knows about for a property, with errors and warnings.
Read-only: submitting or deleting a sitemap needs the read-write scope, which this server never requests.
Returns one row per sitemap: path, last submitted and downloaded timestamps, pending flag, index flag, warning and error counts, and the submitted / indexed URL counts when Google reports them.
| Name | Required | Description | Default |
|---|---|---|---|
| no_cache | No | Bypass the response cache for this call. | |
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as readOnly, idempotent, and non-destructive. The description adds meaningful context beyond this by explaining the server never requests read-write scope, which is why submitting or deleting is impossible. It also discloses that returned data reflects what Google knows, with error and warning counts, adding value 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?
The description is concise and front-loaded: the first sentence states the main purpose, the second adds the key read-only constraint, and the third summarizes the row shape. Every sentence earns its place with no fluff or repetition.
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?
Combined with the detailed input schema, annotations, and output schema, the description is complete enough for an agent to call this tool correctly. It explains scope, read-only policy, and the row contents, while the schema covers parameter formats. Nothing essential for selecting or invoking this tool 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 description coverage is 100%, so the schema already documents site_url, no_cache, and response_format clearly. The main tool description adds little to parameter meaning. The baseline of 3 applies because the schema does the heavy lifting and the description does not need to compensate.
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: 'List the sitemaps Google knows about for a property, with errors and warnings.' It clearly identifies a listing operation on sitemaps with diagnostic data, which distinguishes it from sibling tools like gsc_query or gsc_sites. However, it does not explicitly compare itself to siblings or state what it is not, so it misses full differentiation.
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 gives clear context: this is a read-only listing tool and cannot submit or delete sitemaps because the server never requests read-write scope. This is a useful exclusion. It does not explicitly name an alternative tool to use for mutation or for site discovery, though the site_url schema description suggests gsc_sites when unsure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_sitesARead-onlyIdempotent
List every property the authenticated account can read.
Call this first when a property string fails: it returns the exact site_url
values the other tools expect, and whether each one is a domain property
(sc-domain:example.com) or a URL-prefix property.
| Name | Required | Description | Default |
|---|---|---|---|
| no_cache | No | Bypass the response cache for this call. | |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond those hints: it returns exact site_url strings other tools expect and distinguishes domain properties from URL-prefix properties.
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. The core purpose is stated first, and the practical usage instruction is directly after, making it easy for an agent to scan and act 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?
Given the output schema exists, annotations cover safety and idempotency, and parameters are fully documented, the description adds exactly the missing context: when to call this tool and what value it provides. Nothing an agent needs 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?
Schema coverage is 100%, so the parameters no_cache and response_format are already fully documented in the schema. The description does not need to add parameter details, and it does not, so the baseline score 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?
The description uses a specific verb and resource: 'List every property the authenticated account can read.' It clearly defines the tool's scope and distinguishes it from siblings like gsc_site_details or gsc_query by positioning it as the property-listing/discovery tool.
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 gives an explicit trigger condition: 'Call this first when a property string fails.' It also explains what the tool returns and how that helps with other tools, which gives an agent clear context for when to use it. It does not explicitly name alternative tools, but the unique listing purpose makes the usage boundary clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_traffic_dropsARead-onlyIdempotent
Pages that lost clicks against the baseline, each with a likely cause.
diagnosis separates a ranking loss from falling demand, a collapsed CTR
and a page that disappeared: the four need different fixes, and the raw
numbers for both periods are in the row so the call can be checked.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Rolling window length ending today. | |
| period | No | Named range: last_7_days, last_28_days, last_3_months, last_month, this_month, last_16_months. | |
| date_to | No | End date YYYY-MM-DD. Defaults to today. | |
| no_cache | No | ||
| site_url | Yes | `sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure. | |
| date_from | No | Start date YYYY-MM-DD. Overrides period and days. | |
| row_limit | No | Rows returned. Default 100, capped at 1000. | |
| thresholds | No | Override the adaptive thresholds: min_impressions, min_clicks, high_visibility_impressions, ctr_curve. | |
| min_drop_pct | No | Minimum click loss, in percent. | |
| response_format | No | `tsv` (default, compact) or `json`. | tsv |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint, idempotentHint, and destructiveHint, so the baseline is lower. The description adds meaningful behavior: it explains that each row includes a diagnosis and raw numbers for both periods, making the results auditable. This is useful context beyond the annotations, with no contradiction.
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 description is compact and front-loaded, stating the core purpose in the first sentence. The second paragraph adds genuinely useful diagnostic context without filler. Every sentence 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?
Given the tool has 10 parameters, an output schema, and detailed annotations, the description provides useful interpretive context but leaves gaps. It does not define what 'baseline' means, how thresholds are calculated, or how this tool relates to the many sibling diagnostics. Adequate, but not fully complete for a tool of this complexity.
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 90%, so the parameters are already well documented. The description does not add parameter-level detail, but it does contextualize the output by mentioning 'baseline' and 'both periods.' This is adequate given the schema already carries most of the burden.
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 clearly identifies the output as pages that lost clicks against a baseline, each with a likely cause. It also adds diagnostic categories, making the purpose tangible. However, it lacks an explicit verb like 'returns' or 'identifies' and does not distinguish itself from sibling tools by name.
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 guidance on when to use this tool versus closely related siblings such as gsc_content_decay or gsc_ctr_gaps. The statement that the four diagnoses need different fixes is interpretive guidance for acting on results, not guidance for tool selection.
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.
17 tool updates
v3.0.1- Added
gsc_alerts - Changed
gsc_audit17 fields changed- added
Input schema / properties / brand_termsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Words that mark a query as branded. Without them the first label of the domain is used, which is often wrong.", + "title": "Brand Terms" +} - added
Input schema / properties / branding_path / descriptionAdded value: +"Path to a branding.json overriding colours, logo, name and thresholds." - added
Input schema / properties / date_from / defaultAdded value: +"" - added
Input schema / properties / date_from / descriptionAdded value: +"Start date YYYY-MM-DD. Overrides period and days." - added
Input schema / properties / date_to / defaultAdded value: +"" - added
Input schema / properties / date_to / descriptionAdded value: +"End date YYYY-MM-DD. Defaults to today." - added
Input schema / properties / daysAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Rolling window length ending today.", + "title": "Days" +} - added
Input schema / properties / inspect_top_pagesAdded value: +{ + "default": 10, + "description": "How many top pages to run through URL Inspection. 0 disables it.", + "title": "Inspect Top Pages", + "type": "integer" +} - added
Input schema / properties / languageAdded value: +{ + "default": "", + "description": "Report language: en, it. Defaults to en.", + "title": "Language", + "type": "string" +} - added
Input schema / properties / outputAdded value: +{ + "default": "auto", + "description": "`file` writes the report and returns its path, `inline` returns the HTML as an embedded resource, `both` does both, `auto` picks by transport.", + "title": "Output", + "type": "string" +} - added
Input schema / properties / output_dir / descriptionAdded value: +"Where to write the report. Defaults to ~/gsc-reports/." - added
Input schema / properties / periodAdded value: +{ + "default": "", + "description": "Named range: last_7_days, last_28_days, last_3_months, last_month, this_month, last_16_months.", + "title": "Period", + "type": "string" +} - added
Input schema / properties / sectionsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Subset of sections to render: overview, issues, top_queries, top_pages, countries, sitemaps, indexing, strategy, roadmap.", + "title": "Sections" +} - added
Input schema / properties / site_url / descriptionAdded value: +"`sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure." - added
Input schema / properties / thresholdsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Override the adaptive thresholds: min_impressions, min_clicks, high_visibility_impressions, ctr_curve.", + "title": "Thresholds" +} - changed
Input schema / requiredPrevious value: -[ - "site_url", - "date_from", - "date_to" -]New value: +[ + "site_url" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "title": "Result", - "type": "string" - } - }, - "required": [ - "result" - ], - "title": "gsc_auditOutput", - "type": "object" -}New value: +null
- Added
gsc_cannibalization - Added
gsc_compare_periods - Added
gsc_content_decay - Added
gsc_ctr_gaps - Added
gsc_doctor - Changed
gsc_indexing_issues4 fields changed- added
Input schema / properties / no_cacheAdded value: +{ + "default": false, + "description": "Bypass the response cache for this call.", + "title": "No Cache", + "type": "boolean" +} - added
Input schema / properties / pages / descriptionAdded value: +"Fully qualified URLs under site_url. At most 100 per call." - added
Input schema / properties / response_formatAdded value: +{ + "default": "tsv", + "description": "`tsv` (default, compact) or `json`.", + "title": "Response Format", + "type": "string" +} - added
Input schema / properties / site_url / descriptionAdded value: +"`sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure."
- Changed
gsc_inspect_url16 fields changed- added
Input schema / properties / no_cacheAdded value: +{ + "default": false, + "description": "Bypass the response cache for this call.", + "title": "No Cache", + "type": "boolean" +} - added
Input schema / properties / page_url / descriptionAdded value: +"Fully qualified URL under site_url." - added
Input schema / properties / site_url / descriptionAdded value: +"`sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure." - added
Output schema / descriptionAdded value: +"The URL Inspection payload for one page, with the sub-objects left as-is." - added
Output schema / properties / ampAdded value: +{ + "additionalProperties": true, + "title": "Amp", + "type": "object" +} - added
Output schema / properties / coverage_stateAdded value: +{ + "default": "", + "title": "Coverage State", + "type": "string" +} - added
Output schema / properties / index_statusAdded value: +{ + "additionalProperties": true, + "title": "Index Status", + "type": "object" +} - added
Output schema / properties / inspection_result_linkAdded value: +{ + "default": "", + "title": "Inspection Result Link", + "type": "string" +} - added
Output schema / properties / mobile_usabilityAdded value: +{ + "additionalProperties": true, + "title": "Mobile Usability", + "type": "object" +} - added
Output schema / properties / page_urlAdded value: +{ + "title": "Page Url", + "type": "string" +} - removed
Output schema / properties / resultRemoved value: -{ - "title": "Result", - "type": "string" -} - added
Output schema / properties / rich_resultsAdded value: +{ + "additionalProperties": true, + "title": "Rich Results", + "type": "object" +} - added
Output schema / properties / site_urlAdded value: +{ + "title": "Site Url", + "type": "string" +} - added
Output schema / properties / verdictAdded value: +{ + "default": "", + "title": "Verdict", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "site_url", + "page_url" +] - changed
Output schema / titlePrevious value: -"gsc_inspect_urlOutput"New value: +"InspectionResult"
- Changed
gsc_performance_overview25 fields changed- added
Input schema / properties / compare_previousAdded value: +{ + "default": true, + "description": "Also fetch the equally long preceding period.", + "title": "Compare Previous", + "type": "boolean" +} - added
Input schema / properties / data_stateAdded value: +{ + "default": "", + "description": "`all` (default, includes today's partial data) or `final`.", + "title": "Data State", + "type": "string" +} - added
Input schema / properties / date_from / defaultAdded value: +"" - added
Input schema / properties / date_from / descriptionAdded value: +"Start date YYYY-MM-DD. Overrides period and days." - added
Input schema / properties / date_to / defaultAdded value: +"" - added
Input schema / properties / date_to / descriptionAdded value: +"End date YYYY-MM-DD. Defaults to today." - added
Input schema / properties / daysAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Rolling window length ending today.", + "title": "Days" +} - added
Input schema / properties / no_cacheAdded value: +{ + "default": false, + "description": "Bypass the response cache for this call.", + "title": "No Cache", + "type": "boolean" +} - added
Input schema / properties / periodAdded value: +{ + "default": "", + "description": "Named range: last_7_days, last_28_days, last_3_months, last_month, this_month, last_16_months.", + "title": "Period", + "type": "string" +} - added
Input schema / properties / site_url / descriptionAdded value: +"`sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure." - added
Input schema / properties / typeAdded value: +{ + "default": "web", + "description": "web, image, video, news, discover or googleNews.", + "title": "Type", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "site_url", - "date_from", - "date_to" -]New value: +[ + "site_url" +] - added
Output schema / $defsAdded value: +{ + "Delta": { + "description": "Percentage change between two periods. Position improves when it goes down.", + "properties": { + "clicks_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Clicks Pct" + }, + "ctr_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Ctr Pct" + }, + "impressions_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Impressions Pct" + }, + "position_delta": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Absolute change in average position; negative means an improvement", + "title": "Position Delta" + } + }, + "title": "Delta", + "type": "object" + }, + "Totals": { + "description": "Aggregate metrics for one period.", + "properties": { + "clicks": { + "default": 0, + "title": "Clicks", + "type": "integer" + }, + "ctr": { + "default": 0, + "description": "Click-through rate as a fraction, 4 decimals", + "title": "Ctr", + "type": "number" + }, + "impressions": { + "default": 0, + "title": "Impressions", + "type": "integer" + }, + "position": { + "default": 0, + "description": "Average position, 1 decimal", + "title": "Position", + "type": "number" + } + }, + "title": "Totals", + "type": "object" + } +} - added
Output schema / descriptionAdded value: +"Site totals for a period, optionally compared with the preceding one." - added
Output schema / properties / currentAdded value: +{ + "$ref": "#/$defs/Totals" +} - added
Output schema / properties / data_stateAdded value: +{ + "default": "all", + "title": "Data State", + "type": "string" +} - added
Output schema / properties / date_fromAdded value: +{ + "title": "Date From", + "type": "string" +} - added
Output schema / properties / date_toAdded value: +{ + "title": "Date To", + "type": "string" +} - added
Output schema / properties / deltaAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/Delta" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / previousAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/Totals" + }, + { + "type": "null" + } + ], + "default": null +} - added
Output schema / properties / previous_rangeAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Previous Range" +} - removed
Output schema / properties / resultRemoved value: -{ - "title": "Result", - "type": "string" -} - added
Output schema / properties / site_urlAdded value: +{ + "title": "Site Url", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "site_url", + "date_from", + "date_to", + "current" +] - changed
Output schema / titlePrevious value: -"gsc_performance_overviewOutput"New value: +"Overview"
- Added
gsc_portfolio - Changed
gsc_query18 fields changed- added
Input schema / properties / aggregation_typeAdded value: +{ + "default": "auto", + "description": "auto, byPage or byProperty.", + "title": "Aggregation Type", + "type": "string" +} - added
Input schema / properties / data_stateAdded value: +{ + "default": "", + "description": "`all` (default, includes today's partial data) or `final`.", + "title": "Data State", + "type": "string" +} - added
Input schema / properties / date_from / defaultAdded value: +"" - added
Input schema / properties / date_from / descriptionAdded value: +"Start date YYYY-MM-DD. Overrides period and days." - added
Input schema / properties / date_to / defaultAdded value: +"" - added
Input schema / properties / date_to / descriptionAdded value: +"End date YYYY-MM-DD. Defaults to today." - added
Input schema / properties / daysAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Rolling window length ending today.", + "title": "Days" +} - added
Input schema / properties / dimensions / descriptionAdded value: +"Comma-separated dimensions: query, page, country, device, date, searchAppearance, hour. `hour` covers only the last 10 days." - added
Input schema / properties / filter_group_typeAdded value: +{ + "default": "and", + "description": "Only `and` is supported by the API within one group.", + "title": "Filter Group Type", + "type": "string" +} - added
Input schema / properties / filtersAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "List of {dimension, operator, expression}. Operators: equals, notEquals, contains, notContains, includingRegex, excludingRegex.", + "title": "Filters" +} - added
Input schema / properties / no_cacheAdded value: +{ + "default": false, + "description": "Bypass the response cache for this call.", + "title": "No Cache", + "type": "boolean" +} - added
Input schema / properties / periodAdded value: +{ + "default": "", + "description": "Named range: last_7_days, last_28_days, last_3_months, last_month, this_month, last_16_months.", + "title": "Period", + "type": "string" +} - added
Input schema / properties / response_formatAdded value: +{ + "default": "tsv", + "description": "`tsv` (default, compact) or `json`.", + "title": "Response Format", + "type": "string" +} - added
Input schema / properties / row_limit / descriptionAdded value: +"Rows returned. Default 100, capped at 1000." - added
Input schema / properties / site_url / descriptionAdded value: +"`sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure." - added
Input schema / properties / start_rowAdded value: +{ + "default": 0, + "description": "Zero-based pagination offset.", + "title": "Start Row", + "type": "integer" +} - added
Input schema / properties / typeAdded value: +{ + "default": "web", + "description": "web, image, video, news, discover or googleNews.", + "title": "Type", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "site_url", - "date_from", - "date_to" -]New value: +[ + "site_url" +]
- Added
gsc_quick_wins - Changed
gsc_site_details3 fields changed- added
Input schema / properties / no_cacheAdded value: +{ + "default": false, + "description": "Bypass the response cache for this call.", + "title": "No Cache", + "type": "boolean" +} - added
Input schema / properties / response_formatAdded value: +{ + "default": "tsv", + "description": "`tsv` (default, compact) or `json`.", + "title": "Response Format", + "type": "string" +} - added
Input schema / properties / site_url / descriptionAdded value: +"`sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure."
- Changed
gsc_sitemaps3 fields changed- added
Input schema / properties / no_cacheAdded value: +{ + "default": false, + "description": "Bypass the response cache for this call.", + "title": "No Cache", + "type": "boolean" +} - added
Input schema / properties / response_formatAdded value: +{ + "default": "tsv", + "description": "`tsv` (default, compact) or `json`.", + "title": "Response Format", + "type": "string" +} - added
Input schema / properties / site_url / descriptionAdded value: +"`sc-domain:example.com` for a domain property, or `https://example.com/` with the trailing slash for a URL-prefix property. Call gsc_sites if unsure."
- Changed
gsc_sites2 fields changed- added
Input schema / properties / no_cacheAdded value: +{ + "default": false, + "description": "Bypass the response cache for this call.", + "title": "No Cache", + "type": "boolean" +} - added
Input schema / properties / response_formatAdded value: +{ + "default": "tsv", + "description": "`tsv` (default, compact) or `json`.", + "title": "Response Format", + "type": "string" +}
- Added
gsc_traffic_drops
8 tool updates
v2.0.2- First observed
gsc_audit - First observed
gsc_indexing_issues - First observed
gsc_inspect_url - First observed
gsc_performance_overview - First observed
gsc_query - First observed
gsc_site_details - First observed
gsc_sitemaps - First observed
gsc_sites
TDQS
Scored across 17 tools
Most tools are clearly distinct (query, inspection, sitemaps, audit), but gsc_sites, gsc_site_details, and gsc_portfolio all operate at the property level and could be confused at first glance. Overall, careful descriptions separate them well.
All tool names share the gsc_ prefix and snake_case, but the pattern mixes noun phrases (gsc_performance_overview, gsc_cannibalization) with verb-like names (gsc_query, gsc_compare_periods). Predictable enough, though not a strict verb_noun schema.
17 tools is slightly above the ideal range but appropriate for a broad Search Console audit workflow. Each tool represents a meaningful capability rather than redundant variants.
The set covers property discovery, analytics reporting, common SEO analysis patterns, indexing checks, and report generation. Minor gaps exist — e.g., no direct URL-specific analytics slicing or sitemap submission — but these are consistent with a read-only audit-oriented server.
Maintenance
Related MCP Connectors
Read-only Search Console analytics, URL inspection, indexing diagnostics, and sitemaps.
- CalmSEOOAuthcom.calmseo
SEO MCP server for keyword research, SERP analysis, audits, and Search Console workflows.
Read Search Console performance, keyword opportunities and annotations for your sites.
Google Ads MCP server — manage campaigns, keywords, and metrics.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for querying Google Search Console data — search analytics, URL inspection, sitemap monitoring, and more — read-only tools for any MCP-compatible AI client.7Apache 2.0
- AlicenseBqualityBmaintenanceRead-only MCP server for Google Search Console, with browser-based OAuth flow and local token storage, enabling querying search analytics, site lists, and URL inspection.8MIT
- AlicenseNot gradedqualityCmaintenanceRead-only MCP server that gives AI clients access to Google Search Console data, enabling natural language queries about traffic, rankings, and SEO opportunities.154MIT
- AlicenseNot gradedqualityBmaintenanceRead-only MCP server for Google Search Console data, enabling search analytics, URL inspection, indexing diagnostics, and sitemap management through MCP clients.19MIT