Gsc Mcp Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Gsc Mcp Server (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP server that gives any MCP-compatible AI client (Claude Desktop, Claude Code, Cursor, …) read-only access to your Google Search Console data. Ask questions in plain language — _"why did my traffic drop last week?"_ — and the assistant pulls the numbers, compares periods, and surfaces SEO opportunities for you.
Read-only. The server only ever reads Search Analytics data; it cannot change anything in your Search Console property.
It exposes six tools to the AI client:
| Tool | What it answers |
|---|---|
search_analytics | Raw clicks / impressions / CTR / position for a date range, grouped by query, page, country, device, or date. |
compare_periods | Which pages or queries gained or lost the most clicks/impressions between two date ranges. Great for diagnosing traffic drops. |
top_opportunities | "Low-hanging fruit" — pages/queries ranking 4–20, or high-impression pages with low CTR that are worth optimizing. |
page_details | Deep dive on one page: its top queries and day-by-day trend. |
query_details | For one query: which of your pages rank for it and how. |
list_sites | Lists the configured properties — used when you have several sites and haven't said which one to analyze. |
# 1. Get an OAuth refresh token (interactive, one-time)
npx github:Vrealmatic/gsc-mcp-server get-token
# 2. Save the printed JSON as config.json, then point your MCP client at the server (see below)That's it — the assistant can now query your Search Console.
You need four values: CLIENT_ID, CLIENT_SECRET, REFRESH_TOKEN, and SITE_URL. Step 1 creates the OAuth client (the CLIENT_ID / CLIENT_SECRET); in step 2 you exchange those for a REFRESH_TOKEN — pick either method, both produce the same result.
(or pick) a project.
APIs & Services → Library → search "Search Console API" → Enable.
Test user so you can authorize without app verification.
works):
http://localhost:5858/oauth2callback — for the helper scripthttps://developers.google.com/oauthplayground — for the OAuth Playground#### Method A — Helper script (recommended)
npx github:Vrealmatic/gsc-mcp-server get-tokenIt asks for your Client ID, Client secret, and site URL, opens a browser for you to grant access, then prints a ready-to-paste config.json. Uses the http://localhost:5858/oauth2callback redirect URI.
#### Method B — Google OAuth Playground (no local helper)
Handy if you can't or don't want to run the script — everything happens in the browser:
→ paste your Client ID and Client secret.
enter: https://www.googleapis.com/auth/webmasters.readonly
Then assemble config.json by hand (next step) with that refresh token.
`SITE_URL` (needed by both methods) must match the property exactly as it appears in Search Console: - URL-prefix property:https://example.com/(note the trailing slash) - Domain property:sc-domain:example.com
{
"CLIENT_ID": "…",
"CLIENT_SECRET": "…",
"REFRESH_TOKEN": "…",
"SITE_URL": "https://example.com/"
}Save it anywhere outside the repo and point the server at it with --config (e.g. ~/.gsc/config.json). Keep it private — it grants read access to your Search Console data. If you do keep it inside the project folder, it's already covered by .gitignore.
One config can hold several properties. Replace SITE_URL with a SITES array (the OAuth account must have access to each one):
{
"CLIENT_ID": "…",
"CLIENT_SECRET": "…",
"REFRESH_TOKEN": "…",
"SITES": ["https://example.com/", "sc-domain:another-site.com"]
}How site selection works:
question — _"compare last month for another-site.com"_ — and the assistant passes it through. A partial match is enough (another-site resolves to sc-domain:another-site.com).
the list of available sites and the assistant will ask you which one to use. It never silently picks one.
properties at any time.
SITE_URL or a single-entry SITES),siteUrl is optional and that site is always used.
To keep properties fully isolated instead (separate tokens, separate clients), register multiple MCP server entries, each with its own --config.
The server speaks MCP over stdio. Pass your credentials with --config:
Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):
{
"mcpServers": {
"search-console": {
"command": "npx",
"args": [
"-y",
"github:Vrealmatic/gsc-mcp-server",
"--config",
"/absolute/path/to/config.json"
]
}
}
}claude mcp add search-console -- npx -y github:Vrealmatic/gsc-mcp-server --config /absolute/path/to/config.jsongit clone https://github.com/Vrealmatic/gsc-mcp-server.git
cd gsc-mcp-server
npm install
node index.js --config ./config.jsonYou can also pass credentials via environment variables (CLIENT_ID, CLIENT_SECRET, REFRESH_TOKEN, SITE_URL) instead of --config.
Once connected, just talk to your assistant:
You: My organic traffic feels lower this month. What dropped between May and June?
The assistant calls compare_periods and replies:
Comparing 2026-05-01 → 2026-05-31 vs 2026-06-01 → 2026-06-23, the biggest click losses are:
>
| Page | May clicks | June clicks | Δ | | --- | --- | --- | --- | |/guides/onboarding| 1,240 | 410 | −830 | |/pricing| 980 | 720 | −260 | |/blog/seo-basics| 540 | 360 | −180 |
>
/guides/onboardinglost two-thirds of its clicks and its average position slipped from 3.1 to 7.8 — that single page explains most of the drop. Want me to pullpage_detailsfor it to see which queries fell?
You: Yes, and show me where the easy wins are.
It then runs page_details and top_opportunities to point you at queries sitting at positions 4–20 (a small ranking gain there yields a big click jump) and high-impression pages with weak CTR.
@modelcontextprotocol/sdk.googleapisOAuth2 client and a long-lived refresh token, scoped to webmasters.readonly.
SITE_URL or SITES); seeMultiple sites above.
webmasters.readonly).config.json / refresh token are stored locally and never leave yourmachine except to talk to Google's API. Do not commit them.
Google Account → Security → Third-party access.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.