# adwarp

Open-source ad agent for LinkedIn Ads and Google Ads. Drafts campaigns, audiences and reports from Claude Code, Cursor, Codex or other MCP clients that can run a local server.

- **Type:** MCP server
- **Trust:** 85/100 (A), scored on the package rubric
- **Verification:** verified (build provenance)
- **Version:** 0.4.0
- **Author:** Unknown
- **License:** MIT
- **npm:** adwarp
- **Endpoints:** streamable-http https://mcp.adwarp.dev/api/mcp
- **Source:** https://github.com/adwarp-dev/adwarp
- **Endpoint health:** reachable (last checked 2026-10-22T01:28:37.951Z, 1 sample) — uptime is not a security property and is not part of the trust score
- **Compatible clients:** claude-code, cursor, copilot, chatgpt, gemini (basis: transport)

## Trust

85/100 (A), scored on the package rubric
- Publisher verified: no
- Build provenance: verified attestation
- npm trusted publishing (OIDC): yes
- Install scripts: nothing suspicious found
- Prompt-injection scan: not run
- Obfuscation scan: not run
- Evidence age: 0 days

## Security scan

- **Status:** clean
- **Scanned:** 2026-10-22T01:28:06.562Z
- **Version scanned:** 0.4.0
- **CVEs:** none found by OSV at scan time

## Tools

37 declared. Statically extracted from the shipped source — a floor on the surface, not a census.
- `gads_list_accounts` — List every Google Ads customer this login can reach. Run this first: it proves the OAuth client, developer token, and account access all work.
- `gads_list_client_accounts` — List the client accounts under a Google Ads manager (MCC) account.
- `gads_keyword_ideas` — Keyword research: search volume, competition, and top-of-page bid range for seed terms and/or a landing page. The sizing step before committing budget, equivale
- `gads_list_campaigns` — Account structure: campaigns with their ad groups nested. Paused campaigns are included.
- `gads_list_ads` — Ads in an ad group, with their responsive-search headlines and descriptions.
- `gads_list_conversion_actions` — Conversion actions on the account, so a launch can name one instead of guessing an id.
- `gads_launch_search_campaign`
- `gads_performance` — Performance rows at campaign, ad_group, ad, keyword, or search_term level, with totals and derived KPIs (CTR, CPC, CPM, conversion rate, cost per conversion).
- `gads_search` — Run a raw GAQL query against the account. Read-only escape hatch for anything the other tools do not cover.
- `list_ad_accounts` — List LinkedIn ad accounts this app can access.
- `list_targeting_facets`
- `search_targeting` — Typeahead-search entities within a facet to get their URNs (e.g. facet='titles', query='marketing' -> Marketing Manager urn). Use 'list_facet_entities' for smal
- `list_facet_entities` — List all entities of a small facet (e.g. seniorities, functions, degrees) to pick URNs from.
- `estimate_audience` — Estimate audience size for a structured targeting spec (facet short name -> entity URNs). A campaign needs >=300 members to serve.
- `upload_audience_csv` — Clean a CSV at csvPath and upload it as a matched-audience DMP segment. Auto-detects contact (email) vs company (account) lists, normalizes column names, drops 
- `audience_from_salesforce` — Build a matched audience from a Salesforce SOQL query that selects an email column. Closes the loop: flagged accounts/contacts -> DMP segment. Requires the loca
- `audience_from_hubspot` — Build a matched audience from HubSpot contacts or companies. Pass exactly 1 source: a HubSpot listId (its members), or filters for a CRM search (all ANDed). Rea
- `list_conversions` — List the account's existing conversions (insight tags) so you can select one to track on a campaign. Pass accountId or omit to use the default.
- `list_campaigns` — List the account structure: campaign groups (campaigns) and/or their campaigns (ad groups), DRAFTS INCLUDED, unlike performance reports, which only show entitie
- `list_ads` — List the creatives (ads) in a campaign (ad group), drafts included: id, name, status, and backing post urn.
- `delete_ad` — Delete an ad: removes the creative and (best-effort) the Direct Sponsored Content post behind it. Accepts a numeric creative id or a full urn:li:sponsoredCreati
- `update_ad` — Change a single ad's (creative's) status in place: PAUSED stops it serving, ACTIVE starts it serving, ARCHIVED retires it. Use PAUSED to stop an ad without touc
- `get_audience_status` — Check a DMP segment's matching status and resolved size.
- `create_campaign_group` — Create a campaign group (the top-level 'campaign'). Defaults to DRAFT.
- `create_campaign` — Create a campaign (the 'ad group') with targeting, budget, bid or bidding strategy (optimizationTargetType MAX_CLICK = Maximum Delivery on landing page clicks),
- `update_campaign`
- `create_text_ad` — Create a Text Ad creative (DRAFT by default).
- `create_image_ad` — Create a single-image Sponsored Content creative (DRAFT). Omit imagePath to leave the campaign ready for an image later.
- `performance_summary` — Account performance rollup over a period: totals + KPIs, top campaigns by spend/CTR, worst by cost-per-conversion, and flagged campaigns (spend with no conversi
- `get_performance` — Per-entity performance with derived KPIs (CTR, CPC, CPM, CPL, conversion rate). level: campaign_group (campaign), campaign (ad group), or creative (ad). Pass pa
- `performance_trend` — Weekly or monthly trend for one entity, with period-over-period deltas on impressions, clicks, spend, conversions, and CTR. Use to spot momentum or creative fat
- `launch_from_brief` — End-to-end: optional audience upload -> campaign group -> campaign -> draft creatives. Everything DRAFT. Returns Campaign Manager review links.
- `log_ad_change` — Record a change to an ad entity in the local change journal, so a later lift report can compare performance before vs. after it. Adwarp logs its own changes aut
- `list_ad_changes` — List recorded ad changes (newest first) from the local change journal. Filter by entity type/id or tag. Use this to see what's been changed before computing lif
- `compute_lift` — For each recorded change to an entity, compare performance in the window before the change against the window after it (default 14 days each side). Returns befo
- `inspect_competitor_ads` — Discover competitor ads through the official API. auto optionally queues up to 10 creatives on the remote worker; api returns metadata only. Always provide adve
- `get_competitor_creatives` — Read remote creative job status and cached copy by ad IDs. Read-only: does not enqueue work or visit LinkedIn. Screenshots are available through the authenticat

## Install

**Verdict: install** — No blocking findings and no open coverage gaps — safe to install as configured.
**Config** (claude-code):
```json
"{\n  \"mcpServers\": {\n    \"adwarp\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"adwarp\"\n      ],\n      \"env\": {\n        \"ADWARP_LINKEDIN_CLIENT_SECRET\": \"<YOUR_ADWARP_LINKEDIN_CLIENT_SECRET>\",\n        \"ADWARP_LINKEDIN_REFRESH_TOKEN\": \"<YOUR_ADWARP_LINKEDIN_REFRESH_TOKEN>\"\n      }\n    }\n  }\n}"
```
**Credentials it will ask for** (names only — Forge never holds a value):
- `ADWARP_LINKEDIN_CLIENT_SECRET` — Adwarp Linkedin Client Secret (optional)
- `ADWARP_LINKEDIN_REFRESH_TOKEN` — Adwarp Linkedin Refresh Token (optional)
Placeholders only. Forge never holds, brokers, or transmits a credential value — replace each <YOUR_NAME> in your own config file. Do not send a value back to Forge; no Forge endpoint accepts one.
- This entry needs 2 credentials (0 required). The generated config carries placeholders, so it will fail in the editor rather than at runtime if they are left unset.

## Blast radius

Critical blast radius — deletes data; holds an oauth grant.
- Floor 64, ceiling 64 (tier: critical)
- This is impact, not likelihood. A high radius is not a defect: a filesystem server is supposed to write files. It is never part of the trust score.

## Machine-readable views of this entry

- Signed JSON: https://forgeregistry.com/api/v1/packages/adwarp
- Install plan: https://forgeregistry.com/api/v1/packages/adwarp/install-plan
- Alternatives: https://forgeregistry.com/api/v1/alternatives/adwarp
- HTML page: https://forgeregistry.com/registry/adwarp
- MCP: POST https://forgeregistry.com/api/mcp → `forge_get_package` / `forge_install_plan`

## About this document

Generated by Forge (https://forgeregistry.com) — a compact rendering of the same record served, signed, at the JSON URL above. Trust and scan facts are the registry's own measurements; anything Forge did not measure is named as unmeasured rather than omitted.
