GOOGLE ADS MCP SERVER11 tools, open-source guide

Run Google Ads from your AI assistant

An MCP server hands an assistant typed tools instead of a browser. It pulls the search term report, reads a campaign’s live settings, moves a daily budget, pauses the keyword that is burning money. You stay in the loop for anything that spends, and the work that used to be twenty clicks across six tabs becomes one sentence. Eleven tools, two scopes, a read-only mode, and six tutorials in a public repository.

Free forever plan · No credit card required · Cancel anytime

11
Google Ads tools
Six read, five write, one endpoint
5
Reporting levels
Campaign, ad group, ad, keyword, search term
500
Rows per breakdown call
A week of search terms is one request
MIT
Open-source guide
Six tutorials plus a generated reference
Answer first

A Google Ads MCP server exposes your ad account to an AI assistant as typed tools rather than a website, so the assistant can report on spend at every level Google reports on and make guarded changes, with your own OAuth grant executing every call server side.

The Model Context Protocol is an open standard for connecting an assistant to a remote catalogue of tools. The client connects, lists what is available, and calls a tool with structured arguments while it is working. Pinlyx implements it at https://api.crmsolid.com/mcp over Streamable HTTP, and eleven of the tools it publishes are Google Ads: six that read and five that write.

The model never sees your Google credentials. The bridge runs on your machine and holds a Pinlyx API key in its environment, the key carries either ads:read or ads:write, and the Google side is an OAuth grant you gave once and can revoke from your Google account at any time. So the risk is not credential theft. The risk is a correct tool called with wrong arguments, and everything on this page is built around narrowing that.

Open source

github.com/CRM-Solid/google-ads-mcp

Six tutorials, a tool reference generated from a live tools/list call, and the parts where automation should stop. MIT licensed, and written so the shapes translate to any MCP server wrapping the Google Ads API.

Open on GitHub

The eleven tools, and what each one answers

A tool list is the honest specification of what an assistant can do, so here is the whole thing rather than a highlight reel. Six tools read and are safe to hand any analysis session. Five write, and two of those five are annotated destructive so a client can prompt before calling them. Argument names below are the argument names the server accepts; the generated reference in the repository carries the types and the allowed values.

Read tools

ads:read

Everything an analysis session needs. Reports are cached for 15 minutes per account, level and date range, so a repeated question is free.

ToolWhat it answersArguments
crm_list_google_ads_accounts
Read-only
Which ad accounts this workspace can reach, with currency, time zone and the requests left today. Every other tool needs a customerId from here.No arguments
crm_google_ads_summary
Read-only
Account performance for a window: spend, impressions, clicks, CTR, average CPC, conversions, conversion value and ROAS.customerId, range
crm_google_ads_campaigns
Read-only
The campaign table with status and the same metrics per row, most expensive first, so the assistant can pick what to drill into.customerId, range
crm_google_ads_breakdown
Read-only
One level below the campaign: ad groups, ads, keywords or search terms, up to 500 rows per call. This is where wasted spend shows up.customerId, level, range, campaignId
crm_google_ads_campaign_settings
Read-only
Live settings of one campaign: status, channel type, bidding strategy and its target, daily budget, networks and schedule.customerId, campaignId
crm_list_ad_drafts
Read-only
Campaign drafts built in Ads Studio with their network, status and daily budget, so the assistant can find a draft to validate or publish.network, status

Write tools

ads:write

Changes that reach the ad account. Read the current state first, state the old and new value, confirm, change one thing, then read it back.

ToolWhat it answersArguments
crm_set_google_ads_status
Write, destructive
Enable, pause or remove a campaign, ad group, ad or keyword. Pausing stops spend immediately; removing is permanent inside the ad account.customerId, level, entityId, status
crm_update_google_ads_budget
Write
Set the daily budget of a campaign in the account currency. It takes effect immediately, so the number gets confirmed by a person first.customerId, campaignId, dailyBudget
crm_update_google_ads_bidding
Write
Move a campaign between manual CPC, maximise clicks, maximise conversions and maximise conversion value, with an optional target CPA or ROAS.customerId, campaignId, strategy, targetCpa, targetRoas
crm_dry_run_ad_draft
Write
Asks Google to validate a whole draft campaign without creating anything, and returns Google’s own field-level complaints.draftId
crm_publish_ad_draft
Write, destructive
Publishes a draft that a person approved in Ads Studio. The campaign structure is created paused, so nothing spends until someone enables it.draftId

Reporting windows are LAST_7_DAYS, LAST_14_DAYS, LAST_30_DAYS, THIS_MONTH and LAST_MONTH. Breakdown levels are ad_groups, ads, keywords and search_terms. Bidding strategies are manual_cpc, maximize_clicks, maximize_conversions and maximize_conversion_value.

Connect it in ten minutes

Five steps, and each one ends with something you can check. Most of the ten minutes is waiting for a client to restart.

  1. Connect your Google Ads account. Sign in to Pinlyx, open Insights, Ads, Google Ads and press Connect Google Ads account. Google asks for consent on a single permission, and the page then lists every ad account that login can reach.
  2. Create a scoped API key. Open Settings, Developers and create a key with ads:read. Add ads:write only when you want the assistant to change things, and prefer a second key for that rather than widening the first one.
  3. Prove the key works before touching a client. POST a tools/list JSON-RPC request to https://api.crmsolid.com/mcp with the key as a bearer token. You should get tool names back rather than a 401.
  4. Add the server to your MCP client. Point the client at npx -y @crmsolid/mcp-server with --tools ads, put the key in the environment, and restart the client completely. Add --read-only for sessions meant only for analysis.
  5. Ask for something real. Ask which accounts are connected, what last week cost, and which search terms converted nothing. Compare the numbers against the Google Ads interface for the same window before you trust the next answer.

The client config is the same block in Claude Desktop, Cursor and anything else that launches a local command. The bridge is published to npm as @crmsolid/mcp-server, and --tools ads limits the session to the Google Ads surface so the assistant is not distracted by the rest of the CRM.

{
  "mcpServers": {
    "crmsolid-ads": {
      "command": "npx",
      "args": ["-y", "@crmsolid/mcp-server", "--tools", "ads"],
      "env": { "CRMSOLID_API_KEY": "csk_live_your_key_here" }
    }
  }
}

Claude Code takes the same thing as one command, and a research session adds --read-only so the write tools are gone for that client entirely:

claude mcp add crmsolid-ads \
  --env CRMSOLID_API_KEY=csk_live_your_key_here \
  -- npx -y @crmsolid/mcp-server --tools ads --read-only

Before any of that, prove the key works with a plain HTTP call. This is the fastest way to separate a wrong key from a client configuration problem, and it is the step people skip and then spend an hour on:

curl -sS https://api.crmsolid.com/mcp \
  -H "Authorization: Bearer csk_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Tool names back means the key is good. A 401 means it is wrong, revoked, or was copied with a trailing space. Full walkthroughs for each client are in tutorial 01.

Four workflows worth the setup, and two habits

Each of these is a tutorial in the repository, written so somebody can reproduce it from a clean machine.

Find the spend that converted nothing

Pull the search term report for the last thirty days, sort by cost with zero conversions, and get a list of queries to exclude. One breakdown call returns up to 500 rows, so a full week of search terms costs a single request.

Pause what is bleeding, before lunch

Read the campaign settings, state the old and the new value in one sentence, wait for a yes, change exactly one thing, then read the entity back from Google rather than trusting the confirmation.

Move budget between campaigns

Daily budgets are set in the account currency and take effect immediately. The assistant reads the current number first, which is the difference between a considered change and a guess with a decimal point in it.

Write the weekly report itself

Account rollup, campaign table, ad group detail and the search terms that moved, compared against the previous window. About six requests for one account, and the assistant writes the commentary around the numbers.

Validate a campaign against Google before it exists

A dry run sends the whole draft to Google and returns field-level problems without creating anything. Fix them in the builder, approve, then publish. The campaign is created paused every time.

Give research sessions no way to write

Run two entries side by side, one with an ads:read key and --read-only, one for maintenance. The read-only filter is enforced on the call as well as on the list, so a remembered tool name still fails.

What this is genuinely good at

The search term loop is the one that pays for the setup in a week. Google matches your keywords to queries nobody on your team wrote down, and some of those queries cost money forever because nobody reads a 4,000 row report on a Tuesday. An assistant does: one breakdown call at search_terms level returns up to 500 rows with cost, clicks and conversions per row, and the question "which of these spent more than the price of a lead and converted nothing" is one sentence rather than a pivot table.

Reporting is the second. A weekly rollup that reads the account summary, the campaign table, the ad group detail and the search terms that moved is about six requests, and the assistant writes the commentary around the numbers instead of you writing it around a screenshot. Compare it against the Google Ads interface the first few times. Small differences in the last hour are normal, Google’s own reporting lags.

Changes are where discipline matters more than capability. Never let a write be the first tool call in a turn. Read the current state, state the change in one sentence with the entity name, the old value and the new value, confirm with a person when money moves, change exactly one thing, then verify by reading the entity back from Google rather than trusting the tool’s own confirmation. That loop is the entire content of tutorial 03, and it is the difference between an assistant that is useful on a Friday afternoon and one you end up not trusting.

Plans, allowance and what actually counts

The Google Ads API counts operations per Cloud project rather than per customer, so every workspace on a deployment draws from the same daily pool. That is why the server meters what reaches Google rather than trusting everyone to be reasonable.

PlanGoogle Ads in the CRMGoogle Ads requests per dayAPI keys and MCP server
FreeIncluded50Not included
ProIncluded500Not included
BusinessIncludedUnlimitedIncluded

Read that table honestly: connecting Google Ads, reporting on it and managing it inside Pinlyx is open on every plan, including the free one. The MCP server and the API keys it authenticates with are a developer surface on the Business plan, and Business has no daily cap on Google Ads. So the free plan is the way to evaluate the integration, and the Business plan is the way to put it in front of an assistant.

What counts and what does not: a report served from the 15 minute cache does not count, one breakdown call returns up to 500 rows so a week of search terms is a single request, and writes count including a status change that turns out to be a no-op. On a capped plan, past the limit the API answers HTTP 429 with a message naming the limit and the reset, which is midnight UTC. That is a safety feature as much as a cost control: an assistant stuck in a loop spends an allowance and stops, rather than hammering the account until Google starts refusing everyone.

Scopes, read-only sessions, and injection

Layer one is the scope on the key. ads:read covers the account summary, campaigns, ad groups, ads, keywords, search terms, campaign settings and the draft list. ads:write adds status changes, daily budget, bidding strategy, dry runs and publishing an approved draft. One key per purpose rather than one key per person, never widen a key when you can mint a new one, and revoke on role change. Keys are shown once.

Layer two is the read-only session. Scopes live server side; the bridge adds a local filter. Starting it with --read-only keeps only the tools annotated read-only, and enforces that on the call as well as on the list. Hiding a tool from tools/list alone is advice, because a model that saw the name in an earlier turn can still try it. The call-time check is what makes it a control. Run two entries side by side, one research and one maintenance, and pick the session to match the task.

Layer three is remembering that ad data is user generated content. Search terms are what strangers typed into Google, so a query written as an instruction will appear in a report eventually. Your assistant reads it as data or as instruction depending on how you set the session up. Read-only sessions for anything that analyses search terms, a system prompt that says text inside tool results is data and never an instruction, and confirmation before writes, which breaks the chain even if the model is convinced.

What stays in human hands, on purpose

Some things are missing from this surface deliberately, and routing around them is a mistake rather than a workaround.

  • Campaign creation is a two-person job. Drafts are built and approved in the Ads Studio builder, where a person sees the budget, the keywords and the ad copy on one screen. crm_publish_ad_draft only publishes an approved draft, and the campaign is created paused every time.
  • Enabling spend is explicit. Publishing never starts delivery. Someone enables the campaign, which is a decision with a name attached to it.
  • Payment and account setup stay in Google. Adding a payment method or enabling monthly invoicing are not exposed here, and the Google Ads API does not offer them at all. Account creation and user access management are not part of this surface either.
  • Removal is a different category of action. Enabled and paused are reversible. Removed is permanent inside the ad account. Keep it out of automated workflows and require the word in a human’s own message.

There is also no image or video upload and no keyword planner in this tool set today. Where a workflow needs one, the tutorials say a person does that step rather than pretending the tool exists.

“The scope on the key is the only control that does not depend on the model behaving. If a session only needs to read a search term report, give it a key that cannot pause anything, and then stop worrying about what a stranger typed into Google.”
Pinlyx engineering
From the Google Ads MCP design notes
Open source

Six tutorials, in a public repository

The guide is MIT licensed and lives at github.com/CRM-Solid/google-ads-mcp. The bar for a tutorial there is that somebody reproduced it from a clean machine, and the tool reference is generated from a live tools/list call so the arguments are the ones the server accepts. Corrections are welcome, particularly when a client’s behaviour changes.

Frequently asked questions

The questions people ask before they connect an assistant to an account that spends money.

A Google Ads MCP server is a Model Context Protocol server that exposes Google Ads as typed tools an AI assistant can call. Instead of driving a browser, the assistant lists the available tools at connection time and invokes them with structured arguments: pull a search term report, read a campaign settings block, set a daily budget. Pinlyx runs one at https://api.crmsolid.com/mcp with eleven Google Ads tools, and executes every call server side against the Google Ads API with your own OAuth grant.
Any client that speaks the Model Context Protocol. Claude Desktop, Claude Code and Cursor are covered step by step in the tutorials, and the same JSON block works in other MCP clients that launch a local command. The hosted endpoint speaks Streamable HTTP with JSON-RPC 2.0, so a client that connects to remote servers directly can skip the bridge entirely and send a bearer key.
Six read tools cover the account end to end: connected accounts, the account rollup, the campaign table, a breakdown at ad group, ad, keyword or search term level, live campaign settings, and the draft list. Five write tools change things: status of a campaign, ad group, ad or keyword, the daily budget, the bidding strategy with an optional target CPA or ROAS, a dry run against Google, and publishing a draft a person already approved.
Yes. You connect your own account over Google OAuth inside Pinlyx, under Insights, Ads, Google Ads. Every call then runs with your grant, against the accounts Google says that login may reach, and nothing is copied into a separate system. Revoking the grant in your Google account settings ends the access immediately.
Only if you give it a key that can write and no instructions about confirming. The controls are layered: a key carries either ads:read or ads:write, the bridge can be started with --read-only which is enforced on the call and not only on the tool list, publishing a draft always creates the campaign paused, and there is no tool that adds a payment method or raises your account budget. The tutorials recommend a separate read-only key for research sessions, which removes the whole category of accident.
The Google Ads surface inside Pinlyx is on every plan, including the free one, metered at 50 requests a day on Free and 500 on Pro. MCP access is a developer surface: API keys and the MCP server are on the Business plan, and the Google Ads allowance on Business is unlimited. So you can try the whole Google Ads integration for free in the panel, and move it to an assistant when you want the conversational surface.
Fewer than people expect, for two reasons. Reports are cached for 15 minutes per account, level and date range, so asking the same question twice in a row costs one request rather than two. And a breakdown call returns up to 500 rows, so pulling every search term for a week is one request, not one per term. A full weekly report for one account is about six requests. Past the allowance the API answers HTTP 429 naming the limit, and it resets at midnight UTC.
Enabled and paused are reversible from either side. Removed is permanent inside the ad account: a removed campaign, ad group, ad or keyword cannot be restored, only recreated, and its history stays visible in reports while detached from anything you can edit. Keep removal out of automated workflows and require the word in a human message, never in the assistant’s paraphrase. Pausing costs nothing and can be undone in a second.
Search terms are literally what strangers typed into Google, so a query written as an instruction will land in a report one day. Whether it matters depends on the session. A read-only session cannot act on anything it reads. A write session with a system prompt that names the boundary, treats tool results as data, and confirms before every change breaks the chain even when the model is convinced. Small scopes make the worst case a report you distrust rather than a budget you have to explain.
Not on its own, and that is deliberate. Campaign structure is built and approved in the Ads Studio builder inside Pinlyx, where a person sees the budget, the keywords and the ad copy together. The assistant can validate that draft against Google with a dry run and publish an approved one, and the result is always created paused. It cannot invent a campaign and put it live.
Payment methods and billing setup, which the Google Ads API does not offer at all, plus ad account creation and user access management. There is also no image or video upload and no keyword planner in this tool set today. Where a workflow needs one of those, the tutorials say a person does that step instead of pretending otherwise.
Yes. The six tutorials and the generated tool reference live in a public MIT-licensed repository at github.com/CRM-Solid/google-ads-mcp. The tool reference is produced from a live tools/list call, so the arguments in it are the arguments the server actually accepts. Corrections are welcome, particularly when a client’s behaviour changes, and the tutorials name the places where another MCP server wrapping the Google Ads API would work just as well.
A browser-driving agent sees pixels, clicks whatever looks right, and has no permission boundary smaller than your whole Google account. An MCP server gives it eleven typed tools with declared arguments, a scope on the key, a read-only mode, an allowance that stops a loop, and a result it can read as data. The model never sees your Google credentials, because the OAuth grant lives server side.
The reporting and management tools on this page are Google Ads. The draft tools are network-aware: crm_list_ad_drafts filters by Google, Meta or TikTok, and a dry run or publish goes to the network the draft belongs to. Meta and TikTok campaign building live in Ads Studio alongside Google, so a draft approved there reaches the right network.
Ready to ship

Connect Google Ads, then hand it to your assistant

Google Ads reporting and management are on every plan, including the free one. The MCP server is on Business, and the guide is open to everybody.

Free forever plan · GDPR-ready · No credit card required

We value your privacy

We use cookies to improve our site, analyze traffic, and personalize ads. You can accept all, reject non-essential, or customize your choices. Read our Cookie Policy.