LinkedIn Ads — Claude Code MCP server for campaign data
Pulls LinkedIn Ads structure and performance into your MCP client, and drafts campaigns only for accounts you name up front.
claude mcp add --env LINKEDIN_ADS_ACCESS_TOKEN=<LINKEDIN_ADS_ACCESS_TOKEN> --env LINKEDIN_ADS_REFRESH_TOKEN=<LINKEDIN_ADS_REFRESH_TOKEN> --env LINKEDIN_ADS_CLIENT_ID=<LINKEDIN_ADS_CLIENT_ID> --env LINKEDIN_ADS_CLIENT_SECRET=<LINKEDIN_ADS_CLIENT_SECRET> --env LINKEDIN_ADS_ACCOUNT_IDS=<LINKEDIN_ADS_ACCOUNT_IDS> --transport stdio linkedin-ads -- npx -y @getmcpads/linkedin-ads-mcp-serverWhat LinkedIn Ads does
Eighteen read tools cover the account list and its health, campaign groups, campaigns, creatives, single entities, setup checks, analytics and statistics, professional demographics, revenue attribution, delivery status, targeting lookup and the media library. The client talks to the LinkedIn Marketing API directly with credentials from your own LinkedIn app.
Writes stay hidden unless the environment sets LINKEDIN_ADS_ENABLE_WRITES=true. Those fifteen tools build draft groups, campaigns, text ads and video or image ads, edit and rename entities, duplicate or remove drafts, and handle signed multipart uploads. Every write returns a preview first; nothing changes until confirm is true, and delivery never starts from here. LINKEDIN_ADS_ACCOUNT_IDS is mandatory: one to 100 numeric IDs separated by commas, with anything else refused before a request goes out.
Node.js 22.23.4, 24.22.1, 26.12.1 or newer is required, and an older runtime triggers a warning on stderr. Six resources ship alongside the tools: manifest, metric catalog, pivots, reporting rules, targeting and recipes. npm run doctor lists which variables are present without printing their values.
What it helps with
- review how campaign groups and campaigns are laid out
- pull a statistics report for a date range
- inspect professional demographics behind the numbers
- prepare a draft campaign and its ads before review
- check ad media and delivery status
Example prompts for the agent
- List the campaigns in account
512345678with their current bids - Draft a campaign group for the spring launch and show me the preview
- Which job functions got the most impressions last month?
How to install LinkedIn Ads
Platform CLI
claude mcp add --env LINKEDIN_ADS_ACCESS_TOKEN=<LINKEDIN_ADS_ACCESS_TOKEN> --env LINKEDIN_ADS_REFRESH_TOKEN=<LINKEDIN_ADS_REFRESH_TOKEN> --env LINKEDIN_ADS_CLIENT_ID=<LINKEDIN_ADS_CLIENT_ID> --env LINKEDIN_ADS_CLIENT_SECRET=<LINKEDIN_ADS_CLIENT_SECRET> --env LINKEDIN_ADS_ACCOUNT_IDS=<LINKEDIN_ADS_ACCOUNT_IDS> --transport stdio linkedin-ads -- npx -y @getmcpads/linkedin-ads-mcp-serverReplace <…> with your own values. 4 more environment variables are in the server README
Platform CLI
codex mcp add linkedin-ads --env LINKEDIN_ADS_ACCESS_TOKEN=<LINKEDIN_ADS_ACCESS_TOKEN> --env LINKEDIN_ADS_REFRESH_TOKEN=<LINKEDIN_ADS_REFRESH_TOKEN> --env LINKEDIN_ADS_CLIENT_ID=<LINKEDIN_ADS_CLIENT_ID> --env LINKEDIN_ADS_CLIENT_SECRET=<LINKEDIN_ADS_CLIENT_SECRET> --env LINKEDIN_ADS_ACCOUNT_IDS=<LINKEDIN_ADS_ACCOUNT_IDS> -- npx -y @getmcpads/linkedin-ads-mcp-serverReplace <…> with your own values. 4 more environment variables are in the server README
Config file
{
"mcpServers": {
"linkedin-ads": {
"command": "npx",
"args": [
"-y",
"@getmcpads/linkedin-ads-mcp-server"
],
"env": {
"LINKEDIN_ADS_ACCESS_TOKEN": "<LINKEDIN_ADS_ACCESS_TOKEN>",
"LINKEDIN_ADS_REFRESH_TOKEN": "<LINKEDIN_ADS_REFRESH_TOKEN>",
"LINKEDIN_ADS_CLIENT_ID": "<LINKEDIN_ADS_CLIENT_ID>",
"LINKEDIN_ADS_CLIENT_SECRET": "<LINKEDIN_ADS_CLIENT_SECRET>",
"LINKEDIN_ADS_ACCOUNT_IDS": "<LINKEDIN_ADS_ACCOUNT_IDS>"
}
}
}
}Replace <…> with your own values. 4 more environment variables are in the server README
Config file
{
"servers": {
"linkedin-ads": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@getmcpads/linkedin-ads-mcp-server"
],
"env": {
"LINKEDIN_ADS_ACCESS_TOKEN": "<LINKEDIN_ADS_ACCESS_TOKEN>",
"LINKEDIN_ADS_REFRESH_TOKEN": "<LINKEDIN_ADS_REFRESH_TOKEN>",
"LINKEDIN_ADS_CLIENT_ID": "<LINKEDIN_ADS_CLIENT_ID>",
"LINKEDIN_ADS_CLIENT_SECRET": "<LINKEDIN_ADS_CLIENT_SECRET>",
"LINKEDIN_ADS_ACCOUNT_IDS": "<LINKEDIN_ADS_ACCOUNT_IDS>"
}
}
}
}Replace <…> with your own values. 4 more environment variables are in the server README
Platform CLI
gemini mcp add -e LINKEDIN_ADS_ACCESS_TOKEN=<LINKEDIN_ADS_ACCESS_TOKEN> -e LINKEDIN_ADS_REFRESH_TOKEN=<LINKEDIN_ADS_REFRESH_TOKEN> -e LINKEDIN_ADS_CLIENT_ID=<LINKEDIN_ADS_CLIENT_ID> -e LINKEDIN_ADS_CLIENT_SECRET=<LINKEDIN_ADS_CLIENT_SECRET> -e LINKEDIN_ADS_ACCOUNT_IDS=<LINKEDIN_ADS_ACCOUNT_IDS> linkedin-ads npx -y @getmcpads/linkedin-ads-mcp-serverReplace <…> with your own values. 4 more environment variables are in the server README
Step by step, with commands for each platform: How to add an MCP server to Claude Code, Codex, Cursor, VS Code, Gemini CLI and more
Questions about LinkedIn Ads
How do I install LinkedIn Ads in Claude Code?
Run `claude mcp add linkedin-ads -e LINKEDIN_ADS_ACCESS_TOKEN=<LINKEDIN_ADS_ACCESS_TOKEN> -e LINKEDIN_ADS_REFRESH_TOKEN=<LINKEDIN_ADS_REFRESH_TOKEN> -e LINKEDIN_ADS_CLIENT_SECRET=<LINKEDIN_ADS_CLIENT_SECRET> -e LINKEDIN_ADS_ACCOUNT_IDS=<LINKEDIN_ADS_ACCOUNT_IDS> -- npx -y @getmcpads/linkedin-ads-mcp-server`.
What does LinkedIn Ads do?
It exposes LinkedIn Ads accounts to your assistant for reading, and with writes switched on, for staging draft campaigns and ads that wait for confirmation.
Why are write tools missing after install?
They only load when LINKEDIN_ADS_ENABLE_WRITES is exactly true; the default is false. Setting LINKEDIN_ADS_SCOPES without rw_ads also makes writes refuse to run.