Google Ads MCP Server
Google Ads MCP Server
A Model Context Protocol (MCP) server for Google Ads with read AND write capabilities. Unlike Google's official read-only MCP server, this one lets you actually manage your campaigns.
Features
Read operations
list_accounts- List all accessible Google Ads accountsexecute_query- Run GAQL queries for campaigns, ad groups, keywords, metrics, etc.
Write operations
create_campaign- Create new campaigns (paused by default for safety)create_ad_group- Create ad groups in a campaignadd_keywords- Add keywords to an ad groupadd_negative_keywords- Add negative keywords (campaign or ad group level)create_responsive_search_ad- Create RSAs with headlines/descriptionspause_campaign/enable_campaign- Toggle campaign statuspause_ad_group/enable_ad_group- Toggle ad group statusupdate_ad_group_bid- Update CPC bids
Safety features
Dry run mode - All write operations support
dry_run=Trueto validate without executingSafe defaults - New campaigns are created PAUSED
Clear feedback - All operations return success status and error messages
Installation
Using uv (recommended)
# Install uv if you haven't already
curl -LsSf https://astral.sh/uv/install.sh | sh
# Install the package
uv pip install google-ads-mcp
# Or install from source
git clone https://github.com/maxghenis/google-ads-mcp-rw
cd google-ads-mcp
uv pip install -e .Using pip
pip install google-ads-mcpConfiguration
1. Create Google Ads API credentials
Go to the Google Ads API Center
Create a developer token (or use an existing one)
Set up OAuth2 credentials in Google Cloud Console
Generate a refresh token
2. Create google-ads.yaml
Create a google-ads.yaml file with your credentials:
developer_token: YOUR_DEVELOPER_TOKEN
client_id: YOUR_CLIENT_ID.apps.googleusercontent.com
client_secret: YOUR_CLIENT_SECRET
refresh_token: YOUR_REFRESH_TOKEN
# MCC account ID if using multiple accounts (digits only, no dashes)
login_customer_id: "1234567890"
use_proto_plus: trueSee google-ads.yaml.example for a template.
3. Set the config path (optional)
By default, the server looks for google-ads.yaml in the current directory. You can specify a custom location:
export GOOGLE_ADS_CONFIG_PATH=/path/to/your/google-ads.yamlUsage with Claude Desktop
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"google-ads": {
"command": "uv",
"args": ["run", "--with", "google-ads-mcp", "google-ads-mcp"],
"env": {
"GOOGLE_ADS_CONFIG_PATH": "/path/to/your/google-ads.yaml"
}
}
}
}Or if installed globally:
{
"mcpServers": {
"google-ads": {
"command": "google-ads-mcp",
"env": {
"GOOGLE_ADS_CONFIG_PATH": "/path/to/your/google-ads.yaml"
}
}
}
}Example workflows
List your accounts
Use list_accounts to show me all my Google Ads accountsQuery campaign performance
Run this GAQL query for customer ID 1234567890:
SELECT campaign.name, metrics.clicks, metrics.impressions, metrics.cost_micros
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
ORDER BY metrics.clicks DESCCreate a new campaign with ad group, keywords, and ad
Create a new search campaign called "Q1 Promo" with a $20/day budget,
then add an ad group "Product Keywords" with keywords like "buy widgets",
"widget sale", "best widgets", and create a responsive search ad with
these headlines: "Buy Widgets Now", "50% Off Widgets", "Free Shipping"
and descriptions: "Shop our huge selection of widgets. Free shipping on orders over $50.",
"Premium quality widgets at the best prices. Order today!"
Final URL: https://example.com/widgetsAdd negative keywords
Add these negative keywords to campaign 19638300165:
- "free"
- "cheap"
- "diy"
- "tutorial"Pause underperforming ad groups
First, show me all ad groups in campaign 19638300165 with their metrics.
Then pause any ad groups with CTR below 1%.API reference
Budget and bid values
All monetary values use micros (1/1,000,000 of the currency unit):
1,000,000 micros = $1.002,500,000 micros = $2.5010,000,000 micros = $10.00
Match types
Keywords support three match types:
BROAD - Shows for related searches (default)
PHRASE - Shows when query contains the phrase
EXACT - Shows only for exact query match
Customer IDs
Customer IDs should be digits only, no dashes:
Correct:
1234567890Incorrect:
123-456-7890
Development
# Clone the repo
git clone https://github.com/maxghenis/google-ads-mcp-rw
cd google-ads-mcp
# Install dev dependencies
uv pip install -e ".[dev]"
# Run tests
pytest
# Format code
black src tests
ruff check --fix src testsLicense
MIT License - see LICENSE for details.
Contributing
Contributions welcome! Please open an issue or PR.
Related projects
Google's official Google Ads MCP - Read-only
MCP Protocol - The underlying protocol
FastMCP - The MCP server framework used