Skip to main content
Glama
LinkedIn Ads MCP Server

LinkedIn Ads MCP Server

LinkedIn Ads MCP Server

An MCP server that connects Claude (Code or Desktop) to the LinkedIn Ads API, giving you natural-language control over campaign management, audience targeting, creative uploads, analytics, and account auditing.

What it does

Category

Capabilities

Campaigns

Create, list, update campaign groups and campaigns

Audiences

Create/edit saved audiences, bulk geo-swap targeting

Creatives

Upload images and videos, create ad creatives

Analytics

Campaign and creative performance reports, account summaries

Auditing

10-point account audit (CTR decline, budget utilization, missing conversion tracking, etc.)

Bulk ops

Queue and execute batch campaign/group creation and updates

Best-practice enforcement is built in — audience expansion and audience network are disabled by default on every write operation.

Related MCP server: LinkedIn Profile MCP Server

Prerequisites

  • Node.js 18+

  • A LinkedIn Developer App with Advertising API access (apply here)

  • OAuth scopes: r_ads, rw_ads, r_ads_reporting, r_basicprofile

  • Your LinkedIn Ad Account ID

Quick start

git clone <this-repo-url>
cd linkedin-ads-mcp-server
npm install
cp .env.example .env
# Edit .env with your LinkedIn credentials
npm run build
npm start

You should see: LinkedIn Ads MCP server running — 34 tools registered

Connecting to Claude

Claude Code (CLI)

Add to your ~/.claude/settings.json:

{
  "mcpServers": {
    "linkedin-ads": {
      "command": "node",
      "args": ["/path/to/linkedin-ads-mcp-server/dist/index.js"],
      "env": {
        "LINKEDIN_ACCESS_TOKEN": "your_token",
        "LINKEDIN_AD_ACCOUNT_ID": "urn:li:sponsoredAccount:123456789"
      }
    }
  }
}

Claude Desktop

Add the same mcpServers block to %APPDATA%/Claude/claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS).

Restart Claude after updating the config.

Usage

Once connected, just talk to Claude:

  • "List my campaign groups"

  • "Create a new campaign group called Q3 Brand Awareness"

  • "Run a full account audit"

  • "Show analytics for my top 5 campaigns this month"

  • "Swap targeting from UK to US for all saved audiences"

To target a different ad account without restarting, pass it inline:

  • "List campaigns for account urn:li:sponsoredAccount:987654321"

Full setup guide

See SETUP.md for detailed instructions covering:

  1. Creating a LinkedIn Developer App

  2. Generating OAuth tokens

  3. Linking your ad account

  4. Configuring Claude Code / Claude Desktop

  5. Token refresh for production use

  6. Upgrading to Standard API tier

Token expiration

Access tokens expire after 60 days. See SETUP.md Part 5 for the refresh flow.

License

MIT

Available Tools

37 tools
bulk_create_campaign_groupsA

Queue and execute bulk creation of campaign groups (up to 100). Each item can have unique names, budgets, and schedules. Executes sequentially with rate limiting. Returns a summary with IDs of all created groups.

Inputs: groups (required), dryRun.

bulk_create_campaignsB

Queue and execute bulk creation of campaigns (up to 100). Supports $ref:group_N references to link to groups created in the same session. Best practices are enforced on every campaign.

Inputs: campaigns (required), dryRun.

bulk_geo_swap_audiencesB

Clone a list of saved audiences, replacing one geo-location with another. E.g., swap UK targeting to US and auto-create new audiences with updated names.

Inputs: audienceIds (required), fromGeoUrn (required), toGeoUrn (required), newNameSuffix.

bulk_update_campaignsB

Bulk update multiple campaigns at once — e.g. pause all, change bids, swap targeting.

Inputs: updates (required), dryRun.

check_single_auditA

Run a single audit check by name. Useful for targeted investigation.

Inputs: check (required).

create_ad_creativeA

Create an ad creative and associate it with a campaign. For sponsored content ads, first create a share/post and pass its URN as contentReference. For lead gen, also provide leadgenFormUrn and callToAction.

Inputs: campaignId (required), commentary (required), type, assetUrn, +2 more.

create_campaignA

Create a new campaign. Enforces best practices: audience expansion OFF, audience network OFF, manual bidding default.

Inputs: campaignGroupId (required), name (required), objective (required), dailyBudget (required), +8 more.

create_campaign_groupB

Create a new campaign group. Validates that budget type is consistent.

Inputs: name (required), status, runSchedule, totalBudget, +1 more.

create_full_adA

End-to-end ad creation: upload image + create dark post + create ad creative. Combines upload_image, create_sponsored_post, and create_ad_creative into one call. REQUIRES w_organization_social OAuth scope for post creation.

Inputs: campaignId (required), commentary (required), imagePath, googleDriveUrl, +4 more.

create_saved_audienceC

Create a new saved audience with targeting criteria.

Inputs: name (required), targetingCriteria.

create_sponsored_postA

Create a sponsored post (dark post) for use as ad content. This post won't appear in the org's feed — it's only used as ad creative. Returns a share URN to pass to create_ad_creative. REQUIRES w_organization_social OAuth scope — if you get ACCESS_DENIED, add this scope to your LinkedIn app and re-authorize.

Inputs: commentary (required), imageAssetUrn, landingPageUrl, title, +1 more.

delete_saved_audienceC

Delete a saved audience by ID.

Inputs: id (required).

get_account_summaryB

Get a high-level summary of account performance over a date range.

Inputs: dateRange (required).

get_audience_sizeB

Estimate audience size for given targeting criteria.

Inputs: targetingCriteria.

get_campaignB

Get full details of a single campaign.

Inputs: id (required).

get_campaign_analyticsB

Pull performance metrics for one or more campaigns over a date range.

Inputs: campaignIds (required), dateRange (required), granularity, fields.

get_campaign_groupA

Get details of a single campaign group by ID.

Inputs: id (required).

get_conversion_trackingB

List all conversion rules configured on the account.

Inputs: no named parameters.

get_creativeC

Get details of a single creative by ID.

Inputs: id (required).

get_creative_analyticsC

Pull performance metrics at the creative/ad level.

Inputs: campaignId (required), dateRange (required), granularity.

get_geo_urnsC

Get common geo URNs for targeting (convenience helper).

Inputs: no named parameters.

get_lead_form_responsesC

Pull lead gen form responses for a specific form.

Inputs: formId (required), startDate.

get_queue_statusC

Check the status of a bulk execution queue.

Inputs: queueId (required).

get_saved_audienceC

Get details of a single saved audience.

Inputs: id (required).

list_ad_accountsA

List all LinkedIn Ad accounts the authenticated user has access to. Use this to find account IDs when managing multiple accounts.

Inputs: no named parameters.

list_campaign_groupsA

List all campaign groups in the ad account. Returns names, statuses, budgets.

Inputs: accountId, status.

list_campaignsC

List campaigns, optionally filtered by group or status.

Inputs: accountId, campaignGroupId, status.

list_creativesC

List ad creatives, optionally filtered by campaign.

Inputs: campaignId.

list_saved_audiencesA

List all saved/matched audiences in the ad account.

Inputs: no named parameters.

run_full_auditA

Run a comprehensive audit across 10 checks: declining CTR, low budget utilization, missing conversion tracking, maximized delivery, audience expansion, audience network, stale campaigns, creative fatigue, overlapping audiences, missing UTM parameters.

Inputs: lookbackDays.

search_targeting_entitiesB

Search for targeting entities like job titles, skills, industries, companies.

Inputs: facet (required), query (required).

switch_default_accountA

Show which account is currently the default, and explain how to target a different one.

Inputs: no named parameters.

update_campaignC

Update a campaign. Re-applies best-practice enforcement.

Inputs: id (required), updates (required).

update_campaign_groupC

Update an existing campaign group.

Inputs: id (required), updates (required).

update_saved_audienceB

Update a saved audience's targeting criteria or name.

Inputs: id (required), updates (required).

upload_imageA

Upload an image to the LinkedIn media library from a local file or Google Drive link.

Inputs: filePath, googleDriveUrl, fileName.

upload_videoB

Register a video upload to the LinkedIn media library. Returns upload URLs for multipart upload.

Inputs: fileSizeBytes (required), fileName.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 37 tools

    Disambiguation5/5

    Each tool targets a distinct function or resource: campaigns vs. campaign groups, creatives, audiences, analytics, audit, etc. Even bulk tools are clearly separated by resource type (campaign_groups, campaigns, geo_swap_audiences). No significant overlap.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern in snake_case (e.g., create_campaign, list_campaign_groups, upload_image). Exceptions like 'switch_default_account' and 'run_full_audit' are still clear and follow the same verb-first structure.

    Tool Count3/5

    37 tools is high, but the domain of LinkedIn advertising is broad, covering campaigns, groups, audiences, creatives, analytics, audits, media, and bulk operations. However, some tools like check_single_audit and run_full_audit could be merged, and the count could be trimmed without losing functionality.

    Completeness4/5

    Covers most CRUD operations for core resources (campaigns, groups, audiences) with creation, read, and update, but lacks delete operations for campaigns, campaign groups, and creatives. Bulk creation is present, but bulk deletion is missing. Audit, analytics, targeting search, and media upload are well covered.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      MCP server for the LinkedIn Marketing API — query campaigns, performance, and Lead Gen Forms from Claude in plain English. 19 read-only tools covering ad accounts, campaigns, creatives, performance analytics, demographics, video analytics, budget pacing, period comparisons, conversions, Lead Gen Forms, audiences, and targeting facets. Built for B2B paid social teams.
      19
      4
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      An intelligent bridge between Claude and LinkedIn. This MCP server empowers Claude to act as your high-level career consultant, capable of auditing your profile, optimizing your identity, and managing your professional content with real-time API access.
      554 npm
      1
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      MCP server to manage Meta Ads (Facebook/Instagram) campaigns, ad sets, insights, and audiences from Claude Code using natural language.
      9
      4 npm
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server that connects AI assistants to LinkedIn's Ad Library API for searching advertisers' sponsored content, job postings, and influencer partnerships.
      MIT