io.scalably/gsc-mcp
OfficialThis server is a read-only MCP bridge to Google Search Console, letting AI agents inspect properties, traffic analytics, sitemaps, and page indexing under their own service-account credentials.
List all Search Console properties accessible to the service account, with permission level.
Query Search Analytics for clicks, impressions, CTR, and position, with dimensions (date, query, page, country, device, search appearance, hour), search types, filters, filter groups, aggregation, date ranges, and auto-pagination up to 1M rows.
Fetch list of sitemaps for a property, filter by index, or get a single sitemap by feedpath.
Inspect a single URL's Google index status, coverage, canonical, AMP, and rich results.
Batch-inspect many URLs with client-side rate limiting (default 8 req/s) and per-URL error handling.
Configure via environment: service-account credentials, log level, retry backoff, API base overrides, and test token.
Provides read-only access to Google Search Console, allowing listing of properties, querying Search Analytics with filters and pagination, listing sitemaps, and inspecting URL index status, including batch inspection with throttling.
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., "@io.scalably/gsc-mcp show me top queries and clicks for 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.
Google Search Console MCP
Read-only MCP server for Google Search Console. Five tools cover the read surface: properties, Search Analytics (filters, auto-pagination past the 25,000-row cap, hourly data), sitemaps, URL inspection, batch inspection with throttling. We run this server in production for every SEO client.
Install
Claude Code:
claude mcp add gsc -e GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json -- uvx scalably-gsc-mcpCodex:
codex mcp add gsc --env GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json -- uvx scalably-gsc-mcpClaude Desktop: download gsc-mcp.mcpb from the latest GitHub release and open it.
Related MCP server: searchconsole-mcp
Setup
In Google Cloud, create or pick a project and enable the Google Search Console API on it (APIs and Services, Library).
Create a service account in that project and download its JSON key.
Add the service account's email as a user on each Search Console property you want to query (Settings, Users and permissions). Full or restricted permission both work for reading.
No OAuth consent screen is needed; the server authenticates as the service account with the webmasters.readonly scope.
Tools (5)
Tool | What it does |
| List the Search Console properties the service account can read |
| Query Search Analytics with filters, auto-pagination and hourly data |
| List sitemaps for a property or read one sitemap |
| Inspect one URL's index status |
| Inspect many URLs with client-side throttling |
Configuration
Variable | Required | Purpose |
| yes | Path to a Google service-account JSON file with the Search Console read-only scope; share each property with the service account email |
| no | INFO (default) or DEBUG |
| no | Base delay in seconds for the retry backoff on transient API errors (default 1) |
| no | Override the two Google API base URLs (used by the test suite to point at a local fake; leave unset in normal use) |
| no | Test-suite only: a literal bearer token that bypasses the service account. Never set it in normal use |
Reply shape
Every tool returns JSON with status (succeeded, partial, no_op), operation, summary, target, result, proof, warnings, recovery. Failures surface as a tool error whose text is <code>: <message> <hint>. A partial status with proof.nextStartRow means: continue from that row.
Limits
25,000 rows per Search Analytics call (the server auto-paginates past it up to max_rows). URL inspection: Google allows 600 per minute and 2,000 per day per property. The server paces batch inspection client-side (default 8 requests per second) and warns when a batch exceeds the daily quota; it does not track daily usage across calls, so keep your own count.
Verify
Each release lists the package version, the .mcpb sha256 and the production commit it was derived from in CHANGELOG.md. CI runs the tests and a clean install of the built wheel on every push.
Privacy Policy
This server runs locally, on your machine, under your own credentials. It collects no personal data, contains no telemetry, stores nothing persistently, and talks only to the vendor API it wraps. No third party, including Scalably, receives your data. Contact: hello@scalably.io. Canonical copy: https://scalably.io/connector-privacy.html
License
MIT. Copyright Scalably.
Available Tools
5 toolsgsc_batch_inspect_urlsARead-only
Inspect many URLs under a single Search Console property. Rate-limited.
Respects Google's 600 QPM / 2,000 QPD per-site limits. Default pace of 8 QPS stays well under 600/minute with headroom. For large jobs (>2000 URLs), split across days or across multiple verified properties (e.g. per-subdomain).
Args: urls: list of fully-qualified URLs under site_url. No dedup. site_url: the Search Console property. language_code: BCP-47, default "en-US". requests_per_second: pace. Max ~10 (600 QPM). Caller can lower on 429 pressure. continue_on_error: if True, collect per-URL errors instead of aborting.
Returns: { "results": [{"url": str, "inspection": {...flattened...}} | {"url": str, "error": str}], "count": total, "errors": N, "skipped": 0 }
Quota warning: This does NOT replace the Search Analytics API for bulk query analysis. If the intent is "which pages have most traffic", use gsc_query_search_analytics instead - 40,000 QPM per project vs 600/site here.
Inputs: urls (required), site_url (required), language_code, continue_on_error, +1 more. Returns: result
gsc_inspect_urlARead-only
Inspect a URL in the Google index. Flattened response.
Checks index status, coverage state, canonical URLs, crawl info, AMP status, and rich results. Does NOT trigger a live crawl - checks Google's current index snapshot only.
Args: inspection_url: fully-qualified URL to inspect (must be under the property). site_url: the Search Console property - "https://example.com/" or "sc-domain:example.com". language_code: IETF BCP-47, default "en-US".
Quota: 2,000 requests/day/site + 600 requests/minute/site. Requires the SA to be a Full user on the property (Restricted users get 403 here).
Returns a flat dict with top-level verdict, coverage_state, canonical info,
plus optional amp and rich_results sub-objects. _raw has the full
untouched payload.
Inputs: site_url (required), inspection_url (required), language_code. Returns: result
gsc_list_sitemapsARead-only
List sitemaps on a site - or fetch one sitemap by feedpath.
Args: site_url: the Search Console property. sitemap_index: optional - if set, list only the children of a sitemap-index URL (e.g. "https://example.com/sitemap_index.xml"). feedpath: optional - if set, returns the single sitemap entry at that URL instead of the list (absorbs the prior get_sitemap tool).
Returns: {"sitemaps": [...], "count": N} or {"sitemap": {...}} if feedpath given. Each entry: {path, lastSubmitted, lastDownloaded, isPending, isSitemapsIndex, type, warnings, errors, contents}.
Inputs: site_url (required), feedpath, sitemap_index. Returns: result
gsc_list_sitesARead-only
List every verified Search Console property accessible to this service account.
Returns: {"sites": [{siteUrl, permissionLevel}, ...], "count": N}. permissionLevel: siteOwner | siteFullUser | siteRestrictedUser | siteUnverifiedUser.
Call this first. URL Inspection requires siteFullUser or siteOwner; restricted users cannot inspect.
Inputs: no named parameters. Returns: result
gsc_query_search_analyticsARead-only
Query Search Console traffic data - clicks, impressions, CTR, position.
THE workhorse tool. Supports all six dimensions (incl. HOUR, April 2025), all six search types, full filter compose, pagination, and auto-pagination.
Args:
site_url: "https://example.com/" (URL-prefix) or "sc-domain:example.com" (domain).
start_date / end_date: YYYY-MM-DD (Pacific Time). 16-month retention hard cap.
dimensions: list of {date, query, page, country, device, searchAppearance, HOUR}.
HOUR requires data_state='hourly_all'. searchAppearance cannot be combined with
other dimensions in one query - query it alone and join client-side.
search_type: web (default) | image | video | news | discover | googleNews.
filters: flat list [{dimension, operator, expression}]. Operators:
equals, contains, notEquals, notContains, includingRegex, excludingRegex.
filter_groups: advanced - pass raw dimensionFilterGroups if you need OR logic.
Mutually exclusive with filters.
aggregation_type: auto (default) | byPage | byProperty | byNewsShowcasePanel.
data_state: final (default, ~2-3d lag) | all (fresh, includes unfinalized) |
hourly_all (~10d history with HOUR dimension).
row_limit: per-call cap, 1–25000 (API hard cap).
start_row: 0-based offset for single-page paging.
max_rows: if set (up to 1M), auto-paginate until exhausted or max_rows hit.
Response: {rows, row_count, response_aggregation_type, first_incomplete_date?, first_incomplete_hour?, metadata}. Use first_incomplete_date to distinguish 'data still cooking' from 'data is final' when data_state != 'final'.
Gotchas:
16-month retention. start_date older than 16 months returns empty.
Anonymized queries (fewer than ~a dozen users over 2-3 months) drop from the 'query' dimension but count in totals - page-level data is more complete.
Aggregation shift: with a page filter, totals aggregate byPage (inflates clicks vs property-level). Set aggregation_type explicitly when comparing.
searchAppearance cannot co-exist with other dimensions (API 400).
Inputs: end_date (required), site_url (required), start_date (required), filters, +8 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
Each tool targets a distinct GSC resource: site discovery, search analytics, sitemaps, and URL inspection. The single and batch inspect tools are clearly separated by scope, and descriptions make the boundaries easy to identify.
All tools share the gsc_ prefix and snake_case convention, with clear verbs like list, query, and inspect. The one slight deviation is batch_inspect_urls, which combines an adverb with the verb, but the pattern remains predictable and readable.
Five tools is a well-scoped size for a Google Search Console server focused on reading data and inspecting URLs. Each tool serves a meaningful workflow, and the set is neither bloated nor too thin.
Core GSC workflows are covered: enumerating sites, querying search analytics, reading sitemaps, and inspecting URLs individually or in bulk. Sitemap submission/deletion and site management are absent, but these are minor gaps for a read-oriented analytics server.
Maintenance
Related MCP Connectors
Read-only Search Console analytics, URL inspection, indexing diagnostics, and sitemaps.
Google Search Console for AI assistants: traffic, rankings, indexing and page checks. Read-only.
Read-only Google Search Console and Google Analytics for AI agents.
Read Search Console performance, keyword opportunities and annotations for your sites.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides read-only access to Google Search Console data, including search analytics, sitemap status, and URL inspection, for MCP clients like Claude.6 npmMIT
- AlicenseAqualityDmaintenanceEnables automation of Google Search Console tasks, including retrieving search analytics, managing sitemaps and site properties, and inspecting URLs for index status and crawl information.9MIT
- AlicenseAqualityBmaintenanceEnables MCP clients to query Google Search Console search performance, inspect indexing, analyze sitemaps, and run SEO analyses such as cannibalisation detection, query clustering, and wins/losses, all with read-only access.20119 npmApache 2.0
- AlicenseAqualityBmaintenanceEnables read-only access to Google Search Console data, including property discovery, search analytics queries, and URL inspection, through a security-focused interface.32,172 PyPI2MIT