npm google-ads-mcp-unofficialstdioMITupdated 10d ago
Unofficial Model Context Protocol server that lets AI agents read, analyze, and (gated) act on a Google Ads account — pause keywords, set bids, adjust budgets — without leaving your stack.
¿Qué puedes hacer con google ads mcp?
google-ads-mcp-unofficial
Unofficial Model Context Protocol server that lets AI agents read, analyze, and (gated) act on a Google Ads account — pause keywords, set bids, adjust budgets — without leaving your stack.
Unofficial. Not affiliated with Google. This is a local-first MCP server that speaks the Google Ads REST API directly. It does NOT include automated financial-account changes beyond what the Google Ads API allows. Always review proposed changes before enabling GOOGLE_ADS_ALLOW_MUTATIONS.
HTTP (v2 stateless)
Default is stdio. Optional Streamable HTTP — no session id, JSON responses, loopback only:
npx -y google-ads-mcp-unofficial --http
# GET http://127.0.0.1:3000/health
# POST http://127.0.0.1:3000/mcp (sessionless)
Env: GOOGLE_ADS_MCP_HOST, GOOGLE_ADS_MCP_PORT, GOOGLE_ADS_MCP_TRANSPORT=http.
Quick start (30 seconds)
npx -y google-ads-mcp-unofficial setup
The setup wizard collects your developer token + OAuth client, writes ~/.google-ads-mcp/config.json (chmod 600), then walks you through the OAuth dance via a local callback at http://127.0.0.1:3000/callback.
Verify:
npx -y google-ads-mcp-unofficial doctor
Then add it to your agent (Claude Desktop, Cursor, Hermes, OpenClaw, Codex — see examples below).
What it does
22 tools across 6 categories.
| Category | Count | Examples |
|---|---|---|
| Meta / diagnostic | 5 | google_ads_connection_status, google_ads_capabilities, google_ads_agent_manifest, google_ads_data_inventory, google_ads_privacy_audit |
| Shared Delx profile | 3 | google_ads_profile_get, google_ads_profile_update, google_ads_onboarding |
| Auth | 3 | google_ads_get_auth_url, google_ads_exchange_code, google_ads_revoke_access |
| Reads (always safe) | 8 | google_ads_list_accounts, google_ads_list_campaigns, google_ads_get_campaign, google_ads_list_ad_groups, google_ads_list_keywords, google_ads_get_account_performance, google_ads_get_campaign_performance, google_ads_get_keyword_performance |
| Workflow | 2 | google_ads_daily_report, google_ads_find_waste |
| Mutations (gated) | 6 | google_ads_pause_keyword, google_ads_resume_keyword, google_ads_set_keyword_bid_micros, google_ads_set_campaign_budget_micros, google_ads_pause_campaign, google_ads_resume_campaign |
Full tool reference: see AGENTS.md.
Setup wizard
npx -y google-ads-mcp-unofficial setup [--allow-mutations] [--client hermes|claude|cursor|...]
What it does:
- Prompts for: developer token, OAuth client id/secret, optional login_customer_id (MCC), redirect URI, privacy mode.
- Writes
~/.google-ads-mcp/config.jsonwithchmod 600. - Writes an MCP client config (e.g. merges into
claude_desktop_config.jsonon macOS; writes a Hermes block and skill file for--client hermes). - Runs the OAuth dance (unless
--no-auth) by opening Google's consent screen and listening on127.0.0.1:3000.
Mutations are off by default.
--allow-mutationsenables write tools. ASK THE USER before turning this on — it lets agents change campaigns, bids, budgets, and pause/resume keywords.
Auth model
This MCP requires two credentials:
- Google Ads Developer Token — from your MCC (Manager) account at https://ads.google.com/aw/apicenter. New tokens start in "Test account access" mode and need approval for production traffic.
- Google OAuth 2.0 Client — a "Desktop" or "Web" client created in Google Cloud Console. The single OAuth scope used is
https://www.googleapis.com/auth/adwords.
⚠️ Refresh token gotcha: Google only returns a
refresh_tokenon first consent or after you revoke the prior grant at https://myaccount.google.com/permissions. Ourauthflow usesprompt=consentto maximize the chance Google returns one — but if your code-exchange response is missingrefresh_token, the tool will tell you to revoke and retry.
| Variable | Purpose | Stored where | Secret? |
|---|---|---|---|
GOOGLE_ADS_DEVELOPER_TOKEN |
Approved developer token | ~/.google-ads-mcp/config.json or env |
yes |
GOOGLE_ADS_CLIENT_ID |
OAuth client id | local or env | no |
GOOGLE_ADS_CLIENT_SECRET |
OAuth client secret | local or env | yes |
GOOGLE_ADS_LOGIN_CUSTOMER_ID |
MCC id (no dashes) | local or env | no |
GOOGLE_ADS_REDIRECT_URI |
OAuth callback | local or env (default http://127.0.0.1:3000/callback) |
no |
GOOGLE_ADS_PRIVACY_MODE |
summary | structured | raw |
local or env (default structured) |
no |
GOOGLE_ADS_ALLOW_MUTATIONS |
Enable write tools | local or env (default false) |
no |
GOOGLE_ADS_TOKEN_PATH |
Override token storage | local or env (default ~/.google-ads-mcp/tokens.json) |
no |
GOOGLE_ADS_CACHE |
Enable SQLite cache | local or env (default off) | no |
GOOGLE_ADS_CACHE_PATH |
Override cache path | local or env | no |
GOOGLE_ADS_NO_RETRY |
Disable retry middleware | env (default off) | no |
Privacy modes
| Mode | What you get | Customer id |
|---|---|---|
summary |
id + name + status fields only | partial-redacted (123-***-7890) |
structured (default) |
flat normalized rows with metrics | partial-redacted |
raw |
full upstream Google Ads REST payload | full |
Pass privacy_mode per call to override the default per response.
Redaction matrix:
| Field | summary | structured | raw |
|---|---|---|---|
| developer_token | n/a | n/a | n/a (never returned) |
| access_token, refresh_token, client_secret | [REDACTED] in all errors | [REDACTED] | [REDACTED] |
| email addresses in error messages | [REDACTED] | [REDACTED] | [REDACTED] |
| customer_id | 123-***-7890 |
123-***-7890 |
full |
| metrics (clicks, cost, etc.) | dropped | included | included |
⚠️ Mutation gating — read this
Default: mutations are DISABLED. Six tools are gated:
google_ads_pause_keyword/google_ads_resume_keywordgoogle_ads_set_keyword_bid_microsgoogle_ads_set_campaign_budget_microsgoogle_ads_pause_campaign/google_ads_resume_campaign
If an agent calls any of them without GOOGLE_ADS_ALLOW_MUTATIONS enabled, it gets:
Error: Write tools are disabled. To enable: re-run `google-ads-mcp-server setup --allow-mutations`
or enable GOOGLE_ADS_ALLOW_MUTATIONS. ASK THE USER BEFORE TURNING THIS ON — it lets agents
change campaigns, bids, budgets, and pause/resume keywords.
Even with the env enabled, every mutation requires explicit_user_intent: true in the per-call arguments. And every mutation is logged to stderr with the resource name:
[google-ads-mcp] MUTATION pause_keyword {"resource_name":"customers/1234567890/adGroupCriteria/999~111222333"}
Read SECURITY.md for the threat model.
Agent client examples
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"google-ads": {
"command": "npx",
"args": ["-y", "google-ads-mcp-unofficial"]
}
}
}
Then restart Claude Desktop.
Cursor / Windsurf
~/.cursor/mcp.json (or your IDE equivalent):
{
"mcpServers": {
"google-ads": {
"command": "npx",
"args": ["-y", "google-ads-mcp-unofficial@0.1.0"]
}
}
}
Hermes
# ~/.hermes/config.yaml
mcp_servers:
google-ads:
command: npx
args:
- -y
- google-ads-mcp-unofficial@0.1.0
timeout: 120
connect_timeout: 60
sampling:
enabled: false
Then /reload-mcp (do NOT restart the gateway for normal data access).
OpenClaw
~/.openclaw/mcp.servers.json:
{
"google-ads": {
"command": "npx",
"args": ["-y", "google-ads-mcp-unofficial@0.1.0"]
}
}
Codex / TOML clients
See examples/codex.toml for the equivalent TOML block.
Workflow examples
1. Daily performance pulse
// Agent asks: "How did my Google Ads do yesterday?"
{
"name": "google_ads_daily_report",
"arguments": {
"customer_id": "1234567890",
"cpc_alert_threshold": 0.15
}
}
Returns markdown with yesterday + 7d + 30d aggregates. If yesterday's CPC exceeds 0.15, the output gets an ALERT banner.
2. Identify waste (read-only)
{
"name": "google_ads_find_waste",
"arguments": {
"customer_id": "1234567890",
"date_range": "LAST_30_DAYS",
"min_clicks": 5,
"min_cost_micros": 200000,
"zero_conversions_only": true
}
}
Returns a ranked list of keywords matching "spent ≥ $0.20 with ≥5 clicks and 0 conversions" — but never pauses them.
3. Pause a single keyword (mutation, gated)
After the user confirms:
{
"name": "google_ads_pause_keyword",
"arguments": {
"customer_id": "1234567890",
"ad_group_id": "999",
"criterion_id": "111222333",
"explicit_user_intent": true
}
}
Troubleshooting
| Symptom | Action |
|---|---|
Missing required Google Ads environment variables |
Run setup or set the env vars listed in the error. |
Google did not return a refresh_token |
Revoke at https://myaccount.google.com/permissions then re-run auth. |
PERMISSION_DENIED on a read |
Confirm GOOGLE_ADS_LOGIN_CUSTOMER_ID matches the MCC that owns the target customer (no dashes). |
Write tools are disabled |
Expected. Ask the user before enabling GOOGLE_ADS_ALLOW_MUTATIONS. |
| Hermes tools missing after config edit | /reload-mcp or hermes mcp test google-ads. Do NOT restart the gateway. |
| Token file insecure perms warning | chmod 600 ~/.google-ads-mcp/tokens.json |
Support
- GitHub Issues: https://github.com/davidmosiah/google-ads-mcp-unofficial/issues
- Email: support@delx.ai
- X: @delx369
Disclaimer
Unofficial integration. Not affiliated with Google. This MCP does not include automated financial-account changes beyond what the Google Ads REST API allows. Always review proposed changes before enabling GOOGLE_ADS_ALLOW_MUTATIONS. The author is not responsible for budget overruns, paused campaigns, or any other consequences of automated changes to your Google Ads account.
MIT-licensed.
Skill or MCP
Same package, two doors. MCP registers tools on stdio/HTTP. The skill can drive the same tools through the CLI when the client has no MCP:
npx -y google-ads-mcp-unofficial call google_ads_connection_status --json '{}'
Copy skill/SKILL.md into your agent skills dir.
Instalación
Añade google ads mcp a tu cliente. Elige el que uses.
claude mcp add google-ads-mcp-unofficial -- npx -y google-ads-mcp-unofficialcodex mcp add google-ads-mcp-unofficial -- npx -y google-ads-mcp-unofficialamp mcp add google-ads-mcp-unofficial -- npx -y google-ads-mcp-unofficial{
"mcpServers": {
"google-ads-mcp-unofficial": {
"command": "npx",
"args": [
"-y",
"google-ads-mcp-unofficial"
]
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"google-ads-mcp-unofficial": {
"command": "npx",
"args": [
"-y",
"google-ads-mcp-unofficial"
]
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
code --add-mcp '{"name":"google-ads-mcp-unofficial","command":"npx","args":["-y","google-ads-mcp-unofficial"]}'Or add the block manually to `.vscode/mcp.json` under `servers`.
{
"mcpServers": {
"google-ads-mcp-unofficial": {
"command": "npx",
"args": [
"-y",
"google-ads-mcp-unofficial"
]
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
{
"mcpServers": {
"google-ads-mcp-unofficial": {
"command": "npx",
"args": [
"-y",
"google-ads-mcp-unofficial"
]
}
}
}Add to `cline_mcp_settings.json` via the MCP Servers panel.
{
"mcpServers": {
"google-ads-mcp-unofficial": {
"command": "npx",
"args": [
"-y",
"google-ads-mcp-unofficial"
]
}
}
}Add to `~/.gemini/settings.json`.
{
"mcpServers": {
"google-ads-mcp-unofficial": {
"type": "local",
"command": "npx",
"args": [
"-y",
"google-ads-mcp-unofficial"
],
"tools": [
"*"
]
}
}
}Add to `~/.copilot/mcp-config.json`, or run `/mcp add` inside the CLI.
{
"context_servers": {
"google-ads-mcp-unofficial": {
"command": {
"path": "npx",
"args": [
"-y",
"google-ads-mcp-unofficial"
]
}
}
}
}Add to your Zed `settings.json`.
npx -y google-ads-mcp-unofficialRun `goose configure`, choose **Add Extension → Command-line Extension**, and paste this command.
Puntuación
39 / 100
Incompleta
- Documentación25/25
- Mantenimiento19/25
- Confianza13/20
- Capacidad0/15
- Instalación12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 3 days ago
- Has a release history
- Repository is not archived
- Licensed MIT
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 0 tool(s) documented
- Provides prompt templates
- Provides resources
- 12 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint — no local install
Historial de versiones
| Versiones | Publicada |
|---|---|
| 0.1.3Última | 3 jul 2026 |