Context7
Feeds AI the latest docs for libraries and frameworks before it answers, so code it writes does not use outdated, removed functions.
Description from the maker (original English)
MCP server for Google Search Console: properties, sitemaps, search analytics and URL inspection
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
GSC_SERVICE_ACCOUNT_KEY, GSC_SERVICE_ACCOUNT_KEY_FILE, GSC_CLIENT_ID, GSC_CLIENT_SECRET, GSC_REFRESH_TOKEN, GOOGLE_APPLICATION_CREDENTIALS, GSC_SITE_URL, GSC_ALLOWED_SITES, GSC_READ_ONLY, GSC_ALLOW_TOOLS, GSC_DENY_TOOLSValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"google-search-console": {
"command": "npx",
"args": [
"-y",
"@ni-c/google-search-console-mcp"
],
"env": {
"GSC_SERVICE_ACCOUNT_KEY": "your-value",
"GSC_SERVICE_ACCOUNT_KEY_FILE": "your-value",
"GSC_CLIENT_ID": "your-value",
"GSC_CLIENT_SECRET": "your-value",
"GSC_REFRESH_TOKEN": "your-value",
"GOOGLE_APPLICATION_CREDENTIALS": "your-value",
"GSC_SITE_URL": "your-value",
"GSC_ALLOWED_SITES": "your-value",
"GSC_READ_ONLY": "your-value",
"GSC_ALLOW_TOOLS": "your-value",
"GSC_DENY_TOOLS": "your-value"
}
}
}
}Run this in your terminal
claude mcp add google-search-console --env GSC_SERVICE_ACCOUNT_KEY=your-value --env GSC_SERVICE_ACCOUNT_KEY_FILE=your-value --env GSC_CLIENT_ID=your-value --env GSC_CLIENT_SECRET=your-value --env GSC_REFRESH_TOKEN=your-value --env GOOGLE_APPLICATION_CREDENTIALS=your-value --env GSC_SITE_URL=your-value --env GSC_ALLOWED_SITES=your-value --env GSC_READ_ONLY=your-value --env GSC_ALLOW_TOOLS=your-value --env GSC_DENY_TOOLS=your-value -- npx -y @ni-c/google-search-console-mcpFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"google-search-console": {
"command": "npx",
"args": [
"-y",
"@ni-c/google-search-console-mcp"
],
"env": {
"GSC_SERVICE_ACCOUNT_KEY": "your-value",
"GSC_SERVICE_ACCOUNT_KEY_FILE": "your-value",
"GSC_CLIENT_ID": "your-value",
"GSC_CLIENT_SECRET": "your-value",
"GSC_REFRESH_TOKEN": "your-value",
"GOOGLE_APPLICATION_CREDENTIALS": "your-value",
"GSC_SITE_URL": "your-value",
"GSC_ALLOWED_SITES": "your-value",
"GSC_READ_ONLY": "your-value",
"GSC_ALLOW_TOOLS": "your-value",
"GSC_DENY_TOOLS": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"google-search-console": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@ni-c/google-search-console-mcp"
],
"env": {
"GSC_SERVICE_ACCOUNT_KEY": "your-value",
"GSC_SERVICE_ACCOUNT_KEY_FILE": "your-value",
"GSC_CLIENT_ID": "your-value",
"GSC_CLIENT_SECRET": "your-value",
"GSC_REFRESH_TOKEN": "your-value",
"GOOGLE_APPLICATION_CREDENTIALS": "your-value",
"GSC_SITE_URL": "your-value",
"GSC_ALLOWED_SITES": "your-value",
"GSC_READ_ONLY": "your-value",
"GSC_ALLOW_TOOLS": "your-value",
"GSC_DENY_TOOLS": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
GSC_SERVICE_ACCOUNT_KEY_FILE envGSC_CLIENT_ID envGOOGLE_APPLICATION_CREDENTIALS envGSC_SITE_URL envGSC_ALLOWED_SITES envGSC_READ_ONLY envGSC_ALLOW_TOOLS envGSC_DENY_TOOLS envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 9, 2026
The registry name was verified with the GitHub account ni-c, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: GSC_SERVICE_ACCOUNT_KEY, GSC_CLIENT_SECRET, GSC_REFRESH_TOKEN
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.3.0) reached the registry 2 months ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js, Docker on your computer.
In the same category: Context7, Codebase Memory, Exa
Servers in the same category from other makers, sorted by stars.
Reading a card:↓ Downloads per weeki★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
Feeds AI the latest docs for libraries and frameworks before it answers, so code it writes does not use outdated, removed functions.
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Connect AI agents to Exa for web search, content fetching, and multi-step research.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
A Model Context Protocol (MCP) server for Google Search Console, the service that tells you how Google sees your site — this reads it and sets it up.
Lets MCP clients like Claude Code, Claude Desktop or Codex create a property and prove ownership of it, submit and refresh sitemaps, ask what any URL's index status is, and query the whole Performance report — with the irreversible operations put to a person first and the write tools switchable off entirely.
21 tools is the ceiling, not the floor: GSC_ALLOW_TOOLS=essential registers a curated five instead, and a model picks the right tool far more reliably from five than from 21 — see choosing which tools load.
It can actually create a working property. Getting one takes four steps in a fixed order — obtain a verification token, place it in DNS or on the page, verify ownership, add the property — and nothing in Google's APIs enforces that order. Calling sites.add first _succeeds_ and leaves a property that appears in every listing and answers 403 for every piece of data, which looks like a permissions bug and is not. setup_site reports which step is missing and hands over the exact DNS record to paste. Servers that expose sites.add alone can only add properties somebody already verified by hand.
Three APIs, not one. Search Console v1 is ten methods and does not include ownership. Site Verification is a separate service with its own scope, its own host and an incompatible way of naming the same site — sc-domain:example.com there is {type: INET_DOMAIN, identifier: example.com}, and passing the property spelling straight through is accepted and verifies a domain literally called sc-domain:example.com. The Indexing API is a third. All three are covered, and the translation between them is in src/site-identity.ts.
The numbers are right. Search analytics come back as a table with totals where CTR is computed from the totals rather than averaged across rows, and average position is weighted by impressions. Unweighted, a thousand rare queries ranking 80th drag a property's real average of 12 up into the nineties. The result also says plainly that the rows do not sum to the property total when the query dimension is used — Google withholds rare queries for anonymity, commonly a third or more of all impressions, and a total printed without that caveat is a number people will quote.
It knows where these APIs are sharp. The trailing slash on https://example.com/ is mandatory and its absence is a 403; a domain property and a URL-prefix property for the same site are different properties with different data, so a bare hostname is refused rather than guessed at; days are counted in Pacific Time, so a last7days computed in UTC asks for a day Google has no data for; the hour dimension silently returns nothing without dataState: HOURLY_ALL; Google omits empty arrays entirely, so a fresh credential's property list arrives as {}; and the Indexing API returns 200 for any owned URL while only acting on JobPosting and BroadcastEvent pages.
The server starts without credentials and lists its tools; every call then fails with setup instructions rather than a Google error. That is deliberate, so registries and sandbox inspectors can introspect it.
| Variable | Description |
|---|---|
GSC_SERVICE_ACCOUNT_KEY | Service account key as raw JSON, or base64-encoded JSON |
GSC_SERVICE_ACCOUNT_KEY_FILE | Path to a service account key file. Alternative to the above — setting both is an error |
GSC_CLIENT_ID | OAuth2 client id |
GSC_CLIENT_SECRET | OAuth2 client secret |
GSC_REFRESH_TOKEN | OAuth2 refresh token. All three OAuth2 variables are required together |
GOOGLE_APPLICATION_CREDENTIALS | Application default credentials, used when no GSC_ credential is set |
GSC_SITE_URL | Default property, e.g. sc-domain:example.com or https://example.com/. Makes site_url optional everywhere |
GSC_ALLOWED_SITES | Comma-separated properties this server may touch at all; anything else is refused |
GSC_READ_ONLY | true (or 1/yes) registers only the twelve read tools |
GSC_ALLOW_TOOLS | Comma-separated tool names, a list_* prefix, or essential |
GSC_DENY_TOOLS | Same shape, subtracted from whatever the allow list left |
ELICITATION | false replaces the approval dialog with the two-call token. Not prefixed |
Credentials are tried in that order — explicit beats ambient. A partial OAuth triple is a startup error rather than a reason to fall through to application default credentials, because that fallback would quietly run the server as whatever account the machine is logged into.
A service account is the recommended one: it sees only the properties you explicitly add it to, and revoking it does not touch anyone's Google account. Add its client_email under Settings → Users and permissions in Search Console, or give it ownership with verify_site. Note that the Indexing API requires owner, not full user.
An OAuth2 refresh token acts as the person who consented and sees everything they see. Its scopes were fixed at consent time and cannot be widened later.
Every visible tool costs context on every request, and a model picks the right one far more reliably from five than from 21. Two variables narrow the list:
GSC_ALLOW_TOOLS=essential # the curated five
GSC_ALLOW_TOOLS='list_*,get_site' # exact names, or one trailing * GSC_DENY_TOOLS='delete_*' # subtracted from whatever allow left
essential is list_sites, get_site, list_sitemaps, query_search_analytics and inspect_url — everything needed to look at a property, and nothing that changes it.
An entry that matches no tool stops the server with the list of real names. An ignored typo would otherwise leave a tool missing from tools/list with nothing pointing at the cause, and nobody traces an absence back to an environment variable.
If you run several of these servers at once, mcp-hub is the other answer — its /hub endpoint replaces every server's tools with six meta-tools.
Narrowing the list also narrows the credential: the OAuth scopes this server requests are derived from the tools that are actually registered, so a server denied the Indexing tools never asks for the Indexing scope.
claude mcp add google-search-console -- npx -y @ni-c/google-search-console-mcp
{
"mcpServers": { "google-search-console": { "command": "npx", "args": ["-y", "@ni-c/google-search-console-mcp"], "env": { "GSC_SERVICE_ACCOUNT_KEY_FILE": "/path/to/key.json", "GSC_SITE_URL": "sc-domain:example.com" } } } }
[mcp_servers.google-search-console]
command = "npx" args = ["-y", "@ni-c/google-search-console-mcp"]
[mcp_servers.google-search-console.env] GSC_SERVICE_ACCOUNT_KEY_FILE = "/path/to/key.json" GSC_SITE_URL = "sc-domain:example.com"
docker run --rm -i \
-v /path/to/key.json:/key.json:ro \ -e GSC_SERVICE_ACCOUNT_KEY_FILE=/key.json \ -e GSC_SITE_URL=sc-domain:example.com \ ghcr.io/ni-c/google-search-console-mcp
A client that cannot spawn a local process — ChatGPT connectors, Claude on the web, Cursor, LibreChat — reaches google-search-console-mcp through mcp-hub: one container serves many stdio MCP servers over Streamable HTTP, with an OAuth 2.1 login behind a single password and long-lived tokens for the clients that cannot do OAuth. Its /hub endpoint puts every server behind six meta-tools, so one connector reaches all of them without N×tool schemas in the model's context, and it speaks both protocol revisions — a question this server asks travels through it to the person at the far end.
Its /config/mcp.json uses Claude Code's format, so the entry is the one you already have:
{
"mcpServers": { "google-search-console": { "command": "npx", "args": ["-y", "@ni-c/google-search-console-mcp"], "env": { "GSC_SERVICE_ACCOUNT_KEY": "…", "GSC_SITE_URL": "sc-d
Only the beginning is shown; read the rest in the repo