GSC Wizard MCP
About
Your AI assistant can query Search Console analytics
Details
- Author
- Unknown
- Categories
- Marketing, Other, Search
Jump to
All you need to connect:an MCP API key, free for every GSC Wizard account. Create one attool.gscwizard.com/account/api-keys. Keys look likegscw_live_...and are shown only once at creation.
Most SEO and analytics MCP servers hand the raw rows back to the model: thousands of query/page records streamed into the context window for the LLM to crunch. Language models are not built for arithmetic over large tables. They are slow at it, they burn tokens doing it, and they make mistakes (dropped rows, miscounted sums, hallucinated totals) that are hard to catch.
GSC Wizard does the opposite. Every analysis (CTR curves, decay detection, cannibalization, opportunity scoring, path breakdowns, ranking changes, full SEO reports) is computed inserver-side Python and SQL, against the data warehouse, before anything reaches the model. The tool returns the finished result, not the raw input.
- Far fewer tokens.A single tool call returns a compact, finished answer instead of tens of thousands of rows the model has to read, hold in context, and pay for.
- Much faster.Aggregations run on the warehouse in milliseconds. The model spends its time reasoning about the result, not grinding through a spreadsheet one token at a time.
- Not prone to errors.The math is deterministic. Numbers come from real queries, so there is no risk of the model miscounting or inventing totals.
- Bigger datasets in scope.Because the heavy lifting never enters the context window, the server can analyze months of data and millions of rows that would never fit in a prompt.
The model still does what it is good at: interpreting the findings, spotting the story, and recommending what to do next. The crunching just happens where it belongs.
Two ways to authenticate, both tied to your GSC Wizard account:
- API key(header): sendAuthorization: Bearer gscw_live_.... Best for config-file clients (Claude Code, Cursor, VS Code, Windsurf).
- OAuth 2.1(sign-in): clients that support remote OAuth (ChatGPT, the Claude web/app Connectors UI, the native Claude Desktop connector) discover it automatically and walk you through a Google sign-in and consent screen. No key to copy or store.
In clients that render rich tool output (such as ChatGPT), summary tools likeget_site_summary,query_top_queries,query_top_pages,get_ranking_changes,list_sites, andgenerate_seo_reportdisplay an interactive, theme-aware card/table view. Other clients receive the same data as JSON.
The server speaks Streamable HTTP, so any client that supports remote MCP servers can connect. The config-file clients below (Claude Code, Cursor, VS Code, Windsurf) authenticate with an API-key header: replacegscw_live_...with your key. Clients that support remote OAuth (ChatGPT, the Claude web/app Connectors UI, the native Claude Desktop connector) instead just need the URL and will sign you in: see the OAuth note in each section.
claude mcp add --transport http gsc-wizard \ https://mcp.gscwizard.com/mcp \ --header "Authorization: Bearer gscw_live_..."
Easiest (OAuth, no Node):Settings → Connectors →Add custom connector, enterhttps://mcp.gscwizard.com/mcpas the URL, and leave the OAuth fields blank. Claude registers itself automatically, opens a Google sign-in and consent screen, and connects. Nothing to copy or store.
Add custom connector: paste the URL, leave the OAuth fields blank.
Alternative (static API key):Claude Desktop's config file launches only local (stdio) servers, so pasting a"type": "http"entry is rejected as invalid. To use an API key instead of OAuth, bridge the remote server throughmcp-remote(requiresNode.js). Settings → Developer → Edit Config, then add:
{ "mcpServers": { "gsc-wizard": { "command": "npx", "args": [ "-y", "mcp-remote", "https://mcp.gscwizard.com/mcp", "--header", "Authorization:${AUTH_HEADER}" ], "env": { "AUTH_HEADER": "Bearer gscw_live_..." } } } }
The key goes inenvrather than inline becausemcp-remotesplits each--headervalue on spaces, soAuthorization:${AUTH_HEADER}is written without a space. On Windows, ifnpxfails to launch, set"command": "cmd"and prepend"/c", "npx"toargs. Quit and reopen Claude Desktop fully after saving.
Add to~/.cursor/mcp.json(global) or.cursor/mcp.jsonin a project:
{ "mcpServers": { "gsc-wizard": { "url": "https://mcp.gscwizard.com/mcp", "headers": { "Authorization": "Bearer gscw_live_..." } } } }
Add to.vscode/mcp.jsonin your workspace (or run theMCP: Add Servercommand). VS Code usesservers, notmcpServers, and can prompt for the key so it stays out of source control:
{ "inputs": [ { "id": "gscw-key", "type": "promptString", "description": "GSC Wizard MCP key", "password": true } ], "servers": { "gsc-wizard": { "type": "http", "url": "https://mcp.gscwizard.com/mcp", "headers": { "Authorization": "Bearer ${input:gscw-key}" } } } }
Add to~/.codeium/windsurf/mcp_config.json. Windsurf usesserverUrlfor remote servers:
{ "mcpServers": { "gsc-wizard": { "serverUrl": "https://mcp.gscwizard.com/mcp", "headers": { "Authorization": "Bearer gscw_live_..." } } } }
Requires a paid ChatGPT plan (Plus, Pro, Business, or Enterprise). Custom MCP servers live underSettings → Apps(developer mode, formerly "Connectors"). Enable Developer mode, add an app, and enterhttps://mcp.gscwizard.com/mcpas the Server URL. ChatGPT usesOAuth 2.1: it registers itself, then opens the GSC Wizard sign-in and consent screen. Leave the OAuth client ID/secret fields blank (the server supports dynamic client registration). There is no API-key field, which is expected: ChatGPT cannot present static bearer tokens, so it uses OAuth.
New App (Developer mode): Server URL + Authentication “OAuth”; client ID/secret left blank.
Programmatic access also works through the OpenAIResponses API, which accepts a remote MCP tool with aheadersobject, so there you can passAuthorization: Bearer gscw_live_...directly. Note that ChatGPT's built-in Deep Research connectors only callsearchandfetchtools; full tool access is via developer-mode apps and the Responses API.
Point it at the Streamable HTTP endpoint and send your key as a bearer token:
URL: https://mcp.gscwizard.com/mcp Header: Authorization: Bearer gscw_live_...
Key names vary between clients (for exampletransportvstype,urlvsserverUrl), but the URL and bearer header stay the same. Check your client's MCP docs if the keys above are not recognized.
Each API key carries a scope, chosen when you create it:
- Read only: query data and run reports. Cannot add, edit, or delete anything.
- Read & write: everything read keys can do, plus mutations (add sites, submit IndexNow, manage clusters, and so on). Every mutation is audit-logged.
MCP tools require an active subscription or a running free trial. Creating new API keys needs the same; existing keys can always be revoked from theAPI keys page, where revocation takes effect immediately.
Tool calls are rate limited per account to protect your Search Console quota and keep the service responsive. Two windows apply at once, and a call must fit within both:
The limit is shared across every key and session on your account, so opening more sessions does not raise it. Only tool invocations (tools/call) count: protocol handshakes such asinitializeandtools/listare free, and a batched request that invokes several tools counts as one call per tool.
When you exceed a window the server returnsHTTP 429with aRetry-Afterheader giving the seconds until the window resets, and a JSON-RPC error body:{ "error": { "code": -32000, "message": "Rate limit exceeded (minute window). Retry after 42s." } }. Pause forRetry-Afterseconds and retry. Most clients surface this as a transient error you can simply re-run.
These limits are separate from Google's own quotas. URL Inspection tools (inspect_url,bulk_inspect_urls,check_tracked_url_now) also draw on the daily ~2,000-inspection-per-property quota you share with the GSC Wizard UI.
The server exposes 106 tools. You normally just ask your assistant in natural language ("show my top queries last month for example.com") and it picks the right tool and fills the arguments. The JSON under each tool below shows the argument shape, so you can see what each one accepts. Dates useYYYY-MM-DDand are optional on every tool that takes a date range: omitstartDate/endDateand the server uses the most recent settled window automatically (never passnullor the string"null").siteUrlis a value returned bylist_sites(a URL prefix likehttps://example.com/or a domain property likesc-domain:example.com).
Date ranges are optional.Every tool that takes a date range treatsstartDateandendDateas optional: omit them and the server analyzes the last 28 days Search Console has settled (its data lags ~2-3 days). Pass one end or both to narrow the window; the comparison tools (get_ranking_changes,find_decaying_content) default the baseline to the same-length period immediately before the current one. You never need to know today's date, and you should never sendnullor the string"null"for a date.
Where the numbers come from.The search-analytics tools (query_search_analytics,query_top_queries,query_top_pages,query_countries,query_devices,get_site_summary,get_query_performance,get_page_performance) and the analysis-report tools (get_ranking_changes,find_decaying_content,get_decay_overview,analyze_cannibalization,analyze_ctr_curve,find_page_poaching_opportunities,score_opportunities,breakdown_by_path,analyze_sampling_impact,get_sitemap_performance,get_cross_site_summary,get_tag_group_view) read from the GSC Wizard data warehouse when it has your property: that gives you longer history and no Search Console sampling. Otherwise they fall back to the live Search Console API automatically. Every response includes adataSourcefield set toclickhouseorapiso you always know which one answered. Warehouse responses also include asettledThroughdate and a freshness note: warehouse data settles ~2 days behind real-time, so for the most recent day or two the live API is the better source. Requests that need thesearchAppearancedimension, thegoogleNewstype, three or more distinct dimensions, or pagination always use the live API.
Metric units.Everyctrfield returned by any tool is apercentage from 0 to 100(a 2.34% click-through rate is2.34, not0.0234) — the same on the warehouse path, the live Search Console path, and the Bing tools. Differences between two CTRs (ctrPoints,ctrDelta, thedeltasmap onanalyze_ctr_curve) are in percentage points.positionis an impressions-weighted average where lower is better. GA4 rate metrics are the exception and keep the Data API's own units:bounceRateandengagementRateare 0-1 fractions.
Bing Webmaster Tools.Thelist_bing_sitesandget_bing_*tools read the Bing side of organic search (Bing, Yahoo, DuckDuckGo) live from the Bing Webmaster API. They use the Bing Webmaster API key stored on the property's connected Google account in GSC Wizard, so they need no separate connection here: if no key is set up, the tool returnsnotConfigured: truewith a hint instead of an error. Bing exposes roughly the last 6 months per endpoint, so omitting the date range returns everything Bing has (not a settled-window default like the Search Console tools).
List Search Console properties connected to the account.
No arguments. Start here to get the siteUrl values the other tools expect.
Profile, connected Google accounts, and subscription state.
Runs the whole analysis suite for a property in one call and returns a complete, self-contained HTML report (overview, top queries/pages, countries & devices, CTR curve, opportunities, ranking changes, decay, cannibalization, sections, coverage, sitemaps). Much faster than calling each tool separately.
{ "siteUrl": "sc-domain:example.com", "days": 28, "format": "html" }
days defaults to 28 (7-180). format: "html" (default, ready-to-open report) or "json" (raw data bundle). includeSitemap defaults to true.
Ad-hoc searchAnalytics.query against a property. The most flexible read tool.
{ "siteUrl": "sc-domain:example.com", "startDate": "2026-05-01", "endDate": "2026-05-28", "dimensions": [ "query", "page" ], "rowLimit": 1000, "filters": [ { "dimension": "country", "operator": "equals", "expression": "usa" } ] }
startDate/endDate, dimensions, rowLimit (defaults to 1000, uncapped; the live-API path auto-paginates past 25000), searchType, startRow, and filters are all optional. Omit the dates for the last 28 settled days.
Last-N-days totals plus a prior-period comparison.
{ "siteUrl": "sc-domain:example.com", "days": 28 }
Run the URL Inspection API for one URL and persist the result to history.
{ "siteUrl": "sc-domain:example.com", "inspectionUrl": "https://example.com/blog/post" }
Remaining URL inspections available today for a property.
{ "siteUrl": "sc-domain:example.com" }
Saved filter presets, optionally restricted to one property.
{ "siteUrl": "sc-domain:example.com" }
siteUrl is optional; omit it to list every saved filter on the account.
{ "siteUrl": "sc-domain:example.com" }
Content groups and their URL-matching rules for a property.
{ "siteUrl": "sc-domain:example.com" }
Sitemaps submitted to Search Console for a property.
{ "siteUrl": "sc-domain:example.com" }
Persisted URL inspection history (paginated).
{ "siteUrl": "sc-domain:example.com", "urlContains": "/blog/", "limit": 100 }
urlContains is optional; limit defaults to 100 (max 500).
Top search queries by clicks for a date range.
{ "siteUrl": "sc-domain:example.com", "startDate": "2026-05-01", "endDate": "2026-05-28", "limit": 100 }
limit defaults to 100, uncapped (pull the whole property if you want); searchType defaults to "web". startDate/endDate are optional: omit them for the last 28 settled days.
Top landing pages by clicks for a date range.
{ "siteUrl": "sc-domain:example.com", "startDate": "2026-05-01", "endDate": "2026-05-28", "limit": 100 }
limit defaults to 100, uncapped (pull the whole property if you want); searchType defaults to "web". startDate/endDate are optional: omit them for the last 28 settled days.
Per-country clicks/impressions breakdown.
{ "siteUrl": "sc-domain:example.com", "startDate": "2026-05-01", "endDate": "2026-05-28", "limit": 100 }
limit defaults to 100, uncapped. startDate/endDate are optional: omit them for the last 28 settled days.
DESKTOP / MOBILE / TABLET split for a date range.
{ "siteUrl": "sc-domain:example.com", "startDate": "2026-05-01", "endDate": "2026-05-28" }
startDate/endDate are optional: omit them for the last 28 settled days.
Chart annotations (platform, account, or property scope).
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.



