flin-google-search-console-mcp
A read-only MCP server for Google Search Console that lets you explore properties, pull search performance data, and check a URL's indexing status.
health_check— verify local configuration and saved sign-in status without opening a browser or calling Google.list_sites— list Search Console properties available to the account (runs OAuth browser login if needed).get_site_summary— aggregate clicks, impressions, CTR and position for a property over a date range.query_performance— custom Search Analytics queries with dimensions, filters, search type, aggregation type, data state, row limit and pagination.get_top_queries— top query rows for a property and date range (filterable).get_top_pages— top page rows for a property and date range (filterable).get_dimension_breakdown— single-dimension performance breakdown.inspect_url— read Google's indexed status for a specific URL; does not request indexing.Supports multiple Google accounts per tool call via the
accountparameter, and only reads data — it never modifies Search Console properties.
Provides tools to interact with Google Search Console, enabling retrieval of search analytics data, site summaries, top queries, top pages, dimension breakdowns, and URL inspections for verified properties.
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., "@flin-google-search-console-mcpShow me the search analytics for my site in the last 28 days"
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.
flin-google-search-console-mcp
Read-only MCP server for Google Search Console, built to work well in Claude Desktop with a browser-based OAuth flow and local token storage.
For the prepared Claude Code plugin, see plugin/README.md. It requires Claude Code's secret configuration prompts and is separate from the desktop extension below. Directory submission is prepared, not yet approved.
Privacy Policy
See PRIVACY.md for data flows, storage, retention and deletion. The server sends requests to Google and returns results to your MCP client. It does not send Search Console data to flin GmbH. OAuth tokens are stored as local JSON files and are not encrypted by the server. Sensitive client settings in Claude and the server's token files are separate storage mechanisms.
Publisher: flin GmbH, Weinbergstrasse 31, 8006 Zürich, Switzerland. Privacy and security contact: flin@flin.agency. See SUPPORT.md.
Related MCP server: google-search-console-mcp-python
Claude Desktop Quickstart
If your goal is simply "make this work in Claude Desktop", follow these steps in order.
1) Make sure the Google account has Search Console access
The Google account you use during login must already have access to at least one Search Console property.
Accepted access levels for the API include owner, full, and read access.
2) Create or choose a Google Cloud project
In Google Cloud:
Create a new project or select an existing one.
Enable the Google Search Console API for that project.
Official references:
3) Configure the OAuth consent screen
In Google Cloud, configure the OAuth consent screen for the same project.
For most personal or team setups:
choose
Externalkeep the app in
Testingwhile you validate the integrationadd your own Google account as a test user
Important:
If the app is
Externaland still inTesting, users must be listed as test usersGoogle documents that test-user authorizations in testing mode can expire after 7 days
This MCP only requests one read-only scope:
https://www.googleapis.com/auth/webmasters.readonly
Official references:
4) Create OAuth credentials of type Desktop app
Create an OAuth client in the same Google Cloud project:
Go to Credentials
Click Create client
Choose Desktop app
Copy the generated:
client ID
client secret
You do not need to manually wire redirect URIs into Claude Desktop for this MCP. The desktop OAuth flow uses a local loopback callback handled by the running MCP process.
5) Add the MCP to Claude Desktop
Recommended: desktop extension
Download flin-google-search-console-mcp-<version>.mcpb from the
GitHub releases
and open it in a current Claude Desktop version with MCPB UV runtime support.
Alternatively, use Install Extension in the desktop extension settings.
Enter the Google OAuth client ID and client secret from step 4 and, optionally,
a default property such as sc-domain:example.com. The secret field is marked
sensitive. Continue with the login instructions below. Manual JSON editing is
not required; the Google Cloud setup in steps 1–4 is still required.
The extension runs locally on macOS and Windows. From installer 0.1.7, it checks PyPI for the newest stable server release every time the server starts. Restart Claude Desktop to apply a published server update; no new installer is needed for ordinary server releases. Running conversations are not hot-updated. Python 3.12 and server packages are managed by uv. Startup requires internet access; the installer contains no credentials or saved tokens.
Already installed 0.1.6 or earlier? Install the 0.1.7 bundle once to enable
this mechanism. Keep the same OAuth settings; tokens remain outside the extension.
The extension's displayed version describes the launcher. health_check returns
server_version, the actual running PyPI version.
Changes to Claude's extension settings, permissions, launcher or required Python version may still require a new bundle. Claude does not auto-update privately shared manifests from GitHub. A package that drops Python 3.12 support cannot be used by this launcher; uv selects the latest compatible stable version.
Alternative: manual configuration
The existing PyPI installation remains available. Its minimum configuration is:
{
"mcpServers": {
"flin-google-search-console-mcp": {
"command": "uvx",
"args": ["flin-google-search-console-mcp@latest"],
"env": {
"GOOGLE_CLIENT_ID": "your_oauth_client_id",
"GOOGLE_CLIENT_SECRET": "your_oauth_client_secret"
}
}
}
}If you want a default property so you do not have to pass site_url every time:
{
"mcpServers": {
"flin-google-search-console-mcp": {
"command": "uvx",
"args": ["flin-google-search-console-mcp@latest"],
"env": {
"GOOGLE_CLIENT_ID": "your_oauth_client_id",
"GOOGLE_CLIENT_SECRET": "your_oauth_client_secret",
"GOOGLE_SEARCH_CONSOLE_SITE_URL": "sc-domain:example.com"
}
}
}
}For local development from a checkout:
{
"mcpServers": {
"flin-google-search-console-mcp-local": {
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/flin-google-search-console-mcp",
"flin-google-search-console-mcp"
],
"env": {
"GOOGLE_CLIENT_ID": "your_oauth_client_id",
"GOOGLE_CLIENT_SECRET": "your_oauth_client_secret"
}
}
}
}Replace /absolute/path/to/flin-google-search-console-mcp with your local checkout path.
6) Restart Claude Desktop
After saving the MCP configuration, fully restart Claude Desktop so it reloads the local server definition.
7) Complete the first login inside Claude
Start with these prompts:
Run health_check for the Google Search Console MCP and show the full result.List my Search Console sites.On the first authenticated tool call, the MCP opens a browser window. Sign in with the Google account that has Search Console access and approve the request.
After that:
the token is stored locally
future access tokens refresh automatically
you do not need to paste a refresh token into Claude Desktop config
What the MCP stores locally
The MCP stores a local token JSON file after the first successful login.
New token directories are created with private permissions. Existing directories keep their permissions; on macOS and Linux, they must belong to the current user and must not be writable by other users. Token files are written with owner-only access.
Default locations:
macOS:
~/Library/Application Support/flin-google-search-console-mcp/token.jsonLinux:
~/.config/flin-google-search-console-mcp/token.jsonWindows:
%APPDATA%\flin-google-search-console-mcp\token.json
If you want to override the location:
{
"mcpServers": {
"flin-google-search-console-mcp": {
"command": "uvx",
"args": ["flin-google-search-console-mcp@latest"],
"env": {
"GOOGLE_CLIENT_ID": "your_oauth_client_id",
"GOOGLE_CLIENT_SECRET": "your_oauth_client_secret",
"GOOGLE_SEARCH_CONSOLE_TOKEN_PATH": "/absolute/path/to/flin-google-search-console-mcp-token.json"
}
}
}
}Multiple Google accounts
You can connect multiple Google accounts and choose the account per tool call.
By default, named account tokens are stored next to the default token. To choose a dedicated token directory, set GOOGLE_SEARCH_CONSOLE_TOKEN_DIR:
{
"mcpServers": {
"flin-google-search-console-mcp": {
"command": "uvx",
"args": ["flin-google-search-console-mcp@latest"],
"env": {
"GOOGLE_CLIENT_ID": "your_oauth_client_id",
"GOOGLE_CLIENT_SECRET": "your_oauth_client_secret",
"GOOGLE_SEARCH_CONSOLE_TOKEN_DIR": "/absolute/path/to/search-console-tokens"
}
}
}
}Then pass account in tool calls:
{
"tool": "list_sites",
"args": {
"account": "work"
}
}The first call for a new account opens the OAuth browser flow and stores a separate token, for example work.json. Account names may contain only letters, numbers, _, -, and ..
An account name must not resolve to the default token file, including case variants
or filesystem aliases. With the default storage layout, token is reserved. Omit
account to use the default account. Existing named account files remain supported.
First Prompts To Verify Everything Works
Use these in Claude Desktop after the server is configured.
Health check
Run health_check for the Google Search Console MCP and show the full result.Confirm available properties
List my Search Console sites and tell me whether sc-domain:example.com is available.Quick summary
Run get_site_summary for site_url sc-domain:example.com from 2026-04-01 to 2026-04-20 and show clicks, impressions, ctr, and position.Top queries
Run get_top_queries for site_url sc-domain:example.com from 2026-04-01 to 2026-04-20 with row_limit 25 and show the top queries by clicks.Top pages
Run get_top_pages for site_url sc-domain:example.com from 2026-04-01 to 2026-04-20 with row_limit 25 and show the top pages by clicks.URL inspection
Run inspect_url for site_url sc-domain:example.com and inspection_url https://example.com/.Property Format: Domain vs URL-prefix
This is one of the most common setup mistakes.
Examples:
Domain property:
sc-domain:example.comURL-prefix property:
https://www.example.com/
Use the exact property string returned by list_sites. Do not guess.
What This MCP Exposes
health_checklist_sitesget_site_summaryquery_performanceget_top_queriesget_top_pagesget_dimension_breakdowninspect_url
Which Tool To Use
Recommended call order:
health_checklist_sitesget_site_summaryget_top_queriesorget_top_pagesquery_performancefor custom dimensions and filtersinspect_urlfor indexability and canonical checks on a specific URL
Search Analytics Notes
query_performanceuses the Search Analytics API under the hoodSearch Analytics returns top rows, not guaranteed full exports
The MCP maps Google's positional
keys[]rows into nameddimensionsobjects
Supported knobs include:
dimensionsfilterssearch_typeaggregation_typedata_staterow_limitstart_row
Example Tool Calls
Site summary
{
"tool": "get_site_summary",
"args": {
"site_url": "sc-domain:example.com",
"start_date": "2026-04-01",
"end_date": "2026-04-20"
}
}Top queries
{
"tool": "get_top_queries",
"args": {
"account": "work",
"site_url": "sc-domain:example.com",
"start_date": "2026-04-01",
"end_date": "2026-04-20",
"row_limit": 25
}
}Query performance with filters
{
"tool": "query_performance",
"args": {
"site_url": "sc-domain:example.com",
"start_date": "2026-04-01",
"end_date": "2026-04-20",
"dimensions": ["page"],
"filters": [
{
"dimension": "device",
"operator": "equals",
"expression": "MOBILE"
}
],
"row_limit": 50
}
}URL inspection
{
"tool": "inspect_url",
"args": {
"site_url": "sc-domain:example.com",
"inspection_url": "https://example.com/blog/seo-agent"
}
}Source Setup
If you want to run the MCP from source:
uv sync --extra dev
cp .env.example .env
# Fill .env values
uv run --env-file .env flin-google-search-console-mcpPublished Package
Run the latest published package directly:
uvx flin-google-search-console-mcp@latestTroubleshooting
missing_configuration
GOOGLE_CLIENT_IDorGOOGLE_CLIENT_SECRETis missing from the MCP config
oauth_required
no usable token exists yet
the first browser-based login has not been completed
the stored refresh token is no longer usable and the browser flow must run again
permission_denied
the Google account used during login does not have access to the Search Console property
No sites returned
verify that the Google account really has Search Console access
confirm you logged into the correct Google account in the browser
Google shows an unverified or testing warning
this is usually expected while the app is in testing mode
make sure your Google account is added as a test user on the OAuth consent screen
Security
See the security review for checks, fixes and remaining limitations. Tokens must be private files (0600 on macOS/Linux); legacy token files with broader permissions must be restricted before use. The extension is unsigned; SHA256SUMS verifies download integrity, not publisher identity.
More Docs
Release on GitHub + PyPI
This repository publishes automatically with GitHub Actions:
CI:
.github/workflows/ci.ymlRelease:
.github/workflows/release.ymltriggered by git tagsv*
CI tests the Python package, desktop bundle and Claude Code plugin on Linux,
macOS and Windows. It also checks the plugin manifest and rejects stale copies
of the runtime in plugin/. A release tag builds all formats, publishes the Python package to PyPI,
verifies the launcher against that published version, and creates a GitHub Release with the .mcpb, plugin ZIP,
their checksums and Python distributions. Only Python distributions go to PyPI.
A manual workflow run on a branch only validates and builds downloadable workflow artifacts. Publishing requires a version tag matching the project, package, plugin and lockfile versions. Publishing a directory listing requires the separate process described in the submission guide.
PyPI publication runs automatically for each version tag. To retry publishing
an older tag separately, manually run Release on that tag with publish_pypi enabled.
1) Configure PyPI Trusted Publisher
In PyPI project settings for flin-google-search-console-mcp, add a Trusted Publisher with:
Owner:
flin-agencyRepository:
flin-google-search-console-mcpWorkflow:
release.ymlEnvironment:
pypi
2) Cut a release
Follow the release checklist, commit and push the reviewed changes, then tag the prepared version:
git tag v0.1.7
git push origin v0.1.7Available Tools
8 toolsget_dimension_breakdownDRead-onlyIdempotent
Get a single-dimension Search Analytics breakdown.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| filters | No | ||
| end_date | Yes | ||
| site_url | No | ||
| dimension | Yes | ||
| row_limit | No | ||
| start_row | No | ||
| data_state | No | ||
| start_date | Yes | ||
| search_type | No | web |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds nothing beyond that: no word on quota/rate limits, pagination behavior, which dimension values are valid, or how filters constrain results, all of which matter for a Search Console analytics 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?
It is a single front-loaded sentence with no padding, so nothing needs trimming. However, brevity here comes at the cost of saying almost nothing beyond the name, so it is concise without being informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but for a 10-parameter reporting tool the description is far too thin. The valid dimension values, filter format, date conventions, and pagination defaults are all left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 10 parameters and 0% schema description coverage, the description must carry the burden, but it only vaguely gestures at the 'dimension' parameter. start_date/end_date formats, the filters array structure, row_limit/start_row pagination semantics, search_type defaults, and data_state are all undocumented anywhere.
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 sentence largely restates the tool name: 'get_dimension_breakdown' becomes 'Get a single-dimension ... breakdown.' The only added information is the domain ('Search Analytics'), which does not distinguish it from siblings like query_performance, get_top_queries, or get_top_pages, whose names suggest overlapping reporting behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus query_performance, get_top_queries, or get_top_pages, nor any mention of prerequisites or exclusions. An agent must guess which reporting tool to select.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_site_summaryCRead-onlyIdempotent
Get aggregate performance metrics for a property over a date range.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| end_date | Yes | ||
| site_url | No | ||
| data_state | No | ||
| start_date | Yes | ||
| search_type | No | web |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint with destructiveHint=false, so the safety profile is well covered and the bar is lower. The description adds nothing beyond restating the aggregate-over-date-range idea: no mention of whether metrics are totals versus averages, data freshness, or result-size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is efficient but under-specified rather than over-long, so the only structural issue is missing content, not wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but the definition is otherwise thin for a six-parameter tool with 0% schema coverage and five plausible sibling alternatives. An agent cannot tell from this text how search_type or data_state change results or how the summary differs from query_performance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across six parameters, so the description must compensate and it largely does not. Only the date-range intent of start_date/end_date is implied; account, site_url, data_state, and especially search_type (defaulting to 'web') carry no meaning anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get aggregate performance metrics') scoped by date range and property, which is clear enough to act on. However, it never distinguishes itself from siblings such as query_performance or get_dimension_breakdown, so an agent could reasonably pick the wrong one for a summary-only request.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance. With six sibling tools covering performance querying, top queries/pages, and dimension breakdowns, the description should say this returns totals-only and route users elsewhere for per-item rows, but it does not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_pagesCRead-onlyIdempotent
Get top page rows for a property over a date range.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| filters | No | ||
| end_date | Yes | ||
| site_url | No | ||
| row_limit | No | ||
| start_row | No | ||
| data_state | No | ||
| start_date | Yes | ||
| search_type | No | web |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, read-only, idempotent, open-world operation, so the description's safety burden is low. However, it adds almost no behavioral context: it does not explain what "top" means, how rows are ordered, how pagination works, or what data_state and search_type affect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted wording. Its brevity is efficient, though it also reflects under-specification rather than rich concision.
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?
This is a moderately complex reporting tool with nine parameters, pagination controls, filters, and multiple scope-related options. The output schema and annotations help, but the description omits critical selection and interpretation details an agent would need to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across nine parameters, so the description must compensate and does not. It vaguely implies a property and date range but does not clarify account versus site_url, filters format, row_limit/start_row pagination, data_state, or search_type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Get top page rows") and scope ("for a property over a date range"). It is clear enough to identify the tool, but it does not distinguish it from siblings such as get_top_queries or get_dimension_breakdown.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives. It does not mention get_top_queries, get_dimension_breakdown, or any conditions under which top pages should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_queriesCRead-onlyIdempotent
Get top query rows for a property over a date range.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| filters | No | ||
| end_date | Yes | ||
| site_url | No | ||
| row_limit | No | ||
| start_row | No | ||
| data_state | No | ||
| start_date | Yes | ||
| search_type | No | web |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations establish a safe, idempotent read, while the description adds only basic property and date-range scoping. It does not explain what makes a query 'top,' how results are ordered, or how filtering and pagination affect the retrieval.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded, readable, and free of filler. Its brevity is efficient, although some additional detail is needed elsewhere to make the tool reliably invocable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema and safety annotations reduce some documentation burden, but the description is insufficient for a nine-parameter tool whose schema provides no parameter descriptions. Missing ranking semantics, filter structure, property-selection rules, pagination behavior, and sibling routing are material 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?
The description loosely supports the date parameters and property selection, but does not specify date formats or distinguish account from site_url. With 0% schema description coverage, filters, row_limit, start_row, data_state, and search_type remain effectively undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb and resource—getting top query rows—and adds property and date-range scope. It implies a distinction from get_top_pages by focusing on queries, but does not explicitly differentiate itself from query_performance or get_dimension_breakdown.
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 wording implies use when an agent wants query-level results for one property and period. It gives no explicit selection criteria, prerequisites, or guidance on when to use a sibling tool instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkBRead-onlyIdempotent
Check local configuration and saved sign-in status without opening a browser or calling Google.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior by confirming nothing leaves the machine (no browser launch, no Google API call), but it says nothing about what constitutes a healthy vs unhealthy result or how failures surface.
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?
One tight sentence with the key constraint front-loaded after the verb phrase; no filler or redundancy. It could have spent a few more words on the account parameter at no real cost to brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the offline/local behavior is well covered. What remains missing is any explanation of the 'account' argument and any explicit trigger condition for running a health check, which for a diagnostic tool is a meaningful omission.
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 single 'account' parameter has 0% schema description coverage and the description never mentions it, so the agent has no guidance on what account values are accepted (email? index? alias?) or what happens when it is omitted. This is the main semantic gap in the definition.
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 ('Check') and specific resources ('local configuration and saved sign-in status'), and adds a scope boundary ('without opening a browser or calling Google') that separates it from the data-querying siblings like list_sites or query_performance. It doesn't name a sibling explicitly, but the local/offline framing makes the distinction clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the phrase 'saved sign-in status' hints at diagnosing auth/credential problems, but there is no explicit 'use this when X' or 'use this before calling Y'. An agent must infer the diagnostic intent from context rather than being told.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_urlBRead-onlyIdempotent
Read Google's indexed status for a URL within an accessible property; does not request indexing.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| site_url | No | ||
| language_code | No | ||
| inspection_url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 fully covered by structured data. The description's 'does not request indexing' largely restates readOnlyHint rather than adding new behavior, and it says nothing about quota, per-property auth, or failure modes for inaccessible properties.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the primary action front-loaded and the disambiguation clause second. Every word earns its place; nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values need no explanation, which helps. But with four parameters at 0% description coverage and no annotations for auth or quota, the description leaves real gaps around language_code and account/property selection that an agent would have to guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden for four parameters and mostly does not. 'Within an accessible property' loosely gestures at site_url/account, and inspection_url is self-evident, but language_code is never mentioned and the account-vs-site_url relationship is unexplained.
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: 'Read Google's indexed status for a URL within an accessible property.' It also preempts a likely confusion by stating 'does not request indexing.' Sibling differentiation is only implicit, since none of the listed siblings (query_performance, get_top_queries, list_sites) overlap in purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'within an accessible property' implies a precondition (the property must be accessible), and the negative clause excludes the request-indexing use case. However, there is no explicit guidance on when to prefer this over sibling tools, or what to do when a property is not accessible.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sitesARead-onlyIdempotent
List properties available to the selected Google account before choosing a site to analyse.
Opens Google sign-in in the browser if needed and saves or refreshes the local token. Does not modify Search Console properties.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds materially new behavior: it may open a browser sign-in flow and persist or refresh a local token. It also explicitly bounds the side effects by stating it does not modify Search Console properties, resolving the apparent tension between a token write and readOnlyHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the primary action and the sequencing constraint, followed by the side effect and the explicit non-effect. Nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers the auth side effect, the non-destructive scope, and when to call it. The only remaining gap is the meaning and accepted values of the optional `account` parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single `account` parameter, so the description carries the burden of explaining it. It only implies that the account is a selector ("the selected Google account") and does not say what values are accepted, whether it is an email, an index, or what happens when it is omitted.
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 properties available to the selected Google account") and implicitly distinguishes itself from siblings by positioning it as the step "before choosing a site to analyse", which the sibling tools (get_site_summary, query_performance, etc.) all require. It never names a sibling explicitly, so it falls short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear sequencing guidance: run this before analysing a site, because it establishes which properties are available. It does not state any when-not-to-use condition or name the alternative tools, so there is no explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_performanceCRead-onlyIdempotent
Query Search Analytics performance data with explicit dimensions and filters.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| filters | No | ||
| end_date | Yes | ||
| site_url | No | ||
| row_limit | No | ||
| start_row | No | ||
| data_state | No | ||
| dimensions | No | ||
| start_date | Yes | ||
| search_type | No | web | |
| aggregation_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 nothing beyond that: no mention of row_limit/start_row pagination behavior, the 1000-row default, data freshness (data_state), or Search Console API quota constraints that materially affect calls.
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, and the resource is front-loaded. It is concise to the point of being under-specified for an 11-parameter tool, so brevity here costs more than it saves.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but the request side is badly under-covered: 11 parameters at 0% schema description coverage and no guidance on which sibling to prefer. For a complex, open-ended query tool this leaves too much undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 11 parameters, so the description carries the full burden and only names two of them ('dimensions', 'filters'). It says nothing about site_url vs account selection, search_type's default of 'web', aggregation_type, data_state, or the paging pair start_row/row_limit.
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 gives a concrete verb ('Query') and resource ('Search Analytics performance data') plus the two levers the tool exposes (dimensions, filters), so an agent can tell it retrieves performance metrics. It does not, however, distinguish this from siblings like get_top_queries, get_top_pages, or get_dimension_breakdown, which appear to be convenience wrappers over the same surface.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this generic query tool versus the more specific siblings, and no prerequisites or exclusions are mentioned. The agent must infer routing from the tool names alone.
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.
8 tool updates
v0.1.7- Changed
get_dimension_breakdown1 field changed- added
Input schema / properties / accountAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Account" +}
- Changed
get_site_summary1 field changed- added
Input schema / properties / accountAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Account" +}
- Changed
get_top_pages1 field changed- added
Input schema / properties / accountAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Account" +}
- Changed
get_top_queries1 field changed- added
Input schema / properties / accountAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Account" +}
- Changed
health_check1 field changed- added
Input schema / properties / accountAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Account" +}
- Changed
inspect_url1 field changed- added
Input schema / properties / accountAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Account" +}
- Changed
list_sites1 field changed- added
Input schema / properties / accountAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Account" +}
- Changed
query_performance1 field changed- added
Input schema / properties / accountAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Account" +}
8 tool updates
v0.1.0- First observed
get_dimension_breakdown - First observed
get_site_summary - First observed
get_top_pages - First observed
get_top_queries - First observed
health_check - First observed
inspect_url - First observed
list_sites - First observed
query_performance
TDQS
Scored across 8 tools
Most tools are clearly distinct, but query_performance overlaps heavily with get_top_queries, get_top_pages, and get_dimension_breakdown, which are convenience wrappers around the same Search Analytics data. An agent may struggle to choose between the generic query tool and the specialized top-N tools.
Nearly all tools follow a consistent snake_case verb_noun pattern (list_sites, get_site_summary, query_performance, inspect_url). health_check is a minor deviation as a noun phrase, but overall naming remains predictable.
Eight tools are well-scoped for a Google Search Console analytics server. Each tool covers a distinct operation, and the count avoids both thinness and bloat.
The surface covers authentication status, site listing, aggregate metrics, flexible queries, top-N reports, dimension breakdowns, and URL inspection status. Minor gaps exist around sitemap management and requesting indexing, but core read-oriented workflows are complete.
Maintenance
Related MCP Connectors
Read-only Google Search Console MCP server for AI assistants.
Hosted, read-only Google Search Console MCP: performance, comparisons, URL inspection, sitemaps.
Hosted MCP server for GA4, Google Ads and Search Console. Google OAuth, nothing to install.
Google Search Console, GA4 and PageSpeed MCP server for Claude, ChatGPT and Cursor. Free, hosted.
Related MCP Servers
- AlicenseAqualityBmaintenanceRead-only MCP server for Google Search Console: performance queries, URL inspection, indexing checks, sitemaps, and one-call HTML SEO audit reports.17347 PyPI9MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for Google Search Console API that enables querying search analytics, managing sites, inspecting URLs, and supporting domain delegation via service accounts.1MIT
- AlicenseNot gradedqualityCmaintenanceRead-only MCP server for Google Search Console data, enabling search analytics, URL inspection, indexing diagnostics, and sitemap management through MCP clients.12 npmMIT
- AlicenseAqualityBmaintenanceSecure MCP server for Google Search Console. Query search analytics (clicks, impressions, CTR, position), manage sitemaps, inspect URL indexing status, and manage site properties.10AGPL 3.0