- Four ways to automate an account, split by one line: scripts and Google's official MCP server are ready-made; a real write path on the raw API is build-it-yourself. [3]
- The read path runs today. The official Google Ads MCP server ships three tools, all queries, and cannot change a thing. [3]
- To spend money you leave Google's connector behind: a community or hosted server, or tools you write. Either way you inherit the guardrails. [9]
- v25 (July 22, 2026) deleted the lifecycle goal resources with no deprecation window; code that reads them fails on upgrade. [5][7]
- July's security additions harden account access, not agent spend: passkeys are console-only, multi-party approvals cover user management. [9][10]
- The only real limit on blast radius is the credential's reach and the caps you bake into the tool. Not the prompt.
You open a terminal and type one sentence: pull last week's search terms with spend over $50 and no conversions, and draft me a negative keyword list. A few seconds later the account has been queried, the rows filtered, and a reviewed list handed back. Type again and the budget shift you described is staged, paused, waiting for you to confirm. This is not a demo. It runs today, and the setup takes an afternoon.
The question is no longer whether you can operate Google Ads from a conversation. You can. The question this guide answers is the practical one: which of the four available paths fits the job, how to wire the safe read path in ten minutes, what the July v25 release quietly broke underneath you, and how to build a write path that fails safe instead of fast. For the prior question, whether you should hand an agent your accounts at all, and where the accountability sits when it does, the companion piece on what to let Claude Code touch is the argument. This one is the build.
01Four paths, and the line that divides them
There is not one way to automate a Google Ads account. There are four, and they are not competitors so much as tools for different jobs. The useful way to sort them is the line between what someone already built for you and what you assemble yourself.
| Path | Ready-made | Can write | Who owns the guardrails |
|---|---|---|---|
| Google Ads scripts | Yes | Yes, in-platform | Google's sandbox, your rules |
| Official MCP server | Yes | No, read-only [3] | Not applicable, it cannot spend |
| Community or hosted MCP | Yes | Yes | The vendor's model, then yours |
| Raw Google Ads API (v25) | No, you build it | Yes | Entirely yours |
Google Ads scripts are the oldest and most boring of the four, and that is their strength: deterministic JavaScript that runs on Google's own servers on a schedule, ideal for the fixed, repeatable jobs an agent would be overkill for, like a budget-pacing alert or an out-of-stock pause. The MCP options and the raw API are where the conversational, exploratory work lives. MCP itself is an open standard for connecting a model to the tools and data where the work happens, and Claude Code speaks it natively. [2] And between those two, the fork that decides your whole week is read versus write.
Before the table turns into a decision, match it to the job in front of you.
Use the official MCP server. Reporting, anomaly-spotting, and cross-account analysis are read-only work, which means the worst case is a wrong answer you can check, not a wrong charge you cannot undo. Google's own connector does exactly this and nothing more, so there is no blast radius to secure. Start here this afternoon.
Use a Google Ads script. If the logic is fixed, runs on a clock, and lives inside one account (pause zero-conversion terms nightly, alert when a budget paces hot), you do not want an agent reasoning about it every time. You want a deterministic rule that runs the same way at 3am. Scripts still win the boring, scheduled jobs.
Build a write path, or connect a write-capable server you trust. Exploratory, one-off, conversational changes (draft these negatives, stage that budget shift, restructure this ad group) are where Claude Code earns its place, and where the money is. This is the rest of the guide, and the part you have to secure yourself.
The pattern most teams land on is not picking one. It is running scripts for the deterministic jobs, the official server for reading, and a carefully built write path for the conversational changes, with a human owning the objective on every path that can spend.
02The read path, wired in ten minutes
Start where the risk is lowest and the payoff is immediate. Google ships an official connector for exactly this: the Google Ads MCP server, published at github.com/googleads/google-ads-mcp, gives any MCP-compatible client read-only access to an account. [3] It exposes three tools, and every one of them is a query.
Get the credentials
A Google Ads developer token from the API Center, a Google Cloud project, and an OAuth client or Application Default Credentials. The same three things every API integration needs. [4]
Declare the server
One entry in a .mcp.json file tells Claude Code to launch the server as a subprocess. It runs locally over standard input-output; nothing is hosted. [1]
Ask in plain English
You describe the report, Claude Code writes the query in the account's own language and reasons over the rows. Three screens of clicks become one line of intent.
The configuration is short. Claude Code reads three scopes for where a server is defined: local (just you), project (committed and shared with your team), and user (all your projects). [1]
"mcpServers": { "google-ads": { "command": "pipx", "args": ["run", "--spec", "git+https://github.com/googleads/google-ads-mcp.git", "google-ads-mcp"], "env": { "GOOGLE_ADS_DEVELOPER_TOKEN": "your-developer-token" } } }
Once it is connected, the agent works in GAQL, the account's SQL-like query language. You never write it by hand. You say what you want to see, and the model produces and runs the query behind it. The wasted-spend request from the opening looks like this once translated:
SELECT search_term_view.search_term, metrics.cost_micros FROM search_term_view WHERE metrics.conversions = 0 AND metrics.cost_micros > 50000000 AND segments.date DURING LAST_30_DAYS
Two credential details decide how far this scales. First, access level: a developer token at Test or Basic access runs up to 15,000 operations per day, where an operation is any read or write request; Standard access lifts that to effectively unlimited. [8] For read-heavy analysis across a handful of accounts, Basic is usually enough to begin. Second, and more important, the signal in the tool count.
Google's own MCP server ships three tools, and every one of them is a query.
Google Ads MCP server, github.com/googleads/google-ads-mcpThe company that owns the data decided what an agent should get by default: look, do not touch. To spend money in Google Ads, you will not use Google's connector. You build the write path yourself, which is the whole reason the guardrails end up being yours.
03What v25 changed underneath you
Any integration you build is a maintenance commitment, because the API does not sit still. Google moved the Google Ads API to a monthly release cadence in 2026, and v25, released July 22, is a major version with breaking changes, not a quiet point update. [5] Two of its changes matter to anyone wiring an agent, and one of them will take down a naive integration on the day it upgrades.
| v25 change | What it does | If you ignore it |
|---|---|---|
| Lifecycle goals removed [7] | Deletes the CustomerLifecycleGoal and CampaignLifecycleGoal resources and services, no replacement mapping | Any read or write of lifecycle goals fails on upgrade |
| Synthetic content now mutable [5] | AI-content attestation fields become writable (backported to v24 and v23) | You keep stubbing a field you could now set programmatically |
| Richer YouTube reporting [6] | Adds Shorts social metrics and duration segments for non-skippable instream | You under-report the formats clients ask about |
The removal is the one to respect. In v24 you configured customer acquisition through the lifecycle goal resources. In v25 those resources are gone, deleted outright, with configuration moved to a unified Goal and CampaignGoalConfig schema, and there is no soft-deprecation path or automatic remapping. [7] An agent that queries the old resources does not degrade gracefully. It errors.
The practical lesson is not the specific fields. It is the treadmill itself. A monthly major cadence means any integration sprawled across raw endpoints becomes a monthly firefight. The defense is architectural: keep the platform-touching code in a thin, single layer you can version-bump and re-test in one place, rather than letting v25's field names leak into every tool your agent calls. That thin layer is exactly what the write path should be anyway.
04The auth reality, and what it does not protect
Before you build anything that spends, it helps to know precisely what the platform secures for you, because it is less than the headlines suggest. Google spent 2026 adding security controls, and they are real. They also guard a different door than the one an agent walks through.
Here is the part that surprises people. Google Ads exposes a single broad OAuth scope, adwords, described on the consent screen as permission to see, edit, create, and delete your Google Ads accounts and data. There is no read-only sub-scope. A connector that only reports asks for the same all-powerful permission as one that can delete a campaign, so the token is doing the talking, not the tool's friendly description. [9]
The 2026 additions do not narrow that. They add friction at sign-in and for account access, which is not the same as limiting spend.
What the new controls do
- Passkeys, enforced July 15, 2026, gate sensitive actions a human takes in the console: adding users, changing billing, editing access. [10]
- Multi-party approvals, from July 27, 2026, require a second party to approve sensitive user-management actions through the API. [9]
- Multi-factor authentication is required on the user flow that issues API refresh tokens. [9]
What none of them do
- Stop an authorized agent from moving a budget or pausing a winner.
- Apply to programmatic API calls once an OAuth token exists; passkeys are a console control, not an API gate. [10]
- Cap spend, scope a credential to one account, or review a change before it ships.
Read the split plainly. Passkeys harden human sign-in. Multi-party approvals harden who can be granted access. Both are about the front door. What an already-authorized agent does inside, at the speed of automation, is still entirely on you. That is not a gap Google forgot to close. It is the design: the platform secures identity and access, and leaves the blast radius of an authorized action to the person who authorized it.
05Build the write path so it fails safe
There are two ways to give Claude Code the power to change an account, and they trade convenience for control.
The fast way is to connect a write-capable server someone else built. Community and hosted options exist, like the mcp-google-ads server, which routes every write through a two-step safety layer (draft a change, review the preview, then confirm), with budget caps, bid limits, and audit logging built in. [11] That posture, paused-by-default and confirm-before-execute, is exactly what to demand from any write server. But it still holds the broad scope, and its safety model is the vendor's, not yours.
The controlled way is to write the mutate tools yourself: thin, typed tools you expose to Claude Code, each doing one thing on one account. It is more work, and it is the only honest choice for any account you cannot afford to have wrecked. The principle is simple and worth stating as a rule.
A model told to be careful is not a control. A tool that physically cannot exceed a cap is. Put the limit where the prompt cannot reach it: in the code.
Here is what that looks like in practice. One tool, one job, wired to one account, with the cap compiled in rather than requested politely.
from google.ads.googleads.client import GoogleAdsClient ALLOWED_CUSTOMER = "1234567890" # the sandbox account, nothing else MAX_TERMS = 50 # a hard cap the prompt cannot raise def add_negative_keywords(customer_id, campaign_id, terms): if customer_id != ALLOWED_CUSTOMER: raise ValueError("refusing: this credential is wired to one account") if len(terms) > MAX_TERMS: raise ValueError("refusing: too many terms, over the hard cap") client = GoogleAdsClient.load_from_env(version="v25") # ... build the criterion operations here ... # Every change is added as NEGATIVE and left for a human to review. # The tool exposes no path to enable, raise a budget, or delete. return "staged " + str(len(terms)) + " negatives for review"
Notice what the tool cannot do. It cannot touch another account, because the credential and the check both pin it to one. It cannot add a thousand terms, because the cap is a constant, not a parameter. It cannot enable anything or raise a budget, because no code path exists for it to call. The agent is free to be as confident as it likes; the surface it can act on is the one you deliberately drew. Contrast that with the platform's own automated products, like Performance Max and Advantage+, where the lever you hand over is a goal you set and the system runs; here the lever is a tool you define, and its shape is the whole safety story.
Run your finished write path against a short checklist before it sees a live account. Treat any unchecked line as blocking, not as a nice-to-have.
- The write credential reaches one account or a sandbox, never your whole manager hierarchy.
- Each tool does one thing and validates its inputs; there is no general "run this mutate" tool.
- Every change is created paused or in preview, so a mistake surfaces before it spends.
- Hard limits (spend, item counts, allowed accounts) live in the tool's code, not in the prompt.
- Every tool call is logged, not just every API call, because the tool call is where the real action is decided.
- You trust and have read each MCP server you connect, and reject any that fetches untrusted external content. [1]
That last line is not boilerplate. Claude Code's own documentation warns to verify you trust a server before connecting it, because a server that pulls in external content can carry a prompt injection straight into an agent holding a scope that can delete campaigns. [1] For this connector, that warning is the threat model, not fine print.
06A small ad-ops cookbook
With the read path live and one or two capped write tools in place, the day-to-day is a conversation. These are the requests that earn their keep first, each a plain sentence that becomes a query or a staged, paused change underneath.
Prune wasted spend
"Find search terms over $50 with zero conversions in the last 30 days and draft a negative list." A read to find them, then your capped add-negatives tool to stage them, paused, for your review.
Read, then staged writeCatch a budget pacing hot
"Which campaigns have spent more than 60 percent of their monthly budget with 40 percent of the month left?" Pure read. The answer is a list you act on, or a threshold you later hand to a deterministic script.
Read onlySpot anomalies across accounts
"Compare this week's cost per conversion to the trailing four-week average for every account, and flag anything more than 30 percent worse." The kind of cross-account sweep that is tedious by hand and safe to automate, because it only reports. This is where agents are already production-ready.
Read onlyStage a considered change
"Draft a 15 percent budget increase on the three campaigns beating a 4x return, and leave them paused for me to confirm." The write path does the staging; you do the confirming. Nothing spends until you say so.
Staged writeThe shape repeats. Reading is open, immediate, and reversible, so lean on it hard. Writing is narrow, staged, and confirmed, so it moves at the speed of your review, not the model's confidence.
07Keep it alive
An agent integration is not a project you finish. It is a small system you maintain, and the maintenance is predictable enough to schedule.
Track the version sunset calendar and migrate before, not after, an old version stops responding; the cadence is monthly, so this is a recurring calendar entry, not a surprise. Rotate the credentials on a schedule and keep the write token scoped to as little as the job allows. Re-read any MCP server you update, because a dependency you trusted at version one is not automatically the one you trust at version three. And keep the human on every write, because the accountability never moved.
That is the honest position for 2026, and it is the same one that holds for every capable agent. The convenience is real, and you should take it: the reading alone gives back hours a week, starting the afternoon you wire it. What has not changed is who answers for a budget that moves. Keep a human on every write, wire the agent to the narrowest slice of the account it needs, put the caps in code where no sentence can talk them up, and the account that gets wrecked this year will not be yours. It will be the one where someone mistook a plain-English request for a safe one.
Sources
- Anthropic · Connect Claude Code to tools via MCPinstallation scopes (local, project, user), stdio transport, and the trust and prompt-injection warning
- Model Context Protocol · IntroductionMCP as an open standard for connecting AI models to tools and data
- Google · Google Ads MCP serverofficial, read-only; the three query tools (search, get_resource_metadata, list_accessible_customers) and the pipx install
- Google for Developers · Google Ads MCP server integration guiderequired credentials: developer token, Cloud project, OAuth client or Application Default Credentials
- Google Ads Developer Blog · Announcing v25 of the Google Ads APImajor release, July 22, 2026; new goals and reporting; synthetic content info becomes mutable
- Search Engine Land · Google Ads API v25 adds YouTube metrics and loyalty campaign goalsShorts social metrics, duration segments, and the loyalty retention goal
- PPC Land · Google Ads API v25 kills two lifecycle goal resources, forcing code rewritesCustomerLifecycleGoal and CampaignLifecycleGoal removed outright, no deprecation window, replaced by Goal and CampaignGoalConfig
- Google for Developers · Access levels and permissible useTest and Basic access capped at 15,000 operations per day; Standard access effectively unlimited
- Google Ads Developer Blog · Google Ads API release and security updatesthe single broad adwords OAuth scope; multi-party approvals from July 27, 2026 and MFA on the refresh-token flow, both for access not spend
- PPC Land · Google Ads passkeys and account securitypasskeys enforced July 15, 2026 for sensitive console actions (adding users, billing, links, access), surfaced in the API only as a read-only status field
- lib.rs · mcp-google-ads, a community write-capable serverdraft, preview, confirm safety layer with budget caps, bid limits, and audit logging, built on the standard developer token and OAuth
Frequently asked questions
Can Claude Code actually make changes in Google Ads?
Yes, but not with Google's own server. The official Google Ads MCP server is read-only: it can query the account, list customers, and return schema, and nothing else. To pause a campaign or move a budget you either connect a community or hosted MCP server that exposes write tools, or you build those tools yourself against the Google Ads API. Reading is production-ready today; writing is a path you assemble and secure.
What is the difference between MCP, the API, and Google Ads scripts?
They sit at different layers. Google Ads scripts are deterministic JavaScript that runs on Google's servers on a schedule, best for fixed rules like budget alerts. The Google Ads API is the raw interface every tool is built on, maximum power and maximum responsibility. The Model Context Protocol (MCP) is a thin adapter that exposes API actions as typed tools an agent like Claude Code can call in conversation. Scripts and the official MCP server are ready-made; a write path on the raw API is build-it-yourself.
Is the official Google Ads MCP server free to use, and what can it do?
It is open source and free, published by Google at github.com/googleads/google-ads-mcp. It exposes three tools, all queries: list_accessible_customers, search, and get_resource_metadata. It cannot change a bid, pause a campaign, or create anything. That read-only scope is a deliberate design choice, not a missing feature: the company that owns the data decided an agent should look, not touch, by default.
What broke in Google Ads API v25?
The big one is that v25 removed the CustomerLifecycleGoal and CampaignLifecycleGoal resources and their services outright, with no deprecation window, replacing them with a unified Goal and CampaignGoalConfig schema. Any integration still reading or writing lifecycle goals fails the moment it upgrades. v25 also made synthetic (AI) content declarations fully mutable and added YouTube Shorts and duration reporting. Treat every monthly version as a maintenance commitment.
Does the July 2026 passkey requirement block API automation?
No. Passkeys, enforced from July 15, 2026, apply to sensitive actions a human takes in the Google Ads console (adding users, changing billing, editing access), not to programmatic API calls or OAuth tokens once issued. A separate control, multi-party approvals, starts July 27, 2026 and does touch the API, but only for user-management actions like inviting users, not for the bid and budget changes an agent makes. Both harden who gets in. Neither limits what an authorized agent spends.
How do I stop an agent from spending money by mistake?
Put the limits in code, not in the prompt. Wire the write credential to a single account or a sandbox rather than your whole manager hierarchy, build narrow tools that do one thing and validate their inputs, create every change paused so a human approves before spend starts, and hard-cap the blast radius (spend, number of items) inside the tool where a prompt cannot raise it. A model that is told to be careful is not a control. A tool that physically cannot exceed a cap is.
Get the next issue by email.
One letter, once a week. Sharp coverage of media, tech, and AI business. No filler.




