Config is the same across clients — only the file and path differ.
{
"mcpServers": {
"linkedin-ads": {
"url": "http://localhost:3001",
"type": "http"
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
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.
Run this in your terminal to verify the server starts. Then let us know if it worked — your result helps other developers.
npx -y 'mcp-linkedin-ads' 2>&1 | head -1 && echo "✓ Server started successfully"
After testing, let us know if it worked:
Five weighted categories — click any category to see the underlying evidence.
No known CVEs.
Checked mcp-linkedin-ads against OSV.dev.
Be the first to review
Have you used this server?
Share your experience — it helps other developers decide.
Sign in to write a review.
Others in marketing
DataForSEO API modelcontextprotocol server
Salesforce CRM integration — opportunities, accounts, SOQL, file downloads, analytics
MCP server for Google News and Google Trends
MCP server for Mindbox CDP API — customer profiles, orders, segments. 3 tools.
MCP Security Weekly
Get CVE alerts and security updates for io.github.mharnett/linkedin-ads and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
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)npm install mcp-linkedin-ads
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:
cp config.example.json config.json
Fill in your credentials:
{
"oauth": {
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
},
"clients": {
"default": {
"account_id": "YOUR_AD_ACCOUNT_ID",
"name": "My Account"
}
}
}
Set environment variables (recommended for production):
export LINKEDIN_ADS_CLIENT_ID="your_client_id"
export LINKEDIN_ADS_CLIENT_SECRET="your_client_secret"
export LINKEDIN_ADS_ACCESS_TOKEN="your_access_token"
| 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.
npm start
Add to ~/.claude.json:
{
"mcpServers": {
"linkedin-ads": {
"type": "http",
"url": "http://localhost:3001"
}
}
}
Claude Desktop: Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows).
// Get client context
linkedin_ads_get_client_context(
... [View full README on GitHub](https://github.com/mharnett/mcp-linkedin-ads#readme)