google-ads-mcp-server
Provides tools for interacting with Google Ads, enabling querying performance data with GAQL and managing budgets, campaigns, ad groups, keywords, and bids, with dry-run validation before applying changes.
Click on "Deploy 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-mcp-server Show me performance for my campaigns over the last 7 days"
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-server
A Model Context Protocol (MCP) server for Google Ads with both read and write access. Connect it to Claude (or any MCP client) and pull reports with GAQL, then actually manage the account — create and adjust budgets, campaigns, ad groups, bids, and keywords — in natural language, using your own Google Ads credentials.
Google's own official Google Ads MCP server is read-only. This one adds the write side, and does it carefully.
🛑 Writes spend real money — how the safety guard works
Google Ads changes cost money, so every write tool is a dry run by default. When you call a write tool without confirm=True, the change is sent to the Google Ads API with its validate_only flag: the API checks that the change is valid but does not apply it, and the tool tells you it was validated only. The change is applied only when you call the same tool again with confirm=True.
That means the safe loop is always: call once to validate → review → call again with confirm=True to apply. New campaigns are also created PAUSED by default so nothing starts serving unexpectedly.
Related MCP server: google-ads-mcp
Features
Read
ads_whoamiandlist_accessible_customers— verify credentials and see which accounts you can reachsearch— run any GAQL query (the general-purpose read tool)Convenience listers: campaigns, ad groups, ads, budgets, keywords
campaign_performance— impressions/clicks/cost/conversions by campaign over a date range
Write (dry run unless confirm=True)
Create and update campaign budgets
Create campaigns (paused Search + Manual CPC by default) and set campaign status (enable/pause/remove)
Create ad groups, set ad group status, and change ad group bids
Add keywords and set keyword status
Requirements
Python 3.10+
A Google Ads developer token. Test tokens only work against test accounts; to read or write real accounts you need Basic access, which is a short application in the API Center of a manager (MCC) account.
Credentials — either OAuth2 (client id, client secret, refresh token) or a service account with domain-wide delegation (Google Workspace).
Your manager account id as the login customer id.
Google setup (one time)
In a Google Ads manager (MCC) account, open API Center and apply for a developer token with Basic access.
In the Google Cloud Console, create a project and enable the Google Ads API.
Create OAuth 2.0 credentials (Desktop app) and generate a refresh token for an account that can access your Google Ads accounts. (Google's OAuth desktop guide walks through this; the
google-adslibrary ships a helper script for the refresh token.)Note your login customer id (the MCC id, digits only).
Alternatively, use a service account with domain-wide delegation on a Workspace and point the config at its key — see the google-ads configuration docs.
Install
Using uv (recommended):
git clone https://github.com/burhan29ee/google-ads-mcp-server.git
cd google-ads-mcp-server
uv venv --python 3.12 .venv
uv pip install --python .venv/bin/python -e .Or with pip:
python3 -m venv .venv && source .venv/bin/activate
pip install -e .Configure your MCP client
The server reads the standard GOOGLE_ADS_* environment variables (or a google-ads.yaml via GOOGLE_ADS_CONFIGURATION_FILE_PATH). For Claude Desktop, edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json; Windows: %APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"google-ads": {
"command": "/absolute/path/to/google-ads-mcp-server/.venv/bin/python",
"args": ["-m", "google_ads_mcp_server.server"],
"env": {
"GOOGLE_ADS_DEVELOPER_TOKEN": "your-developer-token",
"GOOGLE_ADS_LOGIN_CUSTOMER_ID": "1234567890",
"GOOGLE_ADS_CLIENT_ID": "your-oauth-client-id.apps.googleusercontent.com",
"GOOGLE_ADS_CLIENT_SECRET": "your-oauth-client-secret",
"GOOGLE_ADS_REFRESH_TOKEN": "your-oauth-refresh-token"
}
}
}
}Restart the client and start with "run ads_whoami" to confirm access. Then try "show my top campaigns by spend over the last 30 days" or "pause campaign 12345" (which will dry-run first).
Tool reference
Tool | Type | What it does |
| read | Show config (masked token, login id) and accessible accounts |
| read | Customer resource names this login can access |
| read | Run any GAQL query |
| read | Campaigns with status, channel, budget |
| read | Ad groups (optionally by campaign) |
| read | Ads (optionally by ad group) |
| read | Budgets with amount and delivery |
| read | Keyword criteria (optionally by ad group) |
| read | Per-campaign metrics over a date range |
| write | Create a budget (dry run unless |
| write | Change a budget amount (dry run unless |
| write | Create a paused Search campaign (dry run unless |
| write | Enable / pause / remove a campaign (dry run unless |
| write | Create an ad group (dry run unless |
| write | Enable / pause / remove an ad group (dry run unless |
| write | Change an ad group's max CPC (dry run unless |
| write | Add a keyword (dry run unless |
| write | Enable / pause / remove a keyword (dry run unless |
Amounts and bids are in micros (1,000,000 micros = 1 unit of the account currency; e.g. a $5.00 daily budget is 5000000).
Development
pip install -e ".[dev]"
ruff check .
pytest -qSee CONTRIBUTING.md for the full workflow.
Security
Credentials here can change spend — treat them like production secrets. Never commit them (the .gitignore blocks key files, .env, and google-ads.yaml), grant least access, prefer a test account while evaluating, and keep the dry-run guard: review the validate_only result before re-running with confirm=True. See SECURITY.md.
Notes
The
mcpdependency is pinned to>=1.2,<2. The 2.0 SDK reorganized its API and removedmcp.server.fastmcp, which this server uses.This is an independent open-source project and is not affiliated with or endorsed by Google. It is separate from Google's official read-only google-ads-mcp.
License
Available Tools
18 toolsadd_keywordA
Add a keyword to an ad group. match_type is 'EXACT', 'PHRASE', or 'BROAD'. Dry run unless confirm=True.
Inputs: text (required), ad_group_id (required), customer_id (required), confirm, +1 more.
ads_whoamiA
Show how this server is configured (login customer id, developer-token presence — masked) and list the Google Ads accounts it can access. Use this first to verify credentials and access.
Inputs: no named parameters.
campaign_performanceA
Report per-campaign performance (impressions, clicks, cost, conversions) between two dates (YYYY-MM-DD), highest spend first.
Inputs: end_date (required), start_date (required), customer_id (required), limit.
create_ad_groupA
Create a standard Search ad group under a campaign. cpc_bid_micros is an optional default max CPC bid in micros. Dry run unless confirm=True.
Inputs: name (required), campaign_id (required), customer_id (required), status, +2 more.
create_campaignA
Create a campaign attached to an existing budget. Defaults to a PAUSED Search campaign with Manual CPC bidding and Google Search + search partners enabled (content network off). Created PAUSED by default so it never starts spending unexpectedly — enable it later with update_campaign_status. Dry run unless confirm=True.
Inputs: name (required), budget_id (required), customer_id (required), status, +2 more.
create_campaign_budgetA
Create a campaign budget. amount_micros is the daily amount in micros (1_000_000 micros = 1 unit of the account currency, e.g. $5/day = 5000000). delivery_method is 'STANDARD' or 'ACCELERATED'. Dry run unless confirm=True.
Inputs: name (required), customer_id (required), amount_micros (required), confirm, +1 more.
list_accessible_customersA
List the resource names of the Google Ads customers this login can access. Each looks like 'customers/1234567890'; the digits are the customer id.
Inputs: no named parameters.
list_ad_groupsA
List ad groups (optionally filtered to one campaign) with id, name, status, type, and CPC bid.
Inputs: customer_id (required), campaign_id.
list_adsA
List ads (optionally filtered to one ad group) with id, type, and status.
Inputs: customer_id (required), ad_group_id.
list_campaign_budgetsB
List campaign budgets with id, name, amount (micros), and delivery method.
Inputs: customer_id (required).
list_campaignsC
List campaigns with id, name, status, channel type, and budget id.
Inputs: customer_id (required), include_removed.
list_keywordsA
List keyword criteria (optionally filtered to one ad group) with text, match type, status, and the criterion id.
Inputs: customer_id (required), ad_group_id.
searchA
Run a GAQL (Google Ads Query Language) query and return the rows. This is the general-purpose read tool — anything reportable in Google Ads can be fetched here. Example query: "SELECT campaign.id, campaign.name, campaign.status, metrics.impressions, metrics.clicks, metrics.cost_micros FROM campaign WHERE segments.date DURING LAST_30_DAYS ORDER BY metrics.cost_micros DESC".
Inputs: query (required), customer_id (required).
update_ad_group_bidA
Change an ad group's default max CPC bid (in micros). Dry run unless confirm=True.
Inputs: ad_group_id (required), customer_id (required), cpc_bid_micros (required), confirm.
update_ad_group_statusA
Set an ad group's status: 'ENABLED', 'PAUSED', or 'REMOVED'. Dry run unless confirm=True.
Inputs: status (required), ad_group_id (required), customer_id (required), confirm.
update_campaign_budgetA
Change a campaign budget's daily amount (in micros). Dry run unless confirm=True.
Inputs: budget_id (required), customer_id (required), amount_micros (required), confirm.
update_campaign_statusA
Set a campaign's status: 'ENABLED' (start/resume serving), 'PAUSED' (stop serving), or 'REMOVED' (delete). Dry run unless confirm=True.
Inputs: status (required), campaign_id (required), customer_id (required), confirm.
update_keyword_statusA
Set a keyword's status: 'ENABLED', 'PAUSED', or 'REMOVED'. criterion_id is the keyword's criterion id (from list_keywords). Dry run unless confirm=True.
Inputs: status (required), ad_group_id (required), customer_id (required), criterion_id (required), +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 18 tools
Each tool targets a distinct entity and action (list, create, update) for customers, campaigns, ad groups, ads, budgets, and keywords. The general-purpose search tool is clearly separate from the type-specific listers, and even the two account-related tools (ads_whoami, list_accessible_customers) serve different purposes.
Most tools follow a predictable verb_noun pattern (list_*, create_*, update_*), but there are minor deviations like ads_whoami, search, campaign_performance, and 'add_keyword' instead of 'create_keyword'. These are readable and not chaotic, but break the otherwise consistent convention.
With 18 tools, the server is slightly on the heavier side but justified by the breadth of Google Ads entities and operations. Each tool covers a distinct area, and no tool feels redundant, so the count is well-scoped for the complexity of the domain.
The set covers account access, reporting, and CRUD for campaigns, ad groups, budgets, and keywords, but notably lacks any tool to create or update ads. This is a significant gap for an advertising management server, as ads are central to the workflow, though the presence of list_ads and search partially mitigates the issue.
Maintenance
Related MCP Connectors
Google Ads MCP server — manage campaigns, keywords, and metrics.
Google Ads MCP: reports, search terms, negatives, budgets, campaigns. Approval on every write.
Google Ads MCP server: 17 tools for reporting, campaigns, keywords, assets. Writes preview first.
Hosted Google Ads MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseAqualityFmaintenanceA read-write MCP server for managing Google Ads campaigns, ad groups, keywords, and ads via natural language.1227 PyPI2-

google-ads-mcpofficial
AlicenseBqualityAmaintenanceMCP server that provides tools and resources for interacting with Google Ads API, enabling search, metadata retrieval, and account management through natural language.75,144 PyPI1,136Apache 2.0- FlicenseNot gradedqualityDmaintenanceMCP server that lets any LLM manage Google Ads campaigns from the terminal. Supports read and write operations.-
- AlicenseNot gradedqualityCmaintenanceA Google Ads MCP server that enables safe, auditable management of ad accounts through natural language, including proposing, reviewing, applying, and rolling back changes with guardrails and dry-runs.MIT