Full Google Search Console control — search analytics, sitemaps, sites, and URL inspection via MCP.
A Model Context Protocol (MCP) server that exposes Google Search Console's API for querying search traffic data, managing sitemaps and sites, and inspecting URL indexing status.
Overview
The mewcp-google-search-console MCP Server provides comprehensive access to Google Search Console through authenticated API calls:
Query search analytics data with flexible dimension grouping and filtering
Manage sitemaps: list, get, submit, and delete sitemap entries
Manage sites: add, remove, and inspect Search Console properties
Inspect the indexed status of any URL within your properties
Perfect for:
SEO teams monitoring search performance and diagnosing indexing issues
Developers automating sitemap submission and site property management
Analysts pulling search traffic data programmatically for reporting pipelines
Tools
Query your search traffic data with filters and parameters that you define. The method returns zero or more rows grouped by the row keys (dimensions) that you define. You must define a date range of one or more days. When date is one of the dimensions, any days without data are omitted from the result list. To learn which days have data, issue a query without filters grouped by date, for the date range of interest. Results are sorted by click count descending. If two rows have the same click count, they are sorted in an arbitrary way.
Inputs:
- `siteUrl` (string, required) — The site's URL, including protocol. For a URL-prefix property, supply the full URL (e.g. 'https://www.example.com/'). For a domain property, supply 'sc-domain:example.com'.- `startDate` (string, required) — Start date of the requested date range, in YYYY-MM-DD format, in PT time (UTC - 7:00/8:00). Must be less than or equal to the end date. This value is included in the range.- `endDate` (string, required) — End date of the requested date range, in YYYY-MM-DD format, in PT time (UTC - 7:00/8:00). Must be greater than or equal to the start date. This value is included in the range.- `dimensions` (array of string, optional) — Zero or more dimensions to group results by. Results are grouped in the order that you supply these dimensions. You can use any dimension name in dimensionFilterGroups[].filters[].dimension as well as date and hour. The grouping dimension values are combined to create a unique key for each result row. If no dimensions are specified, all values will be combined into a single row. There is no limit to the number of dimensions that you can group by, but you cannot group by the same dimension twice. Example: [country, device]- `type` (string, optional) — Filter results to the following type: discover: Discover results; googleNews: Results from news.google.com and the Google News app on Android and iOS. Doesn't include results from the News tab in Google Search., news: Search results from the News tab in Google Search., image: Search results from the Image tab in Google Search.; video: Video search results; web: [Default] Filter results to the combined (All) tab in Google Search. Does not include Discover or Google News results.- `dimensionFilterGroups` (array of DimensionFilterGroup, optional) — Zero or more groups of filters to apply to the dimension grouping values. All filter groups must match in order for a row to be returned in the response. Within a single filter group, you can specify whether all filters must match, or at least one must match.- `aggregationType` (string, optional) — How data is aggregated. 'auto': [Default] let the service decide. 'byNewsShowcasePanel': aggregate by News Showcase panel (requires the NEWS_SHOWCASE searchAppearance filter and type=discover or type=googleNews). 'byPage': aggregate by URI. 'byProperty': aggregate by property (not supported for type=discover or type=googleNews). Note: if you group or filter by page, you cannot aggregate by property.- `rowLimit` (integer, optional, default: 1000) — The maximum number of rows to return. Valid range is 1-25,000; default is 1,000. To page through results, use the startRow offset.- `startRow` (integer, optional, default: 0) — Zero-based index of the first row in the response. Must be a non-negative number. Default is 0. If startRow exceeds the number of results for the query, the response will be a successful response with zero rows.- `dataState` (string, optional) — If 'all' (case-insensitive), data will include fresh data. If 'final' (case-insensitive) or if omitted, the returned data will include only finalized data. If 'hourly_all' (case-insensitive), data will include an hourly breakdown; this indicates that hourly data includes partial data and should be used when grouping by the HOUR API dimension.
dimensionFilterGroups item schema:
- `groupType` (string, optional, default: "and") — Whether all filters in this group must return true ('and'), or one or more must return true (not yet supported). Acceptable value: 'and' (all filters must return true).- `filters` (array of DimensionFilter, optional) — Zero or more filters to test against the row. Each filter consists of a dimension name, an operator, and a value. Examples: country equals FRA; query contains mobile use; device notContains tablet.
filters item schema:
- `dimension` (string, required) — The dimension that this filter applies to. You can filter by any dimension even if you are not grouping by it. 'country': 3-letter country code (ISO 3166-1 alpha-3). 'device': DESKTOP, MOBILE or TABLET. 'page': a URI string. 'query': a query string. 'searchAppearance': a specific search result feature.- `operator` (string, optional, default: "equals") — How your specified value must match (or not match) the dimension value. 'contains': row value contains or equals expression (non-case-sensitive). 'equals': [Default] exact match (case-sensitive for page and query). 'notContains': row value must not contain expression. 'notEquals': must not exactly equal. 'includingRegex': RE2 regex that must match. 'excludingRegex': RE2 regex that must not match.- `expression` (string, required) — The value for the filter to match or exclude, depending on the operator. Max length 4096 characters.
DESTRUCTIVE — REQUIRES EXPLICIT USER CONFIRMATION BEFORE CALLING. Permanently deletes a sitemap from this site. This action is irreversible — the sitemap entry cannot be recovered once deleted. NEVER call this tool autonomously or as part of an automated flow. You MUST stop, tell the user exactly what will be deleted and that it is permanent, and wait for their explicit written confirmation before proceeding.
Inputs:
- `feedpath` (string, required) — The URL of the actual sitemap. For example: http://www.example.com/sitemap.xml- `siteUrl` (string, required) — The URL of the property as defined in Search Console. For example: http://www.example.com/
output data schema:
{ success: boolean;
Retrieves information about a specific sitemap.
Inputs:
- `feedpath` (string, required) — The URL of the actual sitemap. For example: http://www.example.com/sitemap.xml- `siteUrl` (string, required) — The URL of the property as defined in Search Console. For example: http://www.example.com/
output data schema:
{ path: string | null; lastSubmitted: string |
Lists the sitemaps-entries submitted for this site, or included in the sitemap index file (if sitemapIndex is specified in the request).
Inputs:
- `siteUrl` (string, required) — The URL of the property as defined in Search Console. For example: http://www.example.com/- `sitemapIndex` (string, optional) — A URL of a site's sitemap index. For example: http://www.example.com/sitemapindex.xml
output data schema:
{ sitemap: any[] | null;}
Submits a sitemap for a site.
Inputs:
- `feedpath` (string, required) — The URL of the actual sitemap. For example: http://www.example.com/sitemap.xml- `siteUrl` (string, required) — The URL of the property as defined in Search Console. For example: http://www.example.com/
output data schema:
{ success: boolean; message: string | null;}
Adds a site to the set of the user's sites in Search Console.
Inputs:
- `siteUrl` (string, required) — The URL of the property as defined in Search Console. For example: http://www.example.com/
output data schema:
{ success: boolean; message: string | null;}
DESTRUCTIVE — REQUIRES EXPLICIT USER CONFIRMATION BEFORE CALLING. Permanently removes a site from the set of the user's Search Console sites. This action is irreversible — the site entry cannot be recovered once deleted. NEVER call this tool autonomously or as part of an automated flow. You MUST stop, tell the user exactly what will be deleted and that it is permanent, and wait for their explicit written confirmation before proceeding.
Inputs:
- `siteUrl` (string, required) — The URL of the property as defined in Search Console. For example: http://www.example.com/
output data schema:
{ success: boolean; message: string | null;
Retrieves information about specific site.
Inputs:
- `siteUrl` (string, required) — The URL of the property as defined in Search Console. For example: http://www.example.com/
View the indexed, or indexable, status of the provided URL. Presently only the status of the version in the Google index is available; you cannot test the indexability of a live URL.
Inputs:
- `inspectionUrl` (string, required) — Fully-qualified URL to inspect. Must be under the property specified in 'siteUrl'.- `siteUrl` (string, required) — The URL of the property as defined in Search Console. Note that URL-prefix properties must include a trailing / mark. Examples: https://www.example.com/ for a URL-prefix property, or sc-domain:example.com for a Domain property.- `languageCode` (string, optional) — An IETF BCP-47 language code representing the requested language for translated issue messages, e.g.'en-US', or 'de-CH'. Default value is 'en-US'.
output data schema:
API Parameters Reference
Every tool returns the same top-level envelope. Only data varies per tool.
This server uses OAuth. Pass the user's Google OAuth access token via the Authorization: Bearer <token> header on every request. The token must have the https://www.googleapis.com/auth/webmasters scope (read/write) or https://www.googleapis.com/auth/webmasters.readonly scope (read-only tools only).
The user must have verified ownership of the site in Search Console for the requested siteUrl.
Troubleshooting
Cause: OAuth access token not provided or malformed
Solution:
Verify Authorization: Bearer <oauth_access_token> header is present on the request
Ensure the token has not expired — Google OAuth access tokens typically expire after 1 hour
Re-authenticate to obtain a fresh access token
Cause: The authenticated user does not have access to the requested site property
Solution:
Verify the user has verified ownership of the siteUrl in Google Search Console
Check that the OAuth token includes the required webmasters scope
For read-only tools, webmasters.readonly scope is sufficient; write tools require webmasters
Cause: The siteUrl is not registered under the authenticated user's Search Console account
Solution:
Use list_sites to confirm the exact URL format registered in Search Console
URL-prefix properties require a trailing slash (e.g. https://www.example.com/)
Domain properties must use the sc-domain: prefix (e.g. sc-domain:example.com)
Cause: JSON payload is invalid or missing required fields
Solution:
Validate JSON syntax before sending
Ensure all required tool parameters are included
Check parameter types match expected values
Cause: Upstream Google Search Console API returned an error