Skip to main content
Glama
get-mcp-ads

LinkedIn Ads MCP Server

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.

Release CI License: Apache 2.0 Node

Watch the film · What's new · Install · Tool reference · Try hosted getmcpads

Watch the getmcpads film: every ad account in one conversation with your AI assistant

Play the 45-second film

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 unless confirm is true, and none activates delivery.

  • 6 resources: manifest, metric catalog, pivots, reporting rules, targeting and recipes.

  • Require LINKEDIN_ADS_ACCOUNT_IDS and 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.

Full changelog · All releases

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 build

Configure 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

LINKEDIN_ADS_ACCESS_TOKEN

Member access token from your own LinkedIn app. Required unless the three refresh variables are set.

LINKEDIN_ADS_REFRESH_TOKEN

Programmatic refresh token, for apps LinkedIn approved for them. The access token is then renewed in memory.

LINKEDIN_ADS_CLIENT_ID

Client ID of your app. Used with the refresh token.

LINKEDIN_ADS_CLIENT_SECRET

Client secret of your app. Used with the refresh token.

LINKEDIN_ADS_ACCOUNT_IDS

Required. 1 to 100 comma-separated numeric ad account IDs. Every other account is refused before any request, reads included.

LINKEDIN_ADS_SCOPES

Optional. Scopes actually granted to the token. When set, writes refuse to run without rw_ads. Setting it grants nothing.

LINKEDIN_ADS_ENABLE_WRITES

Defaults to false. Only the exact value true exposes the write tools.

LINKEDIN_ADS_API_VERSION

LinkedIn-Version header as YYYYMM. Defaults to 202608, the version the hosted gateway runs.

LINKEDIN_ADS_LOG_LEVEL

debug, info, warn or error. Logs go to stderr. Defaults to info.

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:

  1. Create a LinkedIn Page, then a developer application in the LinkedIn Developer Portal.

  2. Request the Advertising API product from the app's Products tab and complete the access form. LinkedIn reviews each request.

  3. 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.

  4. 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

r_ads

Account, campaign group, campaign, creative and media library reads, and targeting lookup. rw_ads also allows these reads.

r_ads_reporting

linkedin_get_insights, linkedin_run_statistics_report, linkedin_get_demographics, linkedin_get_revenue_attribution and the reporting probe of linkedin_health_check.

r_organization_social

linkedin_list_ad_creatives, which reads the sponsored post behind each sponsored content ad.

rw_ads

Every write tool.

w_organization_social

linkedin_create_media_ad, which creates the dark post sponsored by the ad, authored by the Company Page of the ad account.

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 catalog

All 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

linkedin_health_check

Check the token, the configured accounts it reaches, the reporting endpoint and the API version, without returning the token

linkedin_list_ad_accounts

List the configured ad accounts the member can reach, with currency, status and serving status

linkedin_get_account_details

Read one ad account in full, with the members who hold a role on it

linkedin_get_campaign_groups

List campaign groups with budget, schedule and serving status

linkedin_get_campaigns

List campaigns with status, objective, format, bid, budget and schedule, optionally with targeting

linkedin_get_creatives

List creatives with intended status, review verdict and serving hold reasons

linkedin_get_entity

Read one campaign group, campaign or creative and verify account ownership

linkedin_get_setup_guide

Read the account, supported formats and native write requirements before preparing changes

linkedin_get_insights

Run a report grouped by one pivot, with computed ratios

linkedin_run_statistics_report

Run a report grouped by up to three pivots at once

linkedin_get_demographics

Break delivery down by professional demographics, with names resolved and the limits stated

linkedin_get_revenue_attribution

Read CRM pipeline and closed won revenue attributed to LinkedIn advertising

linkedin_validate_query

Check a pivot and metric combination against the reporting rules, without a request

linkedin_get_delivery_status

Explain why ads are or are not serving, from the account down to the creative

linkedin_find_targeting

Look up native targeting URNs, such as countries or job titles, by name

linkedin_list_media

List the account image or video library with download URLs and processing status

linkedin_get_media

Refresh one image or video URL and verify its library association

linkedin_list_ad_creatives

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

linkedin_create_campaign_group

Create a DRAFT campaign group

linkedin_create_campaign

Create a DRAFT text ad or sponsored content campaign with budget, bid, targeting and schedule

linkedin_create_text_ad

Create a DRAFT text ad with an image from the account library

linkedin_create_media_ad

Create a DRAFT sponsored image or video ad on a dark post

linkedin_update_entity

Rename, pause or archive, or edit budget, bid, schedule, targeting or text ad content

linkedin_rename_campaign_group

Rename a campaign group, and nothing else

linkedin_rename_campaign

Rename a campaign, and nothing else

linkedin_rename_ad

Rename an ad (creative), and nothing else

linkedin_rename_ad_account

Rename the ad account, and nothing else

linkedin_duplicate_ad

Copy an ad into a verified campaign as DRAFT

linkedin_delete_draft_ad

Delete one DRAFT ad, without touching its post or media

linkedin_initialize_upload

Start an image or video upload to the account library and return a signed receipt

linkedin_upload_part

Upload one part of the file to LinkedIn's signed upload URL

linkedin_finalize_upload

Finalize a video once every part is uploaded

linkedin_update_media

Rename or archive a library image or video

Resource

Content

linkedin://manifest

Configured accounts, API version, entity hierarchy and safety rules

linkedin://metrics

The metric catalog, with formulas of computed ratios and the pivots each metric is unavailable with

linkedin://pivots

Pivots and the finder that serves each one

linkedin://reporting-rules

Scoping, row cap, retention, freshness, demographic limits and throttling

linkedin://targeting

Shape of the targeting criteria, lookup and audience limits

linkedin://recipes

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 tools
linkedin_find_targetinglinkedin find targetingB
Read-onlyIdempotent

Look up native targeting URNs such as countries by name.

NameRequiredDescriptionDefault
facetNoNative targeting facet URN; defaults to location targeting.urn:li:adTargetingFacet:locations
queryYesSearch text used by the native targeting lookup.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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

Schema description coverage is 100%, so each parameter (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.

Purpose4/5

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.

Usage Guidelines3/5

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 detailsA
Read-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.

NameRequiredDescriptionDefault
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.
includeUsersNoAlso list the account users and their roles. On by default.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 groupsA
Read-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.

NameRequiredDescriptionDefault
nameNoExact campaign group names to match.
statusNoKeep only campaign groups in these native statuses.
pageSizeNoMaximum items in this page, 1 to 100. Defaults to 100.
pageTokenNoOpaque nextPageToken from the preceding response; omit for the first page.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 campaignsB
Read-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.

NameRequiredDescriptionDefault
nameNoExact campaign names to match.
typeNoKeep only these campaign formats, such as TEXT_AD or SPONSORED_UPDATES.
statusNoKeep only campaigns in these native statuses.
pageSizeNoMaximum items in this page, 1 to 100. Defaults to 100.
pageTokenNoOpaque nextPageToken from the preceding response; omit for the first page.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.
campaignGroupIdNoKeep only campaigns in this campaign group of the selected account.
includeTargetingNoReturn the raw targetingCriteria object. Off by default because it is verbose.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 creativesA
Read-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.

NameRequiredDescriptionDefault
pageSizeNoMaximum items in this page, 1 to 100. Defaults to 100.
pageTokenNoOpaque nextPageToken from the preceding response; omit for the first page.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.
campaignIdsNoSponsored campaign IDs or URNs in the selected account.
includeContentNoReturn the raw content object of each creative. Off by default.
intendedStatusesNoFilter by native configured ad statuses, not effective delivery status.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 statusA
Read-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.

NameRequiredDescriptionDefault
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.
campaignIdsNoLimit the campaign and creative scan to these campaigns.
includeCreativesNoAlso scan creatives. On by default.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 demographicsA
Read-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.

NameRequiredDescriptionDefault
limitNoKeep only the top rows by impressions. Defaults to 50.
endDateNoInclusive end, YYYY-MM-DD. Defaults to today.
metricsNoDefaults to spend, impressions, clicks and CTR. Conversion value, carousel and reach fields are not available here.
breakdownYesWhich professional demographic to group by.
startDateYesInclusive start, YYYY-MM-DD.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.
campaignIdsNoRestrict reporting to these campaign IDs or URNs in the selected account.
resolveNamesNoResolve the returned URNs to readable names. On by default.
campaignGroupIdsNoRestrict reporting to these owned campaign-group IDs.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 entityA
Read-onlyIdempotent

Read one campaign group, campaign or creative and verify account ownership.

NameRequiredDescriptionDefault
kindYesNative resource type to read or modify.
entityIdYesNative numeric ID or sponsoredCreative URN; account ownership is verified.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 insightsA
Read-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.

NameRequiredDescriptionDefault
pivotNoGrouping. 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.
endDateNoInclusive end, YYYY-MM-DD. Defaults to today.
metricsNoMetric keys from linkedin://metrics. Defaults to spend, impressions, clicks and the ratios.
sortFieldNoNative field used to order the returned rows.
sortOrderNoAscending or descending native result ordering.
startDateYesInclusive start, YYYY-MM-DD.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.
campaignIdsNoRestrict reporting to these campaign IDs or URNs in the selected account.
creativeIdsNoRestrict reporting to these owned creative IDs.
campaignTypeNoNative campaign format filter.
timeGranularityNoDefaults to ALL, one row for the whole range.
campaignGroupIdsNoRestrict reporting to these owned campaign-group IDs.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 mediaA
Read-onlyIdempotent

Refresh one image/video URL and verify library association.

NameRequiredDescriptionDefault
mediaIdYesExact urn:li:image or urn:li:video associated with the selected account library.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 attributionA
Read-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.

NameRequiredDescriptionDefault
pivotsNoOne to three of ACCOUNT, CAMPAIGN_GROUP and CAMPAIGN. Defaults to CAMPAIGN.
endDateNoInclusive end, YYYY-MM-DD. Defaults to today.
startDateYesInclusive start, YYYY-MM-DD. The window must cover 30 to 366 days.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.
campaignIdsNoRestrict reporting to these campaign IDs or URNs in the selected account.
campaignGroupIdsNoRestrict reporting to these owned campaign-group IDs.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 guideA
Read-onlyIdempotent

Read account, supported formats and native LinkedIn write requirements before preparing changes.

NameRequiredDescriptionDefault
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 checkA
Read-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.

NameRequiredDescriptionDefault
adAccountIdNoOptional configured account to probe for reporting access. Defaults to the first reachable one.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 accountsA
Read-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.

NameRequiredDescriptionDefault
statusNoKeep only accounts in these native statuses.
adAccountIdsNoConfigured account IDs to list. Defaults to every configured account.
includeTestAccountsNoTest accounts never serve and never report. Off by default.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 creativesA
Read-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.

NameRequiredDescriptionDefault
adIdsNoExact ad IDs to resolve instead of listing a page, up to ten.
limitNoMaximum ads scanned in this page; inspect coverage for additional data.
pageTokenNoOpaque nextPageToken from the preceding response; omit for the first page.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose4/5

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.

Usage Guidelines3/5

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 mediaA
Read-onlyIdempotent

List account image/video library files with download URLs and native processing status; not ad performance.

NameRequiredDescriptionDefault
kindYesLibrary to list: images or videos.
limitNoMaximum results in this page; inspect paging/coverage for additional data.
startNoZero-based offset in the media library page.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 reportA
Read-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.

NameRequiredDescriptionDefault
pivotsYesOne to three pivots. Order decides the order of pivotValues.
endDateNoInclusive end, YYYY-MM-DD. Defaults to today.
metricsNoMetric keys from linkedin://metrics. Defaults to spend, impressions, clicks and the ratios.
startDateYesInclusive start, YYYY-MM-DD.
adAccountIdYesSelected LinkedIn advertising account, numeric ID. It must be listed in LINKEDIN_ADS_ACCOUNT_IDS.
campaignIdsNoRestrict reporting to these campaign IDs or URNs in the selected account.
creativeIdsNoRestrict reporting to these owned creative IDs.
campaignTypeNoNative campaign format filter.
objectiveTypeNoNative campaign objective filter.
timeGranularityNoNative reporting aggregation interval. Defaults to ALL.
campaignGroupIdsNoRestrict reporting to these owned campaign-group IDs.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 queryA
Read-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.

NameRequiredDescriptionDefault
pivotsYesOne to three pivots, as a report would group them.
endDateNoInclusive end, YYYY-MM-DD. Defaults to today.
metricsYesMetric keys from linkedin://metrics.
startDateNoInclusive start, YYYY-MM-DD. Defaults to 30 days ago.
timeGranularityNoNative reporting aggregation interval. Defaults to ALL.

Output Schema

NameRequiredDescription
resultYesOriginal tool result: parsed JSON when the text is JSON, otherwise the text. Provider fields depend on the selected query.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 18 tool updatesv1.0.0
    • First observedlinkedin_find_targeting
    • First observedlinkedin_get_account_details
    • First observedlinkedin_get_campaign_groups
    • First observedlinkedin_get_campaigns
    • First observedlinkedin_get_creatives
    • First observedlinkedin_get_delivery_status
    • First observedlinkedin_get_demographics
    • First observedlinkedin_get_entity
    • First observedlinkedin_get_insights
    • First observedlinkedin_get_media
    • First observedlinkedin_get_revenue_attribution
    • First observedlinkedin_get_setup_guide
    • First observedlinkedin_health_check
    • First observedlinkedin_list_ad_accounts
    • First observedlinkedin_list_ad_creatives
    • First observedlinkedin_list_media
    • First observedlinkedin_run_statistics_report
    • First observedlinkedin_validate_query

TDQS

A3.5/5.0

Scored across 18 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness3/5

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

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables 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 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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