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 executing - Safe 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-mcp
Configuration
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: true
See 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.yaml
Usage 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 accounts
Query 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 DESC
Create 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/widgets
Add 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:
1234567890 - Incorrect:
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 tests
License
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
Metadata
Release files for google-ads-mcp-rw 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| google_ads_mcp_rw-0.1.0.tar.gz | 95.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| google_ads_mcp_rw-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 108.0 kB
Release files / google_ads_mcp_rw-0.1.0.tar.gz
| Download URL | google_ads_mcp_rw-0.1.0.tar.gz |
|---|---|
| Size | 95.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d204d216ffe2497cab667c49a7029ef79feb6fae082450b0d6753c7799964ad2
|
|
BLAKE2b-256 checksum How to use checksums |
2fb46af5a5b393f5d7f47d693b2798e11dafc2561dfd941061d2404b24457edd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / google_ads_mcp_rw-0.1.0-py3-none-any.whl
| Download URL | google_ads_mcp_rw-0.1.0-py3-none-any.whl |
|---|---|
| Size | 12.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bb781409d397dfa3267e27e7bcc5ee629bc04cf4cca1e5f056d717c45049af19
|
|
BLAKE2b-256 checksum How to use checksums |
df8498f7b96c509dbbd5375d66d07ce7b8529d4713431e1c2f7476b020df23e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|