
Google Ads
io.github.mharnettPublished by GitHub account mharnettv1.0.1Updated Oct 24, 2026
Google Ads MCP with MCC support: 35 tools for campaigns, keywords, reporting, GAQL.
Overview
A local MCP server for the Google Ads API that lets an assistant inspect accounts, build paused campaigns and ads, and pull performance reports.
- What you can do
- Detect the client account from the working directory and list campaigns, ad groups, pending changes and conversion actions, including across Manager accounts and multiple clients. Create campaigns, ad groups, responsive search ads, Demand Gen multi-asset ads, image assets and keywords, all in paused state, and validate ads before creation. Enable, pause or remove items and update campaign budgets and tracking templates. Manage negative keywords through shared sets and campaign- or ad-group-level lists. Report on keyword, ad and search-term performance, keyword volume estimates, and run raw GAQL queries.
- When to use it
- Useful for Google Ads managers and agencies working across several client accounts who want an assistant to draft campaigns and ads for review, analyze performance, or run GAQL queries without leaving the chat.
- Requirements
- Runs locally as an npm package (mcp-google-ads) on Node.js, configured through a config.json file or environment variables. Needs a Google Ads developer token, an OAuth client ID and secret, and an OAuth refresh token for the account, plus Google Ads API access approval. Write tools stay hidden unless GOOGLE_ADS_MCP_WRITE is set to true.
Installation
In SourceWeft
- Open Google Ads in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
MCP Google Ads Server
An MCP (Model Context Protocol) server for the Google Ads API with built-in safeguards for review before changes go live. Production-proven with MCC (Manager Account) support, 36 tools for campaign management, reporting, and optimization. v1.2.0 adds Demand Gen campaign creation end-to-end.
Features
- MCC Support: Works with Manager accounts and multiple client accounts
- Auto-Context: Detects which client account based on your working directory
- Safe by Default: All new items created in PAUSED state
- Approval Workflow: Enable items only after manual review
- Validation: Validates ads before creating to catch errors early
- Resilience: Circuit breakers, retry with backoff, and timeout handling (cockatiel)
- Structured Logging: Pino-based logging with build fingerprinting
Setup
1. Google Ads API Access
You need:
- A Google Ads Developer Token (apply at Google Ads API Center)
- OAuth credentials (Client ID & Secret from Google Cloud Console)
- A Refresh Token for your MCC account
Getting OAuth Credentials
- Go to Google Cloud Console
- Create a project or select existing
- Enable the Google Ads API
- Go to Credentials → Create Credentials → OAuth Client ID
- Choose Desktop App
- Download the JSON (contains client_id and client_secret)
Getting a Refresh Token
Bring your own OAuth client (the client_id / client_secret from the step
above) and run the bundled helper. It runs Google's installed-app loopback flow
with PKCE (S256) and prints your refresh token. It reads nothing from your
home directory and needs no shared OAuth keyfile.
Your browser opens for Google sign-in; approve as the Google account that owns the Ads data. On success the helper prints one line to stdout:
Set that value in your environment (or config.json, below). The OAuth scope
requested is read from config.json (oauth.scope), falling back to
config.example.json, so the helper and the running server always request the
same scope. This MCP requests only the minimum scope it needs:
https://www.googleapis.com/auth/adwords.
Do not run this with stdout redirected to a shared log file — the refresh token is printed to stdout by design.
Note: GOOGLE_ADS_DEVELOPER_TOKEN is a separate Google Ads API credential, not
an OAuth scope — set it independently (see Environment Variables below).
2. Install
Or clone and build from source:
Security: Never share your .mcp.json file or commit it to git -- it may contain API credentials. Add .mcp.json to your .gitignore.
3. Configure
Edit config.json with your credentials:
Environment Variables
Alternatively, set credentials via environment variables (these override config.json):
Always-loaded tools
Clients that defer tool schemas behind a tool-search step only load a tool
once it is searched for. Naming tools in GOOGLE_ADS_MCP_ALWAYS_LOAD stamps
them with _meta: {"anthropic/alwaysLoad": true} in tools/list, so those
tools are offered directly. Names that match no tool are ignored, and the
marker never exposes a tool that read-only mode hides.
Read-only by default
The server ships read-only. Mutating tools (anything that creates, updates,
pauses, enables, removes, links, or applies) are hidden from the tool list
until you set GOOGLE_ADS_MCP_WRITE=true in the MCP server environment.
If a write tool is somehow invoked without that flag, the server returns a
clear error pointing at the env var.
This is deliberate: a casual chat message like "activate the Fundraising campaign" should not move live ad spend without an explicit opt-in.
4. Add to Claude Code
Add to your Claude Code MCP settings (~/.claude/settings.json or project settings):
Or if installed from source:
Restart Claude Code.
Claude Desktop: Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows).
Usage
Workflow
Available Tools (36)
Context & Discovery
Campaign Management
Tracking & URLs
Negative Keywords
Performance & Reporting
Advanced
Example Commands
Example: Create a Demand Gen Campaign End-to-End
After all four calls the campaign, ad group, and ad all live in your account in PAUSED state and are labeled Claude-MM-DD-YY. Review in the Google Ads UI, then enable via google_ads_enable_items.
Safety Features
- Everything starts PAUSED — Nothing goes live until you explicitly enable it
- Label tracking — All Claude-created items get a
claude-pendinglabel - Validation — Ads are validated before creation (headline/description lengths, etc.)
- Approval prompts — The
enable_itemstool requires explicit approval in Claude Code - Client isolation — Working directory determines which account, preventing cross-client mistakes
- Magnitude ceilings —
update_campaign_budgetrefuses a change larger than ±20% of the current budget unlessconfirm_large_change: trueand a non-emptyreasonare passed;update_campaign_biddingdoes the same for targets. Every override is logged (seeGOOGLE_ADS_MCP_OVERRIDE_LOG) expected_old— Update tools accept an optionalexpected_old: the value you believe you are overwriting. If the live value differs, the tool refuses, returns current vs expected and makes no write
Adding New Clients
Edit config.json to add clients. Map each client to a working directory:
No server restart needed — config is read on each request.
Troubleshooting
"No client found for working directory"
- Make sure you're in a folder that matches one of your
clientsentries - Check that the folder path in config.json matches exactly
"Developer token not approved"
- New developer tokens need approval from Google
- Use a test account while waiting for approval
"Authentication failed"
- Refresh token may be expired — regenerate it
- Check that client_id and client_secret are correct
License
MIT — see LICENSE for details.
Source: README.md at commit cab425f
Tools
0Version history
1- v1.0.1LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts