Google Ads MCP server

52 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. 52 tools, two scopes, a read-only mode, and six tutorials in a public repository.

Free forever plan · No credit card required · Cancel anytime

52
Google Ads tools
26 read, 26 write, one endpoint
5
Reporting levels
Campaign, ad group, ad, keyword, search term
30
Days to undo a change
validateOnly first, changeId after, confirm on removals
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.pinlyx.com/mcp over Streamable HTTP, and 52 of the tools it publishes are Google Ads: 26 that read and 26 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/Pinlyx/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 52 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. 26 tools read and are safe to hand any analysis session. 26 write, and 10 of those 26 are annotated destructive because they remove, permanently stop or send something to Google that cannot be pulled back, so a client can prompt before calling them. Every write that is not destructive still accepts validateOnly to preview the change, and most return a changeId that crm_google_ads_undo can revert within 30 days. 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_google_ads_account_alerts
Read-only
Health check of one Google Ads account: everything that stops or throttles its ads, as alerts sorted by severity (critical, warning, info), each with a code, a plain explanation, the entity it concerns and the tool to use next.customerId
crm_google_ads_ad_details
Read-only
Full content and review state of Google Ads ads: responsive search ad headlines and descriptions with their pinned position, final and mobile URLs, display path (path1, path2), tracking template, final URL suffix and custom parameters, display URL of older ad types, approval and review status with policy topics and evidence, ad strength with Google's suggestions to raise it (actionItems), primary status and reasons.customerId, adId, adGroupId, campaignId, includeAssetPerformance
crm_google_ads_ad_preview
Read-only
Heuristic diagnosis of whether a search could show an ad from this account, built entirely from the account's own settings (campaign status, budget, schedule, location and language targeting, keywords, negative keywords and ad approval).customerId, campaignId, geoTargetId, languageId, device
crm_google_ads_assets
Read-only
Assets (ad extensions) of a Google Ads account and everywhere each one is linked: sitelinks, callouts, structured snippets, call, price, promotion, image, lead form, business name and logo.customerId, level, campaignId, adGroupId, types, includePerformance
crm_google_ads_auction_insights
Read-only
Auction insights for Search: which other advertisers (by display domain) competed in the same auctions and how the account compares, including impression share, overlap rate and outranking share.customerId, campaignId, adGroupId, range
crm_google_ads_audiences
Read-only
Audience (user) lists of a Google Ads account: type, membership status, estimated size, eligibility for Search/Display, and the Customer Match match rate of the latest upload.customerId
crm_google_ads_bidding_strategies
Read-only
Portfolio (shared) bidding strategies of the account: type, status, targets and limits, and which campaigns use each one.customerId
crm_google_ads_billing
Read-only
Billing state of one account: the billing setup, whether it is on monthly invoicing, its account budgets, and the invoices issued this month and last month.customerId
crm_google_ads_breakdown
Read-only
Performance one level below the campaign: ad groups, ads, keywords or search terms, with the diagnostics needed to act on it.customerId, level, range, campaignId, limit, cursor
crm_google_ads_budget_pacing
Read-only
Today's spend against budget for every enabled campaign: spent so far, expected spend by now, pace, monthly cap and projected month spend.customerId, 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_google_ads_campaigns
Read-only
Campaigns of an account with their settings and performance for a window, most expensive first, including campaigns with no traffic.customerId, range, status, sortBy, limit, cursor
crm_google_ads_change_history
Read-only
Who changed what in a Google Ads account, newest first: Google's own change history merged with changes made through Pinlyx tools.customerId, days, startDate, endDate
crm_google_ads_conversion_actions
Read-only
Conversion tracking health of an account: every conversion action, its type and status, and a recording verdict per action.customerId, campaignId
crm_google_ads_experiments
Read-only
Campaign experiments (A/B tests Google Ads runs by splitting a campaign's traffic): status, dates, control versus treatment, and the traffic split.customerId, experimentId, includeMetrics
crm_google_ads_forecast
Read-only
Keyword Planner forecast for a new Search campaign: expected clicks, cost and average CPC over the forecast period, plus conversions with maximize_conversions.customerId, keywords, bidStrategy, maxCpcBid, dailyBudget
crm_google_ads_geo_search
Read-only
Find Google Ads location ids by name, or look up known ids, for use with the targeting and ad preview tools.query, names, countryCode, targetTypes, locale, includeLanguages
crm_google_ads_keyword_ideas
Read-only
Keyword Planner ideas from up to 20 seed keywords, a page URL, or a whole site: average monthly searches, competition and the top-of-page bid range.customerId, keywords, pageUrl, language, geoTargetConstants, historicalOnly
crm_google_ads_labels
Read-only
List the account's labels, optionally with every campaign, ad group, ad and keyword each one is assigned to.customerId, labelId, includeAssignments
crm_google_ads_negative_keywords
Read-only
Negative keywords of an account: campaign-level, ad group-level, and shared negative keyword lists, with the campaigns each list is attached to.customerId, campaignId, adGroupId, sharedSetId, contains, includeListMembers, limit
crm_google_ads_recommendations
Read-only
Google's recommendations for one account, with the estimated weekly impact before and after applying and the account optimization score.customerId, campaignId, types, includeDismissed
crm_google_ads_segments
Read-only
Performance split by one dimension: device, network, hour of day, day of week, country, region, city, age, gender or conversion action.customerId, dimension, campaignId, adGroupId, range
crm_google_ads_summary
Read-only
Account-level performance for a window: spend, impressions, clicks, CTR, average CPC, conversions, conversion value, ROAS and search impression share.customerId, range, compareTo, includeConversionsByAction
crm_google_ads_targeting
Read-only
Full targeting of one campaign: locations, languages, ad schedule, device bid modifiers, and audiences and demographics with their mode.customerId, campaignId, includeAdGroups
crm_google_ads_timeseries
Read-only
Performance over time for the account, one campaign or one ad group: a point per day, week, month or hour, in the account time zone.customerId, campaignId, adGroupId, granularity, range, compareTo, metrics
crm_list_google_ads_accounts
Read-only
Which ad accounts this workspace can reach and whether each can be used, with currency, time zone and today's remaining request allowance. Every other tool needs a customerId from here.refresh

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. validateOnly previews almost any of them; crm_google_ads_undo reverts most within 30 days.

ToolWhat it answersArguments
crm_google_ads_add_keywords
Write
Adds keywords to a Search ad group, with a default match type, bid and landing page for any that do not set their own.customerId, adGroupId, keywords, matchType, cpcBid, finalUrl, status, fromSearchTerms, validateOnly
crm_google_ads_add_negative_keywords
Write
Adds negative keywords at the campaign, ad group or shared-list level, inferred from what you pass or stated with level.customerId, level, campaignId, adGroupId, sharedSetId, keywords, matchType, fromSearchTerms, validateOnly
crm_google_ads_apply_label
Write
Creates a label, or assigns or unassigns it on campaigns, ad groups, ads and keywords.customerId, action, labelId, labelName, color, description, targets, validateOnly
crm_google_ads_apply_recommendation
Write, destructive
Applies or dismisses one of Google's recommendations by id. Applying it for real needs confirm: true.customerId, ids, confirm, validateOnly
crm_google_ads_bulk
Write, destructive
Applies many keyword-family changes in one call. Any operation that removes something needs confirm: true to apply for real.customerId, operations, partialFailure, confirm, validateOnly
crm_google_ads_campaign_to_draft
Write
Copies a live Search campaign into a new Ads Studio draft that a person can edit, approve and publish, for example into another account.customerId, campaignId
crm_google_ads_create_ad_group
Write
Creates a new ad group in a Search or Display campaign, optionally with its first keywords, in one atomic call.customerId, campaignId, name, status, cpcBid, keywords, validateOnly
crm_google_ads_create_asset
Write
Creates an asset (sitelink, callout, structured snippet, call, price, promotion or image extension) and optionally links it.customerId, type, name, linkTo, validateOnly
crm_google_ads_create_bidding_strategy
Write
Creates a portfolio (shared) bidding strategy several campaigns can use, and optionally attaches existing campaigns to it.customerId, name, type, targetCpa, targetRoas, cpcBidCeiling, attachCampaignIds
crm_google_ads_create_rsa
Write
Creates a responsive search ad in a Search ad group, checked against every Google length and count rule before it is sent.customerId, adGroupId, headlines, descriptions, finalUrl, path1, path2, replaceAdId, validateOnly
crm_google_ads_customer_match
Write, destructive
Syncs CRM contacts into a Google Ads Customer Match list. Every real upload sends customer data to Google and needs confirm: true.customerId, contactFilter, listId, listName, mode, consent, confirm, validateOnly
crm_google_ads_link_asset
Write, destructive
Links an existing asset to the account, a campaign or an ad group, or removes that link. Unlinking needs confirm: true.customerId, assetId, action, level, campaignId, adGroupId, fieldType, confirm, validateOnly
crm_google_ads_manage_experiment
Write, destructive
Creates and runs a campaign A/B test. Ending, promoting, graduating or removing an experiment needs confirm: true and has no undo.customerId, action, baseCampaignId, trafficSplit, experimentId, confirm, validateOnly
crm_google_ads_manage_negative_list
Write, destructive
Creates, attaches, detaches, renames or deletes a shared negative keyword list. Deleting a list needs confirm: true.customerId, action, sharedSetId, name, campaignIds, keywords, confirm, validateOnly
crm_google_ads_remove_negative_keywords
Write, destructive
Removes negative keywords, which can let the searches they blocked start matching again. Applying it for real needs confirm: true.customerId, ids, level, confirm, validateOnly
crm_google_ads_save_conversion_action
Write
Creates a Google Ads conversion action, or changes an existing one: status, whether it feeds bidding, and its counting type.customerId, conversionActionId, name, category, type, status, primaryForGoal, countingType, defaultValue, validateOnly
crm_google_ads_undo
Write
Reverts a Google Ads change made through Pinlyx tools by its changeId. Removals and changes older than 30 days cannot be undone.customerId, changeId, validateOnly
crm_google_ads_update_ad
Write
Edits an existing ad in place, keeping its id and history. Changed text goes back through policy review.customerId, adId, finalUrls, headlines, descriptions, path1, path2, validateOnly
crm_google_ads_update_ad_group
Write
Renames an ad group and/or changes its tracking template or final URL suffix.customerId, adGroupId, name, trackingUrlTemplate, finalUrlSuffix, validateOnly
crm_google_ads_update_keyword
Write
Changes a keyword's match type and/or its own final URL. Changing match type gives the keyword a new id.customerId, keywordId, adGroupId, matchType, finalUrl, validateOnly
crm_google_ads_upload_conversions
Write, destructive
Sends offline conversions, for example won CRM deals, to a conversion action so Smart Bidding learns from real results. Cannot be undone.customerId, conversionActionId, conversions, contactId, dealId, validateOnly
crm_set_google_ads_status
Write, destructive
Pauses, enables or removes one or more campaigns, ad groups, ads or keywords in a single call. Removing needs confirm: true.customerId, level, entityId, entityIds, status, confirm, validateOnly
crm_update_google_ads_bid
Write
Sets or clears a manual max CPC bid on an ad group or a keyword, in the account currency.customerId, level, entityId, cpcBid, clear, validateOnly
crm_update_google_ads_bidding
Write
Switches a campaign's bidding strategy or changes its current target, including target impression share and portfolio strategies.customerId, campaignId, strategy, targetCpa, targetRoas, cpcBidCeiling, clearTarget
crm_update_google_ads_budget
Write, destructive
Sets a campaign's daily budget. Takes effect immediately; a shared budget needs confirmShared: true.customerId, campaignId, dailyBudget, confirmShared
crm_update_google_ads_targeting
Write
Changes a campaign's locations, languages, ad schedule or device bid modifiers. Dropping every location needs confirm: true.customerId, campaignId, addLocations, excludeLocations, removeLocations, languages, adSchedule, deviceModifiers, confirm, validateOnly

Reporting windows include LAST_7_DAYS, LAST_14_DAYS, LAST_30_DAYS, THIS_MONTH, LAST_MONTH, TODAY, YESTERDAY and a custom startDate/endDate; every report states its own window and how fresh the data is. Breakdown levels are ad_groups, ads, keywords, search_terms and several more specialised ones (landing pages, asset groups, placements, videos, products, paid/organic). Bidding strategies are manual_cpc, maximize_clicks, maximize_conversions, maximize_conversion_value, target_impression_share and portfolio.

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.pinlyx.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": {
    "pinlyx-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 pinlyx-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.pinlyx.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 dozens of rows sorted by cost, cursor-paginated for the rest, so a full week of search terms costs a handful of requests instead of a manual export.

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 rows sorted by cost, clicks and conversions, cursor-paginated for the rest, 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 a page of rows cursor-paginated for the rest so a week of search terms is a handful of requests, 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, and can be reverted with crm_google_ads_undo within 30 days. Removed is permanent inside the ad account and explicitly excluded from undo. Keep it out of automated workflows and require the word in a human’s own message.

Keyword Planner is part of this surface now (crm_google_ads_keyword_ideas and crm_google_ads_forecast), and an image asset can be added from a public https URL that Pinlyx downloads. What is still missing: a raw file upload from your machine, video assets, and a live lookup against Google’s own Ad Preview and Diagnosis tool, which the Google Ads API does not expose. Where a workflow needs one of those, 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/Pinlyx/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.pinlyx.com/mcp with 52 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.
26 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, billing state, account health alerts, Google's own recommendations, change history, auction insights, Keyword Planner ideas and forecasts, negative keywords, labels, targeting, assets (ad extensions), campaign experiments, conversion tracking health and Customer Match audiences. 26 write tools change things: status of a campaign, ad group, ad or keyword, the daily budget, the bidding strategy (including target impression share and portfolio strategies), keywords and negative keywords, ad groups and responsive search ads, assets, labels, conversion actions and offline conversion uploads, Customer Match syncing, campaign experiments, and copying a live campaign into a new Ads Studio draft. Most writes accept validateOnly to preview a change, return a changeId when applied, and can be reverted with crm_google_ads_undo within 30 days; anything that removes or permanently stops something also needs confirm: true.
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. Individual writes add their own layer: validateOnly asks Google to check a change without applying it, an applied change returns a changeId that crm_google_ads_undo can revert within 30 days, and anything that removes or permanently stops something needs confirm: true on top of that. 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 dozens of rows per page, cursor-paginated, so pulling every search term for a week is a handful of requests, not one per term. A full weekly report for one account is about six to ten 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, and now formally so: most writes return a changeId, and crm_google_ads_undo reverts it within 30 days, setting values back even if something else changed them since. Removed is the one exception. It is permanent inside the ad account: a removed campaign, ad group, ad or keyword cannot be restored, only recreated, its history stays visible in reports while detached from anything you can edit, and crm_google_ads_undo explicitly refuses to touch a removal. That is why crm_set_google_ads_status needs confirm: true to remove something, on top of the scope on the key. 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, either by calling the tool again or with crm_google_ads_undo.
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.
Changing payment methods or billing setup, which the Google Ads API does not offer at all (crm_google_ads_billing reads billing state, it cannot change it), plus ad account creation and user access management. Image assets can be added from a public https URL that Pinlyx downloads (crm_google_ads_create_asset), but there is no raw file upload from your machine and no video asset support. Keyword Planner is in scope now, both ideas and a spend forecast, but there is still no tool that opens Google's own Ad Preview and Diagnosis page: crm_google_ads_ad_preview is a heuristic built from your account settings, not a live auction lookup. Where a workflow needs one of the remaining gaps, 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/Pinlyx/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 52 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.
Yes, as their own tool families next to the 52 covered on this page, under the same ads:read and ads:write scopes. Meta Ads has 7 tools: connected ad accounts, account performance, campaigns, an ad set/ad breakdown, pixel health, and status and budget changes for Facebook and Instagram. TikTok Ads has 5: connected accounts, performance, campaigns, and status and budget changes. Ads Studio drafts stay network-aware across all three: crm_list_ad_drafts filters by Google, Meta or TikTok, and a dry run or publish goes to the network the draft belongs to. A separate crm_ads_attribution_report joins spend on any of the three networks with the CRM leads and deals it produced.

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.