gsc-mcp · 5 data tools · read-only except sitemap submission
Google Search Console,
as an MCP server.
Claude gets gsc_search_analytics, gsc_inspect_url, sitemap tools and property listing against your own Search Console grant. No exports, no spreadsheets — ask, and the answer comes from the API with Google's own numbers.
https://gsc-mcp.bloggerclinic.com/mcp · $9/mo or $79/yr per property provisional
A real session
Not a mock-up: this is Claude using this tool surface on a property we own, outputs verbatim.
user Which of my sites gets any Google impressions for queries with 'keeda' in them?
→ gsc_list_sites({})
{ "siteEntry": [
{ "siteUrl": "sc-domain:internetkeeda.com", "permissionLevel": "siteOwner" },
{ "siteUrl": "sc-domain:autopartsocean.com", "permissionLevel": "siteOwner" },
… 7 more properties
] }→ gsc_search_analytics({ "siteUrl": "sc-domain:internetkeeda.com", "startDate": "2026-07-08", "endDate": "2026-08-05", "dimensions": ["query"], "rowLimit": 5 })
{ "rows": [
{ "keys": ["aikeeda"], "clicks": 0, "impressions": 1, "position": 17 },
{ "keys": ["ekeeda"], "clicks": 0, "impressions": 9, "position": 87.3 },
{ "keys": ["ikeda"], "clicks": 0, "impressions": 1, "position": 88 },
… ], "responseAggregationType": "byProperty" }claude internetkeeda.com is the only property with 'keeda' queries — 11 impressions across brand-adjacent terms in the last 28 days, zero clicks. The largest is "ekeeda" (9 impressions, position 87), which is a different company's brand; nothing here is worth targeting. If you want traffic queries instead of brand lookalikes, I can pull pages with impressions but no clicks next.
Authentication model
You create an OAuth client in your own Google Cloud project (exact click-path with the screens named), then hand its id and secret to the gsc_setup tool. The consent screen you approve belongs to your client — we never hold a grant issued to us. The scope requested is https://www.googleapis.com/auth/webmasters (read plus sitemap submission; nothing else).
Client id, secret, and refresh token are stored AES-256-GCM encrypted, decrypted only inside the request that needs them, and never logged. The only readback is a masked suffix from gsc_auth_status. Revoke any time at myaccount.google.com/permissions — our copy of the refresh token dies with it.
Tool reference
gsc_setup
not meteredConnect your own Google Cloud OAuth client (client id + secret). Returns the Google consent URL. Consent is granted to your client — never to us.
| client_id | string | OAuth client ID, ends in .apps.googleusercontent.com |
| client_secret | string | OAuth client secret (GOCSPX-…). Stored AES-256-GCM encrypted. |
gsc_auth_status
not meteredConnection state plus the masked client-id suffix. Never returns credentials.
no arguments
check_quota
not meteredPlan, metered calls used this month, cap, reset date.
no arguments
gsc_list_sites
meteredEvery Search Console property the authorised account can access, with permission level.
no arguments
gsc_search_analytics
meteredPerformance query: clicks, impressions, CTR, average position grouped by up to two dimensions. Data lags 2–3 days; max range 16 months (Google's limits, passed through unchanged).
| siteUrl | string | Exact property string: 'sc-domain:example.com' or 'https://www.example.com/'. |
| startDate | string | YYYY-MM-DD |
| endDate | string | YYYY-MM-DD |
| dimensions | string[] | query, page, country, device, date, searchAppearance — e.g. ["page","query"] |
| rowLimit? | number | Up to 25,000. Default 1,000. |
| dimensionFilterGroups? | object[] | Native GSC filter groups, passed through verbatim. |
gsc_inspect_url
meteredIndex status for one URL: coverage state, last crawl, Google-selected canonical, mobile usability, rich results. Google caps this at 2,000 calls/day per property.
| siteUrl | string | Exact property string: 'sc-domain:example.com' or 'https://www.example.com/'. |
| inspectionUrl | string | Full page URL including protocol. |
gsc_list_sitemaps
meteredSubmitted sitemaps with last-downloaded dates, warnings, errors, URL counts.
| siteUrl | string | Exact property string: 'sc-domain:example.com' or 'https://www.example.com/'. |
gsc_submit_sitemap
meteredSubmit or resubmit a sitemap. The one write-scope tool in this connector.
| siteUrl | string | Exact property string: 'sc-domain:example.com' or 'https://www.example.com/'. |
| sitemapUrl | string | Full sitemap URL. |
Rate limits and quotas
- Our metering: 5,000 metered tool calls per month per property on paid plans, 200 on free provisional. Setup, status and check_quota are never metered. The counter is a KV increment; a concurrent burst can overshoot by a few calls — it is a fair-use cap, not a bill.
- Google's limits pass through: URL inspection is capped by Google at 2,000 calls/day per property; search analytics data lags 2–3 days and reaches back 16 months.
- Errors come back as readable tool results (isError) with the upstream status and a fix, never a stack trace or your token.
What it does not do
- No rank tracking beyond what Search Console reports (2–3 day lag, sampled queries — Google's limits, not ours).
- No keyword volume, difficulty scores, or SERP scraping. This reads your own property data only.
- No competitor data of any kind: it can only see properties your Google account can see.
- No writes except gsc_submit_sitemap. It cannot change settings, users, or ownership.
- No historical data beyond Google's 16-month window.
- No caching of your data: every answer is a live API call; nothing is stored except encrypted credentials and a usage counter.
Install
claude mcp add --transport http gsc https://gsc-mcp.bloggerclinic.com/mcp \
--header "Authorization: Bearer smcp_your_key"Claude web, Claude Desktop, and generic clients → · Prefer your own infrastructure? Self-host mode.