# Google Search Console (pypi · open-gsc-mcp)

Search Console analytics, hourly data, URL inspection and sitemaps, with guards for API quirks.

- Trust score: 91/100 (high trust)
- Change this week: +18
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- pypi · `open-gsc-mcp`: 91/100 (this document), [markdown](https://verifymcp.io/servers/onlymoein-google-search-console-mcp/open-gsc-mcp.md), [page](https://verifymcp.io/servers/onlymoein-google-search-console-mcp/open-gsc-mcp)

## Channel facts

- Registry: `pypi`
- Package: `open-gsc-mcp`
- Version: `1.4.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs uv_build at install time, a recognised build step with no custom scripting around it.
  - 2 of 43 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to onlymoein/google-search-console-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 20 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 75/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 5137 tokens (~233/item across 22 items; 22 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 70/100
  - Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 99/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 96% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 23 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Google Search Console MCP server?

Google Search Console runs locally as a PyPI package, launched with uvx open-gsc-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add onlymoein-google-search-console-mcp -- uvx open-gsc-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "onlymoein-google-search-console-mcp": {
      "command": "uvx",
      "args": [
        "open-gsc-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "onlymoein-google-search-console-mcp": {
      "command": "uvx",
      "args": [
        "open-gsc-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add onlymoein-google-search-console-mcp -- uvx open-gsc-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "onlymoein-google-search-console-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "open-gsc-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add onlymoein-google-search-console-mcp --command uvx --arg open-gsc-mcp
```

### Hermes

```yaml
mcp_servers:
  onlymoein-google-search-console-mcp:
    command: "uvx"
    args: ["open-gsc-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "onlymoein-google-search-console-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "open-gsc-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add onlymoein-google-search-console-mcp -t stdio -c uvx -a open-gsc-mcp
```

### Other

```json
{
  "mcpServers": {
    "onlymoein-google-search-console-mcp": {
      "command": "uvx",
      "args": [
        "open-gsc-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 91, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-11-04 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-02 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-01 (score 74, −15)

- [security regression] Malware scan: pass → unverified

### 2026-10-31 (score 89, +16)

- [security improvement] Malware scan: unverified → pass

### 2026-10-29 (score 73, −14)

- [security regression] Malware scan: pass → unverified

### 2026-10-27 (score 87, +1)

- [functional improvement] Security disclosure: unverified → pass

### 2026-10-26 (score 86, 0)

- [functional regression] Security disclosure: pass → unverified

## MCP tools (22)

### `list_sites` (~40 tokens)

List Search Console properties

List every Search Console property this account can access, with its exact
site_url and permission level. Call this first: every other tool needs a site_url.

Output parameters:

- `notes` (array)
- `sites` (array)

### `get_site` (~89 tokens)

Get a Search Console property

Get one property's exact site_url, type and this account's permission level.

Input parameters:

- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…

Output parameters:

- `permission_level` (string)
- `property_type` (string)
- `site_url` (string)

### `add_site` (~68 tokens)

Add a Search Console property

Add a property to this account. It starts unverified: ownership must be verified
in the Search Console web interface before any data is available.

Input parameters:

- `site_url` (string, required): New property: 'sc-domain:example.com' or a URL prefix such as 'https://www.example.com/'.

Output parameters:

- `action` (string)
- `done` (boolean)
- `notes` (array)
- `site_url` (string)
- `target` (string)

### `delete_site` (~60 tokens)

Delete a Search Console property

Remove a property from this account. This removes access for this account only;
it does not delete the site or other users' access. Confirm with the user first.

Input parameters:

- `site_url` (string, required): The property's exact site_url, as listed by list_sites.

Output parameters:

- `action` (string)
- `done` (boolean)
- `notes` (array)
- `site_url` (string)
- `target` (string)

### `query_search_analytics` (~375 tokens)

Query search analytics

Clicks, impressions, CTR and average position from the Performance report, grouped
by dimensions and filtered. Rows are sorted by clicks. Invalid combinations are
rejected with an explanation before Google is called. For Discover, Images, video,
Google News or the News tab, the matching query_*_analytics tool offers only what
that surface supports.

Input parameters:

- `aggregation_type` (string): 'auto' is right almost always. byProperty cannot be used with page grouping or filters, nor with Discover or Google News.
- `data_state` (string): 'all' includes fresh data that may still change and matches the Search Console UI; 'final' is finalized data only (lags 2-3 days).
- `dimensions`: Group rows by these, in order. Omit for ['query']; pass [] for property totals. searchAppearance must be the only dimension (see list_search_appearances). Discover and Google News have no query dimen…
- `end_date`: Last day (inclusive), YYYY-MM-DD in Pacific Time. Defaults to today.
- `filters`: Filters, combined with AND.
- `row_limit` (integer): Rows to return (1-25,000).
- `search_type` (string): web, image, video, news (the News tab), discover or googleNews.
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `start_date`: First day, YYYY-MM-DD in Pacific Time. Defaults to 28 days ago.
- `start_row` (integer): Zero-based row offset, for paging.

Output parameters:

- `aggregation_type`
- `data_state` (string)
- `dimensions` (array)
- `end_date` (string)
- `first_incomplete_date`
- `first_incomplete_hour`
- `next_start_row`: Pass as start_row to fetch the next page, if there is one.
- `notes` (array)
- `request` (object): The exact request body sent to Google.
- `row_count` (integer)
- `rows` (array): One object per row: dimension values by name, then clicks, impressions, ctr (0-1) and position (absent for Discover and Google News).
- `search_type` (string)
- `site_url` (string)
- `start_date` (string)

### `query_discover_analytics` (~326 tokens)

Query Discover performance

Google Discover performance: clicks, impressions and CTR by page, country or date.
Discover reports no queries, no average position and no device breakdown, and has
data only for sites that appear in Discover feeds.

Input parameters:

- `aggregation_type` (string): 'auto' aggregates by page. byNewsShowcasePanel counts News Showcase panels instead: it needs the filter searchAppearance equals NEWS_SHOWCASE and cannot group or filter by page, so dimensions default…
- `data_state` (string): 'all' includes fresh data that may still change and matches the Search Console UI; 'final' is finalized data only (lags 2-3 days).
- `dimensions`: Group rows by these. Omit for ['page'] (['date'] with byNewsShowcasePanel); [] for totals.
- `end_date`: Last day (inclusive), YYYY-MM-DD in Pacific Time. Defaults to today.
- `filters`: Filters, combined with AND.
- `row_limit` (integer): Rows to return (1-25,000).
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `start_date`: First day, YYYY-MM-DD in Pacific Time. Defaults to 28 days ago.
- `start_row` (integer): Zero-based row offset, for paging.

Output parameters:

- `aggregation_type`
- `data_state` (string)
- `dimensions` (array)
- `end_date` (string)
- `first_incomplete_date`
- `first_incomplete_hour`
- `next_start_row`: Pass as start_row to fetch the next page, if there is one.
- `notes` (array)
- `request` (object): The exact request body sent to Google.
- `row_count` (integer)
- `rows` (array): One object per row: dimension values by name, then clicks, impressions, ctr (0-1) and position (absent for Discover and Google News).
- `search_type` (string)
- `site_url` (string)
- `start_date` (string)

### `query_image_analytics` (~288 tokens)

Query Google Images performance

Performance in Google Images and the Images tab of Search: clicks, impressions,
CTR and average position within image results, by query, page, country, device
or date.

Input parameters:

- `aggregation_type` (string): 'auto' is right almost always. byProperty cannot be used with page grouping or filters.
- `data_state` (string): 'all' includes fresh data that may still change and matches the Search Console UI; 'final' is finalized data only (lags 2-3 days).
- `dimensions`: Group rows by these. Omit for ['query']; [] for totals. searchAppearance must be the only dimension.
- `end_date`: Last day (inclusive), YYYY-MM-DD in Pacific Time. Defaults to today.
- `filters`: Filters, combined with AND.
- `row_limit` (integer): Rows to return (1-25,000).
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `start_date`: First day, YYYY-MM-DD in Pacific Time. Defaults to 28 days ago.
- `start_row` (integer): Zero-based row offset, for paging.

Output parameters:

- `aggregation_type`
- `data_state` (string)
- `dimensions` (array)
- `end_date` (string)
- `first_incomplete_date`
- `first_incomplete_hour`
- `next_start_row`: Pass as start_row to fetch the next page, if there is one.
- `notes` (array)
- `request` (object): The exact request body sent to Google.
- `row_count` (integer)
- `rows` (array): One object per row: dimension values by name, then clicks, impressions, ctr (0-1) and position (absent for Discover and Google News).
- `search_type` (string)
- `site_url` (string)
- `start_date` (string)

### `query_video_analytics` (~301 tokens)

Query video search performance

Performance in the Videos tab of Google Search: clicks, impressions, CTR and
average position, by query, page, country, device or date. Video results shown on
the main web results are counted under web search, not here.

Input parameters:

- `aggregation_type` (string): 'auto' is right almost always. byProperty cannot be used with page grouping or filters.
- `data_state` (string): 'all' includes fresh data that may still change and matches the Search Console UI; 'final' is finalized data only (lags 2-3 days).
- `dimensions`: Group rows by these. Omit for ['query']; [] for totals. searchAppearance must be the only dimension.
- `end_date`: Last day (inclusive), YYYY-MM-DD in Pacific Time. Defaults to today.
- `filters`: Filters, combined with AND.
- `row_limit` (integer): Rows to return (1-25,000).
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `start_date`: First day, YYYY-MM-DD in Pacific Time. Defaults to 28 days ago.
- `start_row` (integer): Zero-based row offset, for paging.

Output parameters:

- `aggregation_type`
- `data_state` (string)
- `dimensions` (array)
- `end_date` (string)
- `first_incomplete_date`
- `first_incomplete_hour`
- `next_start_row`: Pass as start_row to fetch the next page, if there is one.
- `notes` (array)
- `request` (object): The exact request body sent to Google.
- `row_count` (integer)
- `rows` (array): One object per row: dimension values by name, then clicks, impressions, ctr (0-1) and position (absent for Discover and Google News).
- `search_type` (string)
- `site_url` (string)
- `start_date` (string)

### `query_google_news_analytics` (~339 tokens)

Query Google News performance

Google News performance (news.google.com and the Google News app): clicks,
impressions and CTR by page, country, device or date. Google News reports no
queries and no average position. For the News tab in Google Search, use
query_news_tab_analytics.

Input parameters:

- `aggregation_type` (string): 'auto' aggregates by page. byNewsShowcasePanel counts News Showcase panels instead: it needs the filter searchAppearance equals NEWS_SHOWCASE and cannot group or filter by page, so dimensions default…
- `data_state` (string): 'all' includes fresh data that may still change and matches the Search Console UI; 'final' is finalized data only (lags 2-3 days).
- `dimensions`: Group rows by these. Omit for ['page'] (['date'] with byNewsShowcasePanel); [] for totals.
- `end_date`: Last day (inclusive), YYYY-MM-DD in Pacific Time. Defaults to today.
- `filters`: Filters, combined with AND.
- `row_limit` (integer): Rows to return (1-25,000).
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `start_date`: First day, YYYY-MM-DD in Pacific Time. Defaults to 28 days ago.
- `start_row` (integer): Zero-based row offset, for paging.

Output parameters:

- `aggregation_type`
- `data_state` (string)
- `dimensions` (array)
- `end_date` (string)
- `first_incomplete_date`
- `first_incomplete_hour`
- `next_start_row`: Pass as start_row to fetch the next page, if there is one.
- `notes` (array)
- `request` (object): The exact request body sent to Google.
- `row_count` (integer)
- `rows` (array): One object per row: dimension values by name, then clicks, impressions, ctr (0-1) and position (absent for Discover and Google News).
- `search_type` (string)
- `site_url` (string)
- `start_date` (string)

### `query_news_tab_analytics` (~302 tokens)

Query News tab performance

Performance in the News tab of Google Search: clicks, impressions, CTR and
average position, by query, page, country, device or date. For news.google.com and
the Google News app, use query_google_news_analytics.

Input parameters:

- `aggregation_type` (string): 'auto' is right almost always. byProperty cannot be used with page grouping or filters.
- `data_state` (string): 'all' includes fresh data that may still change and matches the Search Console UI; 'final' is finalized data only (lags 2-3 days).
- `dimensions`: Group rows by these. Omit for ['query']; [] for totals. searchAppearance must be the only dimension.
- `end_date`: Last day (inclusive), YYYY-MM-DD in Pacific Time. Defaults to today.
- `filters`: Filters, combined with AND.
- `row_limit` (integer): Rows to return (1-25,000).
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `start_date`: First day, YYYY-MM-DD in Pacific Time. Defaults to 28 days ago.
- `start_row` (integer): Zero-based row offset, for paging.

Output parameters:

- `aggregation_type`
- `data_state` (string)
- `dimensions` (array)
- `end_date` (string)
- `first_incomplete_date`
- `first_incomplete_hour`
- `next_start_row`: Pass as start_row to fetch the next page, if there is one.
- `notes` (array)
- `request` (object): The exact request body sent to Google.
- `row_count` (integer)
- `rows` (array): One object per row: dimension values by name, then clicks, impressions, ctr (0-1) and position (absent for Discover and Google News).
- `search_type` (string)
- `site_url` (string)
- `start_date` (string)

### `query_hourly_analytics` (~243 tokens)

Query hourly search analytics

Search performance broken down by hour (Pacific Time) for the last ~10 days. Use it
to spot same-day spikes or compare today with the same day last week. The most
recent hours are incomplete; first_incomplete_hour says where that starts.

Input parameters:

- `dimensions`: Extra grouping besides the hour. Omit for hourly totals.
- `end_date`: Last day, YYYY-MM-DD in Pacific Time. Defaults to today.
- `filters`: Filters, combined with AND.
- `row_limit` (integer): Rows to return (1-25,000).
- `search_type` (string)
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `start_date`: First day, YYYY-MM-DD in Pacific Time, within the last 10 days. Defaults to 2 days ago.
- `start_row` (integer): Zero-based row offset, for paging.

Output parameters:

- `aggregation_type`
- `data_state` (string)
- `dimensions` (array)
- `end_date` (string)
- `first_incomplete_date`
- `first_incomplete_hour`
- `next_start_row`: Pass as start_row to fetch the next page, if there is one.
- `notes` (array)
- `request` (object): The exact request body sent to Google.
- `row_count` (integer)
- `rows` (array): One object per row: dimension values by name, then clicks, impressions, ctr (0-1) and position (absent for Discover and Google News).
- `search_type` (string)
- `site_url` (string)
- `start_date` (string)

### `list_search_appearances` (~216 tokens)

List search appearances

Step one: list the search appearances (rich results and other result features,
such as VIDEO or REVIEW_SNIPPET) the property had, with clicks and impressions.
Then call query_search_appearance with one of the names to break it down.

Input parameters:

- `data_state` (string): 'all' includes fresh data that may still change and matches the Search Console UI; 'final' is finalized data only (lags 2-3 days).
- `end_date`: Last day (inclusive), YYYY-MM-DD in Pacific Time. Defaults to today.
- `search_type` (string)
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `start_date`: First day, YYYY-MM-DD in Pacific Time. Defaults to 28 days ago.

Output parameters:

- `aggregation_type`
- `data_state` (string)
- `dimensions` (array)
- `end_date` (string)
- `first_incomplete_date`
- `first_incomplete_hour`
- `next_start_row`: Pass as start_row to fetch the next page, if there is one.
- `notes` (array)
- `request` (object): The exact request body sent to Google.
- `row_count` (integer)
- `rows` (array): One object per row: dimension values by name, then clicks, impressions, ctr (0-1) and position (absent for Discover and Google News).
- `search_type` (string)
- `site_url` (string)
- `start_date` (string)

### `query_search_appearance` (~297 tokens)

Query one search appearance

Step two: performance of one search appearance, broken down by query, page,
country, device or date. Get the appearance name from list_search_appearances.

Input parameters:

- `appearance` (string, required): Exact appearance name from list_search_appearances, such as VIDEO or REVIEW_SNIPPET.
- `data_state` (string): 'all' includes fresh data that may still change and matches the Search Console UI; 'final' is finalized data only (lags 2-3 days).
- `dimensions`: Break the appearance down by these. Omit for ['query'] (['page'] for Discover and Google News).
- `end_date`: Last day (inclusive), YYYY-MM-DD in Pacific Time. Defaults to today.
- `filters`: Extra filters, combined with AND with the appearance.
- `row_limit` (integer): Rows to return (1-25,000).
- `search_type` (string)
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `start_date`: First day, YYYY-MM-DD in Pacific Time. Defaults to 28 days ago.
- `start_row` (integer): Zero-based row offset, for paging.

Output parameters:

- `aggregation_type`
- `data_state` (string)
- `dimensions` (array)
- `end_date` (string)
- `first_incomplete_date`
- `first_incomplete_hour`
- `next_start_row`: Pass as start_row to fetch the next page, if there is one.
- `notes` (array)
- `request` (object): The exact request body sent to Google.
- `row_count` (integer)
- `rows` (array): One object per row: dimension values by name, then clicks, impressions, ctr (0-1) and position (absent for Discover and Google News).
- `search_type` (string)
- `site_url` (string)
- `start_date` (string)

### `compare_periods` (~331 tokens)

Compare two periods

Compare search performance between two periods of equal length: totals plus a
per-key breakdown with absolute and percent changes. Position change is negative
when ranking improved.

Input parameters:

- `current_end`: Last day of the period to analyze. Defaults to 3 days ago, the last day that is usually final.
- `current_start`: First day of the period to analyze, YYYY-MM-DD (Pacific Time).
- `data_state` (string): Defaults to 'final': fresh, still-changing data in the current period would read as a decline against a complete baseline.
- `dimensions`: Compare per value of these. Omit for ['query']; [] for totals only.
- `fetch_limit` (integer): Top rows fetched per period before joining.
- `filters`: Filters, combined with AND.
- `previous_end`: Last day of the baseline; same length as current.
- `previous_start`: First day of the baseline. Defaults to the period just before.
- `row_limit` (integer): Rows to return.
- `search_type` (string)
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `sort_by` (string): clicks_change (default) and impressions_change rank the biggest gains and losses first; ties fall back to the other metric's change, then current impressions. clicks and impressions rank by the curre…

Output parameters:

- `current_period` (array)
- `data_state` (string)
- `dimensions` (array)
- `notes` (array)
- `previous_period` (array)
- `rows` (array)
- `search_type` (string)
- `site_url` (string)
- `totals`

### `explain_change` (~374 tokens)

Explain a change in traffic

Answer "why did traffic go up or down?" between two periods of equal length.
Splits the change by page, query, country, device and search appearance and says
which slices account for most of it; separates clicks lost to fewer impressions
from clicks lost to a lower CTR; and lists Google updates that ran in or near the
periods. Defaults compare the last 28 days of final data with the 28 before.

Input parameters:

- `breakdowns`: Dimensions to split the change by. Omit for every one the search type has: page, query, country, device and searchAppearance.
- `current_end`: Last day of the period to analyze. Defaults to 3 days ago, the last day that is usually final.
- `current_start`: First day of the period to analyze, YYYY-MM-DD (Pacific Time).
- `data_state` (string): Defaults to 'final': fresh, still-changing data in the current period would read as a decline against a complete baseline.
- `fetch_limit` (integer): Top rows fetched per period and breakdown.
- `filters`: Explain the change within this slice only; combined with AND.
- `metric` (string): The metric whose change to explain.
- `previous_end`: Last day of the baseline; same length as current.
- `previous_start`: First day of the baseline. Defaults to the period just before.
- `search_type` (string)
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `top` (integer): Movers to list per breakdown and direction.

Output parameters:

- `breakdowns` (array)
- `current_period` (array)
- `data_state` (string)
- `effects`
- `google_updates` (array): Google updates and incidents in or near the periods. Timing alone does not show that one caused the change.
- `metric` (string)
- `notes` (array)
- `previous_period` (array)
- `requests` (array): The exact request bodies sent to Google.
- `search_type` (string)
- `site_url` (string)
- `summary` (array): The findings in plain sentences.
- `totals`

### `inspect_url` (~171 tokens)

Inspect a URL

Google's index status for one URL: whether it is indexed and why not, last crawl,
canonical chosen by Google versus declared, robots.txt and fetch state, sitemaps and
rich results. This is Google's indexed view, not a live test of the page.

Input parameters:

- `language_code` (string): BCP-47 language for issue messages, e.g. 'en-US' or 'de-DE'.
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `url` (string, required): Full URL of the page, inside the property.

Output parameters:

- `amp_verdict`
- `canonical_mismatch`
- `coverage_state`
- `crawled_as`
- `google_canonical`
- `indexing_state`
- `inspection_link`
- `last_crawl_time`
- `page_fetch_state`
- `referring_urls` (array)
- `rich_results` (array)
- `rich_results_verdict`
- `robots_txt_state`
- `site_url` (string)
- `sitemaps` (array)
- `url` (string)
- `user_canonical`
- `verdict`: PASS, PARTIAL, FAIL or NEUTRAL.

### `batch_inspect_urls` (~161 tokens)

Inspect many URLs

Inspect up to 50 URLs concurrently and summarize their index verdicts. Failures
are reported per URL; if the daily quota runs out, the remaining URLs are skipped
and listed so you can retry them later.

Input parameters:

- `language_code` (string): BCP-47 language for issue messages, e.g. 'en-US' or 'de-DE'.
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `urls` (array, required): 1-50 page URLs.

Output parameters:

- `items` (array)
- `notes` (array)
- `site_url` (string)
- `verdict_counts` (object)

### `audit_indexing` (~390 tokens)

Audit indexing

Full indexing audit of a property, rebuilt from its sitemaps because Google's API
does not expose the Page indexing report's URL lists. Each call inspects the next
URLs (new ones first, then any checked more than 14 days ago) and reports every URL
inspected so far: grouped by Google's index status with likely fixes, plus canonical
conflicts, indexed pages with no search impressions in 90 days, and pages shown in
search but missing from the sitemaps. Progress is saved locally, so call again to
continue, today or on later days; Google allows 2,000 inspections per property per
day.

Input parameters:

- `examples` (integer): Example URLs shown per issue.
- `fetch_pages` (boolean): Also fetch inspected pages directly (only URLs inside the property), as many as inspect or 50 if it is 0, to compare their status code, redirects, noindex and canonical tag now with what Google last…
- `inspect` (integer): URLs to inspect in this call. Each takes a few seconds and they run 10 at a time, so 50 is about 30 seconds. 0 only reports.
- `issue`: List every URL with this issue key (from issues[].key), 100 at a time. Nothing new is inspected.
- `restart` (boolean): Forget this property's saved audit and start over.
- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `sitemap_url`: Audit this sitemap (or sitemap index) instead of every sitemap submitted for the property.
- `start` (integer): Offset into the issue's URLs.

Output parameters:

- `coverage` (array)
- `inspected` (integer)
- `inspected_now` (integer)
- `issue`: The issue listed in urls, if any.
- `issues` (array)
- `live_checked` (integer)
- `next_start`: Pass as start to list the next page of the issue's URLs.
- `not_yet_inspected` (integer)
- `notes` (array)
- `quota_exhausted_today` (boolean)
- `quota_used_today` (integer): Inspections this server used for the property today (Pacific Time). Other tools and clients share Google's 2,000 a day.
- `site_url` (string)
- `sitemaps` (array)
- `urls` (array)
- `urls_in_sitemaps` (integer)

### `list_sitemaps` (~123 tokens)

List sitemaps

List submitted sitemaps with their status: last submitted and downloaded, errors,
warnings, whether processing is pending, and URL counts by content type.

Input parameters:

- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `sitemap_index`: Only list the sitemaps inside this sitemap index URL.

Output parameters:

- `site_url` (string)
- `sitemaps` (array)

### `get_sitemap` (~107 tokens)

Get a sitemap

Status of one submitted sitemap.

Input parameters:

- `site_url` (string, required): The property, as listed by list_sites: 'sc-domain:example.com' for a domain property or 'https://www.example.com/' for a URL-prefix property. A bare domain such as 'example.com', or any URL on the si…
- `sitemap_url` (string, required): Full URL of the sitemap, e.g. 'https://www.example.com/sitemap.xml'.

Output parameters:

- `contents` (array)
- `errors` (integer)
- `is_index` (boolean)
- `is_pending` (boolean)
- `last_downloaded`
- `last_submitted`
- `path` (string)
- `type`
- `warnings` (integer)

### `submit_sitemap` (~72 tokens)

Submit a sitemap

Submit (or resubmit) a sitemap so Google fetches it. Safe to repeat.

Input parameters:

- `site_url` (string, required): The property's exact site_url, as listed by list_sites.
- `sitemap_url` (string, required): Full URL of the sitemap, e.g. 'https://www.example.com/sitemap.xml'.

Output parameters:

- `action` (string)
- `done` (boolean)
- `notes` (array)
- `site_url` (string)
- `target` (string)

### `delete_sitemap` (~85 tokens)

Delete a sitemap

Remove a sitemap from Search Console. Google may still know the URLs in it, and
the file itself is not touched. Confirm with the user first.

Input parameters:

- `site_url` (string, required): The property's exact site_url, as listed by list_sites.
- `sitemap_url` (string, required): Full URL of the sitemap, e.g. 'https://www.example.com/sitemap.xml'.

Output parameters:

- `action` (string)
- `done` (boolean)
- `notes` (array)
- `site_url` (string)
- `target` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/onlymoein-google-search-console-mcp/open-gsc-mcp#diagnostics

## Score history

- 2026-11-05: 91
- 2026-11-04: 76
- 2026-11-03: 75
- 2026-11-02: 75
- 2026-11-01: 74
- 2026-10-31: 89
- 2026-10-30: 73
- 2026-10-29: 73
- 2026-10-28: 87
- 2026-10-27: 87
- 2026-10-26: 86
- 2026-10-25: 86
- 2026-10-24: 86
- 2026-10-23: 85
- 2026-10-22: 85
- 2026-10-21: 81
- 2026-10-20: 81
- 2026-10-19: 81
- 2026-10-18: 81
- 2026-10-17: 81
- 2026-10-16: 81
- 2026-10-15: 66
- 2026-10-14: 50

## Common questions

### What is the Google Search Console MCP server?

Google Search Console is an MCP server listed in the public MCP registry as io.github.onlymoein/google-search-console-mcp. Search Console analytics, hourly data, URL inspection and sitemaps, with guards for API quirks. This page covers its PyPI package (open-gsc-mcp).

### Is the Google Search Console MCP server safe to use?

Google Search Console scores 91 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Google Search Console MCP server expose?

Google Search Console exposes 22 tools: list_sites, get_site, add_site, delete_site, query_search_analytics, and 17 more. Their descriptions and schemas cost roughly 4,758 tokens of context every time the server is loaded.

### Is the Google Search Console MCP server still maintained?

Google Search Console is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Google Search Console MCP server under?

Google Search Console declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/open-gsc-mcp/
- Socket report: https://socket.dev/pypi/package/open-gsc-mcp
- Repository: https://github.com/onlymoein/google-search-console-mcp
- Changelog RSS feed: https://verifymcp.io/servers/onlymoein-google-search-console-mcp/open-gsc-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/onlymoein-google-search-console-mcp/open-gsc-mcp.json
- HTML version of this page: https://verifymcp.io/servers/onlymoein-google-search-console-mcp/open-gsc-mcp
