Large Language ModelsGenerate imagesGenerate videos

Google Ads MCP Server: Connect Google Ads to Claude (Official)

Google now ships an official, open-source MCP server for Google Ads. This article shows how to authenticate, add it to Claude Desktop or Claude Code, run GAQL queries in plain English, and avoid the data and cost traps, then turn the findings into ad creative.

Google Ads MCP Server: Connect Google Ads to Claude (Official)
Cristian Da Conceicao
Founder of Picasso IA

Ask your ad account a question in plain English and get the answer in seconds. That is the promise of the Google Ads MCP server, an open-source bridge from Google that lets an AI assistant like Claude read your live campaign data instead of waiting for you to export another CSV. It is the official route: Google publishes it in its own googleads GitHub organization under the Apache 2.0 license, and today it is strictly read-only. It can look at everything and change nothing.

This article shows how to connect Google Ads to Claude, which questions are worth asking first, and which traps quietly produce wrong numbers. One recent change matters: Google sunset developer tokens on September 9, 2026, so many older tutorials now describe a setup step you no longer need. Everything below follows Google's current documentation and the project README.

A marketer typing a question into a chat window beside campaign numbers

What the Official Server Does

The Model Context Protocol (MCP) is a standard that lets an AI client call tools exposed by a separate program. Google's server wraps the Google Ads API in three of those tools, so Claude can find your accounts, run queries, and look up field definitions without you writing a line of integration code. The server runs on your machine over stdio, and Claude talks to it the way it talks to any other MCP server.

Here is what changes compared with the weekly export routine most advertisers still follow:

StepExport routineWith the MCP server
Pull dataBuild and download reports by handClaude runs the query
Change the date rangeExport againSay it in one sentence
Ask a follow-upOpen a new spreadsheetAsk again in the same chat
Data freshnessWhatever the file containedLive account data

Printed campaign report with highlighted rows on a tidy desk

Three Tools, Read Only

ToolWhat it returnsWhen Claude calls it
list_accessible_customersThe customer IDs the signed-in user can reach directlyFirst, to find the right account
searchResults of a Google Ads Query Language (GAQL) request: metrics, budgets, statusEvery real question about performance
get_resource_metadataThe structure and available fields of a resource typeBefore writing a query with unfamiliar fields

In practice you never write the query yourself. You say "which campaigns spent the most last week," Claude checks which fields exist, builds the GAQL, runs it through search, and summarizes the rows. You can still read the query it ran, which is how you catch mistakes.

What It Cannot Do

Google's documentation is blunt: the implementation "cannot modify bids, pause campaigns, or create new assets." That rules out:

  • Changing budgets or bids
  • Pausing or enabling campaigns
  • Creating or editing ads
  • Uploading new creative

💡 Read-only is a feature. A wrong answer from the model costs you a bad afternoon, not a drained budget, because it has no way to push a change to the account.

Before You Connect Anything

Three things have to be in place before the config file matters: a Google Cloud project with the right access level, working credentials, and the local tooling to run the server. Skipping any of them produces errors that look unrelated to the real cause.

Cloud Project and Access Level

Your Google Cloud project ID goes into the config as GOOGLE_PROJECT_ID. Open the Google Ads API overview page in the Cloud console and confirm the project sits on one of the three access levels listed there: the entry level, Basic, or Standard. If it has none of them, apply for one. Access levels are now tied to the Cloud project, which is exactly why developer tokens stopped being necessary.

Developer Tokens Are Gone

Google's docs state that developer tokens (GOOGLE_ADS_DEVELOPER_TOKEN) were sunset on September 9, 2026 and are no longer required in the latest version of the server. The GitHub README still lists that variable as optional, so if you pin an older release you might still need to set it. On the current version, leave it out.

💡 Check the date on any tutorial. If it tells you to apply for a developer token and wait for approval, it describes the old flow.

OAuth Credentials or ADC

You need one of two things: an OAuth 2.0 client ID and secret pair created in the same project, or a set of Application Default Credentials (ADC). The required scope is https://www.googleapis.com/auth/adwords. ADC through the gcloud CLI is the shortest path for a single user, and it is what the commands below use.

Hardware security token plugged into a laptop

Have these ready before you continue:

  • pipx installed, the Python tool that runs the server straight from GitHub
  • The gcloud CLI installed and signed in
  • A Google user who has access to the Google Ads account
  • Your Cloud project ID

Connecting Claude Step by Step

Sign In with gcloud

Run the login command with both scopes the server needs, pointing at the OAuth client file you downloaded:

gcloud auth application-default login \
  --scopes https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform \
  --client-id-file=YOUR_CLIENT_JSON_FILE

A browser window opens, you approve the scopes, and gcloud writes a credentials JSON file. Note where it lands, because that path becomes GOOGLE_APPLICATION_CREDENTIALS. Teams that prefer service accounts can swap in --impersonate-service-account=SERVICE_ACCOUNT_EMAIL with the same scopes.

Developer at a standing desk with a terminal open

Add It to Claude Desktop

Open the Claude Desktop config file: ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows. Add the server:

{
  "mcpServers": {
    "google-ads-mcp": {
      "command": "pipx",
      "args": [
        "run",
        "--spec",
        "git+https://github.com/googleads/google-ads-mcp.git",
        "google-ads-mcp"
      ],
      "env": {
        "GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID",
        "GOOGLE_APPLICATION_CREDENTIALS": "/path/to/credentials.json"
      }
    }
  }
}

Quit Claude Desktop fully and reopen it. The first launch downloads the server through pipx, so expect a short pause. For repeatable setups, the README suggests pinning a published version with pipx run --spec "google-ads-mcp==X.Y.Z" google-ads-mcp instead of following the latest repository state.

Claude Code in One Command

Claude Code can register the same server from the terminal:

claude mcp add google-ads-mcp \
  --env GOOGLE_PROJECT_ID=your-project-id \
  --env GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json \
  -- pipx run --spec git+https://github.com/googleads/google-ads-mcp.git google-ads-mcp

Run /mcp inside Claude Code afterward and confirm google-ads-mcp shows as connected.

Test with One Question

Ask the sample prompt from Google's docs: "What customers do I have access to?" Claude should call list_accessible_customers and return account IDs and names. If something breaks, this table lists the usual suspects:

SymptomLikely causeFix
No tools appearInvalid JSON or Claude not restartedValidate the JSON, quit Claude fully, reopen
Permission or access errorProject has no API access level yetCheck the Google Ads API overview page
Empty account listCredentials belong to a user without account accessRerun the gcloud login with the right user
Errors on client accountsMissing manager account IDSet GOOGLE_ADS_LOGIN_CUSTOMER_ID

These are the most likely causes, not an official error catalog, so read the actual message Claude shows before changing anything.

Questions Worth Asking First

Start by finding your accounts. "What customers do I have access to?" gives you the 10-digit customer IDs, written without dashes, that every later query needs. Tell Claude which ID you are working in once, and it will reuse it for the rest of the chat. Then move to questions that save real time. The queries below show what Claude tends to build behind the scenes, so you can sanity check it.

Handwritten query notes next to a laptop

Weekly Performance Pulls

Google's second sample prompt is "How is my campaign performance this week?" A reasonable query behind it looks like this:

SELECT
  campaign.name,
  metrics.cost_micros,
  metrics.clicks,
  metrics.conversions
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
ORDER BY metrics.cost_micros DESC
LIMIT 10

Look at cost_micros. Google Ads stores money in micros, so 12,500,000 means 12.50 in the account's currency. A model that forgets to divide will report spend a million times too high, so tell it to convert and to name the currency.

Freelancer reviewing a line chart on a tablet in a café

Wasted Spend Hunts

The most useful first project is a search terms review. This query finds terms that spent more than 5 units of currency in 30 days and never converted:

SELECT
  search_term_view.search_term,
  campaign.name,
  metrics.clicks,
  metrics.cost_micros,
  metrics.conversions
FROM search_term_view
WHERE segments.date DURING LAST_30_DAYS
  AND metrics.conversions = 0
  AND metrics.cost_micros > 5000000
ORDER BY metrics.cost_micros DESC
LIMIT 25

Hand the rows back to Claude and ask it to group them into themes: job seekers, free-seekers, wrong product, wrong location. Those themes become your negative term list, which you then add in the Google Ads interface yourself, because the server cannot write.

A few more prompts worth keeping in a note:

GoalPrompt to typeLikely resource
Spend check"Which five campaigns spent the most this month?"campaign
Efficiency"Rank campaigns by cost per conversion over 30 days"campaign
Pacing"Which campaigns are limited by budget?"campaign, campaign_budget
Ad quality"List ads with the lowest click-through rate"ad_group_ad

💡 State the date range and currency every time. Vague prompts are where silent errors start. "Last 30 days, in euros" beats "recently." Then spot-check one number against the Google Ads interface before you trust the rest.

Safety, Data, and Limits

Colleagues reviewing bar charts in a glass meeting room

Your Data Reaches the Model

The README warns that the server "will expose your data to the Agent or LLM that you connect to it." It also notes that an extra header is added to your API calls, which Google uses to improve the product. Before you connect an agency account that holds client data, check your contract and your client's policy. Treat the connection like emailing a report: anything a query returns goes to the model.

One cheap safeguard: sign in with a Google user whose access to the account is limited to what the work needs. The server acts with the credentials of the user who authenticated, so that user's permissions apply on top of the server's own read-only design.

Manager Accounts and Hosting

If you reach a customer account through a manager (MCC) account, set GOOGLE_ADS_LOGIN_CUSTOMER_ID to the manager's customer ID in the env block. Google marks it as required for that situation.

The local setup above uses stdio and suits one person. Google also documents a Cloud Run deployment for teams. There, the server needs GOOGLE_ADS_MCP_OAUTH_CLIENT_ID, GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET, and FASTMCP_HOST=0.0.0.0, and the client config points an httpUrl at the /mcp path of your service.

Official vs Community Servers

Plenty of community-built Google Ads MCP servers exist, and some may offer write access. Check scopes and capabilities before pointing any of them at a live account.

Official serverCommunity servers
PublisherGoogle, in the googleads GitHub organizationIndividual developers
Write accessNone, strictly read-onlyVaries by project
AuthenticationOAuth or ADCVaries by project
LicenseApache 2.0Varies by project

Turn Insights Into Ad Creative

Studio corkboard with printed ad mockups

The MCP server tells you what to fix. It does not make the pictures. Once Claude has shown which search themes convert, you still need fresh visuals and copy for them, and that is where PicassoIA fits. Nothing here connects PicassoIA to your ad account, so you carry the findings across yourself.

Suppose the data shows "waterproof hiking boots" converting at a fraction of the cost of "cheap boots." Ask Claude for three visual angles for the winning theme: a muddy trail close-up, a rainy-day lifestyle shot, and a boot on a doorstep. Then generate each one. Match the aspect ratio to the placement: 1:1 for feeds, 16:9 for wide banners, 9:16 for vertical video.

A prompt that works well for this kind of ad concept names the subject, the setting, the light, and the lens, and says plainly what to avoid:

Close-up of muddy waterproof hiking boots on a wet forest trail at dawn, soft side light, shallow depth of field, 50mm lens, photorealistic, no text, no logos.

Generate two or three versions, keep the one that matches the angle your data favors, and drop the rest. Keep the style natural: a believable photo of a real moment suits a hiking boot ad better than a glossy render.

NeedModel on PicassoIAWhy it fits
Fast ad conceptsPicassoIA ImageUnlimited generations, seven aspect ratios from 1:1 to 9:16, seed control
Fixing an existing photoPicassoIA Image Editor ProEdit a product shot instead of starting over
Short video adsPicassoIA VideoVideo from text or from an image
Longer clipsSeedance 2.5 LiteClips up to 10 seconds
Higher resolution videoVeo 3.11080p video from text

How to Use Claude Sonnet 5

Claude Sonnet 5 on PicassoIA is the writing desk in this workflow. It does not run the Google Ads MCP server. You paste in what your MCP session returned, and it drafts the ad copy. The steps:

  1. Open the Claude Sonnet 5 page on PicassoIA.
  2. Fill the System Prompt once: "You write Google responsive search ads. Headlines stay under 30 characters, descriptions under 90. Plain language, no hype, no claims we cannot prove."
  3. Paste your data into Prompt: the top converting search terms, your current headlines, and the offer.
  4. Pick the Effort level. The default, low, turns thinking off and answers fastest, which suits copy variants. Use high or max when you want a restructuring plan for a messy account.
  5. Keep Max Tokens at 8,192 unless you want shorter output.
  6. Optionally attach an Image, such as a screenshot of a performance chart. The model reads it as context.
  7. Review the draft, edit it, and paste the copy into Google Ads yourself.
ParameterDefaultTip
PromptRequiredInclude the data, the goal, and the date range
System PromptEmptyFix the role and character limits once
EffortlowRaise it only for planning tasks
Max Tokens8192Plenty for 15 headlines and 4 descriptions
ImageNoneA chart screenshot adds context
Max Image Resolution0.5 megapixelsLower values save time and cost

Responsive search ads accept up to 15 headlines and 4 descriptions, so one run fills a full ad. Want a second opinion? Run the same prompt through Gemini 3.5 Flash or Claude Opus 4.7 and compare the drafts side by side.

Make Your Own Ad Visuals Today

Creative director reviewing a grid of ad images in a sunlit studio

Data says what to test. Visuals decide whether anyone stops scrolling. Open PicassoIA Image, paste a prompt for your best converting theme, choose 1:1 or 16:9, and generate as many variations as you like, since the model has no per-image cap. Lock a seed when one composition works, then change only the wording to test small differences.

PicassoIA also runs an MCP connection of its own, so the same Claude that reads your Google Ads data can ask for images and videos in one conversation. See the PicassoIA API page for details and check which plan includes access.

Try this tonight: connect the Google Ads MCP server, run the wasted spend query, pick the single best converting theme, and generate five visual variations on Picasso IA before you write anything else. Next week, run the weekly performance query again and see which version earned the clicks.

Share this article