A side-by-side look at the Google Search Console and Google Search Console MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Google Search Console for marketing work as a local process; choose Google Search Console MCP for marketing as a local process. You can also run both side by side in one mcpServers block.
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, TOKEN_ENCRYPTION_KEY.server.capabilities, sites.list, sites.get.GSC_CLIENT_ID, GSC_CLIENT_SECRET, GSC_REFRESH_TOKEN.gsc_sites, gsc_site_details, gsc_query.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Marketing | Marketing |
| Quality signal | 59/100 · Good | 63/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | OAuth 2.0 |
| Pricing | Not declared | Free |
| Required env vars | GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETTOKEN_ENCRYPTION_KEY | GSC_CLIENT_IDGSC_CLIENT_SECRETGSC_REFRESH_TOKEN |
| Verified owner | Community listing | Community listing |
| GitHub stars | 5 | 9 |
| Directory activity | 1 views 0 installs 0 upvotes | 4 views 0 installs 0 upvotes |
| Tools | 10 | 17 |
| Full listing | View Google Search Console | View Google Search Console MCP |
server.capabilitiesList every tool this server exposes and report local Google credential state. `connected` means a stored refresh credential is present; the response also exposes `auth_status_basis` and `provider_auth_live_verified: false` because this discovery call does not probe Google. A later Google tool call…sites.listList the Search Console properties the connected Google account can access (`siteUrl`, `permissionLevel`).sites.getRetrieve one exact Search Console property and the connected account's permission level for it.analytics.queryImpressions, clicks, CTR, and average position over a date range, with dimensions, filters, safe pagination, and selectable search type. Pass `dimensions: []` for true site totals; Google's aggregate row may omit `keys`. Search Analytics does not guarantee every data row and can return only top row…urls.inspectGoogle's URL Inspection report for the version of one page currently known in Google's index. It is not a live URL test; mobile-usability output is deprecated.urls.inspect_manyInspect Google's indexed versions of up to 10 URLs with bounded concurrency of 3 in one call while preserving input-order results. Each URL still consumes one Google URL Inspection request and one unit of the server's shared inspection safety budget; this does not run live URL tests.reports.weekly_digestGenerate a plain-language seven-day performance report with movers, top pages, and one recommended action. Query movers compare only rows returned in both weekly Search Analytics result sets; a query missing from one bounded response is not treated as zero because Google does not guarantee every da…indexing.statusRead Google's latest successful Indexing API `URL_UPDATED` / `URL_DELETED` notification receipts for a previously submitted URL. This is notification metadata only, not index coverage, crawl status, indexing completion, or removal completion. It requires `GSC_ACCESS_MODE=readwrite` because Google's…indexing.requestRequests indexing through Google's Indexing API. Google currently restricts this API to pages containing `JobPosting` structured data or livestream pages containing `BroadcastEvent` inside `VideoObject`. It is not available for general webpage submission. Google's default 200 publish requests/day/p…indexing.removeRequest a `URL_DELETED` notification for a previously eligible Indexing API page. Before removal, the URL must already return HTTP 404/410 or expose a robots `noindex` meta directive. Google's receipt does not prove removal completed; use URL Inspection for indexed-state evidence.gsc_sitesList every property the authenticated account can read.
Call this first when a property string fails: it returns the exact `site_url`
values the other tools expect, and whether each one is a domain property
(`sc-domain:example.com`) or a URL-prefix property.
gsc_site_detailsPermission level and property type for one property.gsc_queryQuery the Search Analytics report: clicks, impressions, CTR, position.
This is the general-purpose tool. With no dates it covers the last 28 days
ending today (UTC), with data_state=all so today's partial data is included,
matching what the Search Console UI shows.
Example: site_url="sc-domain:example.com", dimensions="query,page",
period="last_28_days", row_limit=100.
Returns a `# meta ...` line then a TSV table, or JSON with `meta` and `rows`.
The meta names the exact range, the row count, whether more rows exist and
the `start_row` to pass next.
gsc_performance_overviewSite totals for a period, compared with the preceding one by default.
Start here: it answers "is the site up or down" in one call, with the
percentage change on every metric. `position_delta` is negative when the
average position improves.
gsc_compare_periodsJoin two periods on one dimension and rank the rows by click delta.
Answers "what changed" without the model diffing two tables by hand. Rows
present in only one period are kept, with zeros on the missing side; the
biggest movers in both directions are returned, worst first. The meta counts
how many rows gained and how many lost clicks.
gsc_quick_winsQueries close enough to the top that a push would pay off.
Ranked by the clicks each query would gain at `target_position`, not by
impressions: a big query already near its ceiling is not an opportunity.
The meta reports the thresholds that were applied.
gsc_ctr_gapsRows that rank well but are clicked far less than their position implies.
The snippet, not the ranking, is the problem, which makes these the
cheapest fixes available. `expected_ctr` is what a result at that position
normally earns.
gsc_cannibalizationQueries where several pages of the site compete for the same result.
Reads one page of up to 25,000 query/page pairs; on a very large property
the tail is cut off, and the meta says how many pairs were analysed.
Each row lists the competing pages with their own clicks and positions.
gsc_traffic_dropsPages that lost clicks against the baseline, each with a likely cause.
`diagnosis` separates a ranking loss from falling demand, a collapsed CTR
and a page that disappeared: the four need different fixes, and the raw
numbers for both periods are in the row so the call can be checked.
gsc_content_decayPages sliding down month after month.
A period comparison hides this: a page that halves over six months never
shows a sharp drop in any single month-on-month check. One query per month
runs in parallel.
gsc_alertsWhat changed sharply enough to be worth a message today.
Compares the last `window_days` against the window before it across both
queries and pages, and returns only movements past the alerting rules:
lost positions, collapsed CTR, dropped or vanished pages.
gsc_portfolioEvery accessible property at a glance, ranked worst first.
One row per property with the current period, the previous one and a health
flag: critical below -30% clicks, warning below -15%. Use it to decide which
property to look at before running anything else.
Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"google-search-console": {
"command": "npx",
"args": [
"-y",
"@digestseo/mcp-gsc"
],
"env": {
"GOOGLE_CLIENT_ID": "YOUR_GOOGLE_CLIENT_ID_HERE",
"GOOGLE_CLIENT_SECRET": "YOUR_GOOGLE_CLIENT_SECRET_HERE",
"TOKEN_ENCRYPTION_KEY": "YOUR_TOKEN_ENCRYPTION_KEY_HERE"
}
}
}
}
{
"mcpServers": {
"acamolese-google-search-console-mcp": {
"command": "uvx",
"args": [
"mcp-google-search-console"
],
"env": {
"GSC_CLIENT_ID": "YOUR_GSC_CLIENT_ID_HERE",
"GSC_CLIENT_SECRET": "YOUR_GSC_CLIENT_SECRET_HERE",
"GSC_REFRESH_TOKEN": "YOUR_GSC_REFRESH_TOKEN_HERE"
}
}
}
}