adwarp

Start with 1 prompt.

Paste it into Claude Code, Codex or Cursor. Your agent installs Adwarp, walks you through your LinkedIn app and checks the connection.

setup prompt
Set up Adwarp for me. It's the open-source ad agent for LinkedIn Ads and Google Ads: https://github.com/adwarp-dev/adwarp

1. Check that Node.js 20 or newer is installed.
2. Walk me through creating my own LinkedIn developer app with the Advertising API product: https://github.com/adwarp-dev/adwarp/blob/main/docs/linkedin-app.md
3. Save the app's client ID and secret to ~/.adwarp/config.json as clientId and clientSecret.
4. Run "npx -y adwarp auth login" and wait while I approve access in my browser.
5. Add Adwarp to the AI client I'm using right now as an MCP server that runs "npx -y adwarp mcp". In Claude Code that's: claude mcp add adwarp -- npx -y adwarp mcp
6. Check the connection by listing my ad accounts, then save the one I pick as defaultAccountId in ~/.adwarp/config.json.

Don't create or change anything in my ad accounts during setup. LinkedIn campaigns start as drafts, so nothing spends until I turn it on.
adwarp
GitHub

Start with 1 prompt.

Paste it into Claude Code, Codex or Cursor. Your agent installs Adwarp, walks you through your LinkedIn app and checks the connection.

setup prompt
Set up Adwarp for me. It's the open-source ad agent for LinkedIn Ads and Google Ads: https://github.com/adwarp-dev/adwarp

1. Check that Node.js 20 or newer is installed.
2. Walk me through creating my own LinkedIn developer app with the Advertising API product: https://github.com/adwarp-dev/adwarp/blob/main/docs/linkedin-app.md
3. Save the app's client ID and secret to ~/.adwarp/config.json as clientId and clientSecret.
4. Run "npx -y adwarp auth login" and wait while I approve access in my browser.
5. Add Adwarp to the AI client I'm using right now as an MCP server that runs "npx -y adwarp mcp". In Claude Code that's: claude mcp add adwarp -- npx -y adwarp mcp
6. Check the connection by listing my ad accounts, then save the one I pick as defaultAccountId in ~/.adwarp/config.json.

Don't create or change anything in my ad accounts during setup. LinkedIn campaigns start as drafts, so nothing spends until I turn it on.

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

Read the docs

claude ~ lift

$ 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 ~ weekly cleanup

$ 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.

  1. Set the rules

    A click-through floor after enough impressions, a cap on cuts and your best ads protected.

  2. Let a schedule check

    Cron or a scheduled agent runs the rules and the pacing check you approved in advance.

  3. 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.

04FAQ

Questions, answered. From setup to the details.

Ask on GitHub
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.

crontab
0 9 * * 1  npx adwarp report summary -p last_7_days
Scheduled agent prompt
Every 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.

Which tools and commands does it use?
ToolWhat it does
update_adPause, resume or archive a single ad, with a dry run first
update_campaignChange budget, bid, rotation or status, with a dry run first
get_performanceMetrics for every ad group or ad
performance_trendWeekly or monthly trend, to spot tired creative
log_ad_changeRecord a change made elsewhere, or a hypothesis
list_ad_changesEvery recorded change, newest first
compute_liftBefore and after performance for each change

CLI

  • npx adwarp ad pause <creativeId> --apply
  • npx adwarp campaigns update <campaignId> --rotation even
  • npx adwarp changelog list
  • npx 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.