Skip to main content
Glama
Walma-Labs

Google Search Console MCP server

by Walma-Labs

gsc-mcp — Google Search Console MCP server

A small, read-only Model Context Protocol server that gives Claude, Cursor, Claude Code and any other MCP client access to Google Search Console: search analytics, period comparisons, sitemaps and URL inspection.

Built and used daily by Walma AI to run our own SEO through Claude Code. There is a longer write-up in our guide: Google Search Console MCP.

Why service-account auth: no personal Google login on the machine that runs the agent, a key you can rotate and revoke, and read-only scope. Right for teams and for servers.

Tools

Tool

What it does

list_sites

Properties the service account can see, with permission level

search_analytics

Clicks, impressions, CTR and position by date, query, page, country, device or search appearance, with filters and pagination

compare_periods

Two date ranges side by side with deltas, site-wide or per dimension

list_sitemaps

Submitted sitemaps with status, errors and indexed counts

inspect_url

URL Inspection: index status, canonical, last crawl, mobile and rich-result verdicts

Everything is read-only (webmasters.readonly scope). The server cannot change anything in Search Console.

Related MCP server: gsc-mcp-connector

Setup

1. Create a service account and key

  1. In Google Cloud Console, pick or create a project.

  2. Enable the Google Search Console API (searchconsole.googleapis.com).

  3. IAM & Admin → Service accounts → Create. No project roles are needed.

  4. Keys → Add key → JSON. Save the file somewhere outside any repository, for example ~/.config/gcloud/gsc-service-account.json.

2. Give the service account access in Search Console

In Search Console, for each property: Settings → Users and permissions → Add user → the service account's e-mail (...@...iam.gserviceaccount.com).

  • Full is enough for search_analytics, compare_periods and list_sitemaps.

  • inspect_url needs Owner or Full depending on the property type.

3. Install

With uv (no clone needed):

uvx --from git+https://github.com/Walma-Labs/gsc-mcp gsc-mcp

Or with pipx:

pipx install git+https://github.com/Walma-Labs/gsc-mcp

Or from a clone:

git clone https://github.com/Walma-Labs/gsc-mcp && cd gsc-mcp
python -m venv .venv && .venv/bin/pip install -e .

4. Add it to your client

The server reads one environment variable, GSC_SERVICE_ACCOUNT_FILE, the path to the JSON key.

Claude Code

claude mcp add --transport stdio gsc \
  -e GSC_SERVICE_ACCOUNT_FILE=~/.config/gcloud/gsc-service-account.json \
  -- uvx --from git+https://github.com/Walma-Labs/gsc-mcp gsc-mcp

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "gsc": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/Walma-Labs/gsc-mcp", "gsc-mcp"],
      "env": { "GSC_SERVICE_ACCOUNT_FILE": "/Users/you/.config/gcloud/gsc-service-account.json" }
    }
  }
}

Cursor (.cursor/mcp.json or ~/.cursor/mcp.json)

{
  "mcpServers": {
    "gsc": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/Walma-Labs/gsc-mcp", "gsc-mcp"],
      "env": { "GSC_SERVICE_ACCOUNT_FILE": "/Users/you/.config/gcloud/gsc-service-account.json" }
    }
  }
}

Use absolute paths in the desktop clients; they do not expand ~ or inherit your shell's PATH.

Using it

Properties are addressed the way the API addresses them: sc-domain:example.com for domain properties, https://example.com/ for URL-prefix properties. Ask the agent to run list_sites first if unsure.

Things it is good at:

  • "Which queries drive the most clicks to /pricing, and what is our average position for each?"

  • "Compare the last 28 days with the previous 28. Which pages lost the most clicks, and which queries on those pages dropped?"

  • "Queries with more than 500 impressions where we rank between 11 and 20."

  • "Is /guides/mcp indexed, and what does Google consider the canonical?"

  • "List sitemaps and any with errors."

Two things to tell the agent: Search Analytics data lags about two days (the server defaults to a range ending two days ago), and Google anonymises long-tail queries, so totals by query will not match totals by page.

Running it for a team

The key file grants read access to all your search data. On a laptop it is one lost machine away from a leak, and calls are not attributable to a person. For a team, put the server behind a gateway that holds the key centrally, exposes the server to approved users and logs each query. That is how we run it at Walma, behind Walma AI Hub inside our own EU tenant, next to Google Ads, GA4 and Ahrefs.

Development

.venv/bin/pip install -e .
GSC_SERVICE_ACCOUNT_FILE=~/.config/gcloud/gsc-service-account.json .venv/bin/gsc-mcp

The server speaks MCP over stdio. Test it with the MCP Inspector:

npx @modelcontextprotocol/inspector .venv/bin/gsc-mcp

License

MIT. Copyright (c) 2026 Walma AI AB.

Available Tools

5 tools
compare_periodsB

Compare two date ranges side by side with deltas.

With no dimension, returns site-wide totals for both periods. With a dimension (query, page, country, device), returns the top rows by current clicks with previous-period values and deltas; rows that only exist in one period are included with zeros for the other.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteYes
filtersNo
dimensionNo
row_limitNo
current_endYes
search_typeNoweb
previous_endYes
current_startYes
previous_startYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully discloses the edge-case behavior of rows existing in only one period (included with zeros), which is valuable. However, it omits auth/permission needs, whether the operation is read-only, and pagination semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by two well-structured conditional behavior sentences. Efficient, with only minor redundancy between the two period-behavior sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists so return-value explanation is not required, and the description covers the dimension-mode behavior. But with 0% schema coverage and no annotations, the omission of behavioral and parameter details leaves real gaps for a 9-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 9 parameters, so the description must compensate. It only explains the effect of dimension (and partially row_limit via 'top rows'), leaving site, filters, search_type, and the four date parameters undocumented in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (compare) and resource (two date ranges) plus the core output (deltas). Clearly distinguishes itself from siblings like search_analytics, though it doesn't name an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage through describing the with-dimension vs no-dimension behaviors, which helps an agent choose the mode, but there is no explicit when-to-use/when-not guidance or named alternative to search_analytics.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_urlB

Run URL Inspection for a page: index status, coverage verdict, canonical (Google vs user), last crawl, robots/indexing state, mobile and rich-result verdicts. Quota: 2000 calls/day per property. Requires Owner or Full access.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
siteYes
languageNoen-US

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does meaningful work: it discloses a hard quota (2000 calls/day per property) and the required access level (Owner or Full). It does not state whether the call is purely read-only or what happens on quota exhaustion, but quota and permission disclosure is exactly the context an agent needs before invoking.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the purpose front-loaded and constraints trailing as a short qualification. The enumerated output list is dense but each item is a distinct verdict an agent may care about, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description needn't explain return shape (the enumerated verdicts are partly redundant with it). It covers operational constraints well but leaves parameter formats undocumented, which matters most for a tool whose schema provides zero prose. Adequate overall, with a clear gap on inputs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for all three parameters, so the description is the only place meaning could be added – and it adds none. 'site' in particular is ambiguous (property format such as sc-domain: vs. URL prefix) and 'url' is unspecified, so an agent must guess formats for the two required arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run URL Inspection for a page') and enumerates the concrete outputs: index status, coverage verdict, canonical, last crawl, robots state, mobile and rich-result verdicts. It does not name or distinguish itself from any sibling (list_sites, search_analytics, compare_periods, list_sitemaps), though the operation is distinct enough that confusion is unlikely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the enumerated outputs – an agent infers this is for diagnosing how a single URL is indexed. There is no explicit when-to-use, no when-not-to-use, and no alternative named for the adjacent tasks (e.g. comparing periods or pulling analytics), so the routing burden is left to the reader.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sitemapsB

List submitted sitemaps for a property with status, last download, errors/warnings and indexed URL counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. 'List' implies a non-mutating read and the sentence discloses the payload (status, last download, errors/warnings, indexed URL counts), which is useful. However, it says nothing about auth/permission requirements, rate limits, or whether an unverified property errors out.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler: verb, resource, and scope come first, followed by the field list. Efficient, though the trailing field enumeration is somewhat redundant given an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema is present, so the description's field enumeration is largely redundant, and the omission of usage context and parameter format is the real gap. For a simple one-parameter read tool it is adequate but not fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'site' parameter has 0% schema description coverage, so the description must compensate. It only implies 'site' means 'a property' and gives no expected format (full URL vs. domain vs. property ID), leaving the agent to guess the accepted value shape.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List submitted sitemaps for a property') and names the returned fields, so an agent can immediately tell it apart from list_sites, search_analytics, compare_periods, and inspect_url. It stops short of explicitly contrasting itself with those siblings, but the resource noun is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisite (e.g., the property must already be verified/added), and no mention of which sibling to prefer for other reporting needs. The only signal is the implied 'list' semantics from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sitesA

List Search Console properties the service account has access to, with the permission level for each.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden. It does convey the read-only nature through the 'List' verb and discloses that permission level is returned per property, but it says nothing about auth scope beyond 'service account', rate limits, or pagination behavior. Useful but incomplete for a no-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler. The verb and resource lead, and the returned attribute is appended without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return formatting need not be explained, and with zero parameters the call surface is trivially complete. The only shortfall is the absent usage/positioning context, which is minor for a simple zero-arg read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric the baseline is 4. There is no parameter surface for the description to clarify, and it correctly does not invent any.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and a precise resource ('Search Console properties the service account has access to'), plus the returned attribute (permission level per property). This is clearly distinguishable from siblings like list_sitemaps (sitemaps of a site) and search_analytics (query data), so an agent can route without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use, prerequisites, or alternative routing is stated. The description never tells the agent when to prefer this over inspect_url or list_sitemaps, nor that it is typically the discovery/entry-point call. The purpose alone weakly implies usage, but no explicit guidance is offered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_analyticsA

Query Search Analytics (clicks, impressions, CTR, position).

Args: site: Property URL, e.g. 'sc-domain:example.com' or 'https://example.com/'. start_date / end_date: YYYY-MM-DD. Defaults to the last 28 days ending 2 days ago. dimensions: Any of date, query, page, country, device, searchAppearance. Omit for site-wide totals. row_limit: 1-25000 (default 100). Use start_row to paginate. filters: List of {"dimension": "query|page|country|device|searchAppearance", "operator": "equals|contains|notContains|includingRegex|excludingRegex", "expression": "..."}. Multiple filters are ANDed. search_type: web (default), image, video, news, discover, googleNews.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteYes
filtersNo
end_dateNo
row_limitNo
start_rowNo
dimensionsNo
start_dateNo
search_typeNoweb

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses useful operational traits such as the default date range ending 2 days ago, pagination via start_row, and that multiple filters are ANDed, but it does not mention authentication requirements, rate limits, or explicitly confirm read-only safety.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, then organized cleanly into an Args block matching the parameters. Every sentence provides needed detail without redundancy, and the size is appropriate for an 8-parameter tool with no schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity, absent annotations, and 0% schema description coverage, the description is largely complete for correct invocation. It covers nearly all parameter semantics and behavioral defaults, though it omits auth/permission notes and does not route the agent between this tool and compare_periods.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage across 8 parameters, and the description compensates thoroughly. It explains site URL format, date formats and defaults, valid dimensions, row_limit range and default, filter object structure with operators, and search_type values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: 'Query Search Analytics', and enumerates the returned metrics (clicks, impressions, CTR, position). It is clearly distinguishable from most siblings like list_sites and inspect_url, but it does not explicitly differentiate itself from compare_periods, which is also analytics-related.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The Args section explains how to use parameters (defaults, dimension omission for site-wide totals, pagination, filters), which implies when the tool is appropriate. However, it never states when to choose this tool over alternatives such as compare_periods, nor does it provide explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedcompare_periods
    • First observedinspect_url
    • First observedlist_sitemaps
    • First observedlist_sites
    • First observedsearch_analytics

TDQS

A3.6/5.0

Scored across 5 tools

Disambiguation4/5

Each tool has a distinct purpose: list_sites, search_analytics, compare_periods, list_sitemaps, inspect_url. Potential minor confusion between search_analytics and compare_periods (both query analytics data), but descriptions clarify the difference (single vs two periods).

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (list_sites, search_analytics, compare_periods, list_sitemaps, inspect_url). No deviations or mixing of conventions.

Tool Count5/5

5 tools is well-scoped for a Google Search Console server, covering core operations without bloat. Each tool serves a clear purpose.

Completeness3/5

Covers listing sites, analytics, sitemaps, and URL inspection, but missing operations for managing sitemaps (submit, delete) and site property management (add, delete). These gaps could cause agent dead ends for common tasks.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Model Context Protocol (MCP) server that provides AI agents with access to Google Search Console data.
    25
    555 npm
    289
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Self-hosted MCP server that exposes Google Search Console tools (list sites, query analytics, inspect URL, list sitemaps) via natural language to AI assistants like ChatGPT and Claude.
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Self-hosted Google Search Console MCP server deployable to Cloudflare Workers, allowing natural language queries of GSC data via ChatGPT, Claude, or any MCP-capable client.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Self-hosted MCP server for Google Search Console. Enables natural language queries to list sites, analyze search analytics, inspect URLs, and check sitemaps through AI assistants.
    MIT