Google Search Console Audit MCP
Google Search Console MCP Server
Read this in: English | Italiano
Open-source Model Context Protocol (MCP) server for Google Search Console. Brings your Search Console performance data, URL inspection, indexing checks, and sitemaps into Claude Code, Claude Desktop, Cursor, Zed, Continue, and any MCP-compatible client, and generates complete brandable HTML SEO audit reports in a single call.
If you work with SEO and use an AI coding assistant, this MCP server removes the copy-paste loop between Search Console and your chat: ask for top queries, check which pages are indexed, inspect a URL, or produce a 30/60/90-day SEO roadmap as an HTML report, all without leaving the assistant.
Features
Read-only access to Search Console (no write operations to your properties, only the
webmasters.readonlyOAuth scope)8 tools covering sites, performance queries, pages, devices, countries, indexing, sitemaps, URL inspection
gsc_audit: one-call generator for a self-contained HTML SEO report with Chart.js graphs, automatic issue detection, concrete examples, actionable strategy and a 30/60/90-day roadmapBrandable reports: customize logo, font, and color palette via
branding.json, perfect for agencies delivering white-label auditsStateless-friendly: credentials via environment variables (ideal for CI, Docker, hosted MCP) or via the XDG config directory
Zero setup with
uvx: no clone, no virtualenv, runs straight from PyPIWorks with any MCP client: Claude Code, Claude Desktop, Cursor, Zed, Continue, Windsurf
Related MCP server: flin-google-search-console-mcp
Why use this MCP server
Skip the Search Console UI when you already live inside your AI assistant
Turn GSC data into a shareable client-ready HTML audit in a single prompt
Keep full control over credentials: choose env vars, XDG config, or legacy file layout
Safe by design: read-only scope means the server cannot edit or remove anything from your properties
Python 3.10+, MIT licensed, published on PyPI as
mcp-google-search-console
Tools
Tool | Description |
| List all verified sites |
| Details of a specific site |
| Performance report with dimensions (query, page, country, device, date) |
| Aggregated metrics for a period (clicks, impressions, CTR, position) |
| Check indexing status for a list of pages |
| Detailed URL Inspection for a single page |
| List all sitemaps submitted for a site |
| Generate a complete HTML audit report for a date range |
Installation
Option A — uvx (recommended, zero setup)
Run directly from PyPI, no clone or venv required:
uvx mcp-google-search-console auth # one-time OAuth authorization
uvx mcp-google-search-console # start the MCP serverOption B — pipx
pipx install mcp-google-search-console
mcp-google-search-console auth
mcp-google-search-consoleOption C — From source
git clone https://github.com/acamolese/google-search-console-mcp.git
cd google-search-console-mcp
uv venv && uv pip install -e .
.venv/bin/mcp-google-search-console authConfiguration
1. Google Cloud setup
Google Cloud Console → create a project
Enable the Google Search Console API
APIs & Credentials → Create Credentials → OAuth 2.0 Client ID → Desktop app
Download the JSON
2. Provide the OAuth client credentials
You have three ways, pick whichever fits your setup. The server reads them in this order:
A — Environment variables (best for headless, CI, Docker, hosted MCP):
export GSC_CLIENT_ID="xxxxxxxxxxxx.apps.googleusercontent.com"
export GSC_CLIENT_SECRET="GOCSPX-xxxxxxxxxxxxxxxx"
export GSC_REFRESH_TOKEN="1//0xxxxxxxxxxxxxxxx"With these three variables set, the server is fully stateless: no files are read or written.
B — XDG config directory (recommended for local desktop usage):
Save the OAuth client JSON as:
~/.config/mcp-google-search-console/oauth_credentials.jsonThen run the interactive authorization flow:
mcp-google-search-console authThis opens a browser, captures the OAuth consent and saves the refresh token to ~/.config/mcp-google-search-console/token.json. On Linux and macOS the path honors $XDG_CONFIG_HOME if set.
C — Legacy per-project directory (backward compatibility only):
Place files under ./credentials/oauth_credentials.json and ./credentials/token.json in the working directory where the server is launched. This mode is still supported for older setups but not recommended.
Client configuration
All examples below assume you installed with uvx. Adjust the command if you used pipx (mcp-google-search-console) or cloned from source (/path/to/.venv/bin/mcp-google-search-console).
Claude Code
Edit ~/.claude/.mcp.json:
{
"mcpServers": {
"google-search-console": {
"command": "uvx",
"args": ["mcp-google-search-console"]
}
}
}Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"google-search-console": {
"command": "uvx",
"args": ["mcp-google-search-console"]
}
}
}Cursor
Edit ~/.cursor/mcp.json (or the project-local .cursor/mcp.json):
{
"mcpServers": {
"google-search-console": {
"command": "uvx",
"args": ["mcp-google-search-console"]
}
}
}Zed
Add to your Zed settings.json under context_servers:
{
"context_servers": {
"google-search-console": {
"command": {
"path": "uvx",
"args": ["mcp-google-search-console"]
}
}
}
}Continue, Windsurf, and other MCP clients
Any MCP client that supports stdio servers can use the same pattern:
{
"mcpServers": {
"google-search-console": {
"command": "uvx",
"args": ["mcp-google-search-console"]
}
}
}Stateless configuration with environment variables
If you prefer not to persist anything on disk, pass credentials inline:
{
"mcpServers": {
"google-search-console": {
"command": "uvx",
"args": ["mcp-google-search-console"],
"env": {
"GSC_CLIENT_ID": "xxxxxxxxxxxx.apps.googleusercontent.com",
"GSC_CLIENT_SECRET": "GOCSPX-xxxxxxxxxxxxxxxx",
"GSC_REFRESH_TOKEN": "1//0xxxxxxxxxxxxxxxx"
}
}
}
}Usage examples
Once the MCP server is wired into your client, you can ask things like:
"List my verified sites in Search Console"
"Show the top 50 queries for
sc-domain:example.comover the last 30 days""Check if these 5 pages are indexed: ..."
"Generate a complete audit of
example.comfor the period 2026-01-01 → 2026-03-31"
The gsc_audit tool writes a self-contained HTML file to ~/gsc-reports/ and returns the path. Open it in any browser.
Tips
Use
sc-domain:example.comfor domain properties orhttps://example.com/for URL-prefix properties.Available dimensions for
gsc_query:query,page,country,device,date(combine with commas).Maximum 25,000 rows per request.
Customizing the audit report
The audit report layout uses a Jinja2 template in src/google_search_console_mcp/templates/report.html.j2 with colors and fonts driven by branding.json.
To customize without touching the package, create your own branding.json in the XDG config directory:
~/.config/mcp-google-search-console/branding.jsonExample:
{
"brand_name": "Acme SEO Studio",
"logo": "logo.png",
"font_family": "Poppins",
"font_url": "https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap",
"colors": {
"primary": "#ff6b35",
"primary_dark": "#cc4a1f",
"secondary": "#004e89",
"accent": "#00b894",
"danger": "#e74c3c",
"warning": "#f39c12",
"text": "#004e89",
"text_muted": "#5a6c7d",
"text_light": "#8395a7",
"bg": "#f8f9fc",
"surface": "#ffffff",
"border": "#e1e8ed"
}
}The logo field accepts either a local file name (resolved against the XDG config dir, then the package dir) or a full URL. Local files are automatically base64-encoded into the HTML so the report stays self-contained.
You can also pass a custom branding file per report via the branding_path parameter of gsc_audit:
"Generate an audit of example.com using the branding at
/path/to/client-branding.json"
FAQ
What is an MCP server?
MCP (Model Context Protocol) is an open protocol that lets AI assistants like Claude or Cursor talk to external data sources and tools through a standard interface. An MCP server exposes a set of tools (functions) and resources that the assistant can call during a conversation. This project is an MCP server that exposes Google Search Console as tools your assistant can use.
Does this work with Claude Desktop, Claude Code, Cursor, Zed, and Continue?
Yes. Anything that can speak MCP over stdio can use this server. Ready-to-paste configuration snippets for each client are in Client configuration.
Can this server change or delete data in my Search Console account?
No. The server only requests the webmasters.readonly scope from Google, which is read-only by design. It cannot submit sitemaps, request indexing, or modify any property settings.
How do I obtain the OAuth client credentials?
Create a Google Cloud project, enable the Google Search Console API, then create an OAuth 2.0 Client ID of type Desktop app and download the JSON. Full steps are in the Configuration section.
Can I use a service account instead of OAuth?
Not currently. The Search Console API requires that the identity has been granted access to the property, and Google's own docs recommend OAuth user credentials for most use cases. If you need service account support, open an issue.
Can I customize the SEO audit report?
Yes. Drop a branding.json file in ~/.config/mcp-google-search-console/ to override logo, font, and the full color palette. See Customizing the audit report. You can also pass a per-report branding_path parameter when calling gsc_audit, which is ideal for agencies producing white-label audits for multiple clients.
Where are the audit reports saved?
gsc_audit writes a self-contained HTML file to ~/gsc-reports/ and returns the path. The file is fully inlined (CSS, charts, images base64-encoded) so you can share it without worrying about external assets.
What's the difference between sc-domain: and URL-prefix properties?
sc-domain:example.com covers the entire domain, including all subdomains and both http/https. https://example.com/ only covers that specific prefix. Use whichever matches how you verified the property in Search Console.
Does it work on headless servers or in Docker?
Yes. Set GSC_CLIENT_ID, GSC_CLIENT_SECRET, GSC_REFRESH_TOKEN as environment variables and skip the browser auth flow. The server is fully stateless in this mode and never writes to disk.
Security
Never commit
oauth_credentials.json,token.json, or.envfiles with real secrets.The XDG config directory is the default storage location and is outside the repository.
The server only requests the
webmasters.readonlyscope.
Troubleshooting
401 Unauthorized on first call: token expired or missing. Run
mcp-google-search-console author setGSC_REFRESH_TOKEN."No OAuth client credentials found": neither env vars nor files are configured. See the Configuration section.
Browser flow fails on headless machines: skip
authentirely and exportGSC_CLIENT_ID,GSC_CLIENT_SECRET,GSC_REFRESH_TOKENas environment variables.
Migration from legacy installs (pre-f2fe60e)
The package was restructured in commit f2fe60e and no longer ships a top-level server.py. If your MCP client was configured to launch the server with python server.py, it will now fail at startup with:
can't open file '.../server.py': [Errno 2] No such file or directoryUpdate your client config to use the installed entry-point instead:
"google-search-console": {
"command": "uvx",
"args": ["mcp-google-search-console"]
}Equivalent forms are listed under Client configuration.
License
MIT © Andrea Camolese. Not affiliated with Google or Anthropic. "Google Search Console" is a trademark of Google LLC.
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
Hosted, read-only Google Search Console MCP: performance, comparisons, URL inspection, sitemaps.
Read-only Search Console analytics, URL inspection, indexing diagnostics, and sitemaps.
Audit, rank-track and analyze SEO for sites via an authenticated MCP server.
Hosted MCP server for GA4, Google Ads and Search Console. Google OAuth, nothing to install.
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
- AlicenseBqualityCmaintenanceRead-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 gradedqualityDmaintenanceRead-only MCP server that gives AI clients access to Google Search Console data, enabling natural language queries about traffic, rankings, and SEO opportunities.161 npmMIT
- AlicenseNot gradedqualityBmaintenanceRead-only MCP server for Google Search Console data, enabling search analytics, URL inspection, indexing diagnostics, and sitemap management through MCP clients.11 npmMIT