Google Ads Search campaigns from your terminal.
Adwarp is an open-source MCP server and CLI that builds Google Ads Search campaigns from a brief. Google checks the whole build in a dry run first, then the budget, ad groups, keywords and ads land in 1 step, paused until you switch them on in Google Ads.
$ claude mcp add adwarp -- npx -y adwarp mcp$ claude
> Create the Search campaign in google-brief.json.
adwarp.gads_launch_search_campaign dry run: valid
adwarp.gads_launch_search_campaign apply: PAUSED
Created in 1 step: budget, campaign, targeting, ad groups, keywords and ads.
Everything is paused. Turn it on in Google Ads when you're ready.
01What you can ask
What you can ask. Real requests, answered from your terminal.
$ claude
> Build a Search campaign for lead routing software at 150 USD a day, US only.
adwarp.gads_keyword_ideas "lead routing software", US: volume + bids
adwarp.gads_list_conversion_actions this account: by name
adwarp.gads_launch_search_campaign dry run: valid
The plan: budget, campaign, targeting, and each ad group with its keywords and ads
Validated by Google. Nothing was created yet.
02How it works
How it works.
Write the brief
Name the campaign, set a daily budget and a landing page, and list each ad group's keywords and ads. Your agent can draft it from a plain request.
Dry run
Google validates the whole build and saves nothing. A problem comes back with the field that caused it.
Create it, paused
Confirm, and the budget, campaign, targeting, ad groups, keywords and ads land in 1 step. You switch it on in Google Ads.
03Results
Why it gets better results.
Search network only
Display expansion and search partners are off, so the budget goes to people searching your keywords.
People in your market
Location targeting reaches people physically in the area, not anyone who searched about it.
Bids you control
Manual CPC to start, because smart bidding with no conversion history spends unpredictably.
No half-built campaigns
The build lands whole or not at all, so a failure leaves nothing behind to clean up.
Can Adwarp switch a Google campaign on?
No. Campaigns, ad groups and ads are created paused, and no tool or command can enable them. You switch them on in Google Ads once you've checked them.
What does the dry run check?
The whole build. Google runs every operation through its own validators and saves nothing, so the answer comes from Google instead of a local guess. A failure names the field that caused it.
Does it set conversion goals?
It checks that the conversion actions you name exist and warns when one doesn't. Google applies your account-level goals to the new campaign, so set narrower goals in Google Ads after it's created.
Does it work on the hosted endpoint?
No. The Google tools run on your machine, through the local MCP server or the CLI, with your own developer token and OAuth client.
What goes in a brief?
Every field a launch reads is below, with a short example.
| Field | What it sets |
|---|---|
| campaignName | The campaign's name. |
| dailyBudget | Required. The daily cap, in the ad account's currency. |
| cpcBid | The max CPC for ad groups that don't set their own. |
| finalUrl | The landing page for ads that don't set their own. |
| locations | Country codes such as US or GB, or Google location ids. US when left out. |
| languages | Language codes. English when left out. |
| adGroups | Each with a name, its keywords, optional negatives and at least 1 ad. |
| negativeKeywords | Campaign-level negatives, on top of each ad group's own. |
| negativeKeywordListId | A shared negative keyword list to attach. Never added unless you name it. |
| conversionActionNames | Conversion actions to check, or defaultConversionActionNames from google.json. |
| startDateTime, endDateTime | The flight. Without a start date it starts today, paused. |
{
"campaignName": "RevOps automation - Search",
"dailyBudget": 150,
"cpcBid": 12,
"finalUrl": "https://example.com/platform",
"locations": ["US"],
"negativeKeywords": [{ "text": "jobs", "matchType": "BROAD" }],
"adGroups": [
{
"name": "Lead routing - exact",
"keywords": [
{ "text": "lead routing software", "matchType": "EXACT" },
{ "text": "lead assignment tool", "matchType": "PHRASE" }
],
"ads": [
{
"headlines": ["Lead routing that works", "Route leads in seconds", "Made for RevOps"],
"descriptions": [
"Assign every inbound lead the moment it lands.",
"Connect Salesforce in minutes."
],
"path1": "routing"
}
]
}
]
}What are Google's rules for ads and keywords?
Fixed limits on headlines, descriptions and paths, plus 3 match types. Adwarp checks them before it calls Google.
- 3 to 15 headlines per ad, up to 30 characters each.
- 2 to 4 descriptions per ad, up to 90 characters each.
- Display path segments up to 15 characters each. path2 needs path1, because Google rejects path2 on its own.
- Match types are EXACT, PHRASE or BROAD, and PHRASE when left out. EXACT and PHRASE keep B2B spend tight, and BROAD needs strong negatives.
Can I change the house rules?
No. They apply to every campaign Adwarp builds, with no way to turn them off. Change the bidding in Google Ads once there's conversion data.
- Search network only. Display expansion and search partners are off.
- People physically in your target area. US means people in the US, not anyone who searched about it.
- Manual CPC to start. Switch to smart bidding in Google Ads once there's conversion data.
- Created paused, with no tool or command that can enable it. You switch it on in Google Ads.
- Conversion actions are checked, not set as campaign goals. Google applies your account-level goals, and under manual CPC they don't change bidding.
Which tools and commands does it use?
5 MCP tools and 3 CLI commands, with what each one does.
| Tool | What it does |
|---|---|
gads_ | A paused Search campaign from a brief, in 1 atomic step. A dry run unless told otherwise. |
gads_ | Volume, competition and bid range for the keywords before you commit them |
gads_ | Conversion actions on the account, so a brief can name 1 |
gads_ | Campaigns with their ad groups, paused ones included, to check the result |
gads_ | The ads in an ad group, with their responsive search copy |
CLI
npx adwarp google launch --brief google-brief.jsonnpx adwarp google launch --brief google-brief.json --applynpx adwarp google campaigns list
What are the limits?
4 things to know before you start.
- Search campaigns only. Performance Max, Display, Shopping, video and Customer Match aren't supported yet.
- The Google tools run locally. The hosted endpoint serves 0 of the 9 Google tools.
- It runs in Claude, Codex, Cursor and the CLI. ChatGPT doesn't connect to the Google tools yet.
- Campaign creation works on Explorer access. Keyword research needs Basic access.