AskWatch Google Search Console MCP
Ask Google Search Console in plain language. Hosted, free, no Google Cloud project.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"gsc": {
"url": "https://mcp.askwatch.ai/gsc"
}
}
}Remote endpoints
https://mcp.askwatch.ai/gscstreamable-httpWhat it can do
Tool inventory
Tools (11)
🟢site_overview(site, days, start_date, end_date)
How the site did over a period compared with the one before it: clicks, impressions, CTR, average position and the change in each. Covers the question 'how is my site doing'.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Search Console property, exactly as list_sites reports it (sc-domain:example.com or https://example.com/). Optional when the account has only one property."
},
"days": {
"type": "integer",
"minimum": 1,
"maximum": 480,
"description": "Length of the window, counted back from the last day with data. Default 28."
},
"start_date": {
"type": "string",
"description": "YYYY-MM-DD. Overrides `days`."
},
"end_date": {
"type": "string",
"description": "YYYY-MM-DD. Defaults to the last day with data."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢top(site, dimension, country, device, order_by, ...)
Top queries, pages, countries or devices for a period. Optionally narrowed to one country or device — 'top pages in Germany on mobile' is one call.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Search Console property, exactly as list_sites reports it (sc-domain:example.com or https://example.com/). Optional when the account has only one property."
},
"dimension": {
"type": "string",
"enum": [
"query",
"page",
"country",
"device"
],
"description": "What to group by. Default query."
},
"country": {
"type": "string",
"description": "ISO-3166-1 alpha-3, e.g. deu, usa. Filters rather than groups."
},
"device": {
"type": "string",
"enum": [
"desktop",
"mobile",
"tablet"
]
},
"order_by": {
"type": "string",
"enum": [
"clicks",
"impressions"
],
"description": "Default clicks."
},
"limit": {
"type": "integer",
"minimum": 1,
"description": "Rows to return. Default 25, maximum 100; `has_more` says whether there were more."
},
"days": {
"type": "integer",
"minimum": 1,
"maximum": 480,
"description": "Length of the window, counted back from the last day with data. Default 28."
},
"start_date": {
"type": "string",
"description": "YYYY-MM-DD. Overrides `days`."
},
"end_date": {
"type": "string",
"description": "YYYY-MM-DD. Defaults to the last day with data."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢changes(site, dimension, min_impressions, limit, days, ...)
What gained and what lost between this period and the one before it, with small rows filtered out. Answers 'what dropped in the last 28 days'.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Search Console property, exactly as list_sites reports it (sc-domain:example.com or https://example.com/). Optional when the account has only one property."
},
"dimension": {
"type": "string",
"enum": [
"query",
"page"
],
"description": "Default query."
},
"min_impressions": {
"type": "integer",
"minimum": 0,
"description": "Noise floor. Default 30 in either window."
},
"limit": {
"type": "integer",
"minimum": 1,
"description": "Rows to return. Default 25, maximum 100; `has_more` says whether there were more."
},
"days": {
"type": "integer",
"minimum": 1,
"maximum": 480,
"description": "Length of the window, counted back from the last day with data. Default 28."
},
"start_date": {
"type": "string",
"description": "YYYY-MM-DD. Overrides `days`."
},
"end_date": {
"type": "string",
"description": "YYYY-MM-DD. Defaults to the last day with data."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢find_opportunities(site, min_impressions, limit, days, start_date, ...)
Queries ranking 5-20 with plenty of impressions but a click-through rate below what is typical at their position — where a title or snippet rewrite is worth the most clicks.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Search Console property, exactly as list_sites reports it (sc-domain:example.com or https://example.com/). Optional when the account has only one property."
},
"min_impressions": {
"type": "integer",
"minimum": 0,
"description": "Default 60."
},
"limit": {
"type": "integer",
"minimum": 1,
"description": "Rows to return. Default 25, maximum 100; `has_more` says whether there were more."
},
"days": {
"type": "integer",
"minimum": 1,
"maximum": 480,
"description": "Length of the window, counted back from the last day with data. Default 28."
},
"start_date": {
"type": "string",
"description": "YYYY-MM-DD. Overrides `days`."
},
"end_date": {
"type": "string",
"description": "YYYY-MM-DD. Defaults to the last day with data."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢find_cannibalization(site, min_impressions, limit, days, start_date, ...)
Queries where more than one page of the site is being shown, with how each page does on them.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Search Console property, exactly as list_sites reports it (sc-domain:example.com or https://example.com/). Optional when the account has only one property."
},
"min_impressions": {
"type": "integer",
"minimum": 0,
"description": "Per page. Default 30."
},
"limit": {
"type": "integer",
"minimum": 1,
"description": "Rows to return. Default 25, maximum 100; `has_more` says whether there were more."
},
"days": {
"type": "integer",
"minimum": 1,
"maximum": 480,
"description": "Length of the window, counted back from the last day with data. Default 28."
},
"start_date": {
"type": "string",
"description": "YYYY-MM-DD. Overrides `days`."
},
"end_date": {
"type": "string",
"description": "YYYY-MM-DD. Defaults to the last day with data."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢page_queries(site, page, match, limit, days, ...)
What searches a specific page is shown for.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Search Console property, exactly as list_sites reports it (sc-domain:example.com or https://example.com/). Optional when the account has only one property."
},
"page": {
"type": "string",
"description": "Full URL of the page."
},
"match": {
"type": "string",
"enum": [
"equals",
"contains"
],
"description": "Default equals."
},
"limit": {
"type": "integer",
"minimum": 1,
"description": "Rows to return. Default 25, maximum 100; `has_more` says whether there were more."
},
"days": {
"type": "integer",
"minimum": 1,
"maximum": 480,
"description": "Length of the window, counted back from the last day with data. Default 28."
},
"start_date": {
"type": "string",
"description": "YYYY-MM-DD. Overrides `days`."
},
"end_date": {
"type": "string",
"description": "YYYY-MM-DD. Defaults to the last day with data."
}
},
"required": [
"page"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢brand_split(site, brand_terms, days, start_date, end_date)
Branded versus non-branded search, split on the words supplied. The split is only as good as those terms: misspellings and the domain name catch more of what people type.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Search Console property, exactly as list_sites reports it (sc-domain:example.com or https://example.com/). Optional when the account has only one property."
},
"brand_terms": {
"type": "array",
"items": {
"type": "string"
},
"description": "Words that make a search branded, e.g. ['askwatch', 'ask watch']."
},
"days": {
"type": "integer",
"minimum": 1,
"maximum": 480,
"description": "Length of the window, counted back from the last day with data. Default 28."
},
"start_date": {
"type": "string",
"description": "YYYY-MM-DD. Overrides `days`."
},
"end_date": {
"type": "string",
"description": "YYYY-MM-DD. Defaults to the last day with data."
}
},
"required": [
"brand_terms"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢query(site, dimensions, filters, limit, start_row, ...)
Direct query against Google's Search Analytics API, with the same dates, dimensions and filters it takes, passed through unchanged.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Search Console property, exactly as list_sites reports it (sc-domain:example.com or https://example.com/). Optional when the account has only one property."
},
"dimensions": {
"type": "array",
"items": {
"type": "string",
"enum": [
"query",
"page",
"country",
"device",
"date"
]
},
"description": "Group by these. Omit for totals."
},
"filters": {
"type": "array",
"items": {},
"description": "Google's dimensionFilterGroups, passed through unchanged."
},
"limit": {
"type": "integer",
"minimum": 1,
"description": "Rows to return. Default 25, maximum 100; `has_more` says whether there were more."
},
"start_row": {
"type": "integer",
"minimum": 0,
"description": "Paging offset; `next_start_row` comes back in the answer."
},
"days": {
"type": "integer",
"minimum": 1,
"maximum": 480,
"description": "Length of the window, counted back from the last day with data. Default 28."
},
"start_date": {
"type": "string",
"description": "YYYY-MM-DD. Overrides `days`."
},
"end_date": {
"type": "string",
"description": "YYYY-MM-DD. Defaults to the last day with data."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢list_sites
Search Console properties this connection can read, from Google's Sites API. These are the exact strings the site argument takes.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢inspect_url(site, url)
Google's index status for one URL, as the URL Inspection API reports it: whether it is indexed, when it was last crawled, and which canonical Google chose.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Search Console property, exactly as list_sites reports it (sc-domain:example.com or https://example.com/). Optional when the account has only one property."
},
"url": {
"type": "string",
"description": "The exact URL to inspect."
}
},
"required": [
"url"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢list_sitemaps(site)
Sitemaps submitted for the property and their status, from Google's Sitemaps API. Read-only: submitting is not possible with read access.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Search Console property, exactly as list_sites reports it (sc-domain:example.com or https://example.com/). Optional when the account has only one property."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Community
Evidence