Google Ads MCP server
Campaigns, ad groups, keywords, budgets and performance reporting for your Google Ads accounts.
How it connects
New to MCP? What is an MCP server?
- Runs on
- Statio's runtime
- Connects with
- Credentials you paste in once: Developer Token, OAuth Client ID, OAuth Client Secret, Refresh Token
- May connect to
googleads.googleapis.comoauth2.googleapis.com- Category
- Other
What it does
This server lets an agent read a Google Ads account and make a few campaign changes. It reads campaigns, ad groups, budgets, bidding strategies, keyword and search term performance, Performance Max and Shopping reports, change history and Google's own recommendations. It also runs Keyword Planner, so an agent can pull search volumes and forecasts. It is @getmcpads/google-ads-mcp-server, an Apache-2.0 package that is not made by Google, and Statio runs version 1.0.2 of it against Google Ads API v25.
The package registers 7 tools that change campaigns only when GOOGLE_ADS_ENABLE_WRITES=1 is set. Statio sets it, so all 38 tools are there and your grants decide which ones an agent gets. Google publishes its own server too, googleads/google-ads-mcp, with three tools (search, get_resource_metadata and list_accessible_customers) that expect the model to write GAQL itself.
Tools
Version 1.0.2 lists 38 tools with writes on, and none of them sets annotations. The last column comes from the source. The 31 reading tools come first; the two open-ended ones are fenced in, as described under the table. The 7 that change campaigns are at the bottom, and each one previews by default: without confirm: true it describes the change instead of applying it.
| Tool | What it does | Reads or changes |
|---|---|---|
google_ads_health_check | Checks the credentials, API access and reachable accounts without returning secrets. The README says to call it first. | Reads |
google_ads_list_accounts | Every account the credentials can reach, plus enabled child accounts of a manager account. | Reads |
google_ads_get_account_details | One account's currency, time zone, status and settings. | Reads |
google_ads_get_account_hierarchy | Manager and client relationships between the accessible accounts. | Reads |
google_ads_get_campaigns | Campaigns with status, budget, channel type and bidding strategy. | Reads |
google_ads_get_adgroups | Ad groups, optionally for one campaign. | Reads |
google_ads_get_budgets | Campaign budgets with amount, status, delivery method and recommended amounts. | Reads |
google_ads_get_bidding_strategies | Portfolio bidding strategies, with metrics when given a date range. | Reads |
google_ads_get_conversion_actions | Conversion actions with type, category and primary flags. | Reads |
google_ads_get_change_events | Change history from the last 30 days, filterable by resource, operation and user email. | Reads |
google_ads_get_recommendations | Google's recommendations for the account, including dismissed ones if asked. | Reads |
google_ads_get_insights | The main reporting tool. Takes named metrics and dimensions, writes the GAQL and splits incompatible requests. | Reads |
google_ads_validate_query | Checks a metric, dimension and resource combination before a query runs. | Reads |
google_ads_run_gaql | Runs a raw GAQL query through the API's searchStream reporting endpoint. | Reads |
google_ads_search_fields | Searches Google's catalog of queryable GAQL resources, metrics and segments. | Reads |
google_ads_get_keyword_performance | Keyword performance with quality score, impressions, clicks and cost. | Reads |
google_ads_get_search_terms | What people actually searched before an ad showed. | Reads |
google_ads_get_paid_organic_search_terms | Paid and organic search terms side by side. | Reads |
google_ads_get_landing_pages | Landing page traffic, conversions and quality metrics. | Reads |
google_ads_get_simulations | Bid and budget simulations for a campaign, ad group or bidding strategy. | Reads |
google_ads_get_pmax_assets | Performance Max assets with their asset group and campaign. | Reads |
google_ads_get_pmax_asset_diagnostics | Performance Max ad strength, coverage gaps and status reasons. | Reads |
google_ads_get_pmax_placements | Where Performance Max ads served, with impressions. | Reads |
google_ads_get_shopping_products | Merchant Center products and their eligibility. | Reads |
google_ads_get_shopping_performance | Shopping spend and conversions by product, brand and custom label. | Reads |
google_ads_generate_keyword_ideas | Keyword Planner ideas from up to 20 seeds, a URL or a whole site. | Reads |
google_ads_generate_keyword_historical_metrics | Monthly search volumes, competition and bid ranges for given keywords. | Reads |
google_ads_generate_keyword_forecast_metrics | Forecast clicks, cost and conversions for a hypothetical keyword campaign. Nothing is created. | Reads |
google_ads_generate_ad_group_themes | Suggests which existing ad groups a list of keywords belongs in, without adding them. | Reads |
google_ads_suggest_geo_targets | Resolves place names to Google Ads location IDs. | Reads |
google_ads_run_readonly_rpc | Calls one of 30 allowlisted services outside GAQL, such as Reach Planner, audience insights, benchmarks, invoices and payments accounts. | Reads |
google_ads_update_campaign_status | Pauses, re-enables or removes a campaign. | Changes |
google_ads_update_campaign_budget | Sets a campaign's daily budget, in the account currency. | Changes |
google_ads_update_campaign_schedule | Changes a campaign's start or end date. | Changes |
google_ads_rename_campaign | Renames a campaign and changes nothing else. | Changes |
google_ads_create_campaign | Creates a campaign and its budget, always paused, so someone has to switch it on before it spends. | Changes |
google_ads_update_adgroup_status | Pauses, re-enables or removes an ad group. | Changes |
google_ads_update_adgroup_bid | Sets an ad group's default CPC bid. It does nothing on automated bidding. | Changes |
google_ads_run_readonly_rpc takes an operation from a fixed list, not a path, and the client blocks any service path containing words such as mutate, create, update, delete or upload before it attaches credentials. Those 30 operations include listInvoices, listPaymentsAccounts and getIdentityVerification, which is billing data most reporting agents have no use for.
Set it up
You need three values from Google and one that only the package still wants:
- An OAuth client. In a Google Cloud project, enable the Google Ads API, then under APIs & Services > Credentials create an OAuth client ID of type Desktop app. Note the client ID and secret.
- A refresh token. Run Google's OAuth consent flow once with that client and the
https://www.googleapis.com/auth/adwordsscope, signed in as the Google account that can see your ad accounts. Google's OAuth guide covers it. The token doesn't expire on its own, so treat it like a password. - API access on the project. Google sunset developer tokens on September 9, 2026, and access levels now belong to the Cloud project. Enabling the API gives Test access, which only reaches test accounts. To read real accounts, apply for Explorer access on the Google Ads API Overview page in Cloud Console. Google describes the review as automated in most cases, and Explorer allows 2,880 operations a day against production accounts.
- A developer token value. Google now ignores the
developer-tokenheader, but version 1.0.2 refuses to start withoutGOOGLE_ADS_DEVELOPER_TOKEN. If you have an old token, use it. If you don't, any non-empty value gets past the check, since the API no longer reads it.
Claude Code, directly:
claude mcp add google-ads \
-e GOOGLE_ADS_DEVELOPER_TOKEN=your-old-token \
-e GOOGLE_ADS_CLIENT_ID=your-client-id.apps.googleusercontent.com \
-e GOOGLE_ADS_CLIENT_SECRET=your-client-secret \
-e GOOGLE_ADS_REFRESH_TOKEN=your-refresh-token \
-- npx -y @getmcpads/google-ads-mcp-server@1.0.2If your accounts sit under a manager account, also set GOOGLE_ADS_LOGIN_CUSTOMER_ID to the manager's ID.
Cursor, directly, in ~/.cursor/mcp.json or .cursor/mcp.json:
{
"mcpServers": {
"google-ads": {
"command": "npx",
"args": ["-y", "@getmcpads/google-ads-mcp-server@1.0.2"],
"env": {
"GOOGLE_ADS_DEVELOPER_TOKEN": "${env:GOOGLE_ADS_DEVELOPER_TOKEN}",
"GOOGLE_ADS_CLIENT_ID": "${env:GOOGLE_ADS_CLIENT_ID}",
"GOOGLE_ADS_CLIENT_SECRET": "${env:GOOGLE_ADS_CLIENT_SECRET}",
"GOOGLE_ADS_REFRESH_TOKEN": "${env:GOOGLE_ADS_REFRESH_TOKEN}"
}
}
}
}The client tutorials, How to add MCP servers to Claude Code and How to set up MCP servers in Cursor, explain config scopes and how to keep these values out of files you commit.
Through Statio: install Google Ads from the catalog, paste the four values and a login customer ID under the server's Credentials, and grant tools under Permissions. A new server has no grants, so nobody can call it until you add some. The desktop app then writes your client configs. The manual entry is the local proxy URL with the server name from your dashboard, http://127.0.0.1:7777/google-ads/mcp, added in Claude Code with claude mcp add --transport http google-ads <url> or as a "url" in Cursor. The login customer ID is your manager account's ID if your ad accounts sit under one. Without a manager account, enter the ID of the account the agent will work in. Tools missing after that? Start a fresh session, then work through How to debug an MCP server that won't connect.
What to hold back
Even the reading tools hand an agent a lot. Spend, cost per conversion, search terms and landing page results are the numbers a competitor would most like to see, and they leave the account as soon as the agent puts them in a prompt, a summary or a ticket.
Start with the account list. The refresh token acts as the Google user who signed in, and google_ads_list_accounts follows that user into every client account under a manager account. An agency agent asked about one client can read all of them. Mint the refresh token as a user who can see only the accounts the agent is for, since no tool grant can narrow which accounts a call reaches.
google_ads_run_readonly_rpc is the tool most agents should not get. Its allowlist reaches invoices, payments accounts and identity verification as well as Reach Planner and audience insights. A reporting agent gets everything it needs from google_ads_get_insights and the dedicated report tools.
google_ads_run_gaql and google_ads_search_fields can only read, but they read anything GAQL can reach, including resources that none of the named tools return. Grant them to an agent you want to explore the account, and keep them from one that only produces a weekly report.
The Keyword Planner tools, google_ads_generate_keyword_ideas, google_ads_generate_keyword_historical_metrics and google_ads_generate_keyword_forecast_metrics, cost you quota rather than data. Every call draws on the Cloud project's daily limit, which is 2,880 operations against production accounts on Explorer access. An agent that loops over seed lists can use up the day's budget, and that limit is shared with any other code using the same project.
Report rows also carry text written outside your team: search terms typed by the public and landing page URLs. Treat them as untrusted input, like any other text an agent reads.
The 7 campaign tools spend or stop spending money. Give them only to an agent you'd trust with the account yourself, and keep google_ads_update_campaign_budget and google_ads_update_campaign_status from anything that runs unattended. The preview step is a request parameter, not a safeguard: an agent that wants the change sends confirm: true.
With Statio you grant each tool separately, so a weekly-report agent can hold google_ads_get_insights and the campaign readers while a keyword research agent holds only the planner tools. MCP permissions covers how grants and denies combine.
Questions
What Statio adds
- You choose which of its tools each agent may call. A tool you hold back is removed from that agent's tool list, and a call to it is refused.
- The credentials stay encrypted in Statio, so they never sit in an agent config file.
- Every call is recorded with the agent that made it, when, how long it took and whether it succeeded.
- The outbound list above is enforced outside the server's container, so it cannot reach any other host.
Lock down your first tool in minutes.
Three MCP servers, one of them hosted, and 10,000 calls a month, free and without a card. If you outgrow it the next plan is $19.
Two steps: create your account, then install the desktop app on each machine that runs an AI client.
- Keys encrypted at rest, never handed to an agent
- Cancel anytime, nothing is deleted
- How Statio handles credentials