Google Search Console MCP
The Google Search Console MCP server gives an AI agent 19 tools to read and manage Search Console data and properties across one or more signed-in Google accounts.
List signed-in Google accounts and choose which account a tool call acts as.
List/get properties and permission levels; add properties; delete properties (confirmation required).
Run search analytics: top queries, top pages, period comparisons, striking-distance queries, and custom reports by query, page, country, device, search appearance, date, or hour.
Inspect one URL or a batch of URLs for indexing, canonical, last crawl, rich results, AMP, and mobile usability.
List/get/submit/delete sitemaps (delete requires confirmation).
Mint verification tokens and verify site/domain ownership via DNS TXT, meta tag, or file.
List verified sites/domains across Google products.
Respect safety controls such as read-only mode, destructive-action limits, confirmations, audit logging, and per-tool MCP annotations.
Provides tools to access Google Search Console data, including search performance (queries, pages, impressions, clicks, rankings), period comparisons, URL inspection, sitemap management, and property management.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Google Search Console MCPwhat did we lose traffic on last month, and why?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Google Search Console MCP Server & CLI
Google Search Console MCP server and CLI for Claude Code, Codex and AI agents. 19 tools for search analytics, URL inspection, sitemaps and property verification.
One install gives you both surfaces, the same 19 tools under the same names, from the same server, so they cannot drift apart.
Give any AI agent real access to what Google Search actually recorded about your sites. Queries, pages, impressions, rankings, indexing, sitemaps, from Claude Code, Claude Desktop, claude.ai, Cursor, Codex, or any MCP client.
Built by Navid Moazzez. Built on Slipway, which turns one definition of each tool into the MCP server and the CLI.
Two ways to use it
Command line
google-search-console-cli runs every tool as a command. Agents that run commands, like
Claude Code, Codex and OpenCode, use it on their own, and you can type the same
commands in a terminal, a script or a cron job:
google-search-console-cli # every command, one line each
google-search-console-cli list-sites # the exact property strings
google-search-console-cli top-queries --site sc-domain:example.com --limit 10
google-search-console-cli striking-distance --site sc-domain:example.com
google-search-console-cli top-pages --site sc-domain:example.com --json --select rows.page,rows.clicks
google-search-console-cli delete-sitemap --site sc-domain:example.com --sitemap-url https://example.com/old.xml --confirm
google-search-console-cli which submit a sitemap # find the command for a task
google-search-console-cli <command> --help # what any command takes--confirm is the shell spelling of the confirmation deleting a property or a sitemap needs. --json gives JSON, --compact puts it on one line, --select keeps only the fields you name, and --agent turns on all of it for a script. Exit codes are 0 ok, 1 unexpected, 2 usage or a refused write, 3 not found, 4 auth, 5 API, 7 rate limited and 10 nothing configured, so a script branches on the number.
google-search-console-cli schema <command> prints the exact JSON Schema an MCP client
receives for that tool.
MCP server, for AI agents
google-search-console-mcp is what Claude Code, Claude Desktop, Cursor and the rest launch.
You never run it by hand:
claude mcp add google-search-console -- npx -y @thenavidm/google-search-console-mcp-cli@latestIn Claude Desktop, the .mcpb extension
installs on a double click. Section 4 has every other client.
What each costs
Both surfaces are the same program with the same 19 tools. The difference is when the model pays for them. Measured in Claude Code:
MCP server | CLI | |
Every message, with every tool loaded | 8,700 tokens | nothing |
Every message, Claude Code's default | 840 tokens | nothing |
When Search Console comes up | nothing more, or the tools it picks | 3,100 tokens for |
20 messages with Search Console in 1, every tool loaded | 174,000 tokens | 3,100 tokens |
Claude Code's tool search is on by default: it sends only the tool names and the server instructions, and loads a tool's full definition when the model reaches for it. An app that loads every tool up front pays the first line on every message, whether Search Console comes up or not. With the skill added, Claude Code also lists its one-line description, about 190 tokens.
To spend less, turn the server off when you are not using it, which in Claude
Code is the /mcp panel. GSC_READ_ONLY=1 takes the 5 write tools off the list, leaving 14.
Or install the CLI and add the server on the days it earns its place.
Measured on 2026-10-05 against 0.2.2, with Claude Code 2.1.286 on Claude Opus
5.5 (one short prompt with and without the server connected, once with
ENABLE_TOOL_SEARCH=false and once with the default, the difference read from
the API's own usage figures; SKILL.md the same way) and Codex 0.159.3 on
gpt-6.1-sol:
Cost | 0.2.2 | 0.3.0 |
Claude Code, every tool loaded, every message | 9,208 | 8,686 |
Claude Code's default, tool search, every message | 841 | 839 |
| 3,142 | 3,140 |
Codex over the CLI, one task, median of five | 83,685 | 62,056 |
Codex over MCP, the same task, median of five | 48,548 | 48,544 |
The task was "find the command for the queries a site ranks just off page one,
and the flags it requires". Every tool loaded costs less because each tool no
longer repeats $schema and an execution block. Over the CLI, every 0.2.2 run
read the general help, the command list and the command's help, three requests
that each carry the conversation so far, and every 0.3.0 run read the general
help and asked which, which answered with the command's help: two. Other apps
and models count tokens a little differently, and tool-list characters divided
by four are not API usage.
Related MCP server: Google Search Console MCP Server
Contents
Section | ||
1 | Real prompts, not features | |
2 | Node, one command | |
3 | Getting a Google credential | |
4 | Every client, copy and paste | |
5 |
| |
6 | All 19 | |
7 | What is guarded, what is not | |
8 | The things that surprise people | |
9 | What is stored, and where | |
10 | For claude.ai | |
11 | When something breaks | |
12 | Start here if you are new |
1. What you can ask it 💬
Which queries lost the most clicks this month compared to last?
Show me pages ranking between 5 and 20. Which are closest to page one?
Why is this URL not showing up in Google?
What are my top queries for the blog, US only?
Is Google still reading my sitemap?
We just launched 30 pages. Check which ones are indexed.
Which of my pages get impressions but almost no clicks?
Add this new domain to Search Console and verify it.
Compare mobile against desktop for the last quarter.
The first one is the point. "What changed" is the question anyone actually has, and Search Console's own interface makes you export two reports and join them in a spreadsheet to answer it. Here it is one call, with the deltas already computed.
2. Quick install ⚡
Node 22 or newer. Nothing else.
npx -y @thenavidm/google-search-console-mcp-cli@latest --versionThat is the whole install. npx fetches it on demand, so there is nothing to update later.
For the CLI as a command you or your agent can run anywhere, install it once:
npm install -g @thenavidm/google-search-console-mcp-cli
google-search-console-cli3. Setup 🔑
You need a Google credential. Google does not hand out Search Console access without a Google Cloud project, so there is a real setup here: about five minutes, once.
The full walkthrough is in INSTALL.md. Every click, both routes, and what each error means.
Have an agent do it
The agent cannot sign in to Google for you. Only you can. What it can do is walk you through the console, wire up your client config, and check the connection.
Paste this into Claude Code, Cursor, or any agent with terminal access:
Set up @thenavidm/google-search-console-mcp-cli for me.
1. Read https://github.com/thenavidm/google-search-console-mcp-cli/blob/main/INSTALL.md
2. Walk me through the Google Cloud steps one at a time. Stop and wait
for me after each one. Do not skip the part about publishing the
OAuth app: it is why these break after a week.
3. When I give you the client ID and secret, run `login` and then
`doctor`, and tell me what properties it can see.
4. Then add it to my MCP client config.The one step people skip
While your OAuth app's publishing status is Testing, Google issues refresh tokens that expire after 7 days. Everything works, and then a week later it stops for no visible reason.
Click Publish app on the Audience page during setup. The setup guide covers where that is and why the verification warning does not apply to you.
Signing in
export GSC_CLIENT_ID="...apps.googleusercontent.com"
export GSC_CLIENT_SECRET="GOCSPX-..."
npx -y @thenavidm/google-search-console-mcp-cli@latest loginA browser opens, you pick your Google account, and the refresh token is saved to ~/.google-search-console-mcp/tokens.json.
For a server or CI with no browser, use a service account instead. Both routes are in the setup guide.
4. Connect your client 🔌
Claude Code
claude mcp add google-search-console \
-e GSC_CLIENT_ID=your-client-id \
-e GSC_CLIENT_SECRET=your-client-secret \
-- npx -y @thenavidm/google-search-console-mcp-cli@latestAdd --scope user to make it available in every project rather than just this one.
Claude Desktop
The short way: download the .mcpb extension
from the latest release and double-click it. It carries its own dependencies,
so there is no config file to edit and nothing to install first. Sign in once with npx -y @thenavidm/google-search-console-mcp-cli login first, or pick a service account key when Claude Desktop asks.
The long way, if you would rather edit the config yourself:
Platform | Config file |
macOS |
|
Windows |
|
{
"mcpServers": {
"google-search-console": {
"command": "npx",
"args": ["-y", "@thenavidm/google-search-console-mcp-cli@latest"],
"env": {
"GSC_CLIENT_ID": "your-client-id",
"GSC_CLIENT_SECRET": "your-client-secret"
}
}
}
}Tip Claude Desktop does not inherit your shell PATH. If it cannot find
npx, use the absolute path fromwhich npx.
Quit Claude Desktop completely and reopen it. Closing the window is not enough.
Cursor
.cursor/mcp.json, same JSON shape as Claude Desktop, same mcpServers key.
Windsurf
~/.codeium/windsurf/mcp_config.json, same shape, same mcpServers key.
VS Code
.vscode/mcp.json. The key here is servers, not mcpServers, and each entry needs "type": "stdio".
{
"servers": {
"google-search-console": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@thenavidm/google-search-console-mcp-cli@latest"],
"env": {
"GSC_CLIENT_ID": "your-client-id",
"GSC_CLIENT_SECRET": "your-client-secret"
}
}
}
}Codex CLI
~/.codex/config.toml:
[mcp_servers.google-search-console]
command = "npx"
args = ["-y", "@thenavidm/google-search-console-mcp-cli@latest"]
[mcp_servers.google-search-console.env]
GSC_CLIENT_ID = "your-client-id"
GSC_CLIENT_SECRET = "your-client-secret"Gemini CLI
~/.gemini/settings.json, same mcpServers shape as Claude Desktop.
Everything else
Any stdio MCP client needs the same three things: the command npx, the args array, and the env block.
To disconnect, remove the entry from your MCP client's config, then run logout your@email.com to delete the local token. Then revoke Google's side at myaccount.google.com/permissions. That is the half that matters: deleting the local file leaves a live grant behind.
5. Check it worked 🩺
npx -y @thenavidm/google-search-console-mcp-cli@latest doctorIt reports the Node version, which credential is in use, whether a token can actually be minted, how many properties that account reaches, whether verification is available, and which safety switches are on.
✓ Signed in you@example.com, stored at ~/.google-search-console-mcp/tokens.json
✓ OAuth client GSC_CLIENT_ID and GSC_CLIENT_SECRET are set, so tokens refresh automatically
✓ Token live for you@example.com, by oauth
✓ Search Console 4 properties, 4 writable. First: sc-domain:example.comIt exits 0 when everything works, 1 when a check fails, and 10 when nothing is signed in.
Two things account for almost every failure, and doctor names both: zero properties means you signed in with the wrong Google account, and a refresh failure a week after setup means the OAuth app is still in Testing.
6. Tools 🛠️
Nineteen tools. The five marked ● are writes and disappear under GSC_READ_ONLY=1; the two deletes also disappear under GSC_ALLOW_DESTRUCTIVE=0.
Search performance
Tool | What it does |
| The queries bringing the most clicks, with CTR and average position |
| The pages earning the most clicks |
| Two equal windows side by side, deltas already computed |
| Queries ranking 5 to 20, sorted by impressions left on the table |
| The full report, any dimensions, filters and date range |
compare_periods and striking_distance are the two you cannot get from the API in one call and cannot build in the UI at all without exporting to a spreadsheet.
Indexing
Tool | What it does |
| What Google knows about one URL: indexed, canonical, last crawl, rich results |
| The same for a batch, as a compact table |
Sitemaps
Tool | What it does |
| Every submitted sitemap, when Google last read it, URL counts, errors |
| Details for one |
● | Submit or resubmit. The only recrawl signal the API can send |
● | Stop tracking one. Needs confirming |
Properties
Tool | What it does |
| Every property this account reaches, with permission level. Start here |
| One property and the permission held on it |
● | Register a new property, unverified |
● | Remove a property. Needs confirming |
| Which Google accounts are signed in, and which is the default |
Verification
Tool | What it does |
| Mint the DNS, meta or file token that proves ownership |
● | Claim ownership once the token is live |
| Everything this account has verified, wider than the property list |
Verification needs the browser sign-in. A service account cannot verify a property, because verification is tied to a human Google account.
7. Working safely 🛡️
Writes work by default. Publishing a sitemap is the point of having the tool, and a server where every write needs a flag just teaches you to set the flag once and forget it.
Three mechanisms do the job instead.
Confirmation on the two irreversible tools, delete_site and delete_sitemap. Over MCP a person approves each call: Claude Code (2.1.246 and later) shows its own prompt, and a client that can show forms asks with an approval form whose one box starts unticked. Where a client can do neither, the model's confirm: true still counts, and GSC_CONFIRM=model makes it enough everywhere. In a terminal the flag is --confirm, which --agent never adds. Not on submit_sitemap or add_site: both are trivially undone, and asking for confirmation on everything trains the reflex that defeats asking at all.
GSC_READ_ONLY=1 removes writes entirely. They are left off the tool list, and refused if called anyway. A model cannot call a tool it cannot see. This is the right setting for an agent working unattended.
GSC_ALLOW_DESTRUCTIVE=0 keeps submit_sitemap and add_site while dropping the two deletes from the list.
GSC_AUDIT_LOG=<path> writes one JSON line per attempted write, allowed and refused alike, with who approved it, then whether it was done or failed. Arguments are not logged, so no token reaches it.
Every tool carries MCP annotations so your client can decide what to auto-approve:
|
| |
Reads | true | false |
| false | false |
| false | true |
On prompt injection. A search query is whatever a stranger typed into Google, and a title read through URL inspection is whatever that page says. Both reach your model's context. Text from those fields is framed as data rather than instructions, which helps and is not a guarantee. For an agent running unattended against sites you do not control, GSC_READ_ONLY=1 is the real defence.
8. What Search Console actually does 📊
The things that cost people an afternoon.
Data lags two to three days. Ask for "the last 7 days ending today" and the last few are empty or partial. Every tool here with a default window already ends three days back and tells you the dates it used. Pass data_state: "all" to query_search_analytics if you want the partial days anyway.
The query breakdown never sums to the site total. Google withholds rare queries to protect the people who typed them, so a per-query report always shows fewer clicks than the property total for the same window. That gap is anonymised traffic, not missing traffic, and it is normally larger than people expect.
A property is not a website. https://example.com/ and sc-domain:example.com are two different properties with different data, and https://example.com without the trailing slash is not a valid property string at all. Passing the wrong shape returns "User does not have sufficient permission", which reads like a scope problem and sends people back to the consent screen. Run list_sites and copy exactly. These tools normalize what they can.
Average position is a rank, so lower is better. Position moving from 8 to 5 is an improvement. compare_periods returns position_delta already signed so positive always means better, because "position went up" is ambiguous in the exact place it matters most.
There is no "request indexing" endpoint. The button exists in the UI; Google exposes no API behind it. Resubmitting a sitemap is the only recrawl signal available programmatically. Anything claiming otherwise is either using the Indexing API, which only works for job postings and livestreams, or it is not doing what it says.
About 16 months of history. Ask for more and you get what exists, silently.
Quotas are per property, not per token. Roughly 1200 search analytics queries per minute, and about 2000 URL inspections per day with 600 per minute. inspect_urls paces itself, but a loop over a large site will hit the daily ceiling.
Discover and Google News are different surfaces. Pass type: "discover" and there is no query dimension and no device dimension at all. Asking for one returns an error rather than empty rows.
9. Your data 🔐
There is no backend. Nothing is sent anywhere except Google.
What | Where |
Refresh token, one per signed-in account |
|
Audit log, only if you set | Wherever you point it |
GSC_TOKEN_STORE moves the token file. logout <email> deletes an entry from it, accounts lists them, and myaccount.google.com/permissions revokes Google's side, which is the half that actually matters.
Search Console data is read on demand and never cached to disk.
Settings
The program reads the environment directly. It does not load .env files.
Credentials, in the order they are tried
Variable | Default | Purpose |
| Empty | A token minted elsewhere, such as by |
| Empty | Path to a service account JSON key, for machines with no browser |
| Empty | The same key inline, raw or base64 |
| Empty | A Desktop OAuth client, for |
|
| Where sign-ins are kept |
|
| The scopes |
Safety
Variable | Default | Purpose |
| Off |
|
| On |
|
|
|
|
| Empty | Append guard decisions to this local path |
Tuning
Variable | Default | Purpose |
|
|
|
| None | Give up on any tool after this long |
| 8000, 127.0.0.1, none | For |
| None | Comma-separated browser origins allowed to call |
|
|
|
10. Running it on a server 🌐
claude.ai runs connectors from Anthropic's cloud, not from your machine, so it cannot start a local command. It needs a public HTTPS URL, which means the HTTP transport.
npx -y @thenavidm/google-search-console-mcp-cli@latest --http --port 8000That binds 127.0.0.1. To bind anything else you must set GSC_HTTP_TOKEN, and the server refuses to start without it:
export GSC_HTTP_TOKEN="$(openssl rand -hex 32)"
npx -y @thenavidm/google-search-console-mcp-cli@latest --http --host 0.0.0.0 --port 8000The refusal is deliberate. Whatever can reach that port can read your site's entire search history and delete its properties. A page from another site is refused too, unless GSC_HTTP_ALLOWED_ORIGINS lists it.
Then in claude.ai: Customize, Connectors, +, Add custom connector, and paste the HTTPS URL ending in /mcp. On Team and Enterprise an owner adds it under Organization settings, Connectors first.
There is a Dockerfile if you would rather run it that way.
11. Troubleshooting 🔧
Start with doctor. It checks each failure mode separately and names the fix. Access tokens last an hour and refresh on their own, so an expired token is never the problem by itself.
What you see | What it is |
Worked for a week, then every call fails | The OAuth app is still in Testing status, so Google expired the refresh token at 7 days. Publish the app and run |
| Wrong property string. |
| Signed in with a Google account that owns none. On a service account, its email was never added under Settings, Users and permissions on each property. |
| The API is switched off in your Google Cloud project. Enable it. |
|
|
Empty results for the last few days | The two to three day data lag. Use |
Fewer clicks per query than the site total | Expected. Google withholds rare queries. |
Claude Desktop cannot find | It does not inherit your shell PATH. Use the absolute path from |
Write tools missing from the tool list |
|
12. FAQ ❓
An MCP server is a standard way to give an AI assistant real access to a tool, so it can act instead of guessing. You install it once, your assistant gains a set of tools, and it works in Claude, Cursor, Codex and anything else that speaks MCP.
Without one, an assistant asked about your search traffic can only tell you how Search Console works in general. With one, it reads your actual numbers.
google-search-console-cli is the same program as the MCP server, run as commands. AI agents that run commands, like Claude Code, Codex and OpenCode, use it on their own, and you can type the same commands in a terminal, a script or a cron job. Every tool is a command with dashes, so top_queries runs as google-search-console-cli top-queries.
Use the MCP server in an app with no terminal, like Claude Desktop's chat. Use the CLI anywhere commands run: an agent like Claude Code, Codex or OpenCode, a script or a cron job. The MCP server's tools take up context on every message, and the CLI costs nothing until it runs.
Google Search Console is Google's free tool for site owners. It shows what people searched before they landed on your site, which pages Google shows and where they rank, which pages Google has and has not indexed, and what it thinks is broken.
It is the only place Google tells you any of this. Analytics tells you what people did once they arrived; Search Console tells you what happened in Google before that.
You need to be comfortable pasting commands into a terminal and clicking through a few pages in Google Cloud. The setup guide covers every click, and the prompt in section 3 hands the whole thing to an agent that walks you through it one step at a time.
The Google Cloud part is the hard bit, and it is a one-time five minutes.
There is no backend and no telemetry. The server runs on your machine, talks to Google, and returns the answer to your AI client. The only thing written to disk is your refresh token, at ~/.google-search-console-mcp/tokens.json with 600 permissions.
Your search data does reach whichever AI model you are using, because that is the point. If that matters for a particular site, do not connect it.
There are two things the UI cannot do at all, and one it does slowly.
Comparing two periods with per-query deltas is an export-and-spreadsheet job in the UI. Here it is one call. Finding every query ranking between 5 and 20, ordered by impressions, is the same story.
Everything else it does faster: checking 30 URLs after a launch is 30 clicks in the UI and one call here.
Two tools can delete something. delete_site removes a property from your account, and delete_sitemap stops Search Console tracking a sitemap. Both refuse to run until confirmed: over MCP a person approves each call in the client, and in a terminal it takes --confirm.
Neither touches your website, and neither removes anything from Google's index. delete_site loses your account's access to that property's history until it is re-added and re-verified.
Set GSC_READ_ONLY=1 and both disappear from the tool list entirely.
It costs nothing. The server is MIT licensed, Search Console is free, and the Google Cloud project you create is free. There is no card required and no billing to enable.
Your AI assistant costs whatever it already costs.
It works with any MCP client. Section 4 has copy-paste config for Claude Code, Claude Desktop, Cursor, Windsurf, VS Code, Codex CLI and Gemini CLI.
claude.ai is the one that works differently: it runs connectors from Anthropic's cloud rather than your machine, so it needs the HTTP transport and somewhere to host it. See section 10.
You can connect as many as you like. Run login again with a different account and both are stored. Every tool takes an optional account argument taking an email, and list_accounts shows what is signed in.
Useful when your own sites and a client's sit under different Google logins.
Google offers no such endpoint. "Request indexing" exists in the Search Console UI and has no API behind it, and the Indexing API that does exist only accepts job postings and livestreams.
Resubmitting a sitemap is the only recrawl signal available programmatically, which is what submit_sitemap is for.
Questions
Run into a problem or have a question? Open an issue and I will help.
About the author
Navid Moazzez is a leading AI business strategist and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. He creates useful free tools, MCP servers and CLIs that creators and founders can use in their own workflows.
Links
Personal website: navid.me
Link in bio: navid.bio
Navid Media: navid.media
YouTube: @thenavidm and @thenavidai
X: @thenavidm
Instagram: @thenavidm
LinkedIn: thenavidm
If this is useful, star the repo and come say hi on X.
Dependencies
Package | License | Why |
Apache-2.0 | The MCP server, the CLI and the HTTP transport from one definition of each tool | |
Apache-2.0 | The MCP protocol and its transports, through Slipway | |
MIT | Tool input schemas |
License
MIT. See LICENSE.
Not affiliated with, endorsed by, or sponsored by Google. Google, Google Search Console and Google Cloud are trademarks of Google LLC.
© 2026 Navid Media. Made with ❤️ by Navid Moazzez.
Available Tools
19 toolsadd_siteRegister a propertyAIdempotent
Register a property in Search Console. This only adds it: the property stays unverified and returns no data until ownership is proven, so follow with get_verification_token and verify_site. Adding a property that is already there is a no-op rather than an error.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful behavioral context beyond the annotations: the property remains unverified and returns no data until ownership is proven, and duplicate adds are no-ops rather than errors. These are exactly the lifecycle and idempotency details an agent needs for a mutation tool, and they align with the annotation hints rather than 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?
Three tightly written sentences, front-loaded with the core action and immediately followed by the critical caveat and next steps. Every sentence contributes useful information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description adequately explains the tool's effect and post-conditions, and the detailed input schema covers parameter nuances. It could say more about what the call itself returns on success, but for this registration step the lifecycle guidance is strong enough.
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 fully documents both parameters, including the important URL-prefix vs domain-property distinction and the account selection. The description adds no further parameter-level meaning beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('register/add') and resource ('property in Search Console'), and distinguishes the operation from sibling tools by clarifying that it only adds and leaves the property unverified. An agent can tell this apart from get_site, list_sites, delete_site, and verify_site directly from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this is the right tool and explicitly names the follow-up tools get_verification_token and verify_site. It also usefully notes that re-adding an existing property is a no-op rather than an error. It stops short of explicitly stating when not to use it or naming alternatives like list_sites for inspection, so it is clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_periodsCompare two periodsARead-onlyIdempotent
Two equal windows side by side with the deltas already computed: what went up, what fell, per query, page, country or device. This is the tool for "what changed", "are we up or down" and "which pages lost traffic". The default compares the last 28 days against the 28 before them. Rows are sorted by click change, so the biggest losses are at the bottom and the biggest gains at the top.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Length of each window. | |
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| type | No | Which surface to report on. Defaults to web. "discover" and "googleNews" carry no query or device dimension at all, so asking for one returns an error rather than empty rows. | |
| limit | No | Rows pulled per window before joining. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| dimension | No | query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/destructive=false, so the safety profile is covered. The description adds real behavioral context beyond the schema: the default 28-vs-28 comparison and the sort order (biggest losses at the bottom, gains at the top). It omits error behavior for unsupported dimensions, which the schema covers instead.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core concept, then intent routing, then default behavior and sort order. No filler; each sentence adds distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter read tool with no output schema, the definition conveys the comparison model, default window, dimensions and result ordering. It could say more about what a returned row contains, but the essential calling information is present.
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 83%, so the baseline is 3, but the description adds value the schema lacks: it explains the 'days' parameter in terms of two adjacent windows, not just a length, and summarizes the dimension options. That deepens semantics beyond the enum definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('two equal windows side by side with the deltas already computed') and enumerates what it produces (changes per query, page, country, device). Distinct from siblings like query_search_analytics or top_queries, which retrieve a single window without deltas.
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?
Routes by user intent with quoted phrasing ('what changed', 'are we up or down', 'which pages lost traffic') and states the default comparison window. It does not explicitly name the sibling alternatives an agent should prefer instead, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_siteRemove a propertyADestructive
Remove a property from this Google account's Search Console. The site's history is no longer readable by this account until the property is re-added and re-verified, and Google does not offer an undo. Set confirm to true to proceed.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| confirm | No | Set true only when the user asked for exactly this action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover destructiveHint=true and idempotentHint=false, yet the description adds critical non-redundant behavior: history is no longer readable until re-added and re-verified, and Google offers no undo. This is exactly the extra context an agent needs before firing a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste: the first states what and where, the second front-loads the irreversibility before the confirm instruction. Nothing repetitious.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, the description supplies the consequence and undo profile, and annotations cover the safety flags. An agent has everything needed to decide and call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds the meaning of the confirm gate ("Set confirm to true to proceed"), clarifying it as an active authorization step rather than merely an optional flag. The site/account parameter semantics come entirely from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Remove a property from this Google account's Search Console") with scope qualifier. It is clearly distinguishable from siblings like delete_sitemap or verify_site, which operate on different sub-resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to invoke — it warns that history becomes unreadable and there is no undo, then instructs "Set confirm to true to proceed." It does not explicitly name an alternative tool or a when-not condition, but the destructive consequence framing provides adequate invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_sitemapStop tracking a sitemapADestructive
Stop tracking a sitemap on a property. It does not deindex the URLs the sitemap listed, and it does not delete the file. What it does lose is the submission history and per-sitemap coverage for it. Set confirm to true to proceed.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| sitemap_url | Yes | Full URL of the sitemap to stop tracking. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, non-idempotent and openWorld, but the description goes further by enumerating exactly what is and is not destroyed: no deindexing, no file deletion, loss of submission history and per-sitemap coverage. That is precisely the context an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action and scope, then the negative consequences, then the gating flag. 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?
For a destructive, no-output-schema tool, the description supplies the blast radius, the irreversible-loss detail, and the confirmation gate — everything an agent needs to call it safely. Return values are unnecessary since the operation produces no meaningful payload.
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 all four parameters (including the nuanced site-vs-domain property distinction and account selection) are fully documented in the schema itself. The description's only parameter remark, 'Set confirm to true to proceed', largely restates the schema's confirm description, adding little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Stop tracking a sitemap on a property') and immediately scopes what the operation does not touch. An agent can distinguish it from delete_site, submit_sitemap, and delete_sitemap siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context — it does not deindex URLs or delete the file, and requires confirm=true to proceed. It does not, however, name the alternative tools (e.g. delete_site for removing the property itself), so sibling routing is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_siteOne property and its permission levelCRead-onlyIdempotent
One property and the permission level this account holds on it.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint, so the safety profile is covered. The description adds no behavioral context on top of that: it does not mention that a mismatched property shape returns 403 (that is relegated to the schema) or what the permission level values are.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, front-loaded on the resource. It is slightly too terse to read as a complete statement of purpose, which keeps it out of the top band.
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?
There is no output schema, and the description omits the return shape beyond saying 'permission level.' For a simple two-parameter read tool with full schema coverage and complete annotations this is adequate, but the returned object's fields remain unspecified.
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 documents both parameters thoroughly, including the URL-prefix vs sc-domain: distinction and the 403 consequence. The description adds nothing about parameters, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (one property) and the payload (the permission level this account holds), which distinguishes it from list_sites, the plural enumerator in the sibling set. It is a verbless fragment, but 'get_site' plus this phrase is unambiguous about what the tool returns.
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 offers no when-to-use guidance and never contrasts itself with list_sites or list_verified_sites, which are the obvious alternatives for property lookups. The only routing advice (call list_sites for exact strings) lives in the schema text for the 'site' param, not in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sitemapOne submitted sitemapARead-onlyIdempotent
Details for one submitted sitemap: last download, last submitted, URL counts per type, and whether it is pending or errored.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| sitemap_url | Yes | Full URL of the sitemap, e.g. https://navid.me/sitemap.xml |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description's value-add is naming the returned fields (last download, pending/errored status), but it says nothing about auth/permission requirements, error behavior (e.g. what a 403 looks like), or account scoping.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the identity of the resource and then lists the payload. No filler, no redundancy with the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by enumerating the key fields. For a read-only single-record lookup with fully documented parameters, this is nearly complete; only the error/permission behavior and the fact that a sitemap must already be submitted are unstated.
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 all three parameters (site, account, sitemap_url) are already documented in the schema, including the URL-prefix vs domain-property 403 pitfall and the list_sites/list_accounts pointers. The description adds no parameter detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('one submitted sitemap') and enumerates exactly what it returns: last download, last submitted, URL counts per type, and pending/errored status. The word 'one' implicitly distinguishes it from the list_sitemaps sibling, so an agent can tell them apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the description says 'submitted sitemap', which suggests it applies to sitemaps already registered via submit_sitemap and is the single-item counterpart to list_sitemaps. There is no explicit when-to-use statement, no precondition (e.g. 'you must know the sitemap_url first'), and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_verification_tokenToken that proves ownershipARead-onlyIdempotent
Mint the token that proves ownership of a site or domain, so a new property can be verified without opening the Search Console UI. A domain property must use DNS: publish the returned token as a TXT record on the apex. A URL-prefix property can instead use META, a tag in the homepage head, or FILE, a file served at the site root. Publish the token first, then call verify_site. Minting a token changes nothing on its own.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | INET_DOMAIN for a domain property (sc-domain:), SITE for a URL-prefix property. | |
| method | Yes | DNS_TXT is the only method a domain property accepts. A URL-prefix property can also use META or FILE. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| identifier | Yes | The site URL for SITE ("https://navid.me/"), or the bare domain for INET_DOMAIN ("navid.me"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is covered. The description still adds meaningful behavioral context by clarifying the side-effect profile ('Minting a token changes nothing on its own') and the external publish-then-verify workflow that annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with purpose, then the per-method publish instructions, then the sequencing constraint, then a closing side-effect note. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should ideally say what is returned (the token string), which it only implies via 'the returned token'. Otherwise it fully covers prerequisites, method constraints, and follow-up action for a 4-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already states the type/method constraints and identifier formats, so the description's restatement of DNS vs META/FILE and apex TXT placement adds only marginal detail. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Mint the token that proves ownership of a site or domain') and frames the outcome ('so a new property can be verified'). It is unmistakably distinct from sibling tools like verify_site, add_site, or get_site.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the workflow: choose DNS for a domain property, META or FILE for a URL-prefix property, 'Publish the token first, then call verify_site.' The when-to-use and the next step are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_urlWhat Google knows about a URLARead-onlyIdempotent
Ask Google what it actually knows about one URL: whether it is indexed, which sitemap it was found in, the canonical Google picked against the one the page declares, the last crawl, mobile usability, rich results and any AMP version. This is the tool for "why is this page not showing up". Two constraints worth knowing before a loop: the URL has to sit under the property, and the quota is roughly 2000 inspections a day and 600 a minute per property, so inspect the pages that matter rather than a whole site.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The full URL to inspect. Must be under the property. | |
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| language_code | No | BCP-47 language for the messages Google returns, e.g. "en-US". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which already state readOnly/idempotent/non-destructive) by disclosing hard operational limits: the URL must be under the property, and quota is roughly 2000 inspections/day and 600/minute per property. That rate-limit and loop guidance is exactly the context annotations cannot 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?
Front-loads what the tool returns, then the diagnostic use case, then the two practical constraints. Dense but every sentence carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only inspection call with no output schema, the description enumerates the returned fields, states the two required-parameter relationship, and flags the rate limits and property constraint. An agent has everything needed to call it correctly and pace it sensibly.
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 each parameter is well documented there, including the URL-prefix vs domain property trap and the list_sites cross-reference. The description only restates the 'must sit under the property' constraint, adding no new per-parameter syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Ask Google what it actually knows about one URL') and enumerates the exact data returned (indexed status, sitemap, canonical mismatch, crawl date, mobile usability, rich results, AMP). It is clearly distinguishable from inspect_urls (plural) and query_search_analytics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('This is the tool for why is this page not showing up') and warns to inspect selective pages rather than a whole site. It doesn't name the sibling batch tool inspect_urls as the alternative for that case, so routing is slightly less complete than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_urlsInspect several URLsARead-onlyIdempotent
Inspect several URLs on the same property in one call and get a compact table back: indexed or not, the canonical Google chose, and the last crawl. Use it to check a batch of pages after a launch or a migration. Requests run a few at a time to stay inside the per-minute quota, and one URL failing does not sink the rest. Keep batches small: the daily quota is about 2000 inspections per property.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| urls | Yes | Up to 50 URLs, all under the property. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing concurrency/throttling ("run a few at a time to stay inside the per-minute quota"), partial-failure semantics ("one URL failing does not sink the rest"), and a numeric quota ceiling (~2000 inspections/day/property). These are operational facts an agent cannot infer from readOnlyHint/idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with purpose and return value, then usage, then operational constraints. No wasted clauses or restated schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so (indexed/not, canonical, last crawl). Combined with quota, throttling, and partial-failure notes, an agent has everything needed to call this correctly and reason about failures.
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 well documented, including the site-shape 403 warning. The description reinforces that all URLs must belong to the property but adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ("several URLs on the same property in one call") and names the return contents (indexation status, Google's canonical, last crawl). It is clearly distinguishable from the sibling inspect_url, which handles a single URL.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit triggering scenario ("check a batch of pages after a launch or a migration") and a caution about batch sizing. It stops short of explicitly naming inspect_url as the single-URL alternative, but the batch framing makes the split obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsSigned-in Google accountsARead-onlyIdempotent
List the Google accounts this server can act as, and which one is used when a tool call does not name one. Pass an email as the account argument on any other tool to switch.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the bar is lower. The description adds real behavioral context beyond them: the output determines account resolution for every other tool, and the account argument is the switching mechanism. It does not describe the return shape, but that is a minor omission for a read-only list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The identity of the tool comes first, followed immediately by the actionable detail about the default account and how to switch.
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 zero parameters, no output schema, and annotations that already declare the read-only, idempotent nature, the description covers everything needed to select and invoke it. The only gap is that the exact return shape (e.g., a list of emails plus a default marker) is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description's mention of the `account` argument is a cross-tool usage note rather than a parameter of this tool, but it is still helpful context about how the listed emails get consumed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the Google accounts this server can act as') and goes further by naming the second piece of information returned: which account is the default. This is unambiguous and clearly distinct from every sibling tool, all of which operate on sites/sitemaps/analytics rather than accounts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the context for calling it (to learn the available accounts and the default) and routes the agent to the alternative action: 'Pass an email as the `account` argument on any other tool to switch.' No explicit when-not-to-use case is given, but the cross-tool relationship is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sitemapsSubmitted sitemapsARead-onlyIdempotent
Every sitemap submitted for a property, with when Google last downloaded each one, how many URLs it holds per content type, and any warnings or errors. A sitemap Google has quietly stopped reading shows up here as a lastDownloaded date that stopped moving, which nothing in the UI puts in front of you.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| sitemap_index | No | Only list the children of this sitemap index URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (read-only, idempotent, non-destructive), and the description adds real behavioral content: the returned fields (lastDownloaded, URL counts per content type, warnings/errors) plus a non-obvious diagnostic signal about silently stalled sitemaps. It omits pagination/limits, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose front-loaded, and the second sentence earns its space by explaining a signal the UI hides. Slightly narrative in tone but no wasted clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so well by naming the fields returned. The remaining gap is operational detail (pagination, sitemap_index scope), which is minor for a simple read.
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 site, account, and sitemap_index are already fully documented in the schema, including the 403 warning about property shapes. The description adds no parameter-level meaning, so 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?
States a specific verb (list) and resource (every sitemap submitted for a property), and the plural scope clearly separates it from get_sitemap, submit_sitemap, and delete_sitemap. An agent can tell what it returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it frames the tool as a monitoring surface (stale sitemaps 'show up here'), but never states when to choose it over get_sitemap or that sitemap_index narrows the listing. No explicit when/when-not or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sitesProperties this account can reachARead-onlyIdempotent
Every Search Console property this Google account can reach, with the permission level on each: siteOwner, siteFullUser, siteRestrictedUser or siteUnverifiedUser. Start here. The siteUrl strings it returns are the exact values every other tool wants, and copying one avoids the trailing-slash and sc-domain: mismatch that surfaces as a permissions error.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds real value beyond them: the permission levels it returns and the trailing-slash / sc-domain: mismatch that manifests as a permissions error, which is a non-obvious behavioral trap. No pagination or volume notes, hence 4 not 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler, front-loaded with what is returned and what the caller should do with it. The gotcha sentence earns its place by preventing a real failure mode.
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?
There is no output schema, and the description compensates by describing the return shape (properties plus permission level) and the exact format of the returned siteUrl strings. For a single-optional-parameter read tool, nothing an agent needs to call 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 description coverage is 100% and the single account parameter is fully documented in the schema (including the pointer to list_accounts). The description adds nothing about parameter semantics, so 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?
States a specific verb+resource (every Search Console property this account can reach) and goes further by naming what is returned (permission level) and the exact enum values. It is clearly distinguishable from siblings like get_site, add_site and list_accounts, so an agent can pick it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Start here" and the statement that its siteUrl strings are the exact values every other tool wants gives clear sequencing guidance relative to siblings. It stops short of explicit when-not conditions or naming a competing alternative, so it is strong context rather than a full decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_verified_sitesSites and domains verifiedARead-onlyIdempotent
Every site and domain this Google account has verified ownership of, across all Google products. This is a wider list than list_sites, because a verified domain is not automatically a Search Console property. Use it to tell "not verified yet" apart from "verified but never added", which are two different fixes.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint false, openWorldHint), so the bar is lower. The description still adds real context beyond them: the result set spans all Google products rather than only Search Console, which is a scope trait an agent would otherwise not know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with purpose front-loaded. Sentences two and three slightly overlap in motivating the tool's distinctness, but nothing is padding or restated boilerplate.
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-required-parameter read tool with annotations and no output schema, the description covers purpose, scope breadth, and the sibling decision. The only gap is that it doesn't hint at the shape of the returned entries (e.g., domain vs product fields), which is minor given the absence of an 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 coverage is 100% and the single 'account' parameter is fully documented in the schema, including the guidance to call list_accounts. The description adds no parameter detail of its own, so 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?
Names a specific resource (every site and domain the signed-in Google account has verified ownership of) and its broadening scope across all Google products. It explicitly distinguishes itself from the sibling list_sites, so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the exact condition that selects this tool ('tell "not verified yet" apart from "verified but never added"') and names the narrower alternative (list_sites) with the reason a verified domain may not be a Search Console property. When-to-use and sibling routing are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_search_analyticsSearch analytics by any dimensionARead-onlyIdempotent
The core report: clicks, impressions, CTR and average position from Google Search, grouped by any combination of query, page, country, device, searchAppearance, date or hour. This is the full-control tool. For the questions people actually ask, top_queries, top_pages, striking_distance and compare_periods are one call instead of a hand-assembled body. Two things to know before reading a result as bad news. Data finalises on a two to three day lag, so a window ending today is short at the end. And Google withholds rare queries for privacy, which is why the query breakdown reliably sums to fewer clicks than the site total.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| type | No | Which surface to report on. Defaults to web. "discover" and "googleNews" carry no query or device dimension at all, so asking for one returns an error rather than empty rows. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| filters | No | Combined with AND. | |
| end_date | Yes | YYYY-MM-DD, in PST. | |
| row_limit | No | Default 1000, max 25000. | |
| start_row | No | Zero-based offset, for paging past row_limit. | |
| data_state | No | "all" includes the most recent partial days, which is the only way to see the last two or three at all. Defaults to final. | |
| dimensions | No | Group-by columns, e.g. ["query"] or ["page","device"]. Omit for site totals. | |
| start_date | Yes | YYYY-MM-DD, in PST. About 16 months of history is available. | |
| aggregation_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and openWorld, so the safety profile is covered. The description adds genuinely non-obvious behavioral context: a two-to-three day finalisation lag that makes a window ending today look short, and Google's privacy withholding of rare queries that makes the query breakdown sum to fewer clicks than the site total. It stops short of rate limits or per-account auth caveats, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each load-bearing: capability, routing, then two caveats framed as 'things to know before reading a result as bad news'. The most decision-relevant content is front-loaded and nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully names the returned metrics and grouping, and covers the two traps that would cause misreading of results. For an 11-parameter tool it is close to complete, though it says nothing about pagination behaviour or response envelope shape, which an agent may need when paging past row_limit.
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 site shapes, type surfaces, data_state, row_limit and dimensions, including the discover/googleNews caveat. The description's dimension list largely restates the enum rather than adding syntax or format detail, so the baseline 3 for schema-driven params 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?
Opens with a specific verb+resource and enumerates exactly what is returned (clicks, impressions, CTR, average position) and the group-by dimensions available. It also explicitly positions itself against named siblings, so an agent can distinguish it from top_queries, top_pages, striking_distance and compare_periods without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States this is the 'full-control tool' and then routes the agent by name: for the common questions, top_queries, top_pages, striking_distance and compare_periods are one call instead of a hand-assembled body. That is explicit when-to-use-this vs when-to-use-alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
striking_distanceQueries just off page oneARead-onlyIdempotent
Queries a property already ranks for on the edge of page one, between positions 5 and 20 by default, ordered by the impressions being left on the table. These are the pages where a title rewrite or a section of added depth moves traffic, because the ranking work is already done. The single most useful report in Search Console and the UI makes you build it by hand every time.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| limit | No | ||
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| max_position | No | ||
| min_position | No | ||
| min_impressions | No | Ignore queries too rare to be worth acting on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and non-destructive, so the safety profile is covered. The description adds the meaningful behavioral trait that results are ordered by opportunity rather than raw volume, but omits pagination, result shape, and any auth/rate considerations beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core definition before justification. The closing line ('The single most useful report in Search Console and the UI makes you build it by hand every time') is a value pitch that adds little operational information, though it is brief.
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 analytics query with no output schema, the description conveys what is returned (queries in a positional band ordered by available impressions) and the default window, which is what an agent needs to call it correctly. It stops short of describing the limit/days interaction or pagination, leaving minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 43%, so the description should compensate more than it does. It does clarify the position band semantics ('between positions 5 and 20 by default') that maps to min_position/max_position and explains why results are ordered, but days, limit, account and min_impressions get no elaboration beyond defaults already visible in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (queries) and resource (queries a property already ranks for, positions 5-20) plus the ordering rule (impressions left on the table). This is clearly distinct from siblings like top_queries or query_search_analytics, which lack the positional band constraint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to use it ('where a title rewrite or added depth moves traffic, because the ranking work is already done'), which is actionable usage guidance. It does not, however, name an alternative tool or state when NOT to use it versus query_search_analytics/top_queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_sitemapSubmit or resubmit a sitemapAIdempotent
Submit or resubmit a sitemap. This is the only way the API can ask Google to recrawl anything: there is no endpoint behind the "Request indexing" button, so resubmitting after publishing is the programmatic equivalent. Returns immediately. Google fetches the file on its own schedule, so read the result back with get_sitemap rather than expecting counts here.
| Name | Required | Description | Default |
|---|---|---|---|
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| sitemap_url | Yes | Full URL of the sitemap. Must be on the property it is submitted to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent, non-destructive, open-world, non-read-only, but the description adds behavior they cannot express: the call returns immediately, Google fetches on its own schedule, and no counts are available here. That async/no-result-here disclosure is exactly the extra context an agent needs and is not duplicated from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action, then the recrawl rationale, then the timing caveat and the read-back pointer. No filler and each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining that the call returns immediately and that results must be read via get_sitemap, which is the key thing an agent would otherwise get wrong. Nothing needed to call 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% and the schema descriptions are richer than anything the tool text provides (property string shapes, 403 risk, account selection). The description adds no parameter-level meaning, so 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?
States a specific verb and resource ('Submit or resubmit a sitemap') and immediately distinguishes it from the read-side sibling by naming get_sitemap as the way to check results. An agent can tell it apart from list_sitemaps/delete_sitemap/get_sitemap without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ('resubmitting after publishing is the programmatic equivalent' of Request indexing) and routes the agent to get_sitemap for the outcome. It stops short of stating explicit exclusions or prerequisites, but the context is clear enough to select the tool confidently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_pagesTop pages by clicksARead-onlyIdempotent
The pages on a property earning the most clicks from Google Search, with impressions, CTR and average position. Defaults to the last 28 days ending three days ago.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| type | No | Which surface to report on. Defaults to web. "discover" and "googleNews" carry no query or device dimension at all, so asking for one returns an error rather than empty rows. | |
| limit | No | ||
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| country | No | Three-letter country code, e.g. "usa". | |
| query_filter | No | Only clicks that came from queries containing this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower. The description still contributes a non-obvious behavioral fact — the data lag ('ending three days ago') — which the agent needs to interpret freshness correctly, though it says nothing about pagination, rate limits, or how limit interacts with large result sets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first front-loads what is returned, the second front-loads the default time window. Nothing is repeated from the title or annotations.
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 7-parameter analytics tool with no output schema, the description does list the returned measures, which partially substitutes for a return schema. However, it omits how limit/pagination behaves, how this differs from query_search_analytics or top_queries, and any prerequisite such as needing a verified property, leaving meaningful gaps.
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 71%, so the schema already documents site, type, account, country, and query_filter, including the 403 warning for mismatched property shapes and the error behavior for discover/googleNews. The description only adds semantics for the date window (days default 28, ending three days ago) and leaves limit entirely undocumented in both places, so it compensates only partially.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (pages on a property) and the ranking metric (most clicks from Google Search), plus the returned measures (impressions, CTR, average position). An agent can distinguish this from the sibling top_queries without opening either schema, since one ranks pages and the other ranks queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the default reporting window ('last 28 days ending three days ago'), which is useful context, but gives no explicit when-to-use or when-not-to-use guidance against alternatives such as top_queries, compare_periods, or query_search_analytics. Usage is implied by the resource name rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_queriesTop search queries by clicksARead-onlyIdempotent
The search queries bringing the most clicks to a property, with impressions, CTR and average position. Defaults to the last 28 days ending three days ago, because Search Console lags and a window ending today reads as empty.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Window length. | |
| site | Yes | The Search Console property. Either a URL-prefix property ("https://navid.me/", trailing slash included) or a domain property ("sc-domain:navid.me"). A bare hostname is read as a domain property. Call list_sites for the exact strings this account owns, because the two shapes are different properties and mixing them up returns a 403. | |
| type | No | Which surface to report on. Defaults to web. "discover" and "googleNews" carry no query or device dimension at all, so asking for one returns an error rather than empty rows. | |
| limit | No | ||
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| country | No | Three-letter country code, e.g. "usa", "gbr", "swe". | |
| page_filter | No | Only queries that landed on pages whose URL contains this, e.g. "/blog/". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only/idempotent profile, and the description adds genuinely useful behavioral context beyond them: the default window ends three days ago because Search Console lags and a window ending today reads as empty. It stops short of covering pagination or rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the metric list front-loaded and the default-window caveat immediately following. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter read tool with no output schema, the description usefully enumerates returned metrics (impressions, CTR, average position) and explains the default window. The main gap is the absence of routing guidance versus overlapping siblings, but the parameter and return picture is otherwise 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 description coverage is 86%, so the schema already documents parameters richly (site, type, account, page_filter, country all have detailed descriptions). The description only adds the default-window rationale for 'days', which is marginal over what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('search queries bringing the most clicks to a property') and enumerates the returned metrics. It implicitly distinguishes itself from the sibling top_pages by operating on queries rather than pages, but it never explicitly names or contrasts with alternatives like top_pages or query_search_analytics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the default window rationale but gives no guidance on when to choose this tool over siblings such as top_pages or query_search_analytics, nor any exclusions or prerequisites. The agent must infer usage purely from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_siteVerify ownershipAIdempotent
Claim ownership once the token from get_verification_token is live. Google fetches the DNS record, meta tag or file and, if it matches, marks this Google account an owner of the site. It fails until the token is actually reachable, which with DNS means waiting for propagation, sometimes several minutes. Retrying is safe.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | INET_DOMAIN for a domain property (sc-domain:), SITE for a URL-prefix property. | |
| method | Yes | The same method the token was minted for. | |
| account | No | Which signed-in Google account to act as, by email. Omit to use the default. Call list_accounts to see what is signed in. | |
| identifier | Yes | The same identifier passed to get_verification_token. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (idempotentHint=true, destructiveHint=false, openWorldHint=true), so the bar is lower; the description adds real value by disclosing the failure mode (fails until the token is reachable) and the expected delay for DNS propagation. It does not describe error/return shape or rate limits, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and its prerequisite, then failure/timing behavior. 'Retrying is safe' slightly duplicates the idempotentHint annotation, but overall it is tight and every sentence carries weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the prerequisite, external side effect (Google fetches and marks ownership), and the timing/failure behavior an agent needs, with parameters fully documented in the schema and no output schema to explain. It lacks only error-surface detail (what a failed verification returns).
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%, including inline docs for type, method, identifier and account, and enum values are documented. The description adds no parameter-level detail beyond the schema, so 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?
States a concrete verb+resource (claim ownership of a site via verification) and explicitly ties it to the token produced by the sibling get_verification_token, distinguishing it from list_verified_sites. An agent knows exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition (run only once the token is live), names the sibling that mints the token, and warns that DNS verification requires waiting for propagation before retrying. It also states retrying is safe, which resolves the main agent doubt for this call.
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.
19 tool updates
v0.3.0- Changed
add_site1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
compare_periods1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
delete_site3 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Input schema / properties / confirm / defaultRemoved value: -false - changed
Input schema / properties / confirm / descriptionPrevious value: -"Removing a property cuts this account off from its search history until it is re-added and re-verified. Set true to proceed."New value: +"Set true only when the user asked for exactly this action."
- Changed
delete_sitemap3 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Input schema / properties / confirm / defaultRemoved value: -false - changed
Input schema / properties / confirm / descriptionPrevious value: -"Set true to proceed. The submission history for this sitemap is not recoverable."New value: +"Set true only when the user asked for exactly this action."
- Changed
get_site1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_sitemap1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_verification_token1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
inspect_url1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
inspect_urls1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
list_accounts1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
list_sitemaps1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
list_sites1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
list_verified_sites1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
query_search_analytics2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Input schema / properties / start_row / maximumRemoved value: -9007199254740991
- Changed
striking_distance2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Input schema / properties / min_impressions / maximumRemoved value: -9007199254740991
- Changed
submit_sitemap1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
top_pages1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
top_queries1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
verify_site1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
19 tool updates
v0.1.0- First observed
add_site - First observed
compare_periods - First observed
delete_site - First observed
delete_sitemap - First observed
get_site - First observed
get_sitemap - First observed
get_verification_token - First observed
inspect_url - First observed
inspect_urls - First observed
list_accounts - First observed
list_sitemaps - First observed
list_sites - First observed
list_verified_sites - First observed
query_search_analytics - First observed
striking_distance - First observed
submit_sitemap - First observed
top_pages - First observed
top_queries - First observed
verify_site
TDQS
Scored across 19 tools
Each tool has a clearly distinct purpose: site management, analytics queries, sitemap operations, URL inspection, and verification are well-separated. Overlaps like get_site vs list_sites vs list_verified_sites are differentiated by scope (single property, account properties, verified across Google).
Most tools follow a verb_noun pattern (get_site, list_sites, add_site, delete_site), with slight deviations like inspect_url vs inspect_urls and verify_site. The analytics tools use noun phrases (top_queries, striking_distance), which breaks the pattern but remains understandable.
19 tools are well-suited for the comprehensive scope of Google Search Console management, covering all major areas without excessive bloat. Each tool appears to earn its place.
The server covers the full lifecycle: site add/delete/verify, sitemaps, analytics queries (including specialized reports), URL inspection (single and batch), and account management. No obvious gaps for the stated purpose.
Maintenance
Related MCP Connectors
SEO & marketing toolkit for AI agents: GA4, Search Console, AdSense, GTM, PageSpeed, Trends.
Google Search Console in your AI: overview, opportunities, index gaps, page checks, long history.
Marketing data and actions for AI agents: GA4, Search Console, ads, social, SEO and WordPress.
Related MCP Servers
- AlicenseAqualityAmaintenanceProvides AI agents with read-only access to Google Search Console data, including search analytics, index coverage, and sitemap status. It enables users to query clicks, impressions, and ranking performance or check URL indexing status through natural language.4124 npm10MIT
- FlicenseNot gradedqualityFmaintenanceEnables interacting with Google Search Console via natural language, supporting search analytics, URL inspection, sitemap management, and site listing.25-
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to query Google Search Console data including search analytics, URL inspection, sitemap management, and site performance monitoring, with per-user OAuth authentication.-
- AlicenseAqualityCmaintenanceEnables AI assistants to query and manage Google Search Console data, including search analytics, URL indexing status, and sitemap management, for SEO and LLMO analysis directly from a conversation.154,437 npmMIT