LinkedIn Ads MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@LinkedIn Ads MCP Servershow last month's campaign performance for account 512345678"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LinkedIn Ads MCP server
Bring your LinkedIn Ads accounts into your MCP client.
Read campaign structure, performance and professional demographics, and prepare draft campaigns and ads for explicitly selected accounts.
Watch the film · What's new · Install · Tool reference · Try hosted getmcpads

The film shows hosted getmcpads with sample data. Its MCP Apps, from creative galleries and alerts to Google Sheets exports and bulk launches, belong to the hosted product. This repository provides the standalone native API tools.
18 read tools · 15 write tools, disabled by default.
Run locally with your own LinkedIn app credentials and a client that supports stdio MCP, such as Claude Desktop, Claude Code or Cursor. Your requests go directly to the LinkedIn Marketing API. For managed connections, including supported ChatGPT setups, use the hosted option.
What's new
v1.0.0: First standalone release · October 23, 2026
First standalone release, ported from the native LinkedIn Ads tools of the getmcpads gateway at revision
3e1c2c8.18 read tools: account discovery and health check, account details, campaign groups, campaigns, creatives, single entities, setup requirements, analytics and statistics reports, professional demographics, revenue attribution, offline query validation, delivery status, targeting lookup, the media library and the media used by ads.
15 write tools, exposed only with
LINKEDIN_ADS_ENABLE_WRITES=true: DRAFT campaign groups, campaigns, text ads and sponsored image or video ads, entity edits, four rename tools, ad duplication, draft deletion, signed multipart uploads and media library updates. Every write previews unlessconfirmis true, and none activates delivery.6 resources: manifest, metric catalog, pivots, reporting rules, targeting and recipes.
Require
LINKEDIN_ADS_ACCOUNT_IDSand refuse every other account before any request. Verify child filters and parent entities against the account.Contact only the LinkedIn API, token and upload endpoints, declared in
src/core/http.ts, never follow a redirect, bound every response and redact tokens from results and errors. Renew the access token in memory when refresh credentials are set.Require Node.js 22.23.4, 24.22.1, 26.12.1 or newer, and warn on stderr at startup on an older release. CI covers Node 22, 24 and 26.
Publish from a version tag with
release.yml: npm with provenance, the GitHub release, then the MCP Registry.
Source synchronization: SOURCE_SYNC.md.
Upgrade notes
Requires Node.js 22.23.4, 24.22.1, 26.12.1 or a newer release. These carry the October 2026 security fixes, and the server prints a warning on stderr when it runs on an older one. CI covers Node 22, 24 and 26.
This is the first release. Hosted creative galleries, campaign launches and MCP Apps UI are outside it.
Related MCP server: LinkedIn Ads MCP Toolkit
Install this release
This is a GitHub source release. npm and MCP Registry versions are published separately. The commands below select this exact version; unpinned npx examples later in this document select the version currently available on npm.
git clone --branch v1.0.0 --depth 1 https://github.com/get-mcp-ads/linkedin-ads-mcp-server.git
cd linkedin-ads-mcp-server
npm ci
npm run buildConfigure your MCP client to run node with the absolute path to dist/cli.js and the variables documented below. Once the package is on npm, the client can run npx -y @getmcpads/linkedin-ads-mcp-server instead, which starts the linkedin-ads-mcp binary.
{
"mcpServers": {
"linkedin-ads": {
"command": "node",
"args": ["/absolute/path/to/linkedin-ads-mcp-server/dist/cli.js"],
"env": {
"LINKEDIN_ADS_ACCESS_TOKEN": "your-member-access-token",
"LINKEDIN_ADS_ACCOUNT_IDS": "512345678"
}
}
}
}npm run doctor reports which variables are set, never their values, and checks the Node.js release.
Prefer a managed connection? Use LinkedIn Ads with hosted getmcpads. Connect your account, select the data your assistant may access and use the hosted MCP connection. See the site for current features and plans.
Configuration
Provide these environment variables through the client's secret configuration:
Variable | Purpose |
| Member access token from your own LinkedIn app. Required unless the three refresh variables are set. |
| Programmatic refresh token, for apps LinkedIn approved for them. The access token is then renewed in memory. |
| Client ID of your app. Used with the refresh token. |
| Client secret of your app. Used with the refresh token. |
| Required. 1 to 100 comma-separated numeric ad account IDs. Every other account is refused before any request, reads included. |
| Optional. Scopes actually granted to the token. When set, writes refuse to run without |
| Defaults to |
|
|
|
|
The server validates the configuration at startup and names the variable to fix. It runs no OAuth browser flow and writes nothing to disk: a token renewed through the refresh token stays in memory until the process ends.
What your LinkedIn app needs
LinkedIn Marketing API access is granted per application, so this server runs with an app you own. LinkedIn's quick start describes the steps:
Create a LinkedIn Page, then a developer application in the LinkedIn Developer Portal.
Request the Advertising API product from the app's Products tab and complete the access form. LinkedIn reviews each request.
Every application starts on the Development tier: reads have no account limit, and edits are limited to five ad accounts you administer. On this tier, add each ad account ID under Products, View Ad Accounts. The Standard tier removes the edit limit and is requested through the Developer Support Portal. See access tiers.
Generate a member access token with the Token Generator, or your own authorization code flow, with the scopes below. Access tokens last 60 days. Apps approved for programmatic refresh tokens receive a refresh token valid for a year, which this server can use.
Scopes used by the tools of this server:
Scope | Needed for |
| Account, campaign group, campaign, creative and media library reads, and targeting lookup. |
|
|
|
|
| Every write tool. |
|
|
LinkedIn roles still decide what the token can do. A VIEWER on an ad account can only read, even with rw_ads; writes need ACCOUNT_BILLING_ADMIN, ACCOUNT_MANAGER, CAMPAIGN_MANAGER or CREATIVE_MANAGER (account roles). Media uploads and sponsored image or video ads belong to the Company Page referenced by the ad account, which needs an administrator or sponsored content poster role on that Page. linkedin_health_check lists the configured accounts the token reaches and the ones it does not.
Safety and coverage
Writes preview by default. Review the exact account, target and parameters before repeating the call with confirm: true.
Campaign groups, campaigns and ads are created as DRAFT, and sponsored posts use feedDistribution: NONE, so nothing reaches the organic feed. New campaigns keep audience expansion and the LinkedIn Audience Network off. No tool activates delivery: activation, where spend starts, happens in Campaign Manager. A preview flags an edit of budget, bid, schedule or targeting, which can change what an already running campaign spends.
Do not retry a write automatically when its result is uncertain. A failed write reports verify_before_retry when a mutation reached LinkedIn and not_applied when none did. This server never retries a mutation; reads retry a network error, HTTP 429 or a 5xx at most twice.
Account checks apply before every request. Campaign, group and creative filters are verified against the account before a report, and every write re-reads its account and parent entities. Unknown arguments are rejected.
Requests go only to api.linkedin.com, the token endpoint and the signed upload URLs on www.linkedin.com, without following redirects, with timeouts and bounded responses. Upload URLs travel inside HMAC-signed receipts that end with the process, and the upload request carries no token. Tokens and secrets are redacted from every result and error.
Budgets and bids are decimal strings in the account currency, such as "20.00" with "EUR", not micros or cents. A report needs at least one entity scope, accepts at most 20 fields and is capped at 15,000 rows; the server applies these limits before the call and says when LinkedIn drops a field instead of returning zero.
This server exposes the native LinkedIn tools of the hosted gateway, plus account discovery, a health check and offline query validation. Audience size estimates, bid and supply forecasts, matched audiences, conversion rules, lead form definitions, experiments, Page statistics and generic endpoint reads are not included in this release. Submitted lead data is never exposed.
Use tools/list or server-card.json for exact schemas and the Marketing API documentation for provider details.
Hosted option
getmcpads for LinkedIn Ads manages the hosted connection and account selection. Hosted and source releases can differ. Contact: hello@getmcpads.com.
Development
npm run typecheck
npm run lint
npm run build
npm test
npm run catalogAll tests run offline with mocked fetch responses. No live account is read or changed.
Tools
Every tool is listed below. See server-card.json for complete parameter and output schemas. Every tool except linkedin_list_ad_accounts, linkedin_health_check and linkedin_validate_query takes a configured adAccountId.
Tool | Purpose |
| Check the token, the configured accounts it reaches, the reporting endpoint and the API version, without returning the token |
| List the configured ad accounts the member can reach, with currency, status and serving status |
| Read one ad account in full, with the members who hold a role on it |
| List campaign groups with budget, schedule and serving status |
| List campaigns with status, objective, format, bid, budget and schedule, optionally with targeting |
| List creatives with intended status, review verdict and serving hold reasons |
| Read one campaign group, campaign or creative and verify account ownership |
| Read the account, supported formats and native write requirements before preparing changes |
| Run a report grouped by one pivot, with computed ratios |
| Run a report grouped by up to three pivots at once |
| Break delivery down by professional demographics, with names resolved and the limits stated |
| Read CRM pipeline and closed won revenue attributed to LinkedIn advertising |
| Check a pivot and metric combination against the reporting rules, without a request |
| Explain why ads are or are not serving, from the account down to the creative |
| Look up native targeting URNs, such as countries or job titles, by name |
| List the account image or video library with download URLs and processing status |
| Refresh one image or video URL and verify its library association |
| List the images and videos used by ads, with the actual ad names and landing pages |
Disabled by default. Calls preview unless explicitly confirmed. Check the configuration and exact schema before use.
Tool | Purpose |
| Create a DRAFT campaign group |
| Create a DRAFT text ad or sponsored content campaign with budget, bid, targeting and schedule |
| Create a DRAFT text ad with an image from the account library |
| Create a DRAFT sponsored image or video ad on a dark post |
| Rename, pause or archive, or edit budget, bid, schedule, targeting or text ad content |
| Rename a campaign group, and nothing else |
| Rename a campaign, and nothing else |
| Rename an ad (creative), and nothing else |
| Rename the ad account, and nothing else |
| Copy an ad into a verified campaign as DRAFT |
| Delete one DRAFT ad, without touching its post or media |
| Start an image or video upload to the account library and return a signed receipt |
| Upload one part of the file to LinkedIn's signed upload URL |
| Finalize a video once every part is uploaded |
| Rename or archive a library image or video |
Resource | Content |
| Configured accounts, API version, entity hierarchy and safety rules |
| The metric catalog, with formulas of computed ratios and the pivots each metric is unavailable with |
| Pivots and the finder that serves each one |
| Scoping, row cap, retention, freshness, demographic limits and throttling |
| Shape of the targeting criteria, lookup and audience limits |
| Tool sequences for common questions |
License
Apache License 2.0. See NOTICE.
More from getmcpads
Meta Ads · Google Ads · Google Analytics 4 · Google Search Console · TikTok Ads · Pinterest Ads · X Ads
Maintained by Emmanuel at getmcpads. Questions: hello@getmcpads.com.
Available Tools
18 toolslinkedin_find_targetinglinkedin find targetingBRead-onlyIdempotent
Look up native targeting URNs such as countries by name.
| Name | Required | Description | Default |
|---|---|---|---|
| facet | No | Native targeting facet URN; defaults to location targeting. | urn:li:adTargetingFacet:locations |
| query | Yes | Search text used by the native targeting lookup. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds only that lookups are name-based and return URNs; it doesn't disclose whether results are account-scoped, what happens when no match exists, or that the facet governs the returned namespace.
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 front-loaded sentence with no filler. It stays terse enough to be efficient, though it leans toward under-specification rather than crisp conciseness.
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?
An output schema exists, so return-value shape needn't be explained, and annotations cover safety. Still, for a three-parameter resolver the description omits what facets are usable, whether the query matches prefixes or exact names, and how the adAccountId scopes results — gaps an agent would want covered.
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 (facet, query, adAccountId) is already fully documented including defaults and patterns. The description adds nothing beyond the schema; baseline 3 applies since the schema carries the parameter burden.
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?
Specific verb + resource: 'look up' + 'native targeting URNs', with a concrete example ('countries by name') that clarifies the name-to-URN resolution behavior. It does not differentiate from siblings (e.g., linkedin_validate_query or linkedin_get_entity, which could plausibly overlap), but the purpose itself is 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?
Usage is implied rather than stated: an agent can infer this is the step for resolving human-readable targeting names before attaching them to campaigns, but the description names no alternatives, prerequisites, or when-not-to-use conditions. Given ~17 siblings with potentially overlapping lookup roles, explicit routing guidance would help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_account_detailslinkedin get account detailsARead-onlyIdempotent
Read one LinkedIn ad account in full, with the members who hold a role on it. Roles decide what the connection can do, so a read that fails on one account and works on another is usually a role, not a scope.
| Name | Required | Description | Default |
|---|---|---|---|
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. | |
| includeUsers | No | Also list the account users and their roles. On by default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, openWorld. The description adds real behavioral context beyond that: the account read includes role-holding members and that role assignment governs what the connection can do on each account. It does not mention pagination or response shape, but the output schema exists to cover returns.
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 core action and scope. The second sentence is slightly diagnostic but earns its place by warning about role-driven failures; nothing is wasteful.
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 rich annotations, a fully documented two-parameter schema, and an output schema, the description only needs to add purpose and behavioral nuance. It does so adequately, leaving only minor gaps around explicit alternatives.
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% and both parameters are fully documented, so the baseline is 3. The description's mention of 'the members who hold a role on it' loosely maps to the includeUsers parameter but adds no syntax, default, or format detail 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?
States a specific verb (read) and resource (one LinkedIn ad account) with the scope 'in full, with the members who hold a role on it', which clearly distinguishes it from the plural linkedin_list_ad_accounts. Sibling differentiation is implied by 'one' and 'in full' rather than explicitly naming an alternative.
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 second sentence gives useful diagnostic context for interpreting failures ('a read that fails on one account and works on another is usually a role, not a scope'), which implies when this tool is appropriate. However it never states explicit when-to-use conditions or names alternatives like linkedin_get_entity or linkedin_list_ad_accounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_campaign_groupslinkedin get campaign groupsARead-onlyIdempotent
List campaign groups in a LinkedIn ad account, with budget, schedule and serving status. On LinkedIn the campaign group is where a shared budget and a bid strategy live, so it is the level that explains why sibling campaigns stopped together.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Exact campaign group names to match. | |
| status | No | Keep only campaign groups in these native statuses. | |
| pageSize | No | Maximum items in this page, 1 to 100. Defaults to 100. | |
| pageToken | No | Opaque nextPageToken from the preceding response; omit for the first page. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds that results carry budget, schedule and serving status and explains the LinkedIn hierarchy semantics, though it says nothing about pagination behavior beyond what the schema's pageToken field already conveys.
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 action and scope; the second sentence earns its place by supplying domain context that aids tool selection, though it is the kind of background that could be trimmed for a terse agent.
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?
Annotations cover the safety profile and an output schema exists so return values need not be described; with all five parameters documented in the schema, the definition is sufficient for correct invocation, missing only explicit sibling routing.
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 name, status, pageSize, pageToken and adAccountId each documented in the schema. The description adds no parameter-level detail (e.g., how name matching or status filtering behaves), so the baseline 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?
States a specific verb (List) and resource (campaign groups) scoped to a LinkedIn ad account, and the second sentence explains the level's role (shared budget and bid strategy), which distinguishes it from the sibling linkedin_get_campaigns tool without the agent needing to open either schema.
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 'it is the level that explains why sibling campaigns stopped together' implies when this tool is useful (diagnosing group-level causes), but it never states explicit when-to-use conditions, prerequisites, or an alternative such as linkedin_get_campaigns for campaign-level data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_campaignslinkedin get campaignsBRead-onlyIdempotent
List campaigns in a LinkedIn ad account with status, objective, format, bid strategy, budget and schedule. On LinkedIn the campaign holds the targeting and the bid, and the creatives under it are the ads.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Exact campaign names to match. | |
| type | No | Keep only these campaign formats, such as TEXT_AD or SPONSORED_UPDATES. | |
| status | No | Keep only campaigns in these native statuses. | |
| pageSize | No | Maximum items in this page, 1 to 100. Defaults to 100. | |
| pageToken | No | Opaque nextPageToken from the preceding response; omit for the first page. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. | |
| campaignGroupId | No | Keep only campaigns in this campaign group of the selected account. | |
| includeTargeting | No | Return the raw targetingCriteria object. Off by default because it is verbose. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds domain context about where targeting and bids live, but says nothing about pagination, the verbose includeTargeting behavior, or result shape.
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 tight sentences with the operation and scope front-loaded; the second earns its place by explaining the LinkedIn object hierarchy rather than padding.
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 an output schema, full parameter descriptions and rich annotations, the description needs only establish purpose and scope, which it does. A brief note on pagination or the includeTargeting trade-off would close the remaining gap.
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 every parameter including filters, pageSize/pageToken and includeTargeting is already documented. The description adds no filter syntax or defaults beyond what the schema states, so the 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?
States a specific verb (list) and resource (campaigns in a LinkedIn ad account) plus the fields surfaced. The second sentence clarifies the campaign-vs-creative hierarchy, which implicitly distinguishes it from linkedin_get_creatives, though no sibling is named outright.
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 when-to-use or when-not guidance, and no named alternative among the many siblings (get_campaign_groups, get_creatives, get_insights). The hierarchy note hints at the boundary with creatives but never states it as a selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_creativeslinkedin get creativesARead-onlyIdempotent
List the creatives of a LinkedIn ad account, optionally for given campaigns. A creative is the ad itself, and it carries its own intended status, its review verdict and the reasons it is being held back.
| Name | Required | Description | Default |
|---|---|---|---|
| pageSize | No | Maximum items in this page, 1 to 100. Defaults to 100. | |
| pageToken | No | Opaque nextPageToken from the preceding response; omit for the first page. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. | |
| campaignIds | No | Sponsored campaign IDs or URNs in the selected account. | |
| includeContent | No | Return the raw content object of each creative. Off by default. | |
| intendedStatuses | No | Filter by native configured ad statuses, not effective delivery status. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior, so the safety profile is covered. The description adds genuine domain context by explaining that a creative carries its own intended status, review verdict, and rejection reasons, which helps interpret results. It says nothing about pagination behavior, account allowlisting (LINKEDIN_ADS_ACCOUNT_IDS), or the cost/shape of includeContent.
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, zero waste: the action and scope come first, then a compact domain definition that earns its place by clarifying what the returned entities represent.
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?
An output schema exists, so return-value explanation is not required, and annotations plus full schema coverage handle the rest. The remaining gap is sibling disambiguation against linkedin_list_ad_creatives and linkedin_get_entity, which the description does nothing to resolve — a real risk for tool selection in a 17-tool cluster.
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 six parameters are already documented in the schema, including the distinction between intendedStatuses and effective delivery status. The description reinforces only the campaignIds scenario; it adds no syntax, defaults, or edge-case detail beyond the schema. Baseline 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?
States a specific verb and resource ("List the creatives of a LinkedIn ad account") with scope (optionally narrowed to campaigns), and defines what a creative is. However, it never differentiates itself from the near-identical sibling linkedin_list_ad_creatives, leaving an agent unable to tell the two apart from the text alone.
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?
Usage is only implied: "optionally for given campaigns" hints at the filtering scenario, and the framing around review verdict / hold-back reasons suggests it is the tool to reach for when diagnosing non-delivery. But there is no explicit when-to-use, when-not, or pointer to linkedin_list_ad_creatives or linkedin_get_entity as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_delivery_statuslinkedin get delivery statusARead-onlyIdempotent
Explain why LinkedIn ads are or are not serving, from the account down to the creative. LinkedIn keeps a user status and a system serving status side by side, and it is almost always the second one that says why nothing is running.
| Name | Required | Description | Default |
|---|---|---|---|
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. | |
| campaignIds | No | Limit the campaign and creative scan to these campaigns. | |
| includeCreatives | No | Also scan creatives. On by default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world, so the safety profile is settled. The description adds real domain context (user status vs. system serving status, account-to-creative scan breadth), but says nothing about scan cost, pagination, or response characteristics.
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 tight sentences with zero filler. The diagnostic scope is front-loaded and the LinkedIn status-model note is a compact, useful follow-on.
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 a full output schema and annotations covering safety, the remaining burden is purpose and interpretation, both addressed. Only minor gaps remain around scan breadth when campaignIds is omitted and what the scan cost looks like.
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 account IDs, campaign filtering, and the includeCreatives default are already fully documented in the schema. The phrase 'down to the creative' loosely gestures at includeCreatives but adds no syntax or format guidance. Baseline 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?
States a specific diagnostic verb ('explain why') and the exact question it answers: LinkedIn ad serving state from account down to creative. That cleanly separates it from reporting siblings like linkedin_get_insights or linkedin_run_statistics_report, although no sibling is named explicitly.
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?
Usage is implied by the framing ('is or are not serving') rather than stated as a rule. There is no explicit when-to-use vs. when-to-use-instead guidance, no mention of prerequisites, and no exclusion of the reporting tools it overlaps with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_demographicslinkedin get demographicsARead-onlyIdempotent
Break LinkedIn delivery down by professional demographics: company, company size, industry, seniority, job title, job function or location. These are the numbers LinkedIn is bought for, and they come with limits the tool states alongside the rows.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Keep only the top rows by impressions. Defaults to 50. | |
| endDate | No | Inclusive end, YYYY-MM-DD. Defaults to today. | |
| metrics | No | Defaults to spend, impressions, clicks and CTR. Conversion value, carousel and reach fields are not available here. | |
| breakdown | Yes | Which professional demographic to group by. | |
| startDate | Yes | Inclusive start, YYYY-MM-DD. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. | |
| campaignIds | No | Restrict reporting to these campaign IDs or URNs in the selected account. | |
| resolveNames | No | Resolve the returned URNs to readable names. On by default. | |
| campaignGroupIds | No | Restrict reporting to these owned campaign-group IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description does add one piece of behavioral context beyond annotations — that results come with LinkedIn's limits surfaced alongside the rows — but it doesn't specify which limits, row caps, or latency, so it remains modest added value.
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, purpose front-loaded ahead of the caveat about limits. The middle clause ('the numbers LinkedIn is bought for') is marketing filler that doesn't earn its place, but overall it is tight and well-ordered.
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 an output schema, full parameter descriptions, and annotations covering the safety profile, the description only needs to convey purpose and scope — which it does. The one residual gap is not routing the agent away from general-insights siblings, but that is minor given the richness of the surrounding structured data.
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 every parameter (breakdown enum, metrics defaults, limit, campaignIds, resolveNames) is already documented in the schema. The description only restates the breakdown dimension list, adding no syntax, default behavior, or edge cases beyond the structured 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?
States a specific verb ('break down') and resource ('LinkedIn delivery by professional demographics') and enumerates the supported dimensions, which matches the breakdown enum. An agent can tell what it returns, though it never names the closest sibling (get_insights / run_statistics_report) to differentiate the demographic axis from general reporting.
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?
Usage context is implied by the framing ('these are the numbers LinkedIn is bought for'), which signals audience/demographic analysis, but there is no explicit when-to-use versus linkedin_get_insights or linkedin_run_statistics_report, and no stated prerequisites beyond what the schema requires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_entitylinkedin get entityARead-onlyIdempotent
Read one campaign group, campaign or creative and verify account ownership.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Native resource type to read or modify. | |
| entityId | Yes | Native numeric ID or sponsoredCreative URN; account ownership is verified. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds that account ownership is verified, which is a real behavioral trait, but it is duplicated in the entityId/adAccountId schema text and says nothing about failure modes when ownership fails.
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 front-loaded sentence with no filler, and the operation scope arrives first. It is perhaps too compressed, since a few words on what 'verify account ownership' means in practice would cost little.
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?
An output schema exists so return values need no explanation, all three required params are documented, and annotations cover the safety profile. Only the ownership-verification failure behavior is left implicit.
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%, with the enum for kind and patterns for entityId/adAccountId fully documented, so the schema carries the semantics. The description only restates the three readable resource kinds; with the schema doing the heavy lifting, baseline 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?
Uses a specific verb ('Read one') and enumerates the exact resource kinds (campaign group, campaign, creative), which cleanly sets it apart from the plural list siblings like linkedin_get_campaigns and linkedin_get_creatives. It stops short of naming those siblings explicitly, so differentiation is inferred from the singular phrasing rather than stated.
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?
'Read one' implies the single-entity fetch case versus the list tools, and the ownership-verification clause hints at a prerequisite. But there is no explicit when-to-use/when-not guidance and no named alternative for bulk retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_insightslinkedin get insightsARead-onlyIdempotent
Run a LinkedIn Ads report grouped by one pivot. This is the analytics finder: one pivot, any granularity, and up to 20 fields including dateRange and pivotValues. Ratios such as CTR, CPC and CPM do not exist in the API and are computed here from the raw terms.
| Name | Required | Description | Default |
|---|---|---|---|
| pivot | No | Grouping. Defaults to CAMPAIGN. One of: ACCOUNT, CAMPAIGN_GROUP, CAMPAIGN, CREATIVE, COMPANY, SHARE, CONVERSION, MEMBER_COMPANY, MEMBER_COMPANY_SIZE, MEMBER_INDUSTRY, MEMBER_SENIORITY, MEMBER_JOB_TITLE, MEMBER_JOB_FUNCTION, MEMBER_COUNTRY_V2, MEMBER_REGION_V2, MEMBER_COUNTY, SERVING_LOCATION, PLACEMENT_NAME, IMPRESSION_DEVICE_TYPE, EVENT_STAGE, CARD_INDEX, CONVERSATION_NODE, CONVERSATION_NODE_OPTION_INDEX. | |
| endDate | No | Inclusive end, YYYY-MM-DD. Defaults to today. | |
| metrics | No | Metric keys from linkedin://metrics. Defaults to spend, impressions, clicks and the ratios. | |
| sortField | No | Native field used to order the returned rows. | |
| sortOrder | No | Ascending or descending native result ordering. | |
| startDate | Yes | Inclusive start, YYYY-MM-DD. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. | |
| campaignIds | No | Restrict reporting to these campaign IDs or URNs in the selected account. | |
| creativeIds | No | Restrict reporting to these owned creative IDs. | |
| campaignType | No | Native campaign format filter. | |
| timeGranularity | No | Defaults to ALL, one row for the whole range. | |
| campaignGroupIds | No | Restrict reporting to these owned campaign-group IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description is free to add the non-obvious behavior it does add: ratios like CTR, CPC and CPM are not returned by the API and are computed by this tool. That is genuinely useful and not derivable from annotations or schema. It still omits row limits, pagination and any cost/latency characteristics of an openWorld report call.
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 short sentences, front-loaded with the core action before the caveat about computed ratios. Every sentence carries information, though 'any granularity, and up to 20 fields' is loose phrasing that adds little precision.
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 12 parameters, 4 enums, full schema descriptions, a complete annotation set and an output schema, the remaining burden on the description is small and mostly met: purpose, pivot model and the computed-ratio behavior are covered. The main gap is sibling disambiguation, which matters given how many report-oriented tools share this namespace.
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% and every parameter carries its own description, so the schema already does the heavy lifting and a 3 is the baseline. The description adds only marginal semantic value — that ratios can appear in the metric set because they are computed, and that fields include dateRange/pivotValues — and its 'up to 20 fields' claim sits awkwardly against the schema's maxItems 40.
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 and resource (run a LinkedIn Ads report) and pins the scope with 'grouped by one pivot'. It implicitly contrasts itself with multi-pivot/report siblings ('This is the analytics finder: one pivot'), but never names linkedin_run_statistics_report or linkedin_get_demographics, so the agent still has to guess which analytics sibling to pick.
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?
Usage is implied rather than stated: 'one pivot, any granularity' hints at the single-pivot case, but there is no explicit when-to-use or when-not-to-use rule, and no alternative is named despite several overlapping siblings. Nothing tells the agent whether to reach for this or linkedin_run_statistics_report first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_medialinkedin get mediaARead-onlyIdempotent
Refresh one image/video URL and verify library association.
| Name | Required | Description | Default |
|---|---|---|---|
| mediaId | Yes | Exact urn:li:image or urn:li:video associated with the selected account library. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds two useful behavioral facts: the returned URL is re-resolved/refreshed (suggesting a freshly signed, potentially expiring URL) and the call validates library membership. It does not say what happens on a media URN outside the account library (error vs empty result), which is the main behavioral 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?
A single short sentence with no filler, and the core action leads. It is arguably over-compressed: 'Refresh' carries the whole semantic load and would benefit from one clarifying clause about when a refresh is needed.
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 two-parameter read with full schema coverage, an output schema, and rich annotations, the description supplies enough to call it correctly. The remaining gap is guidance on error/edge behavior when the media is not in the library, plus routing versus linkedin_list_media.
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% and both parameters document their formats (URN pattern, numeric account ID restricted to LINKEDIN_ADS_ACCOUNT_IDS), so the schema carries the parameter burden. The description adds only the framing that the media must be associated with the selected account's library, not per-parameter detail.
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 concrete action on a concrete resource: fetch/refresh a single image or video URL and confirm it belongs to the account's media library. The singular 'one image/video' implicitly contrasts with the sibling linkedin_list_media, though neither that sibling nor any other alternative is named.
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?
Usage is only implied: an agent can infer this is for a single already-known media URN rather than enumerating a library. There is no explicit 'use this when X, use linkedin_list_media when Y', and no stated preconditions beyond the implicit library-association requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_revenue_attributionlinkedin get revenue attributionARead-onlyIdempotent
Read the LinkedIn Revenue Attribution Report: pipeline and closed won revenue from the CRM, attributed to LinkedIn advertising. Only answers for accounts whose Business Manager has a CRM connected, and only over a window of 30 to 366 days.
| Name | Required | Description | Default |
|---|---|---|---|
| pivots | No | One to three of ACCOUNT, CAMPAIGN_GROUP and CAMPAIGN. Defaults to CAMPAIGN. | |
| endDate | No | Inclusive end, YYYY-MM-DD. Defaults to today. | |
| startDate | Yes | Inclusive start, YYYY-MM-DD. The window must cover 30 to 366 days. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. | |
| campaignIds | No | Restrict reporting to these campaign IDs or URNs in the selected account. | |
| campaignGroupIds | No | Restrict reporting to these owned campaign-group IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorldHint, so the safety profile is covered. The description legitimately adds the CRM-dependency and date-window constraints, which are real behavioral limits, but says nothing about what happens when the CRM is absent (empty result vs. error) or about pagination/result shape.
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 resource and the returned metrics, followed by the two gating constraints. Nothing redundant or padded.
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 an output schema present, the return values need no explanation, and the description covers purpose plus both gating conditions. It is essentially complete, only missing failure-mode behavior for accounts without a connected CRM.
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% and every parameter is documented in-schema, including the 30–366 day window and pivot defaults. The description only restates the window constraint already present in startDate's description, adding no new semantics.
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 and resource ('Read the LinkedIn Revenue Attribution Report') plus exactly what it returns: pipeline and closed won revenue from the CRM attributed to LinkedIn advertising. That is enough to distinguish it from the statistics/insights siblings, though it never names an alternative explicitly.
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?
Gives hard eligibility conditions: the Business Manager must have a CRM connected, and the reporting window must be 30–366 days. These are actionable prerequisites, but there is no routing advice (e.g., 'use linkedin_run_statistics_report for non-CRM metrics'), so the agent must infer when this beats its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_setup_guidelinkedin get setup guideARead-onlyIdempotent
Read account, supported formats and native LinkedIn write requirements before preparing changes.
| Name | Required | Description | Default |
|---|---|---|---|
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds the non-obvious fact that this is a prerequisite read for write preparation, which is genuine context beyond the annotations. It does not need to explain returns since an output schema exists.
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 front-loaded sentence with no filler. It is terse to the point of being slightly clipped ('Read account, supported formats...'), but every clause carries 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 an output schema, full parameter documentation, and rich annotations, the description only needs to state purpose and timing. It does both, leaving little an agent needs that isn't already structured.
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?
One parameter with 100% schema description coverage, including the LINKEDIN_ADS_ACCOUNT_IDS constraint, so the schema does the work. The description adds nothing about adAccountId semantics; baseline 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 verb 'Read' is paired with three concrete resources: account, supported formats, and native LinkedIn write requirements. It is distinguishable from siblings like linkedin_get_account_details because it returns setup/format guidance rather than raw account data, though the description never states that distinction explicitly.
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?
'before preparing changes' implies the trigger condition (use prior to authoring mutations), which is real usage context. But no alternatives are named and no exclusion is given, so the agent must infer whether this replaces or supplements linkedin_get_account_details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_health_checklinkedin health checkARead-onlyIdempotent
Read-only LinkedIn Ads health check. Confirms the token works, lists which configured ad accounts it can reach, checks the reporting endpoint and reports the API version header in use, without ever returning the token itself.
| Name | Required | Description | Default |
|---|---|---|---|
| adAccountId | No | Optional configured account to probe for reporting access. Defaults to the first reachable one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/destructive/openWorld, so the description earns credit for what it adds: it explicitly probes the reporting endpoint and exposes the API version header, and guarantees the token itself is never returned — a security-relevant detail not present in the structured fields.
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 dense sentence that front-loads the read-only framing and then lists the checks. Nothing is wasted, though the trailing clause about the token makes it slightly long for what is essentially a four-item checklist.
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?
An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description is complete for a zero-required-parameter diagnostic tool; the only real gap is routing guidance versus sibling validation/diagnostic tools.
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% and the single adAccountId parameter is fully documented in the schema, including its default behavior. The description alludes to 'configured ad accounts it can reach' but adds no new semantics about the parameter, so baseline 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?
States a specific verb and resource ('Read-only LinkedIn Ads health check') and enumerates exactly what it verifies: token validity, reachable ad accounts, reporting endpoint, API version header. That clearly separates it from the data-fetching siblings like linkedin_get_insights or linkedin_list_ad_accounts, though it never explicitly names those alternatives.
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 diagnostic framing implies you call this to validate credentials/configuration before running real queries, but the description never says when to prefer it over, say, linkedin_validate_query or linkedin_list_ad_accounts, nor any exclusion criteria. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_list_ad_accountslinkedin list ad accountsARead-onlyIdempotent
List the LinkedIn sponsored ad accounts configured in LINKEDIN_ADS_ACCOUNT_IDS that the authenticated member can reach, with currency, status and serving status. Accounts outside the configured list are never returned. Test accounts are excluded unless asked for.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Keep only accounts in these native statuses. | |
| adAccountIds | No | Configured account IDs to list. Defaults to every configured account. | |
| includeTestAccounts | No | Test accounts never serve and never report. Off by default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior, so the bar is lower; the description still adds real value by disclosing the hard scoping rule (only accounts in the LINKEDIN_ADS_ACCOUNT_IDS config are ever returned) and the default exclusion of test accounts. It does not discuss pagination or result caps for accounts outside the allowlist, leaving only a minor 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?
Three compact sentences, front-loaded with the verb, resource and the configuration-bound scope. Every clause carries information: reachability, the exclusion of out-of-config accounts, and the test-account default. No filler or repetition.
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?
An output schema exists, so return values need not be spelled out, and the description covers scope, defaults and exclusions for a zero-required-parameter read tool. The only thing an agent might still want is whether the allowlist is enforced as an error or a silent filter when adAccountIds includes unconfigured IDs.
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 of the three parameters is already documented, establishing a baseline of 3. The description reinforces the adAccountIds default ("every configured account") and the includeTestAccounts default, but adds no filtering semantics for the status array beyond what the schema states.
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?
Specific verb+resource ("List the LinkedIn sponsored ad accounts") with explicit scope (accounts configured in LINKEDIN_ADS_ACCOUNT_IDS reachable by the authenticated member) and the fields returned (currency, status, serving status). It distinguishes list-of-configured-accounts from a detail fetch by implication, but never names or contrasts a sibling such as linkedin_get_account_details, so it stops short of full sibling 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?
Usage context is implied rather than stated: "Accounts outside the configured list are never returned" and "Test accounts are excluded unless asked for" tell the agent what will not be returned and hint at when to set includeTestAccounts. There is no explicit guidance on when to choose this tool over linkedin_get_account_details or other listing siblings, and no stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_list_ad_creativeslinkedin list ad creativesARead-onlyIdempotent
List the images and playable videos used by the ads of an account, with the actual ad names. Separates landing URLs from media URLs. Does not report delivery.
| Name | Required | Description | Default |
|---|---|---|---|
| adIds | No | Exact ad IDs to resolve instead of listing a page, up to ten. | |
| limit | No | Maximum ads scanned in this page; inspect coverage for additional data. | |
| pageToken | No | Opaque nextPageToken from the preceding response; omit for the first page. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered structurally. The description adds one genuine behavioral fact — that delivery metrics are excluded — but says nothing about pagination behavior, coverage fields, or the adIds resolution path beyond what the schema 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?
Three short sentences, front-loaded with the primary action and resource, followed by output-shape and scope notes. No filler or 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?
An output schema exists, so return values need not be explained, and the description plus schema together cover the key facts an agent needs. The only gaps are competitive positioning against sibling media tools and the adIds-vs-paging interaction.
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 adAccountId, adIds, limit and pageToken in detail. The description adds no parameter-level meaning (e.g., that adIds bypasses paging, or that limit counts ads scanned rather than creatives returned), so baseline 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?
States a specific verb and resource ("List the images and playable videos used by the ads of an account") and adds a useful qualifier ("with the actual ad names"). It does not explicitly distinguish itself from near siblings like linkedin_list_media or linkedin_get_creatives, so an agent still has to infer which media-listing tool to pick.
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?
"Does not report delivery" is a real exclusion that implicitly routes delivery questions to linkedin_get_delivery_status, but the guidance is purely negative. There is no positive statement of when to choose this over linkedin_list_media or linkedin_get_creatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_list_medialinkedin list mediaARead-onlyIdempotent
List account image/video library files with download URLs and native processing status; not ad performance.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Library to list: images or videos. | |
| limit | No | Maximum results in this page; inspect paging/coverage for additional data. | |
| start | No | Zero-based offset in the media library page. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world, so safety is covered. The description adds that library items come with download URLs and processing status, which hints at the read payload, but says nothing about rate limits, library scoping, or pagination behavior beyond what the schema 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?
A single compact sentence with the resource front-loaded and the exclusion clause at the end. Dense but every clause carries information; nothing is wasted.
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 full schema coverage, annotations, and an output schema, the description only needs to convey scope and exclusions, which it does. A brief note on single-asset retrieval versus linkedin_get_media would close the remaining gap.
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 kind, limit, start, and adAccountId are all documented with enums, defaults, and bounds in the schema itself. The description adds no parameter-level detail (e.g., how kind interacts with returned URL types), so this sits at 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?
States a specific verb and resource (list account image/video library files) plus the payload it returns (download URLs, native processing status). The 'not ad performance' clause separates it from the insights/report siblings, though it doesn't distinguish it from the close sibling linkedin_get_media or linkedin_list_ad_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 'not ad performance' phrase gives a when-not signal, implying use this for asset retrieval rather than metrics. There is no explicit when-to-use statement and no named alternative for fetching a single asset, so the agent must infer the boundary with linkedin_get_media.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_run_statistics_reportlinkedin run statistics reportARead-onlyIdempotent
Run a LinkedIn Ads report grouped by up to three pivots at once. This is the statistics finder, the only way to cross campaign with device, or campaign group with serving location, in a single request.
| Name | Required | Description | Default |
|---|---|---|---|
| pivots | Yes | One to three pivots. Order decides the order of pivotValues. | |
| endDate | No | Inclusive end, YYYY-MM-DD. Defaults to today. | |
| metrics | No | Metric keys from linkedin://metrics. Defaults to spend, impressions, clicks and the ratios. | |
| startDate | Yes | Inclusive start, YYYY-MM-DD. | |
| adAccountId | Yes | Selected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS. | |
| campaignIds | No | Restrict reporting to these campaign IDs or URNs in the selected account. | |
| creativeIds | No | Restrict reporting to these owned creative IDs. | |
| campaignType | No | Native campaign format filter. | |
| objectiveType | No | Native campaign objective filter. | |
| timeGranularity | No | Native reporting aggregation interval. Defaults to ALL. | |
| campaignGroupIds | No | Restrict reporting to these owned campaign-group IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds only the three-pivot ceiling, which the schema also states, and says nothing about the outbound API call behavior, payload size, or latency that would matter for a wide report.
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 tight sentences, capability stated first and the differentiator second. Nothing redundant or padded; every clause carries 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?
The tool is read-only, has an output schema, and has fully described parameters, so the burden is light. However, for an 11-parameter reporting tool the description never mentions the required trio (adAccountId, pivots, startDate) or the default behavior for metrics and time granularity, leaving the agent to open the schema.
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 the baseline is 3, but the description earns extra credit by naming concrete pivot values ('campaign', 'device', 'campaign group', 'serving location'). That is genuinely useful since 'pivots' is an unconstrained string array with no enum in 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?
States a specific verb and resource: run a LinkedIn Ads report grouped by up to three pivots. The 'only way to cross campaign with device, or campaign group with serving location' phrasing functionally differentiates it from linkedin_get_insights and the other getters, though no sibling is named explicitly.
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 implies when to reach for it (multi-pivot cross-tabulation) but never states when not to, nor names linkedin_get_insights or another sibling as the simpler alternative for single-dimension pulls. Usage is inferable rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_validate_querylinkedin validate queryARead-onlyIdempotent
Check a pivot and metric combination against the LinkedIn reporting rules before spending a call on it. Returns the fields that would actually be sent, the ones LinkedIn would drop, and the twenty field ceiling. Makes no request to LinkedIn.
| Name | Required | Description | Default |
|---|---|---|---|
| pivots | Yes | One to three pivots, as a report would group them. | |
| endDate | No | Inclusive end, YYYY-MM-DD. Defaults to today. | |
| metrics | Yes | Metric keys from linkedin://metrics. | |
| startDate | No | Inclusive start, YYYY-MM-DD. Defaults to 30 days ago. | |
| timeGranularity | No | Native reporting aggregation interval. Defaults to ALL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses non-obvious behavior: no network call is made, and validation surfaces both accepted and dropped fields plus the twenty-field ceiling. Annotations already cover the read-only/idempotent safety profile, so this adds real context; there is mild tension with openWorldHint=true, though that plausibly reflects the rule catalog rather than a live request.
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 tight sentences: purpose and cost-saving rationale first, return shape second. No filler and nothing buried.
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 an output schema, full param coverage and annotations, the description covers the essentials. The only omission is what a validation failure looks like versus a successful-but-truncated result, which matters for a pre-flight check.
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 pivots, metrics, dates and granularity are already documented with defaults and formats. The description only references the 'pivot and metric combination' and adds no syntax or constraint detail beyond the schema (e.g. the 1-3 pivot / 40 metric caps).
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+resource (validate a pivot/metric combination against LinkedIn reporting rules) and frames its role relative to actually spending an API call. An agent can distinguish this dry-run validator from linkedin_run_statistics_report without opening either schema.
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?
'before spending a call on it' gives a clear trigger condition for when to use this instead of the real reporting tool. It stops short of explicitly naming linkedin_run_statistics_report or stating when validation is unnecessary, so it is clear context rather than full when/when-not guidance.
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.
18 tool updates
v1.0.0- First observed
linkedin_find_targeting - First observed
linkedin_get_account_details - First observed
linkedin_get_campaign_groups - First observed
linkedin_get_campaigns - First observed
linkedin_get_creatives - First observed
linkedin_get_delivery_status - First observed
linkedin_get_demographics - First observed
linkedin_get_entity - First observed
linkedin_get_insights - First observed
linkedin_get_media - First observed
linkedin_get_revenue_attribution - First observed
linkedin_get_setup_guide - First observed
linkedin_health_check - First observed
linkedin_list_ad_accounts - First observed
linkedin_list_ad_creatives - First observed
linkedin_list_media - First observed
linkedin_run_statistics_report - First observed
linkedin_validate_query
TDQS
Scored across 18 tools
Several tools have genuinely close boundaries: linkedin_get_insights vs linkedin_run_statistics_report (reporting, differentiated only by pivot count), and linkedin_get_creatives vs linkedin_list_ad_creatives vs linkedin_list_media vs linkedin_get_media form a cluster of media/creative tools that are easy to confuse. The descriptions do narrate the differences, but the naming alone would not let an agent pick correctly.
Consistent linkedin_ prefix with a verb_noun pattern (get_insights, list_ad_accounts, run_statistics_report, validate_query, find_targeting). Minor deviation: several list operations use 'get' (get_campaigns, get_creatives) while others use 'list' (list_media, list_ad_accounts), which blurs read-one vs read-many.
18 tools is on the higher side but each maps to a real LinkedIn Ads entity or report and the domain is genuinely rich. It stays under the 25+ 'heavy' threshold and no tool looks like obvious padding, though the media/creative quartet could likely be consolidated.
Read/reporting coverage is strong (insights, multi-pivot stats, demographics, revenue attribution, delivery status, accounts, campaigns, creatives, media, targeting, validation). However the surface is essentially read-only with no create/update/pause/budget operations, and the setup guide's mention of 'write requirements before preparing changes' implies mutations are a known, unaddressed gap for an Ads server.
Maintenance
Related MCP Connectors
Meta Ads MCP: read ad accounts and signal health; propose governed changes under Ask or Full.
Read-only MCP access to your DEXUN AdWhiz account: ad accounts, AI recommendations, savings.
Meta Ads MCP: Facebook and Instagram reports, campaigns, creatives, audiences. Approval on writes.
Google Ads MCP: reports, search terms, negatives, budgets, campaigns. Approval on every write.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to read ad account, campaign, ad group, and ad data plus performance insights, and optionally create, pause, activate, or update paused campaigns, ad groups, and ads through a secured Streamable HTTP endpoint.MIT
- AlicenseAqualityBmaintenanceEnables MCP-compatible clients to query advertising data, analyze spend, conversions, and audiences, compare campaigns, generate dashboards, and manage campaigns with optional read-only safeguards.28Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables multi-tenant access to the Meta Marketing API for account setup, campaign management, ad sets, creatives, audiences, reporting, and batch workflows through a JWT-protected MCP endpoint.27 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to read App Store campaign and performance data and to prepare preview-first, opt-in changes for explicitly allowlisted ad accounts.Apache 2.0