All MCP servers

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

Checked October 26, 2026 against the tools/list of @getmcpads/google-ads-mcp-server 1.0.2

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.

ToolWhat it doesReads or changes
google_ads_health_checkChecks the credentials, API access and reachable accounts without returning secrets. The README says to call it first.Reads
google_ads_list_accountsEvery account the credentials can reach, plus enabled child accounts of a manager account.Reads
google_ads_get_account_detailsOne account's currency, time zone, status and settings.Reads
google_ads_get_account_hierarchyManager and client relationships between the accessible accounts.Reads
google_ads_get_campaignsCampaigns with status, budget, channel type and bidding strategy.Reads
google_ads_get_adgroupsAd groups, optionally for one campaign.Reads
google_ads_get_budgetsCampaign budgets with amount, status, delivery method and recommended amounts.Reads
google_ads_get_bidding_strategiesPortfolio bidding strategies, with metrics when given a date range.Reads
google_ads_get_conversion_actionsConversion actions with type, category and primary flags.Reads
google_ads_get_change_eventsChange history from the last 30 days, filterable by resource, operation and user email.Reads
google_ads_get_recommendationsGoogle's recommendations for the account, including dismissed ones if asked.Reads
google_ads_get_insightsThe main reporting tool. Takes named metrics and dimensions, writes the GAQL and splits incompatible requests.Reads
google_ads_validate_queryChecks a metric, dimension and resource combination before a query runs.Reads
google_ads_run_gaqlRuns a raw GAQL query through the API's searchStream reporting endpoint.Reads
google_ads_search_fieldsSearches Google's catalog of queryable GAQL resources, metrics and segments.Reads
google_ads_get_keyword_performanceKeyword performance with quality score, impressions, clicks and cost.Reads
google_ads_get_search_termsWhat people actually searched before an ad showed.Reads
google_ads_get_paid_organic_search_termsPaid and organic search terms side by side.Reads
google_ads_get_landing_pagesLanding page traffic, conversions and quality metrics.Reads
google_ads_get_simulationsBid and budget simulations for a campaign, ad group or bidding strategy.Reads
google_ads_get_pmax_assetsPerformance Max assets with their asset group and campaign.Reads
google_ads_get_pmax_asset_diagnosticsPerformance Max ad strength, coverage gaps and status reasons.Reads
google_ads_get_pmax_placementsWhere Performance Max ads served, with impressions.Reads
google_ads_get_shopping_productsMerchant Center products and their eligibility.Reads
google_ads_get_shopping_performanceShopping spend and conversions by product, brand and custom label.Reads
google_ads_generate_keyword_ideasKeyword Planner ideas from up to 20 seeds, a URL or a whole site.Reads
google_ads_generate_keyword_historical_metricsMonthly search volumes, competition and bid ranges for given keywords.Reads
google_ads_generate_keyword_forecast_metricsForecast clicks, cost and conversions for a hypothetical keyword campaign. Nothing is created.Reads
google_ads_generate_ad_group_themesSuggests which existing ad groups a list of keywords belongs in, without adding them.Reads
google_ads_suggest_geo_targetsResolves place names to Google Ads location IDs.Reads
google_ads_run_readonly_rpcCalls one of 30 allowlisted services outside GAQL, such as Reach Planner, audience insights, benchmarks, invoices and payments accounts.Reads
google_ads_update_campaign_statusPauses, re-enables or removes a campaign.Changes
google_ads_update_campaign_budgetSets a campaign's daily budget, in the account currency.Changes
google_ads_update_campaign_scheduleChanges a campaign's start or end date.Changes
google_ads_rename_campaignRenames a campaign and changes nothing else.Changes
google_ads_create_campaignCreates a campaign and its budget, always paused, so someone has to switch it on before it spends.Changes
google_ads_update_adgroup_statusPauses, re-enables or removes an ad group.Changes
google_ads_update_adgroup_bidSets 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:

  1. 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.
  2. A refresh token. Run Google's OAuth consent flow once with that client and the https://www.googleapis.com/auth/adwords scope, 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.
  3. 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.
  4. A developer token value. Google now ignores the developer-token header, but version 1.0.2 refuses to start without GOOGLE_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:

bash
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.2

If 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:

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

Yes, if you grant it the tools. Statio runs the package with its 7 write tools on: campaign status, budgets, schedules, renames and paused campaign creation, plus ad group status and bids. Each one returns a preview first and applies the change only when called again with confirm: true. A new server has no grants, so none of them work until you add them.

Yes. Google publishes googleads/google-ads-mcp on GitHub, with three tools: search, get_resource_metadata and list_accessible_customers. It is read-only and expects the model to write GAQL. This catalog entry runs the community package @getmcpads/google-ads-mcp-server instead, which has named reporting tools and Keyword Planner.

Google stopped using developer tokens on September 9, 2026, and access is now set on your Google Cloud project. Version 1.0.2 of this package still requires GOOGLE_ADS_DEVELOPER_TOKEN to be set, so give it your old token or any non-empty value.

Your Cloud project has Test access, which enabling the API grants. Apply for Explorer access on the Google Ads API Overview page in Cloud Console to reach production accounts.

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.