Announcing CIMD support for MCP Client registration
Learn more

Google Search Console MCP vs API - Which One Should Your Agent Call?

Nishant Choudhary
Tech Evangelist

TL;DR

  • Google does not publish an official Search Console MCP server. Google ships official MCP servers for products like BigQuery, Maps, Drive, and Gmail, and even one for Google Analytics 4, but Search Console is not among them. Every "GSC MCP" you will find is a community build wrapping the same Search Console API.
  • The community MCP path almost always authenticates with a Google Cloud service account JSON or a single local OAuth token. Neither models per-end-user identity, which is a hard blocker for a multi-tenant B2B agent.
  • The Search Console API is the official surface: four services (Search Analytics, URL Inspection, Sitemaps, Sites), OAuth 2.0 or a service account, and the webmasters or webmasters.readonly scope. It does not support static API keys.
  • Capability is not the axis that separates the two paths. A community server exposes only what its author chose to wrap; the API exposes the full surface, versioned and supported by Google. The real differences are auth identity, who you trust to run the code, and who maintains the tool surface.
  • Either path produces one OAuth credential per user, and neither stores, refreshes, or revokes it for you. The Scalekit Google Search Console connector wraps the official API as per-user, scoped tools and handles that credential lifecycle, so the MCP vs API choice does not change your auth infrastructure.

The choice in front of you

Your agent needs Google Search Console data. It has to pull clicks and impressions before a content review, inspect whether a freshly shipped page is indexed, or submit a sitemap after a deploy. You searched for a Search Console MCP server and found several. Here is the fact that reframes the decision: none of them are Google's. So the real choice is between a community MCP server that wraps the Search Console API and the official API itself. They differ on three axes that matter in production: who the agent authenticates as, who you trust to run the code, and who maintains the tool surface.

What Google Search Console MCP and the Search Console API actually are

Before comparing them, it helps to be precise about what each object is, because one of them is not what most people assume.

Google Search Console MCP: community servers, not an official one

There is no Google-maintained Search Console MCP server. The servers you find on package registries and GitHub are built by individual developers or third-party vendors, each wrapping some subset of the Search Console API and exposing it over the Model Context Protocol (MCP). They typically run locally over stdio, or as a self-hosted remote server, and they usually authenticate through a Google Cloud service account JSON referenced by GOOGLE_APPLICATION_CREDENTIALS, or a local OAuth token.json created once for a single Google account.

That distinction is the whole story. A community server works, but you are the one running it, updating it, and deciding whether a stranger's repository should hold a credential that reaches your Google Cloud project.

The Search Console API: the official surface

The Search Console API, formerly the Webmaster Tools API, exposes four services: Search Analytics (clicks, impressions, CTR, position, grouped by dimensions), URL Inspection (per-URL index status), Sitemaps (list, get, submit, delete), and Sites (list, get, add, delete). It authenticates with OAuth 2.0 through a user-consent flow or a service account, scoped by webmasters for writes and webmasters or webmasters.readonly for reads. There is no API key option for these calls. You can read the full surface in the official Search Console API reference.

One boundary worth stating up front: the separate Indexing API is a different product with its own service-account requirement and is limited to JobPosting and BroadcastEvent structured data. It is not part of the Search Console API and does not index general pages.

Where Scalekit's connector sits

Scalekit exposes a single Google Search Console connector, and it wraps the official Search Console API, not a community MCP server. It ships ten agent-ready tools with LLM-optimized schemas, OAuth 2.0 per user, and per-user connected accounts. You can browse the tool list and quickstart on the Scalekit Google Search Console connector docs, or find it in the full AgentKit connector catalog.

Comparing them where it matters for agents

The comparison below is between a typical community GSC MCP server and the official Search Console API. Community servers vary, so treat the MCP column as representative rather than universal.

What your agent can actually do

Capability
Community GSC MCP (typical)
Search Console API
Query search analytics (clicks, impressions, CTR, position)
Yes
Yes
Group by query, page, country, device, date
Partial (varies by server)
Yes
Hourly and fresh or partial data via dataState
Rare
Yes
URL inspection (index status)
Partial
Yes
List sites and permission levels
Usually
Yes
Add or delete a property
Rare
Yes
List and get sitemaps
Partial
Yes
Submit or delete a sitemap
Partial
Yes
Per-end-user OAuth identity
No (service account or single token)
Yes (Authorization Code)
Official versioning and support
No
Yes (Google)

The gap the table is really showing

Read the last two rows first. A community server can only expose what its author chose to wrap, and it acts as one identity: the service account or the account behind the local token. The API exposes the complete surface, and Google versions and supports it. The other rows drift toward "Partial" for the MCP column for the same reason: nobody is contractually responsible for keeping a hobby server current with the API. Capability parity is achievable on either path. Identity, trust, and maintenance ownership are not, and those are the axes an agent decision actually turns on.

The auth path each one puts you on

Auth is where the two paths diverge hardest, and where the multi-tenant reality shows up.

Community MCP: a service account or a local token

Most community GSC MCP servers expect a service account JSON or a single OAuth token.json. A service account is one identity: to reach a property, that account must be granted access to it inside Search Console, and every call runs as that account rather than as the user who triggered the agent. A local token.json is worse for multi-user products, because it represents exactly one Google account. Neither shape expresses per-user permissions.

The API: OAuth 2.0 or a service account, no API key

The Search Console API supports OAuth 2.0 Authorization Code for per-user consent and service accounts for server-to-server access to properties you control. The scopes are webmasters and webmasters.readonly. There is no static API key, so an agent acting for many users needs a real consent flow per user, which is the architecturally correct model and also the one that creates credential-management work.

What multi-tenant B2B actually requires

For a B2B agent serving forty marketers across eight customer organizations, the correct model is one OAuth grant per user, scoped to the properties that user can see. That is forty tokens to store, refresh, and revoke. A shared service account collapses all forty into one identity and one permission set, which is both a security failure and an accuracy failure: what one user cannot see, the agent should not be able to reach. The principle is simple. What the user cannot do, the agent cannot do. See access control for multi-tenant AI agents for the full argument.

What you own in production

Both paths leave you holding operational surface area. They just hand you different pieces.

Running and trusting a community server

With a community MCP server you own the runtime and the supply chain. You host it, patch it, and decide whether an unaffiliated repository should hold a credential to your Google Cloud project. There is no versioning contract, so a server update can change tool names or schemas under you, and there is no support channel when it does.

Owning the raw API surface

With the raw API you own request construction, error handling, retries, pagination, and the OAuth lifecycle across four services. You also write and maintain the tool schemas that turn searchanalytics.query, urlInspection.index.inspect, sitemaps, and sites into definitions an LLM can call. Every API change is now your maintenance task.

Schema drift, quotas, and the percent-encoding trap

Quotas are a production constraint on both paths. Search Analytics accepts a rowLimit from 1 to 25,000 per request, and URL Inspection is capped at roughly 2,000 queries per property per day at the time of writing, so a batch inspection agent hits the ceiling fast. There is also a sharp edge: the API requires siteUrl as a single percent-encoded path segment. On the raw API you write that encoding into every request; with a maintained connector the schema documents it and the model fills it in, though it remains a place to watch.

When to use MCP, when to use the API

The paths are not interchangeable, and the right answer depends on who the agent serves.

Use a Google Search Console MCP when

  • You are a single practitioner analyzing your own properties from an interactive client like Claude Desktop, Cursor, or a coding agent.
  • The work is exploratory and local, and a service account or a one-time local token for one Google account is acceptable.
  • You are comfortable running, updating, and vetting the server yourself, and the community server you chose already exposes the actions you need.

Use the Search Console API directly when

  • You are running a deterministic, scheduled pipeline where you control endpoint versioning and cannot absorb an unplanned schema change.
  • You need the full surface, including property and sitemap management, not just the subset a given community server wrapped.
  • You want headless service-account access to properties you own, plus Google's versioning and support behind the surface.

Where a managed connector changes the math

If your agent serves other people, each connecting their own Search Console, neither raw path is complete. That is the case a managed connector is built for: per-user OAuth, a maintained tool surface over the official API, and no server for you to host or trust. For the broader framing of this tradeoff, see MCP vs APIs and how they differ.

The credential problem neither path solves

There is a problem that sits underneath the MCP vs API choice, and it does not go away no matter which you pick.

What both paths hand you

Both paths produce a credential per user. The API's Authorization Code flow gives you an OAuth token per user; a community server that uses per-user OAuth gives you the same. That token is the beginning of the work, not the end of it.

What neither path manages

A token has to live somewhere outside the agent runtime, encrypted at rest and isolated per tenant. Access tokens expire and must be refreshed proactively rather than on a 401, or concurrent agent threads race each other into retry storms. When a marketer leaves or a customer churns, you need to surface and revoke every credential tied to that identity. Neither the Search Console API nor a community MCP server does any of this for you. In a multi-tenant agent that is N credentials, each with its own lifecycle. For the mechanics, see token vault for AI agent workflows and how to handle token refresh.

Where Scalekit fits

The Scalekit Google Search Console connector handles the OAuth flow, per-user token storage, and automatic refresh, so the MCP vs API decision stops touching your auth infrastructure. Credentials never enter the agent runtime; your code executes against a scoped identifier, not a raw token.

Connecting Google Search Console with Scalekit

The pattern below is per-user by default. It authorizes one user, loads only the tools that user's connected account is allowed to call, and runs a standard Claude tool-use loop. The example uses Python and the Anthropic SDK; the same connected-account pattern works in TypeScript via the Node SDK and in LangChain, Google ADK, and CrewAI.

Create the connection and the per-user connected account

Create a connection named googlesearchconsole once in the Scalekit dashboard, then resolve the current user from your own authenticated session. The identifier is your system's user ID; never accept it from the client.

import os import anthropic import scalekit.client from dotenv import find_dotenv, load_dotenv from google.protobuf.json_format import MessageToDict load_dotenv(find_dotenv()) scalekit_client = scalekit.client.ScalekitClient( client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"), ) actions = scalekit_client.actions client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) CONNECTION = "googlesearchconsole" identifier = "user_123" # resolve from your authenticated session in production # 1. Ensure this user has an active connected account account = actions.get_or_create_connected_account( connection_name=CONNECTION, identifier=identifier, ) if account.connected_account.status != "ACTIVE": link = actions.get_authorization_link(connection_name=CONNECTION, identifier=identifier) print("Authorize Google Search Console:", link.link) input("Press Enter after authorizing...")

Discover the tools the user is authorized to call

The next call is the one that separates a per-user agent from a shared-credential agent. Your code is not loading a flat connector catalog; it is loading only the tools this user's connected account is authorized to call, in Anthropic's native format, so there are no schemas to hand-write.

# 2. Load only the tools this user's connected account can call scoped_response, _ = actions.tools.list_scoped_tools( identifier=identifier, filter={"connection_names": [CONNECTION]}, page_size=100, ) llm_tools = [ { "name": MessageToDict(t.tool).get("definition", {}).get("name"), "description": MessageToDict(t.tool).get("definition", {}).get("description", ""), "input_schema": MessageToDict(t.tool).get("definition", {}).get("input_schema", {}), } for t in scoped_response.tools ] print(f"Discovered {len(llm_tools)} Google Search Console tools")

For a read-only reporting agent, Claude will reach for tools like googlesearchconsole_list_sites and googlesearchconsole_query_search_analytics; a technical-SEO agent adds googlesearchconsole_inspect_url and the sitemap tools. The exact ten tool names and their parameters live in the connector docs.

Run the agent loop with Claude

This is the standard Anthropic tool-use loop. Claude decides what to call, your code executes the tool through Scalekit against the user's connected account, and the result goes back until Claude produces a final answer. The token never touches your loop.

# 3. Standard Claude tool-use loop messages = [{ "role": "user", "content": ( "List my Search Console sites, then show clicks and impressions " "for the top queries on my main property over the last 28 days." ), }] while True: response = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, tools=llm_tools, messages=messages, ) if response.stop_reason == "end_turn": print(response.content[0].text) break tool_results = [] for block in response.content: if block.type == "tool_use": try: result = actions.execute_tool( tool_name=block.name, identifier=identifier, tool_input=block.input, ) content = str(result.data) except Exception as e: content = f"Error: {e}" tool_results.append({ "type": "tool_result", "tool_use_id": block.id, "content": content, }) messages.append({"role": "assistant", "content": response.content}) messages.append({"role": "user", "content": tool_results})

Scalekit maintains the connector, so when the Search Console API changes, the tool definitions refresh on their side and your agent code stays the same. Start from the AgentKit quickstart if this is your first connector.

Observability: auth logs for every downstream tool call

An SEO agent that quietly reads the wrong property, or writes a sitemap deletion nobody asked for, is a problem you only catch if the actions are recorded.

What gets recorded

Because every execute_tool call runs through Scalekit against a specific connected account, each one is a logged event: which identifier acted, which connected account was used, which tool ran, when, and whether it succeeded or failed. That record is queryable rather than scattered across your own print statements. See agent tool observability and the deeper write-up on audit trails for agent auth.

Why it matters for GSC agents

Search Console data is delayed, so an agent's read is often the thing a decision rests on, and a mutation like a sitemap submit or a property removal has real downstream effect. On a self-run community server or the raw API you build this audit trail yourself. On the connector it is a property of every tool call, which is exactly what a security reviewer asks for when your agent starts touching customer properties.

Virtual MCP for multi-tool and multi-tenant Search Console agents

Search Console rarely travels alone. A useful agent pairs a ranking drop with GA4 numbers, a content calendar, and a note in Slack, and it does that for many customers at once.

One server definition, per-user session tokens

A Virtual MCP Server gives every agent a scoped, user-specific MCP endpoint with no server to deploy, host, or maintain. One server definition serves all users; before each run, a short-lived session token is minted scoped to that specific user's connected accounts. The endpoint is static; the identity is per-user. That is the piece the community MCP path cannot give you, because a self-hosted server acts as one identity for everyone.

Least-privilege tool subsets

A Virtual MCP server exposes only the tools you explicitly allow, not everything the connector defines. A read-only SEO reporter can be limited to googlesearchconsole_query_search_analytics, googlesearchconsole_inspect_url, and the list tools, with add_site, delete_site, and delete_sitemap left out entirely, which shrinks the blast radius and reduces tool bloat in context. For when this pattern pays off, see how tool calling auth changes when you move from single-tenant to multi-tenant.

Which one to build against

If your agent is a personal SEO assistant working your own properties from an interactive client, a community GSC MCP server is a legitimate, fast start, as long as you accept that you run and trust it. If your agent is a deterministic pipeline that needs the full surface and Google's versioning, build against the Search Console API directly. If your agent serves other people, each with their own Search Console, use a maintained connector so per-user OAuth and the credential lifecycle are handled at the infrastructure layer. The one question that decides it: does the agent act for many users, each with their own properties? If yes, the credential problem is the real work, and that is what needs production-grade infrastructure regardless of the path.

Build your Google Search Console agent

Start from the Scalekit Google Search Console connector docs, browse the full connector catalog, and check AgentKit pricing when you are ready to scale. Building now and want a hand? Join the Scalekit Slack community, or talk to us for immediate help.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
zero upfront cost.

Every feature unlocked. No hidden fees.