LinkedIn Ads MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@LinkedIn Ads MCP Server run a full account audit"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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_basicprofileYour 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 startYou 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:
Creating a LinkedIn Developer App
Generating OAuth tokens
Linking your ad account
Configuring Claude Code / Claude Desktop
Token refresh for production use
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 toolsbulk_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
Scored across 37 tools
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.
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.
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.
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
Related MCP Connectors
Hosted MCP server for marketing agencies: connect Google Ads, GA4, Search Console, Meta, LinkedIn and more to Claude or ChatGPT. Pull reports and make changes via OAuth login, no setup.
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
A hosted LinkedIn MCP server for your own account. Paste one address into Claude, ChatGPT, Cursor or n8n to read your inbox, send messages and invitations, and search people. Free to start. Not made by LinkedIn.
Hosted MCP server for Google Ads and LinkedIn Ads analysis.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP 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.194-
- AlicenseNot gradedqualityDmaintenanceAn 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 npm1MIT
- AlicenseAqualityDmaintenanceMCP server to manage Meta Ads (Facebook/Instagram) campaigns, ad sets, insights, and audiences from Claude Code using natural language.94 npmMIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that connects AI assistants to LinkedIn's Ad Library API for searching advertisers' sponsored content, job postings, and influencer partnerships.MIT