Google Ads MCP
Allows management of Google Ads campaigns through an AI assistant, including reading campaign metrics, search terms, recommendations, and making controlled changes to bids, budgets, statuses, and creative, with safety gates like allowlist, caps, preview, and audit log.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Google Ads MCPget campaign performance for this month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Google Ads MCP
Manage Google Ads campaigns through an AI assistant — safely, with every write gated behind a preview and an audit log.
A Model Context Protocol server that exposes Google Ads API v24 operations as tools for Claude (or any MCP client). Read campaign metrics, search terms, and recommendations; make controlled changes to bids, budgets, statuses, and creative — all from a single conversation.
Features
31 tools across five capability layers:
Read-only reporting
Tool | What it does |
| List all accounts under the MCC |
| List campaigns with status and channel type |
| Clicks, impressions, cost, conversions, CTR |
| List ad groups with status |
| Keywords with match type and status |
| Actual search queries with performance metrics |
| Account change history |
| Execute any read-only GAQL query (up to 10k rows) |
| Available GAQL segments |
| Available GAQL metrics |
| Fields for any GAQL resource |
Recommendations & planning
Tool | What it does |
| Active Google Ads recommendations for an account or campaign |
| Keyword ideas from seed keywords or a URL |
| Bid simulations and forecast data |
| Apply a recommendation (gated) |
| Dismiss a recommendation (gated) |
Status writes (gated)
Tool | What it does |
| Toggle campaign status |
| Toggle ad group status |
| Toggle keyword status |
| Toggle ad status |
Bid & budget writes (gated + capped)
Tool | What it does |
| Set keyword max CPC — capped at ±25% by default |
| Set ad group default CPC — capped |
| Set daily budget — capped at ±20% by default |
Entity creation (gated)
Tool | What it does |
| Create campaign + shared budget atomically (starts paused) |
| Create ad group under a campaign |
| Add keyword to an ad group |
| Create a responsive search ad (starts paused) |
Related MCP server: Google Ad Manager MCP Server
Safety model
Every write passes through four sequential gates:
1. Allowlist — customer_id must be in GOOGLE_ADS_MUTATE_ALLOWLIST (default: deny all)
2. Cap — bid/budget changes exceeding the configured % are blocked outright
3. Preview — confirm=False (default) runs validate_only; nothing changes in the account
4. Audit — confirmed mutations are appended to an append-only JSONL log (chmod 0600)New entities (campaigns, ad groups, keywords, ads) always start paused.
Transient quota errors (RESOURCE_TEMPORARILY_EXHAUSTED) are retried automatically with exponential back-off and jitter (configurable via GOOGLE_ADS_MAX_RETRIES, default 3).
Setup
Prerequisites
Python 3.10+
A Google Ads developer token and manager account (MCC)
Install
git clone https://github.com/LucasSantana-Dev/google-ads-mcp
cd google-ads-mcp
uv sync --extra devCredentials
cp .env.example .envVariable | Description |
| OAuth 2.0 Desktop App client ID |
| OAuth 2.0 Desktop App client secret |
| Your Google Ads developer token |
| MCC account ID (digits only, no hyphens) |
| Long-lived OAuth refresh token (see below) |
| Comma-separated customer IDs that may receive writes |
| Audit log path (default: |
| Max bid change fraction (default: |
| Max budget change fraction (default: |
| Quota retry attempts (default: |
Mint a refresh token
GOOGLE_ADS_CLIENT_ID=... GOOGLE_ADS_CLIENT_SECRET=... \
uv run python scripts/get_refresh_token.pyA browser opens for OAuth consent. Copy the printed refresh token into .env.
Claude Desktop integration
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"google-ads": {
"command": "/Users/<you>/.local/bin/uv",
"args": [
"run",
"--directory", "/path/to/google-ads-mcp",
"--env-file", "/path/to/google-ads-mcp/.env",
"python", "-m", "google_ads_mcp.server"
]
}
}
}Restart Claude Desktop. The 31 tools appear automatically.
Example conversations
# Reporting
"Show me all campaigns for account 123-456-7890 with spend > $100 this week"
"What search terms triggered our branded keywords in the last 7 days?"
"Any keyword ideas for 'project management software'?"
"What recommendations does Google have for my account?"
# Writes — always previews first; apply with confirm=true
"Pause campaign 9876543, it's burning budget"
"Set the CPC bid for keyword 111 in ad group 222 to $1.50"
"Create a new Search campaign 'Brand Q3' with a $20/day budget"
"Apply the 'add keyword' recommendation for campaign 555"Development
uv run pytest # 102 tests, 89% coverage
uv run ruff check src/ tests/ # lint
uv run mypy src/ # type checkCI runs on every push and pull request.
Architecture
src/google_ads_mcp/
├── server.py # FastMCP entrypoint, tool registration
├── config.py # GoogleAdsClient factory (reads .env)
├── gaql.py # GAQL execution, validators, row serialization, retry
├── mutate.py # Write-safety harness (allowlist → cap → preview → audit)
├── retry.py # Exponential back-off for quota errors
├── errors.py # tool_handler wrapper → {success, error} for any exception
├── testing.py # FakeGoogleAdsClient — unit tests without network or credentials
└── tools/
├── accounts.py # list_accessible_customers
├── campaigns.py # get_campaigns, get_campaign_performance
├── adgroups.py # get_ad_groups
├── keywords.py # get_keywords, get_search_terms
├── changes.py # get_change_events
├── query.py # run_gaql_query
├── metadata.py # get_*_metadata (3 tools)
├── writes_status.py # pause/enable campaign/ad_group/keyword/ad (8 tools)
├── writes_value.py # update keyword bid, ad group bid, campaign budget (3 tools)
├── creates.py # create campaign, ad group, keyword, ad (4 tools)
└── planning.py # recommendations, keyword ideas, forecast (5 tools)Transport: stdio only — no HTTP port, no public exposure.
Auth: OAuth 2.0 Desktop App + refresh token. Credentials stay on the local machine.
License
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/LucasSantana-Dev/google-ads-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server