# Google Webtools MCP (oci · ghcr.io/stufently/google-webtools-mcp)

Google Search Console + GA4 for AI agents: properties, reports, indexing, verification, SEO.

- Trust score: 42/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-17

## Components

- oci · `ghcr.io/stufently/google-webtools-mcp`: 42/100 (this document), [markdown](https://verifymcp.io/servers/stufently-google-webtools-mcp/ghcr-io-stufently-google-webtools-mcp.md), [page](https://verifymcp.io/servers/stufently-google-webtools-mcp/ghcr-io-stufently-google-webtools-mcp)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/stufently/google-webtools-mcp`
- Version: `1.2.2`
- 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-10-17.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
- **Provenance & Transparency**: 48/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 2 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 72/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 5455 tokens (~139/item across 39 items; 39 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 7/100
  - Stability observed for 2 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 99% of tool parameters carry a description.
- **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 39 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the Google Webtools MCP server?

Google Webtools MCP runs locally as a container image, launched with docker run --rm -i -e GOOGLE_SERVICE_ACCOUNT_KEY ghcr.io/stufently/google-webtools-mcp:1.2.2. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add stufently-google-webtools-mcp -- docker run --rm -i -e GOOGLE_SERVICE_ACCOUNT_KEY ghcr.io/stufently/google-webtools-mcp:1.2.2
```

This image reads GOOGLE_SERVICE_ACCOUNT_KEY. Set it in your client's env block for this server; docker run -e passes it through to the container.

### Cursor

```json
{
  "mcpServers": {
    "stufently-google-webtools-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GOOGLE_SERVICE_ACCOUNT_KEY",
        "ghcr.io/stufently/google-webtools-mcp:1.2.2"
      ]
    }
  }
}
```

This image reads GOOGLE_SERVICE_ACCOUNT_KEY. Set it in your client's env block for this server; docker run -e passes it through to the container.

### VS Code

```json
{
  "servers": {
    "stufently-google-webtools-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GOOGLE_SERVICE_ACCOUNT_KEY",
        "ghcr.io/stufently/google-webtools-mcp:1.2.2"
      ]
    }
  }
}
```

This image reads GOOGLE_SERVICE_ACCOUNT_KEY. Set it in your client's env block for this server; docker run -e passes it through to the container.

### Codex

```bash
codex mcp add stufently-google-webtools-mcp -- docker run --rm -i -e GOOGLE_SERVICE_ACCOUNT_KEY ghcr.io/stufently/google-webtools-mcp:1.2.2
```

This image reads GOOGLE_SERVICE_ACCOUNT_KEY. Set it in your client's env block for this server; docker run -e passes it through to the container.

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "stufently-google-webtools-mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "-e",
        "GOOGLE_SERVICE_ACCOUNT_KEY",
        "ghcr.io/stufently/google-webtools-mcp:1.2.2"
      ],
      "enabled": true
    }
  }
}
```

This image reads GOOGLE_SERVICE_ACCOUNT_KEY. Set it in your client's env block for this server; docker run -e passes it through to the container.

### Hermes

```yaml
mcp_servers:
  stufently-google-webtools-mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "-e", "GOOGLE_SERVICE_ACCOUNT_KEY", "ghcr.io/stufently/google-webtools-mcp:1.2.2"]
```

This image reads GOOGLE_SERVICE_ACCOUNT_KEY. Set it in your client's env block for this server; docker run -e passes it through to the container.

### Netclaw

```json
{
  "McpServers": {
    "stufently-google-webtools-mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GOOGLE_SERVICE_ACCOUNT_KEY",
        "ghcr.io/stufently/google-webtools-mcp:1.2.2"
      ]
    }
  }
}
```

This image reads GOOGLE_SERVICE_ACCOUNT_KEY. Set it in your client's env block for this server; docker run -e passes it through to the container.

### Other

```json
{
  "mcpServers": {
    "stufently-google-webtools-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GOOGLE_SERVICE_ACCOUNT_KEY",
        "ghcr.io/stufently/google-webtools-mcp:1.2.2"
      ]
    }
  }
}
```

This image reads GOOGLE_SERVICE_ACCOUNT_KEY. Set it in your client's env block for this server; docker run -e passes it through to the container.

## 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-10-17 (score 42, +1)

- [functional improvement] Stability: unverified → 0.07

### 2026-10-15 (score 41, +31)

- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: excellent
- [functional] First check of Tool coverage: 99
- [functional] First check of Schema quality: fail
- [functional] First check of Destructive annotations: 100

### 2026-10-14 (score 10, 0)

- [functional] Package version: 1.2.1 → 1.2.2

### 2026-10-11 (score 10)

First indexed and scored.

## MCP tools (39)

### `list_properties` (~67 tokens)

List every Google Search Console property the credentials can access, including each property type and permission level. Use when the user wants to see which sites they can query before choosing one. Call get_property_details for a single known property, and call add_property only when they ask to register a new site.

### `get_property_details` (~92 tokens)

Read the type, permission level, and verification state of one Google Search Console property. Use when the user names a specific site and wants to know how that property is registered. Call list_properties when the property URL is not known yet.

Input parameters:

- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `add_property` (~112 tokens)

Register a site URL or a domain as a Google Search Console property on the authenticated account. Use when the user asks to add a site to Search Console. Adding a property does not verify it. Call gsc_get_verification_token and then gsc_verify_site to prove ownership, and call list_properties to see sites that are already listed.

Input parameters:

- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `delete_property` (~108 tokens)

Remove a Google Search Console property from the authenticated account site list. Use when the user explicitly asks to drop a property. The property can be added back later, and this call does not erase historical data held by Google. Call delete_sitemap to withdraw a sitemap instead, and call add_property to register the site again.

Input parameters:

- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `list_sitemaps` (~111 tokens)

List the sitemaps submitted for one Google Search Console property, with status, URL counts, and error flags. Use when the user asks which sitemaps are filed or whether Google reports sitemap problems. Call get_sitemap_details to open one feed, and call submit_sitemap only when they want to file a sitemap.

Input parameters:

- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `get_sitemap_details` (~124 tokens)

Read one submitted sitemap, including its type, last download, URL counts by content type, and error and warning totals. Use when the user names a sitemap and wants its processing status. Call list_sitemaps when they do not yet know which feed to open.

Input parameters:

- `feedpath` (string, required): The URL of the sitemap (e.g., "https://example.com/sitemap.xml")
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `submit_sitemap` (~139 tokens)

Submit a sitemap URL to Google Search Console so Google can discover the pages of that property. Use when the user has published or moved a sitemap and asks to file it. Submitting the same feed again refreshes it and does not delete anything. Call delete_sitemap to withdraw a feed, and call get_sitemap_details to check processing afterwards.

Input parameters:

- `feedpath` (string, required): The URL of the sitemap (e.g., "https://example.com/sitemap.xml")
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `delete_sitemap` (~134 tokens)

Withdraw a previously submitted sitemap from a Google Search Console property. Use when the user asks to remove a stale, duplicated, or broken sitemap. Removing the sitemap does not drop its URLs from the Google index. Call submit_sitemap to file that feed again, and call list_sitemaps to see what is still submitted.

Input parameters:

- `feedpath` (string, required): The URL of the sitemap (e.g., "https://example.com/sitemap.xml")
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `get_search_analytics` (~272 tokens)

Query raw Google Search Console search analytics with explicit dates, dimensions, filters, search type, row limit, and data state. Use when the user needs a custom breakdown that the shaped reports do not offer. Call get_performance_summary for a period overview, call get_top_queries or get_top_pages for a ranking, and call compare_periods for two named date ranges.

Input parameters:

- `aggregationType` (string)
- `dataState` (string): "final" = finalized data only (the API's own default; the newest days are simply absent until they settle), "all" = also includes the freshest days, whose numbers may still change
- `dimensions` (array): Dimensions to group by (e.g. query, page, date, country, device, searchAppearance)
- `endDate` (string, required): End date in YYYY-MM-DD format
- `filters` (array): Dimension filters to apply
- `rowLimit` (number): Maximum rows to return (1-25000)
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get_performance_summary` (~141 tokens)

Summarize clicks, impressions, CTR, and average position for one property against the previous period of the same length. Use when the user asks how search traffic is doing over a named period such as the last 28 days. Call compare_periods when they name two specific date ranges, and call get_search_analytics when they need the raw rows.

Input parameters:

- `period` (string): Predefined date range period
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `compare_periods` (~208 tokens)

Compare Search Console clicks, impressions, CTR, and position between two explicit date ranges, optionally grouped by a dimension. Use when the user names a before and an after, such as a release or a season. Call get_performance_summary when they want the latest period against the one just before it, without choosing dates.

Input parameters:

- `dimensions` (array): Dimensions to group by
- `period1EndDate` (string, required): Period 1 end date (YYYY-MM-DD)
- `period1StartDate` (string, required): Period 1 start date (YYYY-MM-DD)
- `period2EndDate` (string, required): Period 2 end date (YYYY-MM-DD)
- `period2StartDate` (string, required): Period 2 start date (YYYY-MM-DD)
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `get_top_queries` (~193 tokens)

List the top Search Console queries by clicks and score each query against the CTR benchmark for its position. Use when the user asks which queries bring traffic or which queries underperform their rank. Call get_top_pages for pages rather than queries, and call find_quick_wins for opportunity buckets instead of a plain ranking.

Input parameters:

- `country` (string): Filter by country code (e.g. "USA", "GBR")
- `device` (string): Filter by device type
- `limit` (number): Number of top queries to return
- `page` (string): Filter to a specific page URL (contains match)
- `period` (string): Predefined date range period
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `get_top_pages` (~173 tokens)

List the top Search Console pages by clicks and score each page against the CTR benchmark for its position. Use when the user asks which URLs earn the search traffic. Call get_top_queries for queries, call get_traffic_by_device for a device split, and call find_ctr_opportunities for pages far below the benchmark.

Input parameters:

- `device` (string): Filter by device type
- `limit` (number): Number of top pages to return
- `period` (string): Predefined date range period
- `query` (string): Filter to pages matching a specific query (contains match)
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `get_traffic_by_device` (~126 tokens)

Split Search Console clicks, impressions, CTR, and average position across desktop, mobile, and tablet. Use when the user asks whether one device is underperforming the others. Call get_top_pages or get_top_queries when they want the pages or queries behind that device split.

Input parameters:

- `period` (string): Predefined date range period
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `find_quick_wins` (~158 tokens)

Find query and page pairs that rank well but are under-clicked, sit just off page one, or would gain clicks from a small position push. Use when the user asks where search traffic is being left on the table. Call find_ctr_opportunities for page-level CTR gaps, and call find_declining_content when the problem is traffic that is already falling.

Input parameters:

- `minImpressions` (number): Minimum impressions to consider a query
- `period` (string): Predefined date range period
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `find_declining_content` (~156 tokens)

Compare the current Search Console period with the previous one and rank the pages and the queries that lost clicks. Use when the user asks what stopped getting traffic or what dropped recently. Call find_quick_wins for under-clicked rankings that are not necessarily declining, and call weekly_seo_report for a full weekly digest.

Input parameters:

- `minClicksInPrevious` (number): Minimum clicks in the previous period to consider a page or query
- `period` (string): Predefined date range period
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `find_ctr_opportunities` (~150 tokens)

Find pages whose Search Console click-through rate sits well below the benchmark for their average position, with a fix note for each page. Use when the user asks which titles or snippets are wasting impressions. Call find_quick_wins for query and page pairs near page one, and call get_top_pages for a plain traffic ranking.

Input parameters:

- `minImpressions` (number): Minimum impressions to include a page
- `period` (string): Predefined date range period
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `find_content_gaps` (~153 tokens)

Find Search Console queries that land on the wrong page, high-impression queries with no clicks, and topics that still need a dedicated page. Use when the user asks what content is missing. Call find_what_to_build_next to group that demand by intent, and call find_cannibalization when several pages already compete for one query.

Input parameters:

- `minImpressions` (number): Minimum impressions to consider a query
- `period` (string): Predefined date range period
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `find_what_to_build_next` (~152 tokens)

Group Search Console queries by user intent, covering questions, comparisons, problems, and buying signals, into topic clusters for what to write next. Use when the user asks what content to create. Call find_content_gaps for mismatched landing pages and zero-click queries, and call analyze_query_landscape for the overall intent mix.

Input parameters:

- `minImpressions` (number): Minimum impressions to consider a query
- `period` (string): Predefined date range period
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `inspect_url` (~130 tokens)

Inspect one URL in the Google Search Console index for coverage, mobile usability, and rich-result verdicts, including the issues behind a failure. Use when the user asks why a single URL is missing from search or looks wrong. Call batch_inspect_urls for a list of URLs, and call check_indexing_issues to audit the top traffic pages of the property.

Input parameters:

- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")
- `url` (string, required): The fully qualified URL to inspect

### `batch_inspect_urls` (~161 tokens)

Inspect up to 50 URLs in one call and group them into indexed, not indexed, and errors. Indexed URLs show coverage state and last crawl; not-indexed URLs show verdict, coverage state, robots.txt state, and page fetch state; URLs without index data are listed as errors. Use when the user hands over a list of URLs to check. Call inspect_url for a single URL, and call check_indexing_issues when they want the top traffic pages audited without supplying the list.

Input parameters:

- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")
- `urls` (array, required): Array of URLs to inspect (max 50)

### `check_indexing_issues` (~127 tokens)

Audit the top traffic pages of a property for indexing failures, canonical mismatches, missing canonicals, and mobile problems. Use when the user wants an indexing health pass rather than a check of URLs they already named. Call inspect_url or batch_inspect_urls when they already have the URL list.

Input parameters:

- `limit` (number): Number of top pages to check (default 20, max 100)
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `analyze_query_landscape` (~151 tokens)

Classify the Search Console queries of a property by intent, branded versus non-branded demand, and position band. Use when the user wants the shape of search demand rather than a list of winners. Call find_new_queries for queries that just appeared, and call find_cannibalization when several pages share one query.

Input parameters:

- `minImpressions` (integer): Minimum impressions for a query to be included
- `period` (string): Predefined date range period
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `find_new_queries` (~149 tokens)

Find queries that are new or rising fast by diffing this Search Console period against the previous one. Use when the user asks what people started searching recently. Call analyze_query_landscape for the overall mix of intent, and call find_what_to_build_next when they want those queries grouped into topics to write.

Input parameters:

- `minImpressions` (integer): Minimum impressions in the current period to be included
- `period` (string): Predefined date range period
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `find_cannibalization` (~196 tokens)

Detect queries where more than one page of the property ranks, and name the page that wins the clicks. Use when the user asks whether their own pages compete for the same query. Call find_content_gaps when the query lands on the wrong page, and call get_top_pages for a plain page ranking.

Input parameters:

- `minImpressions` (integer): Minimum total impressions for a query to be evaluated for cannibalization
- `minPageImpressions` (integer): Minimum impressions one page needs before it counts as a real contender. Queries where only a single page clears this bar are reported as low-volume and get no consolidation advice.
- `period` (string): Predefined date range period
- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `weekly_seo_report` (~125 tokens)

Build a one-call weekly SEO digest with traffic versus last week, top growers and decliners, quick wins, sitemap health, and prioritized recommendations. Use when the user asks for a weekly report or a regular status update. Call seo_health_check for a letter grade, and call get_performance_summary when they only want the headline numbers.

Input parameters:

- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `seo_health_check` (~125 tokens)

Score a Search Console property from A to F, with sub-scores for traffic trend, CTR efficiency, position distribution, and sitemap health. Use when the user asks how healthy the site is in search or wants a grade. Call weekly_seo_report for the narrative digest, and call find_declining_content when they already know traffic fell.

Input parameters:

- `searchType` (string): Search type to analyze
- `siteUrl` (string, required): The site URL exactly as it appears in Google Search Console (e.g., "https://example.com/" or "sc-domain:example.com")

### `ga4_list_accounts` (~66 tokens)

List every Google Analytics 4 account the credentials can reach, and the properties under each account. Use when the user does not yet know the account or property id. Call ga4_list_properties when they already named an account, and call ga4_get_property for one property settings.

### `ga4_list_properties` (~93 tokens)

List Google Analytics 4 properties under one account, including timezone, currency, and when each property was created. Use when the user names an account and wants its properties. Call ga4_list_accounts when the account id is unknown, and call ga4_get_property to open one property.

Input parameters:

- `account_id` (string, required): GA4 account ID (e.g., "123456" or "accounts/123456")

### `ga4_get_property` (~94 tokens)

Read one Google Analytics 4 property display name, timezone, currency, industry, and parent account. Use when the user asks how a known property is configured. Call ga4_list_properties to find the id first, and call ga4_list_data_streams for the streams on that property.

Input parameters:

- `property_id` (string, required): GA4 property ID (e.g., "123456" or "properties/123456")

### `ga4_create_property` (~183 tokens)

Create a new Google Analytics 4 property under an account, with a display name, timezone, and currency. Use when the user asks to provision a GA4 property. This server cannot remove the property afterwards. Call ga4_list_properties to see properties that already exist, and call ga4_create_data_stream next when they need a measurement id.

Input parameters:

- `account_id` (string, required): GA4 account ID (e.g., "123456" or "accounts/123456")
- `currency_code` (string): Currency code (e.g., "USD", "EUR")
- `display_name` (string, required): Display name for the new property
- `industry_category` (string): Industry category (e.g., "TECHNOLOGY", "FINANCE")
- `timezone` (string, required): Reporting timezone (e.g., "America/New_York", "Europe/Moscow")

### `ga4_create_data_stream` (~150 tokens)

Create a web data stream on a Google Analytics 4 property and return its measurement id for the tag. Use when the user needs a measurement id to install analytics on a site. This server cannot delete the stream afterwards. Call ga4_list_data_streams if a stream may already exist, and call ga4_create_property first when the property itself does not exist yet.

Input parameters:

- `property_id` (string, required): GA4 property ID (e.g., "123456" or "properties/123456")
- `stream_name` (string): Display name for the stream (defaults to hostname)
- `url` (string, required): Website URL for the data stream (e.g., "https://example.com")

### `ga4_list_data_streams` (~100 tokens)

List the data streams on a Google Analytics 4 property, including each web stream measurement id and default URI. Use when the user asks which streams or measurement ids a property already has. Call ga4_get_data_stream for one stream, and call ga4_create_data_stream only when they want a new stream.

Input parameters:

- `property_id` (string, required): GA4 property ID (e.g., "123456" or "properties/123456")

### `ga4_get_data_stream` (~111 tokens)

Read one Google Analytics 4 data stream, including its measurement id, default URI, and created and updated times. Use when the user names a stream and wants its measurement id or settings. Call ga4_list_data_streams when the stream id is not known yet.

Input parameters:

- `property_id` (string, required): GA4 property ID (e.g., "123456" or "properties/123456")
- `stream_id` (string, required): Data stream ID (numeric, e.g., "789012")

### `ga4_run_report` (~229 tokens)

Run a Google Analytics 4 report for chosen metrics, dimensions, and an absolute or relative date range. Use when the user asks for historical GA4 numbers such as users, sessions, or page views. Call ga4_run_realtime_report for who is on the site right now, and call ga4_get_metadata before guessing a custom metric name.

Input parameters:

- `dimensions` (array): Dimensions to group by (e.g., ["date", "country", "pagePath"])
- `end_date` (string, required): End date: YYYY-MM-DD or relative ("yesterday", "today")
- `limit` (number): Maximum rows to return (1-100000, default 100)
- `metrics` (array, required): Metrics to retrieve (e.g., ["activeUsers", "sessions", "screenPageViews"])
- `property_id` (string, required): GA4 property ID (e.g., "123456" or "properties/123456")
- `start_date` (string, required): Start date: YYYY-MM-DD or relative ("7daysAgo", "30daysAgo", "yesterday", "today")

### `ga4_run_realtime_report` (~152 tokens)

Run a Google Analytics 4 realtime report of active users and on-site activity from the last thirty minutes. Use when the user asks who is on the site right now. Call ga4_run_report for any date range older than that live window, and call ga4_get_metadata if a realtime metric name is rejected.

Input parameters:

- `dimensions` (array): Realtime dimensions (e.g., ["country", "city", "unifiedScreenName"])
- `metrics` (array, required): Realtime metrics (e.g., ["activeUsers", "screenPageViews", "conversions"])
- `property_id` (string, required): GA4 property ID (e.g., "123456" or "properties/123456")

### `ga4_get_metadata` (~88 tokens)

List the dimensions and metrics a Google Analytics 4 property accepts, including custom definitions. Use when a report needs valid metric and dimension names and guessing would be wrong. Call ga4_run_report once the names are known; this tool does not return the numbers.

Input parameters:

- `property_id` (string, required): GA4 property ID (e.g., "123456" or "properties/123456")

### `gsc_get_verification_token` (~130 tokens)

Request a site-verification token for FILE, DNS_TXT, META, or ANALYTICS, and the steps for placing that token. Use when the user needs the token before they can prove they own a site. Call gsc_verify_site only after the token is in place. Domain properties cannot use FILE or META; call this tool with DNS_TXT for those.

Input parameters:

- `method` (string, required): Verification method to use
- `site_url` (string, required): Site URL or domain to verify (e.g., "https://example.com/" or "example.com" for domain verification)

### `gsc_verify_site` (~126 tokens)

Record Google site ownership for a URL or a domain once the verification token is already in place. Use when the user says the file, DNS record, meta tag, or Analytics tag is published and asks to finish verification. Call gsc_get_verification_token first if they do not have a token yet. This does not add the Search Console property; call add_property for that.

Input parameters:

- `method` (string, required): Verification method that was configured
- `site_url` (string, required): Site URL or domain to verify (e.g., "https://example.com/" or "example.com")

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/stufently-google-webtools-mcp/ghcr-io-stufently-google-webtools-mcp#diagnostics

## Score history

- 2026-10-17: 42
- 2026-10-16: 41
- 2026-10-15: 41
- 2026-10-14: 10
- 2026-10-13: 10
- 2026-10-12: 10
- 2026-10-11: 10

## Common questions

### What is the Google Webtools MCP server?

Google Webtools MCP is listed in the public MCP registry as io.github.stufently/google-webtools-mcp. Google Search Console + GA4 for AI agents: properties, reports, indexing, verification, SEO. This page covers its container image (ghcr.io/stufently/google-webtools-mcp).

### Is the Google Webtools MCP server safe to use?

Google Webtools MCP scores 42 out of 100 on VerifyMCP. 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 Webtools MCP server expose?

Google Webtools MCP exposes 39 tools: list_properties, get_property_details, add_property, delete_property, list_sitemaps, and 34 more. Their descriptions and schemas cost roughly 5,455 tokens of context every time the server is loaded.

### Is the Google Webtools MCP server still maintained?

Google Webtools MCP is still listed as active in the MCP registry. We last reached this channel on 17 October 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 Webtools MCP server under?

Google Webtools MCP 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

- GitHub Container Registry: https://ghcr.io/stufently/google-webtools-mcp
- Repository: https://github.com/stufently/google-webtools-mcp
- Changelog RSS feed: https://verifymcp.io/servers/stufently-google-webtools-mcp/ghcr-io-stufently-google-webtools-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/stufently-google-webtools-mcp/ghcr-io-stufently-google-webtools-mcp.json
- HTML version of this page: https://verifymcp.io/servers/stufently-google-webtools-mcp/ghcr-io-stufently-google-webtools-mcp
