Getting one takes four steps in a fixed order and nothing in the API enforces it — add_site on an unverified domain succeeds and leaves a property that answers 403 for every piece of data. setup_site reports which step is missing and hands over the DNS record to paste.
Three APIs, not one
Search Console 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; the Indexing API is a third. All three are covered, and the translation between them is handled for you.
Only the tools you want
GSC_READ_ONLY=true registers the twelve read tools and nothing else. GSC_ALLOW_TOOLS cuts finer — essential for a curated five, your own comma-separated list, or a whole family with list_* — and GSC_DENY_TOOLS subtracts. Whatever is filtered out does not exist on the protocol rather than failing when called, and a name that matches no tool stops the server at startup instead of quietly going missing. Narrowing the list narrows the OAuth scopes it asks Google for.
Irreversible calls ask a person
delete_site, delete_sitemap, unverify_site and update_site_owners raise a real dialog through MCP elicitation — one the model cannot answer on its behalf. Where the client cannot show one they fall back to a single-use token bound to the exact arguments, and say which of the two it was rather than implying somebody approved.
Numbers you can quote
CTR comes from the totals rather than an average of row CTRs, average position is weighted by impressions, and the result says plainly that rows do not sum to the property total when the query dimension is used.
The server talks to three separate Google services. Search Console alone cannot create a working property — ownership lives in the Site Verification API, on a different host, behind a different scope, naming the same site a different way.
The tool list is not fixed. GSC_ALLOW_TOOLS=essential narrows it to the five that cover looking at a property — which properties exist, what their sitemaps did, what the Performance report says, and whether one URL is indexed — and a name that matches nothing stops the server instead of quietly leaving a tool out of tools/list.
Narrowing the list narrows the credential with it: the OAuth scopes this server requests are derived from the tools that are actually registered. A server denied the Indexing tools never asks Google for the Indexing scope, which is the difference between working and not for a service account under domain-wide delegation.
The server starts without any configuration at all, so registries and inspectors can introspect it; every call then fails with setup instructions instead of reaching Google.
A client that cannot spawn a local process — ChatGPT connectors, Claude on the web, Cursor, LibreChat — cannot start google-search-console-mcp the way Claude Code does. mcp-hub is the bridge: 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 instead of ending at the gateway.
Its configuration is Claude Code's mcpServers format, so the entry you already have is the entry it takes: Through mcp-hub.