google-ads-write-mcp
Provides tools for writing to Google Ads: managing campaigns, ad groups, keywords, RSA ads, sitelinks, images, Customer Match audiences, and recommendations.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@google-ads-write-mcpPause the campaign with ID 1234567890"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
google-ads-write-mcp
MCP server that exposes write operations on Google Ads: campaigns, ad groups, keywords, RSA ads, sitelinks, images, Customer Match audiences and recommendations.
Complements the official google-ads MCP (read-only). Use the official
one (or google-ads-kw-mcp) to read data, this one to
write.
Tools (26)
Campaigns
Tool | What it does |
| Pause, enable or remove a campaign |
| Change the daily budget (locates the budget entity automatically) |
Ad groups
Tool | What it does |
| Pause, enable or remove an ad group |
| Change the ad group's max CPC bid |
Keywords
Tool | What it does |
| Add keywords to an ad group (BROAD/PHRASE/EXACT, optional bid) |
| Pause, enable or remove a keyword |
| Change a keyword's CPC bid |
| Add negative keywords at campaign level |
RSA ads
Tool | What it does |
| Replace headlines (and optionally descriptions) of an RSA |
Sitelinks
Tool | What it does |
| Create a sitelink asset |
| Link the sitelink to a campaign |
Ad assets
Tool | What it does |
| Create a callout text (max 25 chars) |
| Create a call extension with a phone number |
| Create a structured snippet (header + list of values) |
| Link any asset to a campaign (SITELINK, CALLOUT, CALL, STRUCTURED_SNIPPET, MARKETING_IMAGE…) |
Images
Tool | What it does |
| Download an image from a URL and upload it as an asset (Display/PMax) |
Audiences / Customer Match
Tool | What it does |
| List all audiences (remarketing + Customer Match) |
| Create a new Customer Match list |
| Upload emails to a list (SHA-256 hashing done automatically) |
Create full campaigns
Tool | What it does |
| Create a Search or Performance Max campaign (budget, bid, country, language, EU political-ads flag) |
| Create an ad group inside a Search campaign |
| Create a full RSA ad (3–15 headlines, 2–4 descriptions, URL, display paths) |
| Create a PMax asset group (headlines, long headlines, descriptions, images, logo) |
Recommendations
Tool | What it does |
| List pending recommendations (optional type filter) |
| Apply a recommendation |
| Dismiss a recommendation |
Related MCP server: google-ads-mcp
Setup
Same credentials as google-ads-kw-mcp — you can point
both at the same credentials.json.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtMCP client configuration
{
"mcpServers": {
"google-ads-write": {
"command": "/path/to/.venv/bin/python3",
"args": ["/path/to/google-ads-write-mcp/server.py"],
"env": {
"GOOGLE_ADS_CREDENTIALS_PATH": "~/.config/google-ads-mcp/credentials.json",
"GOOGLE_ADS_DEVELOPER_TOKEN": "<your developer token>",
"GOOGLE_ADS_LOGIN_CUSTOMER_ID": "<your MCC customer id, no dashes>"
}
}
}
}Confirmation required for critical operations
These tools require confirmed=True. Called without it, they return a JSON
with requires_confirmation: true that the calling agent MUST show to the
user and wait for a response before repeating the call with confirmed=True.
Tool | When it asks for confirmation |
| status = PAUSED or REMOVED |
| always |
| status = REMOVED |
# 1. First call — no confirmed
update_campaign_status(customer_id="1234567890", campaign_id="111222333", status="PAUSED")
# → returns requires_confirmation: true → show it to the user
# 2. Second call — after the user confirms
update_campaign_status(customer_id="1234567890", campaign_id="111222333", status="PAUSED", confirmed=True)Gotchas found in production use
Auth
Never use
gcloud auth print-access-token— that token doesn't carry theadwordsscope → 403. The only valid source is therefresh_tokenagainstoauth2.googleapis.com/token, which this server already does correctly.
Negatives vs. positives
Adding a negative EXACT keyword to an ad group where the same keyword already exists as a positive EXACT match returns
IMMUTABLE_FIELD. The fix is to pause the positive instead of adding the negative.
Resource names
adGroupCriteriaresource names always need a~between the ad group ID and the criterion ID:customers/{cid}/adGroupCriteria/{ag_id}~{crit_id}.
GAQL field limits
ad_group_criteriondoesn't accept metrics (clicks, cost, conversions) in the same query — querysearch_term_viewseparately for performance data.Filter
ad_group_criterionby campaign withWHERE ad_group.campaign = 'customers/{cid}/campaigns/{campaign_id}', notcampaign_iddirectly.
Budgets
The budget is a separate entity (
CampaignBudget). If a campaign shares a budget with others, changing it affects all of them.
contains_eu_political_advertising
This is an enum (
EuPoliticalAdvertisingStatus), not a bool.Falseserializes asUNSPECIFIED, which the API rejects as "not present". UseDOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISINGexplicitly.
PMax with Brand Guidelines
If the account has Brand Guidelines enabled, PMax campaigns need a
business_nameand alogo(min. 128×128px, square) linked asCampaignAssetat creation time — not after.
RSA headline updates
Use
AdService.mutate_ads()with field mask"responsive_search_ad.headlines". UsingAdGroupAdServicewith"ad.responsive_search_ad.headlines"givesIMMUTABLE_FIELD.
Removing a keyword
Use the
removeoperation onAdGroupCriterionOperation. Trying anupdatewithstatus = REMOVEDgivesINVALID_ENUM_VALUE.
REMOVED resources are immutable
No write operation works on ad groups, keywords or ads whose parent campaign has
status = REMOVED(OPERATION_NOT_PERMITTED_FOR_REMOVED_RESOURCE).
Customer Match allowlist
upload_customer_match_emailsfails withCUSTOMER_NOT_ALLOWLISTED_FOR_THIS_FEATUREunless your developer token has explicit Customer Match access.create_customer_match_listworks without it — only the email upload needs the allowlist.
Notes
Monetary amounts are passed in the account's currency units and converted to micros internally (1 unit = 1,000,000 micros).
customer_idis always passed without dashes.update_rsa_headlinesreplaces ALL current headlines — pass the full desired list, not just the new ones.Customer Match lists can take up to 48h to process on Google's side.
License
MIT — see LICENSE.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityFmaintenanceA read-write MCP server for managing Google Ads campaigns, ad groups, keywords, and ads via natural language.Last updated122The Unlicense

google-ads-mcpofficial
Alicense-qualityBmaintenanceMCP server that provides tools and resources for interacting with Google Ads API, enabling search, metadata retrieval, and account management through natural language.Last updated800Apache 2.0- AlicenseBqualityBmaintenanceRead-only MCP server for Google Ads, enabling querying campaigns, ad groups, ads, insights, and keywords without create/update/delete operations.Last updated9MIT
- Flicense-qualityDmaintenanceMCP server that lets any LLM manage Google Ads campaigns from the terminal. Supports read and write operations.Last updated
Related MCP Connectors
MCP server for interacting with the Supabase platform
Remote MCP server for the Hackle Admin API: experiments, feature flags, remote config, messaging.
MCP server for managing Prisma Postgres.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/YerayRodri/google-ads-write-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server