# io.github.davidmosiah/google-ads-mcp (npm · google-ads-mcp-unofficial)

Unofficial Google Ads MCP for campaigns, keywords, budgets, and gated mutations.

- Trust score: 68/100 (medium)
- Change this week: +24
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `google-ads-mcp-unofficial`: 68/100 (this document), [markdown](https://verifymcp.io/servers/davidmosiah-google-ads-mcp/google-ads-mcp-unofficial.md), [page](https://verifymcp.io/servers/davidmosiah-google-ads-mcp/google-ads-mcp-unofficial)

## Channel facts

- Registry: `npm`
- Package: `google-ads-mcp-unofficial`
- Version: `0.1.3`
- 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-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (129 of 130), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (129 of 130), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/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 71 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 76/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3188 tokens (~106/item across 30 items; 30 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 87/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 53% of tool parameters carry a description.
  - Structured output schemas are declared (90% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add davidmosiah-google-ads-mcp -- npx -y google-ads-mcp-unofficial
```

### Codex

```bash
codex mcp add davidmosiah-google-ads-mcp -- npx -y google-ads-mcp-unofficial
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "davidmosiah-google-ads-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "google-ads-mcp-unofficial"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add davidmosiah-google-ads-mcp --command npx --arg -y --arg google-ads-mcp-unofficial
```

### Hermes

```yaml
mcp_servers:
  davidmosiah-google-ads-mcp:
    command: "npx"
    args: ["-y", "google-ads-mcp-unofficial"]
```

### Other

```json
{
  "mcpServers": {
    "davidmosiah-google-ads-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "google-ads-mcp-unofficial"
      ]
    }
  }
}
```

## 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-08-03 (score 68, +48)

- [security regression] Provenance: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [functional regression] Security disclosure: unverified → fail
- [functional improvement] Schema quality: unverified → excellent
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Stability: unverified → 0.27
- [functional improvement] MCP protocol: unverified → pass
- [functional] Licence: MIT

### 2026-08-02 (score 20, +15)

- [security improvement] Malware scan: unverified → pass
- [functional regression] Security disclosure: fail → unverified

### 2026-08-01 (score 5, −15)

- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-31 (score 20, −24)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-27 (score 44)

First indexed and scored.

## MCP tools (30)

### `google_ads_data_inventory` (~46 tokens)

Google Ads Data Inventory

List supported Google Ads data domains, scopes, privacy boundary, and recommended first calls. Does not call Google Ads APIs or expose user data.

Input parameters:

- `response_format` (string)

Output parameters:

- `kind` (string)
- `mcp_name` (string)
- `source` (string)

### `google_ads_capabilities` (~44 tokens)

Google Ads MCP Capabilities

Explain supported Google Ads data, mutation gating, privacy modes, and recommended agent workflow. Does not read Google Ads or expose secrets.

Input parameters:

- `response_format` (string)

Output parameters:

- `mcp_name` (string)
- `project` (string)
- `unofficial` (boolean)

### `google_ads_agent_manifest` (~52 tokens)

Google Ads Agent Manifest

Machine-readable install, runtime, and client guidance for AI agents operating the Google Ads MCP. Does not read Google Ads or expose secrets.

Input parameters:

- `client` (string)
- `response_format` (string)

Output parameters:

- `client` (string)
- `mcp_name` (string)
- `project` (string)
- `unofficial` (boolean)

### `google_ads_connection_status` (~60 tokens)

Google Ads Connection Status

Check whether local Google Ads env vars, token file, Node version, privacy mode, mutation gate, and retry settings are ready. Does not call Google Ads or expose secrets.

Input parameters:

- `client` (string)
- `response_format` (string)

Output parameters:

- `ok` (boolean)
- `ready_for_google_ads_api` (boolean)

### `google_ads_privacy_audit` (~46 tokens)

Google Ads Privacy Audit

Return the local privacy, mutation-gate, cache, token-path, env-presence and redaction posture without revealing secret values.

Input parameters:

- `response_format` (string)

Output parameters:

- `mutations_allowed` (boolean)
- `privacy_mode_default` (string)
- `project` (string)
- `unofficial` (boolean)

### `google_ads_cache_status` (~59 tokens)

Google Ads Cache Status

Return the SQLite GAQL-response cache status: enabled flag, on-disk path, entry count, oldest entry age, and default TTL. Read-only — never calls Google Ads and does not require credentials.

Input parameters:

- `response_format` (string)

Output parameters:

- `cache_enabled` (boolean)
- `cache_path` (string)
- `default_ttl_seconds` (integer)
- `entries_count` (integer)
- `newest_age_ms` (number)
- `oldest_age_ms` (number)

### `google_ads_clear_cache` (~64 tokens)

Google Ads Clear Cache

Delete all entries from the local SQLite GAQL-response cache. Does NOT touch Google Ads — only affects local memoization. Not gated by GOOGLE_ADS_ALLOW_MUTATIONS because nothing in your ad account changes. Does not require credentials.

Input parameters:

- `response_format` (string)

Output parameters:

- `cache_enabled` (boolean)
- `cache_path` (string)
- `cleared_entries` (integer)

### `google_ads_profile_get` (~63 tokens)

Profile Get (shared Delx profile)

Read the shared Delx profile (~/.delx-wellness/profile.json). Returns the user's preferred name, language, timezone, etc. Cross-tool — same profile is shared with other Delx MCPs. Read-only.

Input parameters:

- `response_format` (string)

### `google_ads_profile_update` (~84 tokens)

Profile Update (shared Delx profile)

Persist a partial patch to the shared Delx profile (~/.delx-wellness/profile.json). REQUIRES explicit_user_intent=true. NEVER stores secrets — writes will be rejected at validation time.

Input parameters:

- `explicit_user_intent` (boolean): Must be true.
- `patch` (object, required): Partial WellnessProfileDocument patch.
- `response_format` (string)

### `google_ads_onboarding` (~54 tokens)

Onboarding (shared Delx profile)

Return the 11-question Delx onboarding flow plus the current profile state and missing critical fields. Same profile reused across all Delx MCPs.

Input parameters:

- `locale` (string)
- `response_format` (string)

### `google_ads_get_auth_url` (~81 tokens)

Get Google OAuth URL

Generate a Google OAuth authorization URL for the Google Ads API. Does not read or modify Google Ads data. Use this first when no local token exists.

Input parameters:

- `response_format` (string)
- `scopes` (array): Optional scope override. Defaults to the Google Ads scope.
- `state` (string): Optional OAuth state value generated by the caller.

Output parameters:

- `auth_url` (string)
- `next_step` (string)
- `redirect_uri` (string)
- `scopes` (array)

### `google_ads_exchange_code` (~72 tokens)

Exchange Google OAuth Code

Exchange a Google OAuth authorization code for local tokens. Tokens stored at ~/.google-ads-mcp/tokens.json with 0600 perms; never returned in the response.

Input parameters:

- `code` (string, required): OAuth authorization code, or a full redirect URL containing ?code=...
- `response_format` (string)

Output parameters:

- `expires_at` (number)
- `has_refresh_token` (boolean)
- `note` (string)
- `ok` (boolean)
- `scope` (string)
- `token_path` (string)

### `google_ads_revoke_access` (~43 tokens)

Revoke Google Ads Access

Revoke the current Google OAuth grant and delete local tokens. Use only when the user explicitly wants to disconnect Google Ads.

Input parameters:

- `response_format` (string)

Output parameters:

- `local_tokens_cleared` (boolean)
- `note` (string)
- `ok` (boolean)
- `token_path` (string)

### `google_ads_list_accounts` (~43 tokens)

List Accessible Customer Accounts

List all customer accounts the authenticated user can access. For a manager (MCC) account, this includes every child customer.

Input parameters:

- `response_format` (string)

Output parameters:

- `count` (integer)
- `error` (string)
- `has_more` (boolean)
- `next_page_token` (string)
- `ok` (boolean)
- `privacy_mode` (string)
- `records` (array)

### `google_ads_list_campaigns` (~135 tokens)

List Google Ads Campaigns

List campaigns under a Google Ads customer. Returns id, name, status, advertising_channel_type, bidding_strategy_type, and campaign_budget linkage.

Input parameters:

- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `page_size` (integer)
- `privacy_mode` (string): Optional per-call payload privacy override. Defaults to GOOGLE_ADS_PRIVACY_MODE or structured.
- `response_format` (string)
- `status` (string): Filter by campaign status. Use ALL to include every status.

Output parameters:

- `count` (integer)
- `error` (string)
- `has_more` (boolean)
- `next_page_token` (string)
- `ok` (boolean)
- `privacy_mode` (string)
- `records` (array)

### `google_ads_get_campaign` (~126 tokens)

Get Google Ads Campaign

Get a single campaign with budget, bidding strategy, and status. Returns the linked campaign_budget id (use it with google_ads_set_campaign_budget_micros).

Input parameters:

- `campaign_id` (string, required): Google Ads campaign id (numeric).
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `privacy_mode` (string): Optional per-call payload privacy override. Defaults to GOOGLE_ADS_PRIVACY_MODE or structured.
- `response_format` (string)

Output parameters:

- `error` (string)
- `ok` (boolean)
- `privacy_mode` (string)

### `google_ads_list_ad_groups` (~123 tokens)

List Google Ads Ad Groups

List ad groups under a campaign (or all campaigns) in a customer.

Input parameters:

- `campaign_id` (string): Optional campaign id filter.
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `page_size` (integer)
- `privacy_mode` (string): Optional per-call payload privacy override. Defaults to GOOGLE_ADS_PRIVACY_MODE or structured.
- `response_format` (string)
- `status` (string)

Output parameters:

- `count` (integer)
- `error` (string)
- `has_more` (boolean)
- `next_page_token` (string)
- `ok` (boolean)
- `privacy_mode` (string)
- `records` (array)

### `google_ads_list_keywords` (~151 tokens)

List Google Ads Keywords

List keyword criteria under a campaign or ad group. Returns criterion_id, keyword text, match type, status, and cpc_bid_micros.

Input parameters:

- `ad_group_id` (string): Optional ad group id filter.
- `campaign_id` (string): Optional campaign id filter.
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `page_size` (integer)
- `privacy_mode` (string): Optional per-call payload privacy override. Defaults to GOOGLE_ADS_PRIVACY_MODE or structured.
- `response_format` (string)
- `status` (string)

Output parameters:

- `count` (integer)
- `error` (string)
- `has_more` (boolean)
- `next_page_token` (string)
- `ok` (boolean)
- `privacy_mode` (string)
- `records` (array)

### `google_ads_get_account_performance` (~130 tokens)

Get Account Performance

Aggregate performance metrics (impressions, clicks, cost_micros, ctr, average_cpc, conversions) for the customer over a date range.

Input parameters:

- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `date_range` (string): Predefined date range supported by Google Ads GAQL.
- `privacy_mode` (string): Optional per-call payload privacy override. Defaults to GOOGLE_ADS_PRIVACY_MODE or structured.
- `response_format` (string)

Output parameters:

- `error` (string)
- `ok` (boolean)
- `privacy_mode` (string)

### `google_ads_get_campaign_performance` (~132 tokens)

Get Campaign Performance

Per-campaign performance metrics over a date range. Filter to a single campaign with campaign_id.

Input parameters:

- `campaign_id` (string): Optional single-campaign filter.
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `date_range` (string): Predefined date range supported by Google Ads GAQL.
- `privacy_mode` (string): Optional per-call payload privacy override. Defaults to GOOGLE_ADS_PRIVACY_MODE or structured.
- `response_format` (string)

Output parameters:

- `error` (string)
- `ok` (boolean)
- `privacy_mode` (string)

### `google_ads_get_keyword_performance` (~183 tokens)

Get Keyword Performance

Per-keyword performance metrics over a date range. Returns clicks, cost_micros, ctr, average_cpc, conversions, conversion_rate. Filter with campaign_id, ad_group_id, or min_clicks.

Input parameters:

- `ad_group_id` (string)
- `campaign_id` (string)
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `date_range` (string): Predefined date range supported by Google Ads GAQL.
- `min_clicks` (integer): Filter out keywords with fewer than this many clicks (defensive baseline filter).
- `privacy_mode` (string): Optional per-call payload privacy override. Defaults to GOOGLE_ADS_PRIVACY_MODE or structured.
- `response_format` (string)

Output parameters:

- `error` (string)
- `ok` (boolean)
- `privacy_mode` (string)

### `google_ads_daily_report` (~157 tokens)

Daily Performance Report

Synthetic daily performance snapshot. Pulls YESTERDAY + LAST_7_DAYS + LAST_30_DAYS aggregates for a customer, optionally alerts when CPC exceeds cpc_alert_threshold. Pure-read workflow tool — never mutates.

Input parameters:

- `cpc_alert_threshold` (number): Optional CPC threshold in account currency. If yesterday's CPC exceeds this, the report adds an ALERT block.
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `privacy_mode` (string): Optional per-call payload privacy override. Defaults to GOOGLE_ADS_PRIVACY_MODE or structured.
- `response_format` (string)

Output parameters:

- `error` (string)
- `ok` (boolean)
- `privacy_mode` (string)

### `google_ads_find_waste` (~223 tokens)

Find Waste Keywords (read-only)

Identify keywords matching the 'high cost + zero conversions' waste pattern (inspiration from script #1). Returns a ranked list of candidates — NEVER pauses anything. Pair with google_ads_pause_keyword (gated) after user confirmation.

Input parameters:

- `campaign_id` (string)
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `date_range` (string): Predefined date range supported by Google Ads GAQL.
- `min_clicks` (integer): Minimum clicks to evaluate (skip low-data keywords).
- `min_cost_micros` (integer): Cost floor in micros. Default 200_000 = $0.20 — adjust to taste.
- `privacy_mode` (string): Optional per-call payload privacy override. Defaults to GOOGLE_ADS_PRIVACY_MODE or structured.
- `response_format` (string)
- `zero_conversions_only` (boolean): If true (default), only include keywords with 0 conversions.

Output parameters:

- `error` (string)
- `ok` (boolean)
- `privacy_mode` (string)

### `google_ads_quick_wins` (~281 tokens)

Find Quick-Win Keywords (read-only)

Identify keywords with LOW CPC + HIGH CTR + at-least-some conversions — candidates to RAISE the bid on. Inverse of google_ads_find_waste. Returns a ranked list with a recommended_bid_micros (current + 25%, capped at 2x). NEVER changes bids; pair with google_ads_set_keyword_bid_micros (gated) after user confirmation.

Input parameters:

- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `limit` (integer): Maximum candidates to return.
- `lookback_days` (integer): Look-back window in days (1-90). Converted into the GAQL DATE_RANGE/BETWEEN clause.
- `max_avg_cpc_micros` (integer): Maximum average CPC in micros. Default 100_000 ($0.10).
- `min_conversions` (number): Minimum conversions in the window. Default 0.5 (at least half a conversion).
- `min_ctr` (number): Minimum CTR in percent (e.g., 5 = 5%). Default 5%.
- `privacy_mode` (string): Optional per-call payload privacy override. Defaults to GOOGLE_ADS_PRIVACY_MODE or structured.
- `response_format` (string)

Output parameters:

- `error` (string)
- `ok` (boolean)
- `privacy_mode` (string)

### `google_ads_pause_keyword` (~133 tokens)

Pause Keyword (gated mutation)

Pause a single keyword by criterion_id. GATED: requires GOOGLE_ADS_ALLOW_MUTATIONS=true AND explicit_user_intent=true. Ask the user first.

Input parameters:

- `ad_group_id` (string, required): Ad group that owns the keyword criterion.
- `criterion_id` (string, required): Keyword criterion id (the keyword's id, NOT the keyword text).
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `explicit_user_intent` (boolean, required)
- `response_format` (string)

Output parameters:

- `applied` (boolean)
- `error` (string)
- `note` (string)
- `ok` (boolean)
- `resource` (string)
- `reverted` (boolean)

### `google_ads_resume_keyword` (~117 tokens)

Resume Keyword (gated mutation)

Resume (enable) a single paused keyword by criterion_id. GATED.

Input parameters:

- `ad_group_id` (string, required): Ad group that owns the keyword criterion.
- `criterion_id` (string, required): Keyword criterion id (the keyword's id, NOT the keyword text).
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `explicit_user_intent` (boolean, required)
- `response_format` (string)

Output parameters:

- `applied` (boolean)
- `error` (string)
- `note` (string)
- `ok` (boolean)
- `resource` (string)
- `reverted` (boolean)

### `google_ads_set_keyword_bid_micros` (~159 tokens)

Set Keyword Bid (gated mutation)

Update the cpc_bid_micros for a keyword criterion. GATED. Bid must be in micros (10_000 = $0.01).

Input parameters:

- `ad_group_id` (string, required)
- `cpc_bid_micros` (integer, required): Max CPC bid in micros. 10_000 = $0.01 minimum, 1_000_000_000 = $1000 maximum.
- `criterion_id` (string, required)
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `explicit_user_intent` (boolean, required)
- `response_format` (string)

Output parameters:

- `applied` (boolean)
- `error` (string)
- `note` (string)
- `ok` (boolean)
- `resource` (string)
- `reverted` (boolean)

### `google_ads_set_campaign_budget_micros` (~158 tokens)

Set Campaign Budget (gated mutation)

Update a campaign budget's amount_micros. GATED. campaign_budget_id is NOT the campaign id — discover it via google_ads_get_campaign (campaign_budget.id).

Input parameters:

- `amount_micros` (integer, required): Daily budget amount in micros. 10_000 = $0.01 minimum.
- `campaign_budget_id` (string, required): Campaign budget id (NOT the campaign id). Discover via google_ads_get_campaign — returns campaign_budget.id.
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `explicit_user_intent` (boolean, required)
- `response_format` (string)

Output parameters:

- `applied` (boolean)
- `error` (string)
- `note` (string)
- `ok` (boolean)
- `resource` (string)
- `reverted` (boolean)

### `google_ads_pause_campaign` (~83 tokens)

Pause Campaign (gated mutation)

Pause an entire campaign by id. GATED.

Input parameters:

- `campaign_id` (string, required)
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `explicit_user_intent` (boolean, required)
- `response_format` (string)

Output parameters:

- `applied` (boolean)
- `error` (string)
- `note` (string)
- `ok` (boolean)
- `resource` (string)
- `reverted` (boolean)

### `google_ads_resume_campaign` (~86 tokens)

Resume Campaign (gated mutation)

Resume (enable) a paused campaign by id. GATED.

Input parameters:

- `campaign_id` (string, required)
- `customer_id` (string, required): Google Ads customer id (10 digits). Dashes optional, e.g. '1234567890' or '123-456-7890'.
- `explicit_user_intent` (boolean, required)
- `response_format` (string)

Output parameters:

- `applied` (boolean)
- `error` (string)
- `note` (string)
- `ok` (boolean)
- `resource` (string)
- `reverted` (boolean)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/davidmosiah-google-ads-mcp/google-ads-mcp-unofficial#diagnostics

## Score history

- 2026-08-03: 68
- 2026-08-02: 20
- 2026-08-01: 5
- 2026-07-31: 20
- 2026-07-30: 44
- 2026-07-28: 44
- 2026-07-27: 44

## Links

- npm package: https://www.npmjs.com/package/google-ads-mcp-unofficial
- Socket report: https://socket.dev/npm/package/google-ads-mcp-unofficial
- Repository: https://github.com/davidmosiah/google-ads-mcp-unofficial
- Changelog RSS feed: https://verifymcp.io/servers/davidmosiah-google-ads-mcp/google-ads-mcp-unofficial/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/davidmosiah-google-ads-mcp/google-ads-mcp-unofficial/changelog.json
- HTML version of this page: https://verifymcp.io/servers/davidmosiah-google-ads-mcp/google-ads-mcp-unofficial
