LIAM · LINKEDIN ADS MANAGER

LIAM

The LinkedIn Ads Manager you talk to. Describe the campaign in plain language and Liam drafts the audience, the ad groups, and the ads. Works from Claude over MCP or a CLI, locally or through the hosted endpoint with your own LinkedIn app.

What you can do

Ask it like you would ask a teammate.

> How many VPs of demand gen at US SaaS companies can we reach?

Resolves targeting facets and estimates reach before any money is involved.

> Upload this CSV as a matched audience.

Auto-cleans the columns and hashes emails; company domains become website URLs.

> Build an audience from Salesforce: every contact on a target account.

A SOQL query becomes a matched audience, no export step.

> Launch a draft campaign for that audience, $100 a day.

Campaign group, ad group, and draft ads in one call, conversion attached.

> What ads is HubSpot running, and what offers are they pushing?

Reads any company's ads from the public Ad Library: copy, formats, EU targeting.

> How did retargeting do last month vs the month before?

Trend reports with deltas at any level: account, campaign, single ad.

> Which ads should I pause this week?

Account rollup with top and bottom performers, plus flags worth acting on.

> Rewrite the copy on the losing ad.

LinkedIn ignores edits to a live ad's post, so Liam recreates it as a fresh draft.

> Build last month's report: spend, CTR, cost per conversion.

Pulls the month's numbers and names the underperformers in one pass.

Get started

One prompt sets everything up.

Pick how you want to use Liam and paste the matching prompt into Claude Code. It checks your machine, helps you create your own LinkedIn developer app, logs you in, and verifies the connection, one step at a time.

Use it as a CLI

For scripted and batch work in the terminal. Ends with a global liam command and your first report.

setup prompt · paste into claude code
You are helping me set up Liam, an open-source LinkedIn Ads Manager from
https://github.com/stan-default/liam. It runs locally as a CLI and an MCP server.
Everything it creates on LinkedIn is a draft, so nothing spends money until I
activate it myself in Campaign Manager.

Walk me through the setup one step at a time. Run commands for me where you can,
show me exactly what to click where you cannot, and wait for my confirmation
before moving to the next step.

1. Check that git, Node.js 20 or newer, and pnpm are installed. Help me install
   whatever is missing.
2. Clone https://github.com/stan-default/liam and run "pnpm install" then
   "pnpm -r build" in the repo root.
3. Help me create a LinkedIn developer app at
   https://www.linkedin.com/developers/apps (it must be associated with my
   company's LinkedIn Page):
   a. On the Products tab, request access to the "Advertising API" product.
      This is the only required product; approval can take a while.
   b. Optional: also request "Audiences" if I want to upload CSV contact or
      company lists as matched audiences.
   c. Optional: also request "LinkedIn Ad Library" if I want competitor ad
      metadata through the official API.
   d. On the Auth tab, add http://localhost:53682/callback as an authorized
      redirect URL, and show me where the Client ID and Client Secret live.
4. Create ~/.liads/config.json containing my clientId, clientSecret, and
   "linkedinVersion": "202605".
5. Run "node packages/cli/dist/index.js auth login". My browser opens LinkedIn's
   consent screen; after I approve, tokens are stored in ~/.liads/credentials.json.
6. Verify with "node packages/cli/dist/index.js accounts list". If no accounts
   show up, remind me to map my ad account in the Developer Portal under
   Products > Advertising API > View Ad Accounts. Then set my account id as
   "defaultAccountId" in ~/.liads/config.json.
7. Link the CLI globally with "cd packages/cli && pnpm link --global" so I can
   run "liam" from anywhere, and confirm "liam accounts list" works.
8. Show me a first session: "liam report summary -p last_30_days" and
   "liam targeting search titles" with a title I care about.

If any step fails, show me the exact error and fix it with me before moving on.

Talk to it over MCP

Adds Liam as an MCP server in Claude Code, Claude Desktop, or any MCP client. The one-time install runs only if it is not on your machine yet.

setup prompt · paste into claude code
You are helping me connect Liam, an open-source LinkedIn Ads Manager
(https://github.com/stan-default/liam), to Claude as an MCP server. Everything
it creates on LinkedIn is a draft, so nothing spends money until I activate it
myself in Campaign Manager.

Work one step at a time, run commands for me where you can, and wait for my
confirmation before moving on.

1. Register the MCP server:
   - In Claude Code: claude mcp add liam -- node <abs repo path>/packages/mcp/dist/index.js
   - For Claude Desktop or another MCP client, add {"command": "node", "args":
     ["<abs repo path>/packages/mcp/dist/index.js"]} under mcpServers in its
     config, and tell me where that config file lives on my machine.
2. Confirm the liam tools load, then show me one read-only call working, for
   example list_ad_accounts or a last_30_days performance summary.

Only if step 1 has nothing to point at yet, do the one-time install first:
clone https://github.com/stan-default/liam, run "pnpm install" and
"pnpm -r build", put the clientId and clientSecret from my LinkedIn developer
app (Advertising API product, redirect URL http://localhost:53682/callback)
in ~/.liads/config.json, then run "node packages/cli/dist/index.js auth login"
and verify with "node packages/cli/dist/index.js accounts list".

If a step fails, show me the exact error and fix it with me before moving on.

Use the hosted MCP

Connect to the hosted endpoint with your own LinkedIn app credentials as headers. Every call runs against your ad account; nothing to deploy or keep running.

setup prompt · paste into claude code
You are helping me connect to the hosted MCP endpoint of Liam, an
open-source LinkedIn Ads Manager (https://github.com/stan-default/liam), at
https://liam-mcp.vercel.app/api/mcp. I bring my own
LinkedIn developer app credentials as request headers, so every call runs
against my own LinkedIn ad account, and everything Liam creates is a draft
that spends nothing until I activate it myself in Campaign Manager.

Work one step at a time, run commands for me where you can, and wait for my
confirmation before moving on.

1. Help me create a LinkedIn developer app at
   https://www.linkedin.com/developers/apps (it must be associated with my
   company's LinkedIn Page). On the Products tab request "Advertising API";
   on the Auth tab add http://localhost:53682/callback as a redirect URL and
   show me where the Client ID and Client Secret live.
2. Mint my refresh token, the one step that runs locally: clone
   https://github.com/stan-default/liam, run "pnpm install" and "pnpm -r build",
   write my clientId and clientSecret into ~/.liads/config.json, then run
   "node packages/cli/dist/index.js auth login" and approve in the browser.
3. Run "node packages/cli/dist/index.js auth export --mcp". It prints the
   exact "claude mcp add" command with my credentials as X-Liads headers.
   Run that command for me (or show me where to paste the headers in my MCP
   client's config if I am not on Claude Code).
4. Confirm the liam tools load and show me one read-only call working, for
   example list_ad_accounts. If my default account is missing, add an
   "X-Liads-Account-Id" header with my ad account id.

Remind me that my credentials travel with every call to that server, and that
I can self-host the same endpoint on my own Vercel account if I prefer
(the README has the steps).

If a step fails, show me the exact error and fix it with me before moving on.

Prefer to do it by hand, or want to self-host the hosted mode on your own Vercel account? The docs have the full manual walkthrough, the hosted header reference, and the permissions table, mirrored from the README.

FAQ

The questions worth asking first.

Can it spend money without me?

No. Everything Liam creates is written to LinkedIn as a draft, and there is deliberately no activate command or tool anywhere in the codebase. A campaign starts spending only when you switch it on yourself in Campaign Manager.

What permissions does it need?

Liam runs against your own LinkedIn developer app with the Advertising API product. At login it asks for four OAuth scopes: rw_ads to create and edit campaigns, r_ads_reporting to read performance, rw_conversions for conversion tracking, and w_organization_social so image ads can create the post owned by your LinkedIn Page. Two optional products unlock more: Audiences for CSV list uploads and Ad Library for competitor metadata.

How does it work?

A CLI and an MCP server sit on top of the same typed client for LinkedIn's Marketing API. You say what you want and your assistant calls the matching tools. Every change Liam makes is journaled to a local file so you can measure the lift of any edit later.

How do I get started?

Copy one of the prompts above into Claude Code. It installs the prerequisites, walks you through creating the LinkedIn app, logs you in through your browser, and verifies everything with a read-only call. The hands-on part takes about 15 minutes; LinkedIn's approval of the Advertising API product can add a day or two of waiting.

Do I need to be a developer?

No. You need a terminal with Claude Code installed, and the setup prompt does the rest. The hardest part is clicking approve in your browser when LinkedIn asks.

Where do my credentials live?

In a ~/.liads folder on your own machine, with file permissions locked to your user. Tokens go to LinkedIn's API and nowhere else. Self-hosting the hosted mode puts them in your own Vercel project's environment variables. Connecting to the shared hosted endpoint puts them in your MCP client's config as headers, so they ride along on each call; the server uses them in memory and stores nothing. Self-host if you would rather they never leave your infrastructure.

Can I use it without installing anything?

Almost. The hosted MCP endpoint lets any MCP client that supports custom headers connect with your own LinkedIn app credentials, so there is nothing to deploy or keep running. You still do one short local run to mint your refresh token, since LinkedIn's OAuth consent has to happen in your browser. After that the connection is a URL plus headers, and a skill or system prompt holds your account defaults.

What does it cost?

Nothing. Liam is open source under the MIT license, and there is no hosted service to subscribe to. The only money involved is what you choose to spend on LinkedIn after you activate a campaign.

Does it only work with Claude?

It works with any MCP client: Claude Code, Claude Desktop, Cursor, and the rest. The CLI needs no assistant at all. Put a weekly report in cron and it runs without one.

Is this an official LinkedIn product?

No. Liam is unofficial and has no affiliation with or endorsement from LinkedIn. It talks to LinkedIn's documented Marketing API through the developer app you create and control.