MCP server for the LinkedIn Marketing API. Read + write campaigns, analytics, and creatives from any MCP client.
Server has 10 tools with consistent naming (verb_noun pattern) and basic schemas. All tools have descriptions and input parameters are typed. However, descriptions are often terse (many under 100 chars), parameter descriptions lack detail about constraints/formats, output schemas are not formally documented, and error handling is minimal. No tool annotations (readOnlyHint/destructiveHint) despite clear risk stratification. Composition is sound, tools chain well via URN/ID returns, but descriptions don't guide LLM selection between similar tools (e.g., list_campaigns vs get_campaign_analytics).
Create a campaign under an existing campaign group. Defaults are demo-safe: DRAFT, $10/day, US/en TEXT_AD with WEBSITE_TRAFFIC objective, US-only targeting. Caller must supply `campaign_group_urn` (use create_campaign_group first). Status must match the parent group: DRAFT/DRAFT or ACTIVE+(PAUSED/ACTIVE).
Create a campaign group. Defaults to DRAFT (required precondition for creating DRAFT campaigns inside it). Minimum total_budget is $100 USD.
Account-level totals over the last N days (impressions, clicks, costInUsd, conversions).
Per-campaign metrics over the last N days, sorted by spend desc.
List user→role assignments on an ad account.
List every LinkedIn ad account the OAuth user has any role on. Returns: [{id, urn, name, type, status, currency, serving_statuses}]
Parameter descriptions lack constraint details. E.g., 'days' param has no min/max bounds, 'status' enum values not listed in description, 'currency' accepts any string without validation guidance.
Output schemas not formally documented. Tools return dicts with fields like 'id', 'urn', 'name', 'status' but no schema definition visible in docstrings. LLM must infer structure from code.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). Server clearly stratifies tools by risk (READ_ONLY vs WRITE) but does not expose this via MCP tool annotations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
List campaign groups on an ad account.
List all campaigns on an ad account (no metrics — use get_campaign_analytics).
List creatives on an ad account.
Update campaign status (DRAFT → PAUSED → ACTIVE, or reverse). Idempotent.
Minimal error handling. No recovery guidance in docstrings. E.g., create_campaign requires 'campaign_group_urn' but no description of how to obtain it or what error occurs if invalid.
List tools lack pagination. No limit/offset/cursor parameters visible. Returning all elements could exhaust context window on large accounts.