Optimize LinkedIn Ads from your terminal.
Adwarp is an open-source MCP server and CLI for pausing weak ads, pacing budgets, changing bids and testing creative on LinkedIn Ads. Write the rules once, run them on a schedule, and measure the lift of every change.
$ claude mcp add adwarp -- npx -y adwarp mcp$ claude
> Did the new headline actually help?
adwarp.list_ad_changes this ad, newest first: new headline
adwarp.compute_lift 14 days before vs 14 days after: +50%
click-through rate 0.38% to 0.57%
A before and after read, not a controlled test. Seasonality can move it too.
01What you can ask
What you can ask. Real requests, answered from your terminal.
$ claude
> Which ads should I pause this week?
adwarp.get_performance ads, last 14 days: 14 ads
3 ads under 0.4% click-through rate after 1,500 impressions
Ready to pause those 3. The top 5 stay on. Go ahead?
02How it works
How it works.
Set the rules
A click-through floor after enough impressions, a cap on cuts and your best ads protected.
Let a schedule check
Cron or a scheduled agent runs the rules and the pacing check you approved in advance.
Measure the lift
Every change is journaled, so you compare the 14 days before it with the 14 days after.
03Results
Why it gets better results.
Rules run every week
A schedule runs your pause rules instead of a calendar reminder, so they never get skipped.
Budget problems surface early
A daily pacing check catches spend running ahead on day 8 instead of day 30.
You keep what worked
Every change is journaled with a reason, so lift gets measured instead of guessed.
In practice29 budget changes, 23 bid changes, 16 rotation switches and 36 notes on why in the journal, next to a Monday job pausing ads under 0.4% click-through rate after 1,500 impressions and a daily pacing check.
How is lift measured?
For each recorded change, Adwarp compares a window before it with the same window after, 14 days by default, and reports the change in click-through rate, cost per click, conversion rate and cost per conversion. Treat it as a signal, since seasonality and LinkedIn's learning phase can move it.
Can it warn me before I overspend?
Yes. A daily check projects month-end spend from the current run rate and compares it with your monthly cap. It stays silent while you're on pace, so a message always means something.
What should I optimize for?
The result you want in the end. Track a conversion on every ad group so cost per conversion is there to read, and use click-through rate as the early signal while conversions are few.
Can it pause ads automatically?
Only by rules you approve in advance, run by cron or a scheduled agent. Your best ads stay protected, and every pause is journaled.
- Floor: pause ads under 0.4% click-through rate once they pass 1,500 impressions.
- Cap: pause no more than a set number of ads in 1 run.
- Protected: your top 5 ads stay on, whatever the floor says.
How do I A/B test LinkedIn ads?
Put the ads in 1 ad group, set rotation to even so each gets a fair share, and change 1 thing at a time. Adwarp journals the change, and compute_lift compares the 14 days before with the 14 days after.
- Set rotation to even (ROUND_ROBIN) so every ad gets a fair share of impressions.
- Change 1 thing per ad group at a time, so the result has 1 cause.
- Read the lift once each side has about 1,000 impressions or 3 conversions.
npx adwarp lift creative <creativeId> -w 14
Can I run it on a schedule?
Yes, with cron or a scheduled agent, which can send its summary through your AI client's Slack connector.
0 9 * * 1 npx adwarp report summary -p last_7_daysEvery Monday at 9am, find ads under 0.4% click-through rate
after 1,500 impressions. Keep the top 5 on, ask me before
pausing the rest, and send the summary to Slack.Which tools and commands does it use?
7 MCP tools and 4 CLI commands, with what each one does.
| Tool | What it does |
|---|---|
update_ | Pause, resume or archive a single ad, with a dry run first |
update_ | Change budget, bid, rotation or status, with a dry run first |
get_ | Metrics for every ad group or ad |
performance_ | Weekly or monthly trend, to spot tired creative |
log_ | Record a change made elsewhere, or a hypothesis |
list_ | Every recorded change, newest first |
compute_ | Before and after performance for each change |
CLI
npx adwarp ad pause <creativeId> --applynpx adwarp campaigns update <campaignId> --rotation evennpx adwarp changelog listnpx adwarp lift creative <creativeId> -w 14
What are the limits?
4 things to know before you start.
- Results need about 1,000 impressions or 3 conversions before they mean anything.
- The journal lives on your machine, so lift isn't available on the hosted endpoint.
- Lift is a before and after read, not a controlled test. Seasonality and LinkedIn's learning phase can move it.
- Changes made in Campaign Manager only count once you log them.