linkedin-ads-mcp
This server lets you connect an MCP-compatible AI client (like Claude) to LinkedIn Ads for account management, performance analytics, audience insights, conversions, lead gen, and public Ad Library research.
Account & campaign management: list/inspect ad accounts, create/update/delete campaign groups and campaigns, manage creatives, upload images, and create inline ads.
Performance & analytics: get campaign/creative performance, compare date ranges, view daily trends, and track impressions, clicks, spend, CTR, conversions, and engagement.
Audience & demographics: analyze performance by job function, seniority, industry, company size, region/country; view reach and audience penetration; list saved audiences.
Conversions & lead gen: list conversion rules, track conversion performance and value, list lead gen forms, and measure form submissions and qualified leads.
Ad Library research: search public LinkedIn ads from any advertiser with filters like country, date range, targeting, and impression volume.
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:
Claude discovers our metadata at
/.well-known/oauth-protected-resourceand/.well-known/oauth-authorization-server.Claude registers itself via Dynamic Client Registration (
POST /oauth/register).Claude redirects the user to
/oauth/authorize. We delegate identification to LinkedIn OAuth.After LinkedIn login, we issue our own opaque bearer token to Claude — LinkedIn credentials never leave the server.
On each
/mcprequest 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_EMAILSto 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
Go to LinkedIn Developer Portal and create an app (or use an existing one).
Under Products, request:
Sign In with LinkedIn using OpenID Connect (gives
openid emailfor 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)
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)
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 valuesStep 3 — Mode A: Local STDIO
npm run auth # one-shot browser sign-in; saves token to ~/.linkedin-ads-mcp/tokens.json
npm run buildThen 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.
In Cloud Console, Firestore → Create database → Native mode, pick a region.
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_SECRETin Secret Manager and inject via--set-secretsrather 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/callbackConnect from Claude
Claude Teams (org owner adds it once for everyone):
Settings → Connectors → Add custom connector
URL:
https://YOUR-SERVICE-URL.run.app/mcpEach 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 |
| Yes | OAuth client ID from your LinkedIn app. |
| Yes | OAuth client secret from your LinkedIn app. |
| No | Override the LinkedIn callback URL. Defaults to |
| Mode B | Public URL of this service. Used for OAuth metadata and as the canonical resource URI tokens are bound to. |
| Mode B | GCP project hosting Firestore. |
| No | Comma-separated allow-list of LinkedIn-account emails. Empty = no restriction. |
| Mode A | Override the local token file path. Defaults to |
| Mode A | Inline JSON to seed local tokens (overrides the file). |
| No | HTTP port (default |
Available Tools
Account & Campaign Management
Tool | Description |
| List all accessible LinkedIn ad accounts |
| Account name, currency, status, and serving status |
| List campaigns for an account |
| List campaign groups |
| Manage campaign groups |
| Manage campaigns |
| Manage creatives |
| One-shot creative + campaign creation |
| Upload an image asset for use in creatives |
Performance & Analytics
Tool | Description |
| Impressions, clicks, cost, CTR, CPC, conversions per campaign |
| Performance metrics broken down by creative, including engagement and video metrics |
| Side-by-side comparison of two date ranges |
| Daily performance trend data |
Audience & Demographics
Tool | Description |
| Performance breakdown by demographic pivot (industry, seniority, function, etc.) |
| Reach and impression counts across an audience |
| List saved targeting audiences |
Conversions & Lead Gen
Tool | Description |
| All configured conversion actions |
| Conversion counts and value across campaigns |
| All Lead Gen forms on an account |
| One-click leads, form opens, qualified leads |
Ad Library (Public)
Tool | Description |
| 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 2026OAuth endpoint reference (Mode B)
For developers who want to verify the implementation or write their own MCP client.
Endpoint | Spec | Purpose |
| RFC 9728 | Advertises the canonical resource URI and authorization server. |
| RFC 8414 | Authorization server metadata. |
| RFC 7591 | Dynamic Client Registration. |
| OAuth 2.1 | Starts the auth code flow with PKCE; redirects to LinkedIn. |
| — | LinkedIn redirects here; we mint our authorization code and bounce back to the MCP client. |
| 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
stateparameter 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 toolscompare_performanceA
Compares performance between two time periods, campaigns, or campaign groups. Calculates percentage changes and highlights significant differences. Essential for reporting on performance trends.
| Name | Required | Description | Default |
|---|---|---|---|
| periodA | Yes | First period or entity set for comparison | |
| periodB | Yes | Second period or entity set for comparison | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| comparisonType | Yes | Type of comparison to make |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Campaign name | |
| type | No | Campaign type. Default: SPONSORED_UPDATES | |
| status | No | Initial status. Default: DRAFT | |
| endDate | No | End date in YYYY-MM-DD format | |
| costType | No | Cost/bid type. Default: CPM | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| startDate | No | Start date in YYYY-MM-DD format | |
| localeCountry | No | Target country code. Default: US | |
| objectiveType | Yes | Campaign objective type | |
| localeLanguage | No | Target language code. Default: en | |
| unitCostAmount | Yes | Bid amount per unit (e.g., "5.00") | |
| campaignGroupId | Yes | Campaign group ID to place this campaign under | |
| politicalIntent | No | Political advertising intent. Default: NOT_POLITICAL | |
| unitCostCurrency | No | Currency code. Default: USD | |
| creativeSelection | No | Creative rotation strategy. Default: OPTIMIZED | |
| dailyBudgetAmount | Yes | Daily budget amount (e.g., "50.00") | |
| targetingCriteria | Yes | Targeting criteria object with include/exclude conditions. Example: {"include":{"and":[{"or":{"urn:li:adTargetingFacet:locations":["urn:li:geo:103644278"]}}]}} | |
| totalBudgetAmount | No | Total/lifetime budget amount | |
| dailyBudgetCurrency | No | Currency code. Default: USD | |
| totalBudgetCurrency | No | Currency code. Default: USD | |
| offsiteDeliveryEnabled | No | Enable LinkedIn Audience Network delivery. Default: false | |
| audienceExpansionEnabled | No | Enable audience expansion. Default: false |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the campaign group (max 100 characters) | |
| status | No | Initial status. Default: DRAFT | |
| endDate | No | End date in YYYY-MM-DD format. Required if totalBudget is set | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| startDate | Yes | Start date in YYYY-MM-DD format | |
| objectiveType | No | Campaign group objective type. Immutable once set. All campaigns in the group inherit this objective. | |
| dailyBudgetAmount | No | Daily budget amount (only with DYNAMIC budget optimization) | |
| totalBudgetAmount | No | Total budget amount (e.g., "5000.00") | |
| dailyBudgetCurrency | No | Daily budget currency code | |
| totalBudgetCurrency | No | Budget currency code (e.g., "USD"). Must match account currency |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional name for the creative | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| campaignId | Yes | Campaign ID to create the creative under (numeric ID or full URN) | |
| leadgenFormId | No | Lead gen form ID (required for LEAD_GENERATION objective campaigns) | |
| intendedStatus | No | Initial status. Default: DRAFT | |
| contentReference | Yes | URN of the content to sponsor (e.g., urn:li:share:123 or urn:li:ugcPost:123) | |
| leadgenCallToActionLabel | No | Call to action label for lead gen campaigns |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for the creative (for internal reference in Campaign Manager) | |
| mediaId | No | URN 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. | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| campaignId | Yes | Campaign ID to create the ad under (numeric ID or full URN) | |
| commentary | Yes | The ad text/copy that appears as the post commentary | |
| mediaTitle | No | Title for the media (displayed as headline for videos) | |
| leadgenFormId | No | Lead gen form ID (required for LEAD_GENERATION objective campaigns) | |
| intendedStatus | No | Initial status. Default: DRAFT | |
| landingPageUrl | No | Landing page URL for the ad. Required for WEBSITE_VISIT and WEBSITE_CONVERSIONS campaign objectives. | |
| organizationId | Yes | Organization/company ID that will be the ad author (numeric ID or full URN like urn:li:organization:123) | |
| callToActionLabel | No | Call to action button label | |
| leadgenCallToActionLabel | No | Call to action label for lead gen form button |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | The LinkedIn Ad Account ID | |
| campaignId | Yes | The campaign ID to delete |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | The LinkedIn Ad Account ID | |
| campaignGroupId | Yes | The campaign group ID to delete |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | The LinkedIn Ad Account ID (numeric ID, not the URN) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Top N results to return (max 100). Default: 25 | |
| metric | No | Primary metric to sort by. Default: impressions | |
| endDate | No | End date in YYYY-MM-DD format. Default: today | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| startDate | Yes | Start date in YYYY-MM-DD format | |
| campaignIds | No | Filter by specific campaigns | |
| demographicType | Yes | The demographic dimension to analyze (MEMBER_COUNTRY and MEMBER_REGION are the newer versions) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | End date in YYYY-MM-DD format. Default: today | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| startDate | Yes | Start date in YYYY-MM-DD format (max 92 days range) | |
| campaignIds | No | Filter by specific campaigns | |
| campaignGroupIds | No | Filter by campaign groups |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status | |
| endDate | No | End date for performance (if included) | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| startDate | No | Start date for performance (if included) | |
| includePerformance | No | Include performance metrics. Default: true |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | End date in YYYY-MM-DD format. Default: today | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| startDate | Yes | Start date in YYYY-MM-DD format | |
| campaignIds | No | Specific campaign IDs to filter. If omitted, returns all campaigns. | |
| timeGranularity | No | Time granularity for the data. Default: ALL | |
| campaignGroupIds | No | Filter by campaign group IDs |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | End date in YYYY-MM-DD format. Default: today | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| startDate | Yes | Start date in YYYY-MM-DD format | |
| campaignIds | No | Filter by specific campaigns | |
| includePostView | No | Include view-through conversions. Default: true | |
| timeGranularity | No | Time granularity. Default: ALL |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | End date in YYYY-MM-DD format. Default: today | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| startDate | Yes | Start date in YYYY-MM-DD format | |
| campaignIds | No | Filter creatives by campaign IDs | |
| creativeIds | No | Specific creative IDs to fetch | |
| timeGranularity | No | Time granularity. Default: ALL | |
| includeVideoMetrics | No | Include video-specific metrics. Default: true |
TDQS
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.
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.
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.
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.
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.
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_daily_trendsB
Retrieves daily performance trends over a specified period. Returns time-series data for visualizing performance patterns, identifying anomalies, and understanding day-of-week effects.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | End date in YYYY-MM-DD format. Default: today | |
| metrics | No | Metrics to include. Default: impressions, clicks, costInUsd, conversions | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| startDate | Yes | Start date in YYYY-MM-DD format | |
| campaignIds | No | Filter by specific campaigns | |
| entityLevel | No | Level of aggregation. Default: ACCOUNT |
TDQS
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 that the tool returns time-series data, which is a basic behavioral trait, but it does not disclose potential pagination, rate limits, authentication requirements, or whether the operation is read-only. The description adds minimal behavioral context beyond the core functionality.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no extraneous words. The primary purpose is front-loaded in the first sentence, and the second sentence adds context about use cases. Every sentence earns its place, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has six parameters and no output schema, the description is adequate but not exhaustive. It explains the use cases but omits details about output format, pagination, or how parameters like metrics and entityLevel affect the results. The schema covers parameter descriptions, so the description only needs to add contextual value, which it does partially, but more could be said about the response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are documented in the schema itself. The description does not add any additional parameter-specific meaning; it only mentions the general purpose of returning time-series data. Since the schema fully covers parameters, the baseline of 3 is appropriate, but the description provides no extra value for parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves daily performance trends over a specified period and returns time-series data. It specifies the verb 'retrieves' and the resource 'daily performance trends', which distinguishes it from siblings like get_campaign_performance that may focus on aggregate or campaign-level data. However, it does not explicitly name alternative tools, so it stops 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for visualizing patterns, identifying anomalies, and understanding day-of-week effects, providing clear context on when to use it. However, it does not explicitly state when not to use it or mention alternatives such as compare_performance or get_campaign_performance, leaving some ambiguity about tool selection.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | End date in YYYY-MM-DD format. Default: today | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| startDate | Yes | Start date in YYYY-MM-DD format | |
| campaignIds | No | Filter by specific campaigns | |
| timeGranularity | No | Time granularity. Default: ALL |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by account type. | |
| status | No | Filter by account status. If not specified, returns all statuses. | |
| includeTest | No | Include test accounts. Default: false |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by campaign status. If omitted, returns all statuses. | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| campaignGroupIds | No | Filter by campaign group IDs (numeric IDs) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | The LinkedIn Ad Account ID | |
| enabledOnly | No | Only show enabled conversions. Default: false |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| includeQuestions | No | Include form questions. Default: true |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| audienceType | No | Filter by audience type |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New campaign name | |
| status | No | New status. Common transitions: DRAFT->ACTIVE, ACTIVE->PAUSED, PAUSED->ACTIVE, ACTIVE->ARCHIVED | |
| endDate | No | New end date as Unix timestamp in milliseconds | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| campaignId | Yes | The campaign ID to update | |
| unitCostAmount | No | New bid amount per unit | |
| unitCostCurrency | No | Bid currency code | |
| dailyBudgetAmount | No | New daily budget amount | |
| targetingCriteria | No | New targeting criteria object. Replaces existing targeting entirely. | |
| totalBudgetAmount | No | New total/lifetime budget amount | |
| dailyBudgetCurrency | No | Budget currency code | |
| totalBudgetCurrency | No | Budget currency code | |
| offsiteDeliveryEnabled | No | Enable/disable LinkedIn Audience Network | |
| optimizationTargetType | No | Optimization target type | |
| audienceExpansionEnabled | No | Enable/disable audience expansion |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name for the campaign group | |
| status | No | New status. ACTIVE->PAUSED, ACTIVE->ARCHIVED, DRAFT->ACTIVE are common transitions. | |
| endDate | No | New end date as Unix timestamp in milliseconds | |
| accountId | Yes | The LinkedIn Ad Account ID | |
| campaignGroupId | Yes | The campaign group ID to update | |
| totalBudgetAmount | No | New total budget amount | |
| totalBudgetCurrency | No | Budget currency code |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | The LinkedIn Ad Account ID | |
| creativeId | Yes | The creative ID (numeric ID or full URN) | |
| intendedStatus | Yes | New intended status for the creative |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Absolute path to the image file on the local filesystem | |
| accountId | No | Optional: LinkedIn Ad Account ID to register the image in the account media library | |
| assetName | No | Optional: Name for the asset in the media library (required if accountId is provided) | |
| organizationId | Yes | Owner 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
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.
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.
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.
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.
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.
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.
25 tool updates
v0.1.0- First observed
compare_performance - First observed
create_campaign - First observed
create_campaign_group - First observed
create_creative - First observed
create_inline_ad - First observed
delete_campaign - First observed
delete_campaign_group - First observed
get_account_details - First observed
get_audience_demographics - First observed
get_audience_reach - First observed
get_campaign_groups - First observed
get_campaign_performance - First observed
get_conversion_performance - First observed
get_creative_performance - First observed
get_daily_trends - First observed
get_lead_gen_performance - First observed
list_ad_accounts - First observed
list_campaigns - First observed
list_conversions - First observed
list_lead_forms - First observed
list_saved_audiences - First observed
update_campaign - First observed
update_campaign_group - First observed
update_creative_status - First observed
upload_image
TDQS
Scored across 25 tools
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.
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.
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.
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
Related MCP Connectors
Hosted MCP server for Google Ads and LinkedIn Ads analysis.
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
Google Ads MCP server — manage campaigns, keywords, and metrics.
LinkedIn Ads MCP server: 10 tools for campaigns, creatives, audiences, lead forms. Writes preview.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that connects Claude to the LinkedIn Ads API for natural-language control over campaign management, audience targeting, creative uploads, analytics, and account auditing.3712 npmMIT
- AlicenseNot gradedqualityCmaintenanceUnified 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
- AlicenseBqualityAmaintenanceA read-only MCP server for LinkedIn Ads that enables users to query ad accounts, campaigns, creatives, insights, and company intelligence via natural language.11MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for posting and managing LinkedIn content, supporting personal and company accounts. Deployed on Cloudflare Workers with token management via KV.-