{"slug": "show-hn-google-search-console-mcp", "title": "Show HN: Google Search Console MCP", "summary": "A developer released an open-source MCP server that gives AI assistants read-only access to Google Search Console data across all properties using a single service-account credential. The tool lets users query top queries, page indexing status, and sitemap stats via natural language without logging into the Search Console interface. It authenticates with a read-only Google service account and works with Claude Code, Claude Desktop, Cursor, and other MCP clients.", "body_md": "Give your AI assistant read access to your [Google Search Console](https://search.google.com/search-console) data — across every property you own.\n\nChecking how a site is doing on Google usually means logging into Search Console, picking a property, fiddling with date ranges, and eyeballing charts. This connects your assistant (Claude Code, Claude Desktop, Cursor, or any MCP client) straight to the Search Console API, so you can just ask — \"what are my top queries this month?\" or \"is this page indexed yet?\" — and get the numbers back in seconds.\n\nOne service-account credential covers **all** your properties at once, so you can ask across sites without switching accounts. And because the credential is read-only, your assistant can look but never touch.\n\n**It does:**\n\n- List every Search Console property the credential can read.\n- Pull clicks, impressions, CTR, and average position — grouped by query, page, date, country, device, or search appearance.\n- Check the index status of any URL (indexed or not, last crawl, canonical, coverage state, mobile usability).\n- Show your submitted sitemaps and their indexed-vs-submitted counts.\n\n**It does not:**\n\n**Write anything.** The credential uses Google's read-only Search Console scope, so it cannot submit sitemaps, change settings, add or remove properties, or modify your account in any way.- Bypass Search Console's own data limits. It sees exactly what the API exposes — the same ~16-month window and sampling Google gives everyone.\n- Send your data anywhere except between your machine and Google's API. There is no third-party server in the middle.\n\nYou need:\n\n- A\n**Google Cloud project** and the`gcloud`\n\nCLI (or the Cloud Console) to create a service account. - One or more\n**verified Google Search Console properties** you can grant access on. [Node.js](https://nodejs.org/)22.5 or newer.- An MCP-capable assistant (for example\n[Claude Code](https://claude.com/claude-code)).\n\nThe server authenticates as a **service account** — a robot Google identity with its own email. You create it once, grant it read access on each property, and it can then read all of them.\n\n```\ngcloud config set project YOUR_PROJECT_ID\ngcloud services enable searchconsole.googleapis.com\ngcloud iam service-accounts create gsc-reader --display-name=\"GSC Reader\"\n\nmkdir -p ~/.config/gsc-mcp\ngcloud iam service-accounts keys create ~/.config/gsc-mcp/key.json \\\n  --iam-account=gsc-reader@YOUR_PROJECT_ID.iam.gserviceaccount.com\n```\n\nThat writes a JSON key to `~/.config/gsc-mcp/key.json`\n\n. Keep it private — it is a credential, not config. (This repo's `.gitignore`\n\nalready blocks `*key*.json`\n\nso you can't commit it by accident.)\n\nThe service account lives in one Cloud project, but its identity works for any property you grant it on — the project choice does not matter.\n\nIn [Search Console](https://search.google.com/search-console), open each property → **Settings → Users and permissions → Add user**. Add the service-account email (`gsc-reader@YOUR_PROJECT_ID.iam.gserviceaccount.com`\n\n) with the **Restricted** (read) role.\n\nAdding a new site later is just one more grant here — no code or config changes.\n\n```\ngit clone https://github.com/AkashRajpurohit/gsc-mcp.git\ncd gsc-mcp\nnpm install\n```\n\nThen register it with your assistant. Note the full path to `mcp.mjs`\n\n— you will need it below:\n\n```\necho \"$PWD/mcp.mjs\"\nclaude mcp add gsc --scope user -- node \"$PWD/mcp.mjs\"\n```\n\n`--scope user`\n\nregisters it for every Claude Code session on the machine. Restart the session (or start a new one) to pick up the tools.\n\nOpen **Settings → Developer → Edit Config** (or edit `claude_desktop_config.json`\n\ndirectly) and add:\n\n```\n{\n  \"mcpServers\": {\n    \"gsc\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/gsc-mcp/mcp.mjs\"]\n    }\n  }\n}\n```\n\nRestart Claude Desktop.\n\nOpen **Settings → MCP → Add new global MCP server** (or edit `~/.cursor/mcp.json`\n\n) and add the same `gsc`\n\nentry as above:\n\n```\n{\n  \"mcpServers\": {\n    \"gsc\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/gsc-mcp/mcp.mjs\"]\n    }\n  }\n}\n```\n\nEdit `~/.codeium/windsurf/mcp_config.json`\n\nand add the same `gsc`\n\nentry under `mcpServers`\n\n.\n\nAdd it to `.vscode/mcp.json`\n\nin your workspace (or run **MCP: Add Server** from the Command Palette):\n\n```\n{\n  \"servers\": {\n    \"gsc\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/gsc-mcp/mcp.mjs\"]\n    }\n  }\n}\n```\n\nIf your key is not at the default path, add\n\n`\"env\": { \"GSC_KEY_PATH\": \"/absolute/path/to/key.json\" }`\n\nto any of the entries above.\n\nRegister a **stdio** server that runs `node /absolute/path/to/gsc-mcp/mcp.mjs`\n\n. That is all the server needs.\n\nOnce registered, start a new session and ask your assistant to \"list my Search Console sites.\" If it comes back with your properties, you are ready.\n\nJust talk to your assistant. For example:\n\n- \"List all my Search Console properties.\"\n- \"What are my top 20 queries for example.com over the last 28 days?\"\n- \"Show me the pages losing clicks this month compared to last.\"\n- \"Which queries have high impressions but a low CTR?\"\n- \"Is\n`https://example.com/blog/my-post/`\n\nindexed by Google?\" - \"How many URLs did my sitemap submit vs get indexed?\"\n\nBehind the scenes it offers four tools your assistant uses automatically:\n\n| Tool | What it does |\n|---|---|\n`gsc_list_sites` |\nLists readable properties and their exact `siteUrl` values. |\n`gsc_search_analytics` |\nClicks, impressions, CTR, and position grouped by query, page, date, country, device, or search appearance. |\n`gsc_inspect_url` |\nIndex status of a single URL (indexed, last crawl, canonical, coverage). |\n`gsc_list_sitemaps` |\nSubmitted vs indexed counts per sitemap, with errors and warnings. |\n\nEvery tool is **read-only** — the underlying credential physically cannot change anything in your account.\n\nThere's a small CLI wrapping the same core, handy for a sanity check:\n\n```\nnode cli.mjs sites\nnode cli.mjs perf     \"sc-domain:example.com\"\nnode cli.mjs pages    \"sc-domain:example.com\"\nnode cli.mjs queries  \"sc-domain:example.com\"\nnode cli.mjs inspect  \"sc-domain:example.com\" \"https://example.com/blog/my-post/\"\nnode cli.mjs sitemaps \"sc-domain:example.com\"\n```\n\nDomain properties look like `sc-domain:example.com`\n\n; URL-prefix properties look like `https://example.com/`\n\n. Run `node cli.mjs sites`\n\nfirst to see the exact `siteUrl`\n\nfor each of your properties.\n\n| Variable | Default | Description |\n|---|---|---|\n`GSC_KEY_PATH` |\n`~/.config/gsc-mcp/key.json` |\nPath to the service-account JSON key. |\n\n```\nMCP client ──stdio──▶ mcp.mjs ──▶ gsc.mjs ──▶ Google Search Console API\n                      (tools)     (auth + calls)   (service-account key)\n```\n\n`gsc.mjs`\n\n— the Google API client. Authenticates with the service-account key and wraps the Search Console API (sites, search analytics, URL inspection, sitemaps).`mcp.mjs`\n\n— the MCP server (stdio transport) that exposes those tools to your assistant.`cli.mjs`\n\n— the same core, runnable by hand.\n\nThe core (`gsc.mjs`\n\n) is transport-agnostic. To run this as an always-on remote MCP instead of a local stdio process, containerize it, expose it over HTTP/SSE behind an authenticating proxy, mount the key as a secret, and register the remote URL with your client — only the hosting changes.\n\n— the service account isn't granted on any property yet. Re-check step 2: the email you added in Search Console must match your key's`gsc_list_sites`\n\nreturns an empty list`client_email`\n\nexactly.**Auth or \"file not found\" errors**— the key isn't where the server expects it. Confirm the path, or set`GSC_KEY_PATH`\n\nto point at it.**A specific property 403s**— that one property hasn't been shared with the service account. Add it under Users and permissions.\n\n**This project is not affiliated with, endorsed by, or associated with Google in any way.** It is an independent, open-source tool that talks to Google's public Search Console API using credentials you create and control. \"Google Search Console\" is a trademark of Google LLC and is used here only to describe what the tool works with.\n\nThe tool is released under the MIT license (see `LICENSE`\n\n). It is provided as-is, with no warranty. It only ever uses Google's read-only Search Console scope, so it can read your data but never modify your account.", "url": "https://wpnews.pro/news/show-hn-google-search-console-mcp", "canonical_source": "https://github.com/AkashRajpurohit/gsc-mcp", "published_at": "2026-07-18 05:34:56+00:00", "updated_at": "2026-07-18 05:51:27.450353+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools"], "entities": ["Google Search Console", "Claude Code", "Claude Desktop", "Cursor", "Google Cloud", "AkashRajpurohit"], "alternates": {"html": "https://wpnews.pro/news/show-hn-google-search-console-mcp", "markdown": "https://wpnews.pro/news/show-hn-google-search-console-mcp.md", "text": "https://wpnews.pro/news/show-hn-google-search-console-mcp.txt", "jsonld": "https://wpnews.pro/news/show-hn-google-search-console-mcp.jsonld"}}