The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Linkedin Ads listing page.
Production-grade MCP server for LinkedIn Campaign Manager API. Enables Claude to manage LinkedIn ad accounts, campaigns, ad sets, and creatives with full read/write support.
Features:
Stats:
landingPageClicks (not total clicks with engagement)Security: Never share your .mcp.json file or commit it to git -- it may contain API credentials. Add .mcp.json to your .gitignore.
Get OAuth credentials:
r_ads, rw_ads, w_member_social, r_organization_social, w_organization_socialCreate config.json:
Fill in your credentials:
Set environment variables (recommended for production):
| Variable | Required | Default | Purpose |
|---|---|---|---|
LINKEDIN_ADS_CLIENT_ID | yes | -- | OAuth client ID |
LINKEDIN_ADS_CLIENT_SECRET | yes | -- | OAuth client secret |
LINKEDIN_ADS_ACCESS_TOKEN | yes | -- | OAuth access token |
LINKEDIN_ADS_REFRESH_TOKEN | optional | -- | OAuth refresh token (rotated automatically when set) |
LINKEDIN_ADS_MCP_WRITE | optional | false | Set to true to expose mutating tools. Read-only by default. |
The LinkedIn Ads MCP currently ships with read-only tools only. The write-mode
gate is already in place so that any future create/update/pause/enable/remove
tool is hidden from ListTools and refused at call time unless
LINKEDIN_ADS_MCP_WRITE=true is set in the MCP server environment. This
mirrors the Google Ads MCP gate and matches the pattern being rolled out to
Bing / Reddit / Meta. Motivation: prevent a casual LLM request from mutating
production ad accounts without the operator explicitly opting in.
Add to ~/.claude.json:
Claude Desktop: Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows).
landingPageClicks (LP clicks), NOT clicks (total clicks)DRAFT — Not yet activeACTIVE — Actively servingPAUSED — Paused manuallyARCHIVED — Historical recordflexible_spec array (OR logic between items)exclude_spec arrayFiles:
src/index.ts — MCP server, OAuth flow, tool handlerssrc/tools.ts — Tool schema definitionssrc/errors.ts — Error handling & classificationconfig.json — Credentials & client mappingError Handling:
src/tools.tssrc/index.ts tool dispatch.contract.test.tsConfig file not foundMissing required credentialsCheck that:
LINKEDIN_ADS_CLIENT_ID and LINKEDIN_ADS_CLIENT_SECRET are set (or in config.json)config.json exists and contains at least one client with account_idRate limit exceededLinkedIn enforces strict rate limits. The server includes automatic retry with exponential backoff. If you hit limits:
CTR seems too lowVerify you're using landingPageClicks (LP clicks), not clicks (all interactions). The latter includes social engagement and will inflate CTR incorrectly.
MIT
Contributions welcome! Please:
docs/ folder for detailed API referenceMark Harnett — Demand generation leader and paid media practitioner building AI-powered ad management tools. This server was born from managing LinkedIn campaigns across multiple clients and wanting Claude to handle campaign ops, performance analysis, and bulk creative updates autonomously.
Built with production workloads in mind: resilient API calls (circuit breakers, retry with backoff, response truncation), accurate CTR calculation (landing page clicks, not total clicks), and multi-account support.
Also by Mark: mcp-bing-ads -- Bing/Microsoft Ads MCP server with 10 tools.
Last Updated: 2026-03-13