Skip to main content
Glama
dhawalshah

linkedin-ads-mcp

LinkedIn Ads MCP

A Model Context Protocol (MCP) server for LinkedIn Ads. Connect Claude (or any MCP-compatible AI client) directly to your LinkedIn ad accounts to query performance, manage campaigns, analyse audiences, and search the public Ad Library — all in natural language.

The server speaks the MCP authorization spec (2025-06-18), so it works as a remote connector anywhere Claude supports custom MCP servers — claude.ai (personal), Claude Desktop, and Claude Teams. Add one URL, click "Connect", sign in with LinkedIn, done. For a Teams plan, the org owner adds the URL once and each member individually authenticates on first use.

What you can do

Account & Campaign Management

  • List and inspect ad accounts

  • Create, update, and delete campaign groups and campaigns

  • Manage creatives and update their status

  • Upload images and create inline ads

Performance & Analytics

  • Get campaign and creative performance metrics

  • Compare performance across date ranges

  • View daily trends

  • Analyse audience demographics and reach

Conversions & Lead Gen

  • Track conversion performance

  • View lead gen form submissions and performance

Ad Library (Public)

  • Search any advertiser's public LinkedIn ads

  • Filter by country, date range, targeting categories, impression volume

  • Useful for competitive research and creative inspiration


Related MCP server: ads-mcp

How auth works

There are two modes. Pick one.

Mode A — Local STDIO (one user, no server)

Use this if you only want it on your own machine. npm run auth runs the LinkedIn OAuth flow once and stores your token in ~/.linkedin-ads-mcp/tokens.json. Claude Desktop launches the server as a subprocess. No Firestore, no Cloud Run, no public URL.

Mode B — Remote HTTP server (Claude Teams, claude.ai, multi-user)

The MCP server is also an OAuth 2.1 authorization server. When Claude connects:

  1. Claude discovers our metadata at /.well-known/oauth-protected-resource and /.well-known/oauth-authorization-server.

  2. Claude registers itself via Dynamic Client Registration (POST /oauth/register).

  3. Claude redirects the user to /oauth/authorize. We delegate identification to LinkedIn OAuth.

  4. After LinkedIn login, we issue our own opaque bearer token to Claude — LinkedIn credentials never leave the server.

  5. On each /mcp request Claude sends our bearer; we map it server-side to the right user's stored LinkedIn credentials and call the LinkedIn Marketing APIs.

A note on access control. LinkedIn returns whatever email the account was registered with — usually personal (gmail, hotmail, etc.) rather than work email. Domain-based restriction therefore isn't reliable. By default this MCP allows any LinkedIn user to connect; the security comes from LinkedIn's own permission model (each user only sees ad accounts their LinkedIn profile has access to). For tighter control, set ALLOWED_EMAILS to a comma-separated allow-list of LinkedIn-account emails.


Prerequisites

  • Node.js 18+

  • A LinkedIn Marketing Developer Platform-approved app

  • A Google Cloud project (Mode B only)


Step 1 — Create a LinkedIn Developer App

  1. Go to LinkedIn Developer Portal and create an app (or use an existing one).

  2. Under Products, request:

    • Sign In with LinkedIn using OpenID Connect (gives openid email for user identification)

    • Marketing Developer Platform (gives r_ads, r_ads_reporting, rw_ads, r_organization_social, w_organization_social — required for the ads tools; access requires LinkedIn approval)

  3. Under Auth → OAuth 2.0 settings → Authorized redirect URLs, add:

    • http://localhost:8080/oauth/callback (local dev)

    • https://YOUR-CLOUD-RUN-URL/oauth/callback (Mode B — add after deploy)

  4. Copy the Client ID and Client Secret — you'll need them in the env config below.


Step 2 — Install

git clone https://github.com/dhawalshah/linkedin-ads-mcp
cd linkedin-ads-mcp
npm install
cp .env.example .env       # fill in values

Step 3 — Mode A: Local STDIO

npm run auth     # one-shot browser sign-in; saves token to ~/.linkedin-ads-mcp/tokens.json
npm run build

Then add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "linkedin-ads": {
      "command": "node",
      "args": ["/absolute/path/to/linkedin-ads-mcp/dist/index.js"],
      "env": {
        "LINKEDIN_CLIENT_ID": "your_client_id",
        "LINKEDIN_CLIENT_SECRET": "your_client_secret"
      }
    }
  }
}

Restart Claude Desktop. You're done — skip the rest.


Step 3 — Mode B: Remote HTTP server (Claude Teams / claude.ai)

Enable Firestore

The server stores OAuth bearer tokens and per-user LinkedIn credentials in Firestore.

  1. In Cloud Console, Firestore → Create database → Native mode, pick a region.

  2. Grant the Cloud Run service account Cloud Datastore User role under IAM & Admin → IAM.

Deploy to Cloud Run

gcloud run deploy linkedin-ads-mcp \
  --source . \
  --region YOUR_REGION \
  --project YOUR_PROJECT_ID \
  --platform managed \
  --port 8080 \
  --allow-unauthenticated \
  --set-env-vars "GCP_PROJECT_ID=your-project-id,BASE_URL=https://YOUR-SERVICE-URL.run.app,LINKEDIN_CLIENT_ID=...,LINKEDIN_CLIENT_SECRET=..."

Recommended: store LINKEDIN_CLIENT_SECRET in Secret Manager and inject via --set-secrets rather than as a plain env var.

After it's up, go back to the LinkedIn Developer Portal and add the live callback URL:

https://YOUR-SERVICE-URL.run.app/oauth/callback

Connect from Claude

Claude Teams (org owner adds it once for everyone):

  • Settings → Connectors → Add custom connector

  • URL: https://YOUR-SERVICE-URL.run.app/mcp

  • Each member clicks Connect, signs in with LinkedIn, done.

claude.ai personal:

  • Settings → Connectors → Add custom connector

  • URL: https://YOUR-SERVICE-URL.run.app/mcp

Claude Desktop with a remote server:

{
  "mcpServers": {
    "linkedin-ads": {
      "url": "https://YOUR-SERVICE-URL.run.app/mcp"
    }
  }
}

Claude Desktop will run the OAuth dance the first time you use it.


Environment Variables

Variable

Required

Description

LINKEDIN_CLIENT_ID

Yes

OAuth client ID from your LinkedIn app.

LINKEDIN_CLIENT_SECRET

Yes

OAuth client secret from your LinkedIn app.

LINKEDIN_REDIRECT_URI

No

Override the LinkedIn callback URL. Defaults to ${BASE_URL}/oauth/callback.

BASE_URL

Mode B

Public URL of this service. Used for OAuth metadata and as the canonical resource URI tokens are bound to.

GCP_PROJECT_ID

Mode B

GCP project hosting Firestore.

ALLOWED_EMAILS

No

Comma-separated allow-list of LinkedIn-account emails. Empty = no restriction.

TOKEN_STORAGE_PATH

Mode A

Override the local token file path. Defaults to ~/.linkedin-ads-mcp/tokens.json.

LINKEDIN_TOKENS_JSON

Mode A

Inline JSON to seed local tokens (overrides the file).

PORT

No

HTTP port (default 8080).


Available Tools

Account & Campaign Management

Tool

Description

list_ad_accounts

List all accessible LinkedIn ad accounts

get_account_details

Account name, currency, status, and serving status

list_campaigns

List campaigns for an account

get_campaign_groups

List campaign groups

create_campaign_group / update_campaign_group / delete_campaign_group

Manage campaign groups

create_campaign / update_campaign / delete_campaign

Manage campaigns

create_creative / update_creative_status

Manage creatives

create_inline_ad

One-shot creative + campaign creation

upload_image

Upload an image asset for use in creatives

Performance & Analytics

Tool

Description

get_campaign_performance

Impressions, clicks, cost, CTR, CPC, conversions per campaign

get_creative_performance

Performance metrics broken down by creative, including engagement and video metrics

compare_performance

Side-by-side comparison of two date ranges

get_daily_trends

Daily performance trend data

Audience & Demographics

Tool

Description

get_audience_demographics

Performance breakdown by demographic pivot (industry, seniority, function, etc.)

get_audience_reach

Reach and impression counts across an audience

list_saved_audiences

List saved targeting audiences

Conversions & Lead Gen

Tool

Description

list_conversions

All configured conversion actions

get_conversion_performance

Conversion counts and value across campaigns

list_lead_forms

All Lead Gen forms on an account

get_lead_gen_performance

One-click leads, form opens, qualified leads

Ad Library (Public)

Tool

Description

search_ad_library

Search any advertiser's public LinkedIn ads with filters


Example Prompts

List my LinkedIn ad accounts

Show campaign performance for the last 30 days

Compare last week vs the week before for account 12345

Which industries are clicking most on campaign X?

What did my top creative drive in conversions last month?

Search the LinkedIn Ad Library for ads from Stripe in the US in 2026

OAuth endpoint reference (Mode B)

For developers who want to verify the implementation or write their own MCP client.

Endpoint

Spec

Purpose

GET /.well-known/oauth-protected-resource

RFC 9728

Advertises the canonical resource URI and authorization server.

GET /.well-known/oauth-authorization-server

RFC 8414

Authorization server metadata.

POST /oauth/register

RFC 7591

Dynamic Client Registration.

GET /oauth/authorize

OAuth 2.1

Starts the auth code flow with PKCE; redirects to LinkedIn.

GET /oauth/callback

—

LinkedIn redirects here; we mint our authorization code and bounce back to the MCP client.

POST /oauth/token

OAuth 2.1

Authorization code + refresh token grants.

A GET /mcp without a valid bearer returns 401 with a WWW-Authenticate: Bearer resource_metadata="…" header pointing at the protected-resource metadata document, which is how a standards-compliant MCP client discovers the rest.

PKCE caveat: LinkedIn's OAuth implementation does not support PKCE on the upstream side, so PKCE is only enforced on the Claude → us channel. The us → LinkedIn channel uses a state parameter for CSRF protection.


Tech Stack

  • TypeScript + Node 18+

  • @modelcontextprotocol/sdk — MCP server framework

  • Express — HTTP server

  • @google-cloud/firestore — per-user token storage and OAuth-server state (Mode B)

  • Google Cloud Run — Serverless hosting


About Dhawal Shah

I run a 40-plus person digital marketing agency out of Singapore, and I build the automation my own teams use. This server is one of those tools rather than a weekend project: it runs against live LinkedIn Ads accounts every week, which is why the read-only surface is wide and the write surface is deliberately narrow.

Fourteen years building companies across Asia behind it. 5,000+ campaigns, 400+ brands, 30+ startups advised, and 300+ training sessions for teams including Sony, Toyota, DHL and Interpol. I am also an Accredited Director with the Singapore Institute of Directors, which in practice means I get asked what breaks, who is accountable and what it costs before anyone asks what it can do.

I write up the routines and agents I actually run at dhawalshah.net.

Worth reading alongside this repo: Google Ads, Meta, LinkedIn & TikTok MCPs for Claude: Agency Setup Guide.


License

MIT

Available Tools

25 tools
compare_performanceA

Compares performance between two time periods, campaigns, or campaign groups. Calculates percentage changes and highlights significant differences. Essential for reporting on performance trends.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodAYesFirst period or entity set for comparison
periodBYesSecond period or entity set for comparison
accountIdYesThe LinkedIn Ad Account ID
comparisonTypeYesType of comparison to make

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral disclosure burden. It usefully discloses that the tool calculates percentage changes and highlights significant differences, but it does not mention read-only nature, required permissions, output shape, or how significance is determined.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, each contributing information: what it compares, what it calculates, and when it is useful. No filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, full schema coverage, and absence of annotations, the description covers the conceptual operation well. It gives enough of an output expectation through 'percentage changes' and 'significant differences,' though an explicit output shape would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds a high-level mapping between comparison scopes and the comparisonType enum, but it does not add details beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('compares') with a clear resource ('performance') and explicitly names the three comparison scopes: time periods, campaigns, or campaign groups. This makes it easy to distinguish from single-period performance getters like get_campaign_performance or get_creative_performance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Essential for reporting on performance trends' gives clear context for when to use the tool. However, it does not explicitly state when not to use it or point to alternative tools for single-period performance checks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_campaignB

Creates a new LinkedIn ad campaign within a campaign group. Requires targeting criteria, budget, and objective type.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCampaign name
typeNoCampaign type. Default: SPONSORED_UPDATES
statusNoInitial status. Default: DRAFT
endDateNoEnd date in YYYY-MM-DD format
costTypeNoCost/bid type. Default: CPM
accountIdYesThe LinkedIn Ad Account ID
startDateNoStart date in YYYY-MM-DD format
localeCountryNoTarget country code. Default: US
objectiveTypeYesCampaign objective type
localeLanguageNoTarget language code. Default: en
unitCostAmountYesBid amount per unit (e.g., "5.00")
campaignGroupIdYesCampaign group ID to place this campaign under
politicalIntentNoPolitical advertising intent. Default: NOT_POLITICAL
unitCostCurrencyNoCurrency code. Default: USD
creativeSelectionNoCreative rotation strategy. Default: OPTIMIZED
dailyBudgetAmountYesDaily budget amount (e.g., "50.00")
targetingCriteriaYesTargeting criteria object with include/exclude conditions. Example: {"include":{"and":[{"or":{"urn:li:adTargetingFacet:locations":["urn:li:geo:103644278"]}}]}}
totalBudgetAmountNoTotal/lifetime budget amount
dailyBudgetCurrencyNoCurrency code. Default: USD
totalBudgetCurrencyNoCurrency code. Default: USD
offsiteDeliveryEnabledNoEnable LinkedIn Audience Network delivery. Default: false
audienceExpansionEnabledNoEnable audience expansion. Default: false

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It clearly conveys that this is a create/mutation operation, but it does not mention cost implications, status defaults, failure/validation behavior, idempotency, authentication, or what the caller receives on success.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short, front-loaded sentence with no filler. The action, resource, scope, and key prerequisites are stated efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex mutation tool: 22 parameters, a nested targeting object, no output schema, and no annotations. A single sentence omits operational context such as expected return values, validation failures, billing/activation consequences, and workflow positioning relative to campaign groups and creatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter. The description only names three high-level requirement categories (targeting, budget, objective type), which adds no meaning beyond the formal required fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action (creates), a clear resource (LinkedIn ad campaign), and a precise context (within a campaign group), which differentiates it from create_campaign_group and update_campaign. It is immediately clear what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives prerequisites ('Requires targeting criteria, budget, and objective type') but no explicit guidance on when to choose this tool over siblings like update_campaign, create_campaign_group, or list_campaigns. No exclusions or alternative conditions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_campaign_groupA

Creates a new LinkedIn campaign group for organizing campaigns. Campaign groups manage status, budget, and performance across multiple related campaigns.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the campaign group (max 100 characters)
statusNoInitial status. Default: DRAFT
endDateNoEnd date in YYYY-MM-DD format. Required if totalBudget is set
accountIdYesThe LinkedIn Ad Account ID
startDateYesStart date in YYYY-MM-DD format
objectiveTypeNoCampaign group objective type. Immutable once set. All campaigns in the group inherit this objective.
dailyBudgetAmountNoDaily budget amount (only with DYNAMIC budget optimization)
totalBudgetAmountNoTotal budget amount (e.g., "5000.00")
dailyBudgetCurrencyNoDaily budget currency code
totalBudgetCurrencyNoBudget currency code (e.g., "USD"). Must match account currency

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility for behavioral disclosure. It states it creates a resource but does not disclose that the operation is a mutation, mentions no constraints like the immutability of objectiveType or the requirement for endDate when totalBudget is set, and lacks any side-effect or permission information. This is a significant gap for a create tool, deserving a 2.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no fluff. The primary action is front-loaded, and the second sentence provides useful context about campaign groups without repetition. It is efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create operation with 10 parameters, the description is minimal but workable because the schema carries full parameter documentation. It does not mention what the response contains or any workflow expectations, but this is not critical for a simple create operation. It adequately covers the basic 'what' but not deeper context like offline effects, making it a 3.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with detailed parameter descriptions already present. The description adds no additional parameter-level meaning beyond what the schema provides, so it meets the baseline of 3 but does not elevate it. It does not clarify relationships between parameters (e.g., mutual exclusivity of budgets) that would add value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Creates a new LinkedIn campaign group') and its purpose ('for organizing campaigns'). It is specific about the resource type and distinguishable from sibling tools like create_campaign, which creates an individual campaign. The additional sentence about managing status, budget, and performance further clarifies the group's role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates use for grouping campaigns, but it does not explicitly contrast with alternatives like create_campaign or provide when-not-to-use guidance. There is no mention of prerequisites (e.g., having an ad account) or exclusions. This is adequate but not explicit, earning a 3.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_creativeB

Creates a new LinkedIn creative/ad under a campaign. Requires a content reference (post/share URN) or will be created as a reference to existing content.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional name for the creative
accountIdYesThe LinkedIn Ad Account ID
campaignIdYesCampaign ID to create the creative under (numeric ID or full URN)
leadgenFormIdNoLead gen form ID (required for LEAD_GENERATION objective campaigns)
intendedStatusNoInitial status. Default: DRAFT
contentReferenceYesURN of the content to sponsor (e.g., urn:li:share:123 or urn:li:ugcPost:123)
leadgenCallToActionLabelNoCall to action label for lead gen campaigns

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden of behavioral disclosure. It clearly indicates a mutation ('Creates') and the reference-based nature, but it does not mention the default intended status, lead-gen dependencies, permissions, or what happens after creation. This adds little beyond what the schema already states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with the core action front-loaded. It is appropriately short, though the second clause is grammatically awkward and could be removed or rewritten for better clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a mutating tool with no annotations and no output schema. The description does not indicate return values, the default status behavior, or the lead-generation parameter dependenciescars. The schema fills in some gaps, but the overall definition is too thin for an agent to invoke it with full confidence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter descriptions already carry the semantic load. The description only adds the 'post/share URN' hint and does not clarify conditional requirements like leadgenFormId; the 'or will be created' clause is potentially confusing rather than informative.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Creates') and names the exact resource ('LinkedIn creative/ad under a campaign'), which distinguishes it from sibling tools like create_campaign and create_inline_ad. However, the phrase 'or will be created as a reference to existing content' is awkward and slightly obscures the clear statement of purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides placement context ('under a campaign') and a prerequisite ('Requires a content reference'), which implies the main use case of sponsoring existing LinkedIn content. However, it does not explicitly name alternatives such as create_inline_ad, nor does it state when this tool should NOT be used.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_inline_adA

Creates a new LinkedIn ad with inline content directly (without needing a pre-existing post). This creates the ad content (text, image/video, landing page, CTA) and the creative in a single call. Use this to create sponsored content ads from scratch.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName for the creative (for internal reference in Campaign Manager)
mediaIdNoURN of the image or video to use (e.g., urn:li:image:C5510AQE... or urn:li:video:C5510AQE...). Upload media first via LinkedIn's media upload APIs.
accountIdYesThe LinkedIn Ad Account ID
campaignIdYesCampaign ID to create the ad under (numeric ID or full URN)
commentaryYesThe ad text/copy that appears as the post commentary
mediaTitleNoTitle for the media (displayed as headline for videos)
leadgenFormIdNoLead gen form ID (required for LEAD_GENERATION objective campaigns)
intendedStatusNoInitial status. Default: DRAFT
landingPageUrlNoLanding page URL for the ad. Required for WEBSITE_VISIT and WEBSITE_CONVERSIONS campaign objectives.
organizationIdYesOrganization/company ID that will be the ad author (numeric ID or full URN like urn:li:organization:123)
callToActionLabelNoCall to action button label
leadgenCallToActionLabelNoCall to action label for lead gen form button

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states that this operation creates an ad and consolidates ad content and creative into a single call. This clearly signals a write operation and what is being created. No hidden behaviors or side effects are mentioned, but none are expected for a creation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no redundancy. The primary action and distinguishing feature are front-loaded, followed by a clear usage directive. Every sentence earns its place, and the description is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 12 parameters and no output schema, the description covers the essential context: what the tool does, when to use it, and its key differentiator. It does not explicitly state prerequisites like an existing campaign, but those are implied by the required parameters. Overall, the description provides sufficient context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 12 parameters are already documented in the schema. The description summarizes that it creates 'ad content (text, image/video, landing page, CTA),' which maps to several parameters but adds no new semantic meaning beyond the schema definitions. It neither detracts nor adds significant value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('creates'), a resource ('new LinkedIn ad with inline content'), and distinguishes it from the alternative of using a pre-existing post. It clearly identifies the tool's purpose as creating sponsored content ads from scratch, which differentiates it from siblings like create_creative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: 'Use this to create sponsored content ads from scratch.' It also implies the alternative by saying 'without needing a pre-existing post,' which signals that a different tool should be used when a post already exists. It does not name the specific sibling tool, but the guidance is clear enough for an agent to make the correct choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_campaignA

Deletes a LinkedIn campaign. Draft campaigns are deleted immediately. Non-draft campaigns are set to PENDING_DELETION status.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe LinkedIn Ad Account ID
campaignIdYesThe campaign ID to delete

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that drafts are deleted immediately while non-drafts enter PENDING_DELETION status, which is important and non-obvious. However, it does not mention side effects like irreversibility or cascading actions, but the core destructive behavior and its variation are clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the verb and resource, and includes the crucial behavioral nuance without any fluff. Every word contributes value, and the structure is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete tool with two fully documented parameters and no output schema, the description covers the essential behavioral outcomes (immediate deletion vs pending status). It does not omit any critical information an agent would need to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both accountId and campaignId are already documented in the input schema. The description adds no extra meaning to the parameters (e.g., format, source, or validation rules). This meets the baseline for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Deletes' and the resource 'LinkedIn campaign', and adds a specific behavioral distinction (draft vs non-draft). It is unambiguous and easily distinguishable from the sibling tool delete_campaign_group by name and description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives. It does not mention that delete_campaign_group should be used for campaign groups, nor does it state any preconditions or exclusions. The behavioral difference between drafts and non-drafts is useful but does not help an agent choose between this and other delete tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_campaign_groupA

Deletes a LinkedIn campaign group. Draft groups are deleted immediately. Non-draft groups are set to PENDING_DELETION status.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe LinkedIn Ad Account ID
campaignGroupIdYesThe campaign group ID to delete

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does well by revealing a non-obvious consequence: draft groups are deleted immediately, while non-draft groups only move to PENDING_DELETION status. It could go further by noting permissions or side effects on associated campaigns, but the core side-effect behavior is clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with no filler. The first sentence states the operation; the second provides the single most important behavioral caveat. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter delete operation with no output schema, the description is largely complete: it names the action and the differentiated deletion behavior. It would be more complete with a note about what happens to campaigns within the group or explicit permission expectations, but an agent has enough to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both accountId and campaignGroupId already documented in the input schema. The description adds no extra meaning, constraints, or relationships between parameters, so it stays at the baseline for fully covered schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Deletes') on a specific resource ('LinkedIn campaign group'), clearly distinguishing it from sibling tools like delete_campaign, create_campaign_group, and update_campaign_group. It is non-tautological and immediately tells an agent what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as update_campaign_group or delete_campaign. The draft/non-draft status explanation is useful behavioral context, but it does not help an agent choose among related tools or identify when not to use this one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_account_detailsA

Retrieves detailed information about a specific LinkedIn Ad Account including status, currency, notification settings, and linked organization.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe LinkedIn Ad Account ID (numeric ID, not the URN)

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry behavioral disclosure. It does convey a read-only retrieval action and the scope of returned data, which rules out mutation. It does not mention error handling, auth, or account-ownership restrictions, but for a simple getter the provided transparency is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-structured sentence front-loads the purpose and gives concrete examples of returned information. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only retrieval, the description covers the resource, the key returned fields, and the account ID. It could mention response shape or error conditions, but nothing essential is missing for a caller with an accountId.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents accountId at 100% coverage, including the useful note that it is a numeric ID, not a URN. The description adds no extra parameter-level meaning beyond referring to 'a specific' account, so the baseline score applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb ('Retrieves'), resource ('detailed information about a specific LinkedIn Ad Account'), and enumerates the kinds of data returned. It is unambiguous but does not explicitly distinguish itself from sibling list_ad_accounts or other get_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this over list_ad_accounts or when not to use it. The word 'specific' implies a caller already has an account ID, but the description leaves that inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_audience_demographicsB

Retrieves demographic breakdown of who saw or interacted with your ads. Shows performance segmented by job function, seniority, industry, company size, or geographic location. Essential for understanding if you're reaching your target audience. Note: Demographic data has a 12-24 hour delay.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoTop N results to return (max 100). Default: 25
metricNoPrimary metric to sort by. Default: impressions
endDateNoEnd date in YYYY-MM-DD format. Default: today
accountIdYesThe LinkedIn Ad Account ID
startDateYesStart date in YYYY-MM-DD format
campaignIdsNoFilter by specific campaigns
demographicTypeYesThe demographic dimension to analyze (MEMBER_COUNTRY and MEMBER_REGION are the newer versions)

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It does disclose the 12-24 hour data delay and implies a read-only operation via 'Retrieves' and 'Shows'. It omits return-format details and pagination behavior, but for a read-only analytics tool this is acceptable minimum transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core behavior. The data-delay note is relevant. The sentence 'Essential for understanding if you're reaching your target audience' is somewhat general, but it does communicate intended usage without bloating the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers core purpose, the relevant demographic dimensions, a usage rationale, and the latency caveat. However, there is no output schema, and the description does not mention the response envelope, default limits, or how sorting behaves, leaving a few gaps for an agent invoking this tool for the first time.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds plain-language context for demographic types (job function, seniority, industry, etc.), which maps to the demographicType enum, but does not materially extend the schema's meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Retrieves demographic breakdown of who saw or interacted with your ads' and names the segmentation dimensions. It is clear on its own, but it does not explicitly differentiate itself from the sibling tool get_audience_reach, which could overlap semantically.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a use case ('Essential for understanding if you're reaching your target audience') and a data-delay caveat. However, it gives no guidance on when to prefer this over get_audience_reach or other analytics tools, and no exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_audience_reachA

Shows unique member reach and native audience penetration for campaigns. Returns LinkedIn's native audiencePenetration metric (approximate unique members reached / total target audience size). Helps understand what percentage of your target audience you've reached. Note: Date range must be 92 days or less.

ParametersJSON Schema
NameRequiredDescriptionDefault
endDateNoEnd date in YYYY-MM-DD format. Default: today
accountIdYesThe LinkedIn Ad Account ID
startDateYesStart date in YYYY-MM-DD format (max 92 days range)
campaignIdsNoFilter by specific campaigns
campaignGroupIdsNoFilter by campaign groups

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses that the metric is approximate and explains the exact formula used (unique members reached / total target audience size). It also notes the date range limitation. It does not mention authentication requirements, response structure, or rate limits, but the read-only nature is implied by 'Shows'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences plus a note, front-loaded with the primary purpose. The metric formula adds specificity without excess, and the date-range note is essential. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Description explains the metric and its calculation, which helps interpret results. However, no output schema exists and the description does not specify the response structure beyond the metric name. It also doesn't mention default behavior when filters are omitted, so an agent might need to infer response format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are already documented. The description repeats the 92-day constraint already present in the schema but adds nothing about accountId, campaignIds, or campaignGroupIds. Baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Shows unique member reach and native audience penetration for campaigns.' This clearly distinguishes it from siblings like get_campaign_performance and get_audience_demographics by focusing on reach and penetration metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool – to understand what percentage of the target audience has been reached. It also notes a critical constraint (date range ≤ 92 days). However, it does not explicitly name alternative tools or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_campaign_groupsC

Lists all campaign groups for an account with their configuration and optionally aggregated performance. Campaign groups help organize campaigns and control budget at a higher level.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by status
endDateNoEnd date for performance (if included)
accountIdYesThe LinkedIn Ad Account ID
startDateNoStart date for performance (if included)
includePerformanceNoInclude performance metrics. Default: true

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It mentions 'optionally aggregated performance', which is a useful behavioral detail, but it doesn't disclose other important behaviors like that the operation is read-only, whether results are paginated, what the response format is, or any access requirements. For a list operation, more transparency is expected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, with the core action front-loaded in the first sentence. The second sentence adds useful context about campaign groups without being verbose. It's appropriately concise and well-structured, with no unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list operation with 5 parameters and no output schema, the description is adequate but lacks details such as pagination behavior, ordering, or which performance metrics are included when includePerformance is true. It also doesn't state whether the response contains all campaign groups or is limited. These gaps could affect agent expectations, though the core functionality is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 5 parameters have schema descriptions (100% coverage), so the baseline is 3. The description adds no extra meaning beyond the schema; it only reiterates that performance is optional, which is already stated in the includePerformance parameter description. No additional semantic value is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all campaign groups for an account, with a specific verb and resource. It also provides context on what campaign groups are (organize campaigns, control budget), which helps distinguish it from other list tools. However, it doesn't explicitly differentiate from siblings like list_campaigns or list_lead_forms, so it's clear but not perfectly distinctive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no explicit guidance on when to use this tool versus alternatives. It mentions campaign groups help organize campaigns, but doesn't state when to choose this over list_campaigns or performance-specific tools. There are no exclusions or alternative tool names, leaving the agent to infer usage from the purpose alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_campaign_performanceA

Retrieves performance metrics for campaigns within a specified date range. Returns key metrics like impressions, clicks, spend, CTR, conversions, audience penetration, and average dwell time. The primary tool for daily campaign monitoring and optimization decisions.

ParametersJSON Schema
NameRequiredDescriptionDefault
endDateNoEnd date in YYYY-MM-DD format. Default: today
accountIdYesThe LinkedIn Ad Account ID
startDateYesStart date in YYYY-MM-DD format
campaignIdsNoSpecific campaign IDs to filter. If omitted, returns all campaigns.
timeGranularityNoTime granularity for the data. Default: ALL
campaignGroupIdsNoFilter by campaign group IDs

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. 'Retrieves' and 'Returns' signal a read-only reporting operation with no side effects, and the description openly states the date-range scope and the kinds of metrics returned. It does not disclose potential quirks like pagination or data aggregation behavior, but for a read-only metrics tool the core behavior is well conveyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight sentences: the first states the operation, the second lists return metrics and the primary use case. Every sentence earns its place, and the key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is no output schema, listing the returned metrics is helpful for an agent to interpret results. The 6-parameter input schema is fully described, and the description covers the tool's core output and purpose. A fully complete description might also note return grouping or default date behavior, but the definition is adequate for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, so the parameters are already well-documented. The description adds general context about date ranges and metric types, but it does not add meaning beyond what the schema provides for individual parameters, such as campaignIds or timeGranularity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action and resource: 'Retrieves performance metrics for campaigns within a specified date range.' It also lists the key metrics returned, making the tool's function concrete. However, it does not explicitly contrast itself with closely related siblings like get_creative_performance or get_conversion_performance, so it falls just short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'The primary tool for daily campaign monitoring and optimization decisions' gives a clear context for when to choose it, indicating a routine monitoring scenario. It does not mention exclusions or explicitly name alternatives, so it provides context but not a full when-to-use vs. when-not-to-use comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_conversion_performanceA

Retrieves conversion metrics broken down by conversion type/action. Shows which conversions are being driven by which campaigns, with cost per conversion and conversion value.

ParametersJSON Schema
NameRequiredDescriptionDefault
endDateNoEnd date in YYYY-MM-DD format. Default: today
accountIdYesThe LinkedIn Ad Account ID
startDateYesStart date in YYYY-MM-DD format
campaignIdsNoFilter by specific campaigns
includePostViewNoInclude view-through conversions. Default: true
timeGranularityNoTime granularity. Default: ALL

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. While 'Retrieves' implies a read-only operation, it does not explicitly state that the tool is non-destructive or safe to call without side effects. It also does not disclose any permissions, rate limits, or limitations on data scope. The description does give some expectation of output (conversion type, campaign, cost, value) but lacks explicit behavioral caveats such as default time ranges or the meaning of includePostView.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no redundant words. The primary purpose is stated first, and the added detail about cost per conversion and conversion value is relevant and concise. It is efficiently structured and front-loaded, making it easy for an agent to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description should explain what the tool returns, which it does partially by mentioning conversion type, campaign attribution, cost per conversion, and conversion value. However, it omits details about defaults (e.g., includePostView default true, timeGranularity default ALL) and any filtering effects. For a tool with six parameters and no annotations, this is adequate but not fully complete, leaving some gaps for an agent to infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters. The description adds context by explaining that the tool breaks down conversions by type/action and attributes them to campaigns, which hints at the purpose of campaignIds and timeGranularity. However, it does not add specific meaning to individual parameters beyond what the schema states, so it does not elevate beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Retrieves') and a precise resource ('conversion metrics broken down by conversion type/action'). It further specifies that it shows which conversions are driven by which campaigns, including cost per conversion and conversion value. This clearly differentiates it from sibling tools like get_campaign_performance (which likely focuses on campaign-level metrics) and get_creative_performance (creative-level), making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for conversion-focused analysis but does not provide explicit guidance on when to choose this tool over alternatives such as get_lead_gen_performance or get_campaign_performance. There is no mention of when not to use it or any conditions that would select a sibling tool. The context is clear only by inference, not by explicit exclusions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_creative_performanceA

Retrieves performance metrics for individual ad creatives. Shows which specific ads are performing best, including engagement metrics (likes, comments, shares), video metrics, and average dwell time. Essential for creative optimization.

ParametersJSON Schema
NameRequiredDescriptionDefault
endDateNoEnd date in YYYY-MM-DD format. Default: today
accountIdYesThe LinkedIn Ad Account ID
startDateYesStart date in YYYY-MM-DD format
campaignIdsNoFilter creatives by campaign IDs
creativeIdsNoSpecific creative IDs to fetch
timeGranularityNoTime granularity. Default: ALL
includeVideoMetricsNoInclude video-specific metrics. Default: true

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It does clearly signal a read operation ('Retrieves') and lists the categories of data returned, but it does not disclose scoping behavior, defaults, or limitations such as what happens when no campaignIds/creativeIds are provided or whether results are sorted/aggregated. This is adequate but leaves gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with the core 'what' in the first sentence and metric detail in the second. The final sentence ('Essential for creative optimization') is slightly promotional but provides useful context and does not harm readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a 7-parameter tool with no output schema and no annotations, the description is serviceable but incomplete: it does not describe the response shape, time-series behavior, or default scoping when filters are omitted. The 100% schema coverage compensates for parameter meaning, but the lack of an output schema means more behavioral context would be valuable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already documents all seven parameters. The description adds context around output metrics (e.g., video metrics, dwell time) that hints at includeVideoMetrics, but it does not explain parameter syntax, defaults, or filtering semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Retrieves performance metrics for individual ad creatives.' It names concrete metric categories (engagement, video, dwell time) and the intended use, and the 'individual ad creatives' framing distinguishes it from sibling tools like get_campaign_performance, which operate at campaign level.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Essential for creative optimization' signals a use case but does not explicitly state when to choose this tool over siblings such as get_campaign_performance, compare_performance, or get_conversion_performance. There is no when-not guidance or mention of alternatives, so the agent has to infer the boundary from the tool name and the phrase 'individual ad creatives.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_lead_gen_performanceB

Retrieves lead generation form performance including form submissions, qualified leads, and cost per lead. Essential for B2B marketers running lead gen campaigns.

ParametersJSON Schema
NameRequiredDescriptionDefault
endDateNoEnd date in YYYY-MM-DD format. Default: today
accountIdYesThe LinkedIn Ad Account ID
startDateYesStart date in YYYY-MM-DD format
campaignIdsNoFilter by specific campaigns
timeGranularityNoTime granularity. Default: ALL

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the operation is a 'retrieval' (implying read-only), but gives no information about authentication requirements, rate limits, data freshness, pagination, or potential errors. The term 'performance' is vague and does not elaborate on what 'performance' encompasses beyond the three listed metrics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is concise and informative. The second sentence, 'Essential for B2B marketers running lead gen campaigns', adds no operational value and reads as marketing fluff. The description could be trimmed to a single sentence without loss of useful information, so it is not optimally concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description should explain what the tool returns. It lists three metrics ('form submissions, qualified leads, cost per lead'), which gives some idea, but it omits other plausible metrics like impressions, clicks, or conversion rates. It also does not clarify how parameters like timeGranularity or campaignIds affect the result, nor does it mention pagination or limits. The description is adequate for a basic call but leaves gaps for a thorough understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers all 5 parameters with clear descriptions, including enums and defaults. The description adds no parameter-specific guidance beyond what the schema already provides. It does mention the output metrics ('form submissions, qualified leads, cost per lead'), which indirectly clarifies the purpose of date filters, but this does not enhance parameter semantics. Baseline of 3 is appropriate given 100% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('retrieves'), a clear resource ('lead generation form performance'), and the key metrics returned. This distinguishes it from sibling tools like get_campaign_performance and get_creative_performance, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions it is 'essential for B2B marketers running lead gen campaigns', but this is promotional rather than actionable guidance. It does not explain when to choose this tool over siblings like get_campaign_performance or get_conversion_performance, nor does it mention any prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ad_accountsA

Lists all LinkedIn Ad Accounts accessible to the authenticated user. Returns account names, IDs, status, currency, and serving statuses. Use this to get an overview of all accounts or find a specific account ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by account type.
statusNoFilter by account status. If not specified, returns all statuses.
includeTestNoInclude test accounts. Default: false

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral transparency burden. It clearly indicates the operation is a read/list action and enumerates the returned fields, but it does not mention pagination, potential rate limits, or explicitly confirm that no data is modified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The core action and scope are front-loaded, followed by the returned fields and concrete use cases, so every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with no output schema and no annotations, the description covers the resource, return fields, and typical use cases well. It could be slightly more complete with an explicit note on pagination or read-only behavior, but nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are fully documented in the input schema with 100% coverage, so the schema already handles parameter semantics. The description adds no additional meaning about type, status, or includeTest beyond what the schema provides, matching the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Lists') and a clear resource ('LinkedIn Ad Accounts accessible to the authenticated user'), and states the returned fields. The 'all accounts' scope and the 'find a specific account ID' use case distinguish it from more targeted sibling tools like get_account_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: get an overview of all accounts or locate a specific account ID. It does not explicitly name alternatives or state when not to use the tool, but the intended scenarios are clear enough for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_campaignsA

Lists campaigns for a LinkedIn Ad Account. Unlike get_campaign_performance (which only returns campaigns with analytics data), this tool returns ALL campaigns including DRAFT and PAUSED campaigns with zero impressions. Supports filtering by campaign group and status.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by campaign status. If omitted, returns all statuses.
accountIdYesThe LinkedIn Ad Account ID
campaignGroupIdsNoFilter by campaign group IDs (numeric IDs)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It adds a meaningful guarantee beyond the schema: this tool returns ALL campaigns, including DRAFT and PAUSED campaigns with zero impressions, and supports filtering by group and status. It does not mention pagination or response shape, but for a read-only listing tool the disclosed behavior is solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler. The core purpose is front-loaded, the differentiating contrast is sharp, and the filtering capabilities are stated concisely in the final sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list tool with three params, full schema coverage, and no output schema, the description is nearly complete. It clearly scopes the result set and differentiates from the closest sibling. Minor omissions like pagination or default sorting are not critical for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are already documented in the schema. The description's mention of filtering by campaign group and status adds no format or semantic detail beyond what the schema already provides, warranting the baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb (Lists) with a clear resource (campaigns for a LinkedIn Ad Account) and immediately distinguishes itself from the sibling get_campaign_performance. It specifies exactly what this tool returns that the sibling does not, so an agent can tell them apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly contrasts this tool with get_campaign_performance, stating that get_campaign_performance only returns campaigns with analytics data while this tool returns ALL campaigns including DRAFT/PAUSED with zero impressions. It also mentions supported filters, giving clear context for when to choose this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_conversionsA

Lists all conversion tracking rules configured for an account. Shows conversion names, types, attribution windows, and enabled status.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe LinkedIn Ad Account ID
enabledOnlyNoOnly show enabled conversions. Default: false

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the burden of behavioral disclosure. 'Lists' clearly implies a read-only operation and the description names the returned fields, but it does not mention pagination, rate limits, authentication requirements, or whether the response includes unconfigured rules. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences deliver the core purpose and output contents with no filler. The primary action is front-loaded, and the second sentence adds useful detail without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter list tool with no output schema, the description covers what is listed and what fields are shown. It lacks explicit usage guidance and behavioral caveats, but the overall context is sufficient for an agent to call the tool correctly in most straightforward scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already fully documents accountId and enabledOnly. The description adds no parameter-specific meaning beyond the schema, which matches the baseline of 3 for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Lists all conversion tracking rules') and a clear resource ('configured for an account'), with the fields returned explicitly listed. This makes it easy to distinguish from siblings like get_conversion_performance, which is about performance metrics rather than rule configuration.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for retrieving conversion tracking rule configurations, but it does not explicitly state when to use it versus alternatives such as get_conversion_performance or list_lead_forms. There is no when-not guidance or mention of related tools, so usage context is only implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_lead_formsA

Lists all lead generation forms configured for an account with their questions and settings. Helps understand what forms are available and their configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by status
accountIdYesThe LinkedIn Ad Account ID
includeQuestionsNoInclude form questions. Default: true

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool lists forms, implying a read-only operation, but does not explicitly mention side effects, permission requirements, or any limits such as pagination or response size. The behavior is minimally disclosed but not richly contextualized.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences and front-loaded with the core action. The second sentence, 'Helps understand what forms are available and their configuration,' is slightly redundant with the first sentence but not wasteful. Overall it is concise and efficient with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete enough for a simple list operation. It specifies the scope (all lead forms for an account) and includes questions and settings. There is no output schema, but the description conveys the return concept. It does not mention pagination or potential large response sizes, but given the tool's simplicity and full parameter documentation, it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, meaning all three parameters (accountId, status, includeQuestions) have descriptions. The tool description adds no additional meaning beyond the schema, so the baseline score of 3 applies. It does not clarify parameter formats or provide extra context beyond what the schema already offers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists all lead generation forms configured for an account, including their questions and settings. The verb 'lists' combined with the specific resource 'lead generation forms' makes the purpose unambiguous and distinguishes it from sibling tools that handle campaigns, ad accounts, or creatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when one needs to understand available forms and their configuration, but it does not explicitly state when to use this tool versus alternatives or mention any exclusions. Since it is uniquely scoped to lead forms, an agent can infer its use, but explicit guidance on alternatives is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_saved_audiencesA

Lists saved/matched audiences available in the account for targeting. Shows audience names, sizes, and statuses to help plan campaign targeting.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by status
accountIdYesThe LinkedIn Ad Account ID
audienceTypeNoFilter by audience type

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It indicates a read operation ('Lists') but does not mention pagination, response format, rate limits, or any caveats about what audiences are returned. The description is minimal and adds little beyond the basic action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no redundant information. The primary action and purpose are front-loaded, and the additional detail about the output content is concise and useful. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description is adequate for a simple listing tool but omits details about response structure, pagination, or behavior when filters are applied. It covers the basics (what it lists and why) but could do more to inform an agent of edge cases or additional fields returned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description 'shows audience names, sizes, and statuses' implies output content but does not add meaning to the parameters themselves. The filters (status, audienceType) are already documented in the schema, and the description does not elaborate on how they affect results.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool lists saved/matched audiences in the account for targeting, and specifically mentions showing names, sizes, and statuses. This is a specific verb-resource pair that distinguishes it from sibling tools like get_audience_demographics or get_audience_reach.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context (used for planning campaign targeting) but does not explicitly mention when not to use it or name alternatives. It gives enough context for an agent to infer the intended use case, but lacks explicit exclusions or sibling comparisons.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_campaignA

Updates an existing LinkedIn campaign. Can change status (ACTIVE/PAUSED/ARCHIVED), budget, name, targeting, bid amount, and other settings. Uses partial update - only specified fields are changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew campaign name
statusNoNew status. Common transitions: DRAFT->ACTIVE, ACTIVE->PAUSED, PAUSED->ACTIVE, ACTIVE->ARCHIVED
endDateNoNew end date as Unix timestamp in milliseconds
accountIdYesThe LinkedIn Ad Account ID
campaignIdYesThe campaign ID to update
unitCostAmountNoNew bid amount per unit
unitCostCurrencyNoBid currency code
dailyBudgetAmountNoNew daily budget amount
targetingCriteriaNoNew targeting criteria object. Replaces existing targeting entirely.
totalBudgetAmountNoNew total/lifetime budget amount
dailyBudgetCurrencyNoBudget currency code
totalBudgetCurrencyNoBudget currency code
offsiteDeliveryEnabledNoEnable/disable LinkedIn Audience Network
optimizationTargetTypeNoOptimization target type
audienceExpansionEnabledNoEnable/disable audience expansion

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the key partial-update behavior, which is valuable. However, it does not mention permission requirements, idempotency, side effects on existing fields, or what the response looks like. For a mutation tool, this is a notable gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the primary purpose and the key partial-update semantics. No wasted words, and the most important information appears immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 15 parameters, no output schema, and no annotations, the description is minimal. It covers the core update behavior but omits prerequisites (e.g., required permissions), response format, error scenarios, and guidance on how to construct the targeting object. The schema compensates for parameter semantics, but the description does not fully support an agent in anticipating consequences.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter is individually documented. The description adds the conceptual 'partial update' behavior and groups fields into categories, but it does not provide additional syntax or format details beyond the schema. This aligns with the baseline of 3 when schema covers all parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates an existing LinkedIn campaign, enumerating specific fields (status, budget, name, targeting, bid amount) and contrasting with create/delete operations. It is unambiguous and distinct from sibling tools like create_campaign or update_campaign_group.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for existing campaigns via 'updates an existing' and 'partial update', but does not explicitly exclude alternatives or state when to use this over update_campaign_group. The context is clear enough for an agent to infer it is for campaigns, not groups, but exclusions are not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_campaign_groupA

Updates an existing LinkedIn campaign group. Can change status (ACTIVE/PAUSED/ARCHIVED/DRAFT), budget, name, or end date.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name for the campaign group
statusNoNew status. ACTIVE->PAUSED, ACTIVE->ARCHIVED, DRAFT->ACTIVE are common transitions.
endDateNoNew end date as Unix timestamp in milliseconds
accountIdYesThe LinkedIn Ad Account ID
campaignGroupIdYesThe campaign group ID to update
totalBudgetAmountNoNew total budget amount
totalBudgetCurrencyNoBudget currency code

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states what fields can be changed but doesn't disclose any side effects, such as whether updates are partial or full, whether changes are irreversible, permissions required, or any constraints on transition (though the schema mentions common transitions). This is a significant gap for a mutation tool with no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that states the primary purpose and lists the key changeable fields. It is front-loaded with the verb and resource, and every word adds value. There is no fluff or redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description should cover more context such as return values, error conditions, or prerequisites. It doesn't mention that accountId and campaignGroupId are required, nor does it explain what happens on success or failure. For a tool with 7 parameters and no annotations, this is insufficient context. The agent has to infer too much from the schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters have descriptions in the schema. The description adds a high-level summary by listing the changeable fields (status, budget, name, end date), which maps to the parameters but doesn't add new meaning beyond the schema. For example, it doesn't explain that totalBudgetAmount and totalBudgetCurrency must be used together, or that endDate is in milliseconds (the schema already says this). Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Updates' and the resource 'LinkedIn campaign group', and lists the specific fields that can be changed (status, budget, name, end date). This distinguishes it from sibling tools like 'create_campaign_group' and 'delete_campaign_group' without requiring the agent to inspect schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Updates an existing LinkedIn campaign group', which makes it clear that this tool is for modifying existing groups, not creating or deleting them. While it doesn't explicitly name alternative tools, the wording strongly implies the use case. It could be improved by explicitly saying 'use this instead of create_campaign_group when the group already exists', but the intent is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_creative_statusB

Updates the intended status of a LinkedIn creative/ad. Can activate, pause, or archive creatives.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe LinkedIn Ad Account ID
creativeIdYesThe creative ID (numeric ID or full URN)
intendedStatusYesNew intended status for the creative

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral disclosure burden. It says 'updates the intended status' but does not clarify whether this has immediate effects, requires specific permissions, or is reversible. It also doesn't explain side effects on related entities or how 'intended' differs from actual status. This leaves significant behavioral ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. It states the core function and gives concrete examples of the status transitions in a compact way.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity mutation tool with three fully documented parameters and no output schema, the description covers the essential intent. It doesn't mention return values or prerequisites, but the schema and enums cover the key calling details. It is adequate, though a note on permissions or side effects would push it higher.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds minimal extra meaning beyond the schema, merely restating that the tool can activate, pause, or archive, which mirrors the enum values. No additional context about the parameters (e.g., URN format, required account state) is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Updates'), a resource ('LinkedIn creative/ad'), and the scope ('intended status'). It also enumerates the supported operations (activate, pause, archive), which distinguish it from sibling tools like create_creative or update_campaign.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives. The description implies use for status changes, but it never names sibling tools, prerequisites, or conditions under which one status should be chosen over another. No 'when not to use' is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_imageA

Uploads an image file to LinkedIn for use in ads. Supports PNG, JPG, and GIF formats. Returns the image URN that can be used as the mediaId when creating inline ads. The image is uploaded in two steps: initialize upload (get URL + URN), then upload binary.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathYesAbsolute path to the image file on the local filesystem
accountIdNoOptional: LinkedIn Ad Account ID to register the image in the account media library
assetNameNoOptional: Name for the asset in the media library (required if accountId is provided)
organizationIdYesOwner of the image. Can be an organization URN (urn:li:organization:123) or a sponsored account URN (urn:li:sponsoredAccount:123). Use sponsoredAccount if you only have rw_ads permissions.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It adds meaningful context beyond the schema: supported image formats (PNG, JPG, GIF), the return value (image URN), and the critical two-step upload flow (initialize upload, then upload binary). This gives an agent a realistic model of how the operation behaves. It does not mention size limits or permission requirements, but the disclosed two-step behavior is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. It front-loads the core purpose, then covers format support, output usage, and the two-step process in a logical order. Every sentence contributes essential information for correct invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no output schema and no annotations, so the description must explain the return contract and operational behavior. It does: the image URN is returned for use as mediaId, and the upload is a two-step process. It does not mention failure modes, file size limits, or accountId/assetName implications, but those are either covered by the schema or less critical than the two-step flow and URN output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already has 100% description coverage for all four parameters, so the baseline is 3. The tool description adds context by explaining the output URN's role and the upload flow, but it does not add new meaning to individual parameters beyond what the schema already provides. This is acceptable given the schema's completeness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Uploads an image file to LinkedIn for use in ads.' It clearly explains the purpose and distinguishes this from sibling tools like create_inline_ad by specifying that this tool produces the image URN used as mediaId. The intended role in the ad-creation flow is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states when this tool is relevant: before creating inline ads, because it returns the image URN to use as mediaId. It does not explicitly name alternatives or state when not to use it, but the connection to inline ad creation provides clear contextual guidance along with the sibling tool create_inline_ad.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 25 tool updatesv0.1.0
    • First observedcompare_performance
    • First observedcreate_campaign
    • First observedcreate_campaign_group
    • First observedcreate_creative
    • First observedcreate_inline_ad
    • First observeddelete_campaign
    • First observeddelete_campaign_group
    • First observedget_account_details
    • First observedget_audience_demographics
    • First observedget_audience_reach
    • First observedget_campaign_groups
    • First observedget_campaign_performance
    • First observedget_conversion_performance
    • First observedget_creative_performance
    • First observedget_daily_trends
    • First observedget_lead_gen_performance
    • First observedlist_ad_accounts
    • First observedlist_campaigns
    • First observedlist_conversions
    • First observedlist_lead_forms
    • First observedlist_saved_audiences
    • First observedupdate_campaign
    • First observedupdate_campaign_group
    • First observedupdate_creative_status
    • First observedupload_image

TDQS

B3.4/5.0

Scored across 25 tools

Disambiguation4/5

Most tools target clearly distinct resources and actions—accounts, campaigns, campaign groups, creatives, audiences, conversions, lead forms, and analytics. The main possible confusion is between create_creative and create_inline_ad, but the descriptions clarify that one references existing content while the other creates content inline; list_campaigns and get_campaign_performance are also explicitly differentiated.

Naming Consistency4/5

Tool names generally follow a consistent snake_case verb_noun pattern with clear verbs like list, get, create, update, delete, compare, and upload. Minor inconsistencies exist, notably get_campaign_groups is a listing operation while parallel resources use list_, and get_daily_trends/compare_performance use metric-style names rather than resource-object names.

Tool Count3/5

At 25 tools, the surface is on the heavy side for an MCP server. Most tools serve a distinct aspect of LinkedIn ads management, but the number of separate performance/analytics tools and creative-creation variants pushes it into the borderline heavy range.

Completeness3/5

The server covers the core campaign and creative lifecycle plus performance analytics well, but notable gaps remain: there is no list/get creatives tool, no video upload despite inline ad support mentioning video, and no create/update for lead forms, conversions, or audiences. These gaps require external workarounds for some common workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Unified MCP server for managing Meta Ads, LinkedIn Ads, Google Ads, GA4, and Search Console with 89 read/write tools, multi-account support, OAuth setup, and safe dry-run mutations.
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    A read-only MCP server for LinkedIn Ads that enables users to query ad accounts, campaigns, creatives, insights, and company intelligence via natural language.
    11
    MIT