Home

/

Servers

/

Google Ads

Google Ads MCP Server - Connect Claude to Your Ad Campaigns

Google Ads MCP Server - Connect Claude to Your Ad Campaigns

by

Google

  • Paid media
  • Reporting API
  • Campaign data
  • Official
  • Native to Polar

Connect Claude or any AI agent to your Google Ads account: query campaign performance, run GAQL reports, feed spend into your attribution model. Read-only.

Google publishes this one itself, and it is deliberately small. There is no tool for creating a campaign, moving a budget or pausing an ad: the server reads the Google Ads API and stops there. What you get instead is the whole reporting surface behind a single query tool, plus the metadata to write those queries correctly. It is the most honest server in the Ads category, and the one that requires the most setup: a Google Cloud project, OAuth credentials, and a developer token with Explorer access once you query production accounts.

Open-sourced by Google on 7 October 2025. Not in the Claude directory: create the credentials on Google's side, then declare it in your MCP client's config.

Key Features

  1. One query tool over the full Google Ads API: campaigns, ad groups, keywords, search terms, assets.
  2. Schema introspection, so the agent checks which fields exist before querying them.
  3. Account discovery, including manager accounts through a login customer id.
  4. Read-only by design: no bid, budget or campaign write ever leaves the server.
  5. Tools can be enabled, disabled or renamed through a tools config file.
  6. Native connector inside Polar, no pipeline to maintain.

Use Cases

  1. Pulling campaign and keyword performance without opening the Ads UI.
  2. Checking which accounts a set of credentials actually reaches before reporting on them.
  3. Learning the shape of a resource before writing the report query against it.
  4. Feeding spend into a wider blended view, since spend on its own is not ROAS.

Tools

3

  • searchRuns a query against the Google Ads API and returns the account data behind it.
  • get_resource_metadataDescribes a resource type, for example a campaign, and the fields available on it.
  • list_accessible_customersReturns the customer ids the authenticated user can reach.
  • discovery-documentResource, not a tool: the API surface, its methods and schemas.
  • metricsResource, not a tool: every metric available for reporting.
  • segmentsResource, not a tool: every segment available for reporting.
  • release-notesResource, not a tool: the latest Google Ads API release notes.

Connect it

What you need before the first question, and where it goes.

claude_desktop_config.json

Copy

{ "mcpServers": { "google-ads-mcp": { "command": "pipx", "args": ["run", "--spec", "google-ads-mcp", "google-ads-mcp"], "env": { "GOOGLE_APPLICATION_CREDENTIALS": "/path/to/credentials.json", "GOOGLE_PROJECT_ID": "your-project-id", "GOOGLE_ADS_DEVELOPER_TOKEN": "your-developer-token", "GOOGLE_ADS_LOGIN_CUSTOMER_ID": "manager-account-id, if any" } } } }

Open the server

What the Google Ads MCP server actually is

Google open-sourced it on 7 October 2025 and maintains it through the Google Ads API team. It ships as a Python package, google-ads-mcp, Apache-2.0, released on PyPI. And it is deliberately small: three tools and four resources, sitting directly on the Google Ads API.

The three tools work as a chain rather than a menu. list_accessible_customers tells the agent which accounts the credentials reach. get_resource_metadata describes a resource type — a campaign, an ad group, a keyword — and the fields available on it. search then runs a GAQL query and returns the rows. The four resources sit underneath: the API discovery document, the list of reportable metrics, the list of segments, and the current release notes. An agent reads those before writing a query, which is why this server needs so few tools to cover so much of the API.

Google's official server vs the community ones

Search GitHub for a Google Ads MCP server and you will find a dozen. They divide into two families, and the difference is not quality, it is scope.

The official one reads. Three tools, no mutate path, maintained by the team that ships the API itself — which matters more than it sounds, because the Google Ads API ships new versions several times a year and sunsets the old ones, and something has to keep up.

The community ones write, and they are much larger for that reason. FGRibreau/mcp-google-ads describes itself as 63 tools covering campaigns, RSA ads, keywords, extensions, PMax, audiences, bidding and budgets, with two-step safety guardrails. amekala/ads-mcp spans Google, Meta, LinkedIn and TikTok in one server. grantweston/google-ads-mcp-complete advertises 29 tools. Those counts are the projects' own claims, not something we have audited.

One trap worth knowing: google-marketing-solutions/google_ads_mcp_server is archived and points to the googleads repository. If a tutorial sends you there, the tutorial predates the move.

How to choose is simple. If you want an agent that reports, take the official one and stop. If you want an agent that changes campaigns, you are choosing an unofficial server that holds write access to your ad account, and you should read its code before you hand it credentials.

What “read-only by design” really means

What it will never do

No bid changes. No budget moves. No pausing or enabling a campaign. No new ads, no asset uploads, no negative keywords, no audience edits. The server exposes no write path at all — not a locked one, not a guarded one. search reads, the metadata tool describes, the customer tool lists.

Why that is a feature, not a limit

An agent that cannot write cannot spend your money by misreading a prompt. Reporting is also where the ratio of value to risk is best today: pulling a week of performance across accounts is tedious and low-stakes, while moving a budget is fast and high-stakes. You lose nothing by keeping the second one in the interface built for it.

Setting up the Google Ads MCP server, step by step

Prerequisites

Python 3.10 or later, pipx, a Google Cloud project with the Google Ads API enabled, and access to the Google Ads account you want to query.

The developer token

Optional against test accounts, required for production ones, and it needs at least Explorer access. If the token is not there yet, the server tells you plainly: The developer token is only approved for use with test accounts. New tokens are often upgraded to Explorer automatically; if yours is not, you apply through the API Center.

Credentials, three ways

Application Default Credentials is the shortest path: run gcloud auth application-default login with the https://www.googleapis.com/auth/adwords scope and point the server at the credentials file. The FastMCP OAuth proxy is the one to pick when the server runs as a web service: set the OAuth client id and secret as environment variables and the server switches from stdio to streamable HTTP on its own. And if you already have a working google-ads.yaml from the Python client library, it can be reused as is.

Manager accounts

If your access to an account goes through a manager account, set GOOGLE_ADS_LOGIN_CUSTOMER_ID to the manager's customer id. Skip it and the calls fail in a way that reads like a permissions problem.

Choosing which tools load

A tools_config.yaml enables or disables tools and categories and sets their namespace prefixes. A default one ships with the package, so the server works untouched. One sharp edge: if you point GOOGLE_ADS_MCP_TOOLS_CONFIG at a file that is missing or invalid, the server does not fall back — it raises and refuses to start.

Testing the connection

Ask what the server can do, then ask which customers you can reach, then ask something real: “How many active campaigns do I have for customer id 1234567890?” Include the customer id in the prompt when you move between accounts — the agent will ask for it otherwise, on nearly every question.

What you can ask once it is connected

  • “How did my campaigns perform last week, by cost, conversions and conversion value?”
  • “Which search terms cost more than €50 last month with no conversion?”
  • “List every campaign that changed status in the last 14 days.”
  • “Which ad groups have a quality score under 5 and more than €100 of spend?”
  • “What fields can I query on a campaign, and which segments can I break them down by?”

Everything here compiles down to GAQL. The agent composes the query, the server runs it, and the rows come back — which is also why an answer is only as precise as the question: ask for “performance” and you will get whatever the model decided that meant.

Where the Google Ads MCP server stops

It knows what you spent. It does not know what you earned.

Google Ads counts conversions the way Google Ads counts them, on its own attribution window, in its own account. It has no view of your net revenue after returns, your product margin, your shipping cost, or what the same customer did on Meta, in an email flow, or three weeks later on a repeat order. Blended ROAS, customer acquisition cost across channels, contribution margin — none of those exist in the Google Ads API to be queried, at any tool count.

That is the boundary every platform MCP server has, and stacking more of them does not dissolve it: three servers return three versions of “revenue last week” and the model picks one. The join has to happen underneath, in a layer where revenue is defined once. That is what the Polar MCP reads from — Google Ads spend reconciled with Shopify orders, Klaviyo flows and the rest of the stack, against your definitions rather than each platform's.

Compatibility

The server speaks stdio by default, so it works with any MCP client that runs a local command: Claude Code, Cursor, VS Code, Antigravity. The mcpServers block is the same in all of them, only the file path changes.

For a client that only accepts a remote server, deploy it with the OAuth proxy enabled — the transport switches to streamable HTTP and the server can sit on Cloud Run behind an OAuth client. Either way there is no one-click path: it is not listed in Claude's connector directory, so you create the credentials on Google's side first.

Two things Google states plainly and that are worth repeating: the server exposes your Google Ads data to whichever model you connect it to, and it adds a header to your API calls so usage can be measured.

Frequently asked questions

Is there an official Google Ads MCP server?

Yes. Google open-sourced it on 7 October 2025 under the googleads organisation, Apache-2.0, published on PyPI as google-ads-mcp and maintained by the Google Ads API team.

Can it change my campaigns, budgets or bids?

No. It is read-only by design and exposes no write path. Campaign management through MCP means an unofficial server.

Do I need a Google Ads developer token?

For test accounts it is optional. For production accounts it is required, with at least Explorer access.

Does the Google Ads MCP server work with Claude?

Yes, though not in one click. It runs locally over stdio, declared in your client's config file — Claude Code, Cursor and VS Code all take the same block. It is not listed in Claude's connector directory, so you create the credentials on Google's side first; to reach it from a client that only accepts remote servers, deploy it behind the OAuth proxy.

How many tools does it have?

Three tools and four resources. Community servers advertise far more because they also write; the official one only reads.

Can I choose which tools load?

Yes, through tools_config.yaml, which enables or disables individual tools and categories and can rename their namespace prefixes.

Does it work with a manager account?

Yes. Set GOOGLE_ADS_LOGIN_CUSTOMER_ID to the manager account's customer id.

Why can't it tell me my blended ROAS?

Because revenue does not live in Google Ads. Blended ROAS needs ad spend joined to orders across every channel on one definition of revenue, which is the job of a semantic layer rather than a platform connector.

<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Is there an official Google Ads MCP server?","acceptedAnswer":{"@type":"Answer","text":"Yes. Google open-sourced it on 7 October 2025 under the googleads organisation, Apache-2.0, published on PyPI as google-ads-mcp and maintained by the Google Ads API team."}},{"@type":"Question","name":"Can it change my campaigns, budgets or bids?","acceptedAnswer":{"@type":"Answer","text":"No. It is read-only by design and exposes no write path. Campaign management through MCP means an unofficial server."}},{"@type":"Question","name":"Do I need a Google Ads developer token?","acceptedAnswer":{"@type":"Answer","text":"For test accounts it is optional. For production accounts it is required, with at least Explorer access."}},{"@type":"Question","name":"Does the Google Ads MCP server work with Claude?","acceptedAnswer":{"@type":"Answer","text":"Yes, though not in one click. It runs locally over stdio, declared in your client's config file — Claude Code, Cursor and VS Code all take the same block. It is not listed in Claude's connector directory, so you create the credentials on Google's side first; to reach it from a client that only accepts remote servers, deploy it behind the OAuth proxy."}},{"@type":"Question","name":"How many tools does it have?","acceptedAnswer":{"@type":"Answer","text":"Three tools and four resources. Community servers advertise far more because they also write; the official one only reads."}},{"@type":"Question","name":"Can I choose which tools load?","acceptedAnswer":{"@type":"Answer","text":"Yes, through tools_config.yaml, which enables or disables individual tools and categories and can rename their namespace prefixes."}},{"@type":"Question","name":"Does it work with a manager account?","acceptedAnswer":{"@type":"Answer","text":"Yes. Set GOOGLE_ADS_LOGIN_CUSTOMER_ID to the manager account's customer id."}},{"@type":"Question","name":"Why can't it tell me my blended ROAS?","acceptedAnswer":{"@type":"Answer","text":"Because revenue does not live in Google Ads. Blended ROAS needs ad spend joined to orders across every channel on one definition of revenue, which is the job of a semantic layer rather than a platform connector."}}]}</script> <script type="application/ld+json">{"@context":"https://schema.org","@type":"SoftwareApplication","name":"Google Ads MCP Server","applicationCategory":"BusinessApplication","operatingSystem":"Web","author":{"@type":"Organization","name":"Google"},"url":"https://github.com/googleads/google-ads-mcp","license":"https://www.apache.org/licenses/LICENSE-2.0","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"}}</script>