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.

Set up Adwarp and look up every tool.

Adwarp is an open-source MCP server and CLI for LinkedIn Ads and Google Ads that you run from your terminal. Start with your LinkedIn app, then run it locally, on the hosted endpoint or as a CLI.

On this page

Start here.

  1. Create your LinkedIn app

    Your own developer app with the Advertising API, so your credentials and your ad account stay yours. You do this once.

    Create a LinkedIn app
  2. Add Adwarp to your agent

    Save your app's Client ID and Secret in ~/.adwarp/config.json, sign in from your terminal, then copy the command for your client.

    npx -y adwarp auth login
    $ claude mcp add adwarp -- npx -y adwarp mcp
  3. Ask something read-only

    Confirm it works before anything else.

    List my ad accounts

Browse the docs.

Overview

Adwarp (formerly Liam) is the open-source ad agent for LinkedIn Ads and Google Ads. You describe the campaign in plain language and Adwarp drafts the audience, the ad groups, and the ads, from Claude Code, Claude Desktop, Cursor, Codex, or other MCP clients that can run a local server, or from a CLI. It covers creation, matched audiences (including building one straight from Salesforce or HubSpot), conversion selection, performance reporting, competitor ad intelligence, and a change journal with before and after lift.

Everything Adwarp creates starts switched off. LinkedIn entities are created as drafts and Google Ads entities as paused. A LinkedIn campaign goes live only when you explicitly ask Adwarp to turn it on or switch it on yourself in Campaign Manager, and Google campaigns can only be switched on in the Google Ads UI.

Adwarp is unofficial and not affiliated with or endorsed by LinkedIn or Google.

What you can ask for

Once Adwarp is connected, you talk to your assistant in plain language. These are requests it handles today, roughly in the order a campaign comes together:

  • "How many VPs of demand gen at US SaaS companies can we reach?" Adwarp resolves the targeting facets and estimates reach before any money is involved.
  • "Upload this CSV as a matched audience." Adwarp cleans the columns, hashes emails, and converts company domains to URLs.
  • "Build an audience from Salesforce: every contact on an account flagged as a target." A SOQL query goes straight to a matched audience.
  • "Turn our HubSpot target accounts list into a LinkedIn audience." A HubSpot list or search becomes a matched audience of contacts or companies.
  • "Launch a draft campaign for that audience, $100/day, tracking the demo-booked conversion." The campaign group, campaign, and draft ads are created in a single call.
  • "What ads is our biggest competitor running right now, and what offers are they pushing?" Adwarp reads the public Ad Library: copy, formats, and EU targeting metadata for any company.
  • "How did retargeting do last month compared to the month before?" You get a trend report with deltas.
  • "Which ads should I pause this week?" You get an account rollup with top and bottom performers and flags. Name the ads to pause and Adwarp pauses each of them, leaving the rest of the ad group running.
  • "Rewrite the copy on the losing ad." Adwarp deletes the ad and recreates it as a fresh draft, because LinkedIn ignores edits to a live ad's post.
  • "Did the new headline actually help?" The change journal measures before and after lift.

Adwarp resolves the details and reports back the ids. Every capability is also an adwarp CLI command for scripted or batch use.

Hierarchy mapping

LinkedIn names its levels differently from Google. Its names are shifted 1 level from everyone else's, which is the most common source of confusion when working across both platforms.

Common term, LinkedIn entity, Google Ads entity, Holds
Common termLinkedIn entityGoogle Ads entityHolds
CampaignCampaign Group(none)status, total or shared budget
Ad groupCampaignCampaigntargeting, budget, bid, schedule, format
(none)(none)Ad groupkeywords and the ads that answer them
AdCreativeAd group adthe rendered ad
AudienceDMP SegmentUser listattached to targeting

So a LinkedIn campaign and a Google campaign are different things. Google's campaign holds the budget and targeting (LinkedIn's campaign group plus campaign), and its ad group holds keywords.

Put it on a loop

Adwarp has no scheduler. Use the one in whatever client you drive it from. Some loops that work well:

  • "Every Monday at 9am, pull last week's performance summary, compare it to the week before, and flag anything that moved more than 20%." This works as a Claude Code scheduled agent.
  • "Every Friday, check what new ads our top 3 competitors shipped this week and summarize the angles."
  • "Check the audience match status every few hours and tell me when it clears 300 members." That is the minimum for a matched audience to serve.
  • Or skip the assistant entirely and put the CLI in cron: 0 9 * * 1 adwarp report summary -p last_7_days.

Get started

Start with Create a LinkedIn app, then pick a path: run the MCP server locally, connect to the hosted endpoint, or use the CLI.