LinkedIn Ads Library 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 Library MCP ServerAnalyze Datadog's LinkedIn ads and break down their targeting."
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 Library MCP Server
This is a Model Context Protocol (MCP) server for the LinkedIn Ad Library.
With this you can search LinkedIn's public ad library for any company or brand, see what they're currently running and analyze their advertising. You can analyze ad images/text, analyze video ads with comprehensive insights, compare companies' strategies, and get insights into what's working in their campaigns.
Here's an example of what you can do when it's connected to Claude.
Hosted Version (Recommended)
The easiest way to use the LinkedIn Ads Library MCP is the hosted version from Proxy (useproxy.dev). No API keys, no Gemini key, no Python, no server to run — just connect and start querying.
⚡ Zero setup — nothing to install, configure, or maintain
🔑 No API keys — skip the ScrapeCreators and Gemini keys entirely
🔌 Works everywhere — ChatGPT, Claude, Cursor, Manus, and anywhere else that supports MCP
🚀 Always up to date — new tools and fixes ship automatically
👉 Get started for free at useproxy.dev →
Prefer to run it yourself? The full self-host setup is documented below.
Hosted vs. Self-Host
Hosted — Proxy (useproxy.dev) | Self-Host | |
Setup time | None — connect and go | Python env + config |
API keys required | None | ScrapeCreators + Gemini |
Infrastructure | Fully managed | You run and maintain it |
Updates | Automatic | Manual |
Works in ChatGPT, Claude, Cursor, Manus | ✅ | ✅ |
Best for | Most users who just want the data | Developers who want to customize the code |
For most people, the hosted version is the fastest path. Choose self-host if you specifically want to modify or extend the server yourself.
Related MCP server: LinkedIn Ad Library MCP Server
Example Prompts
How many LinkedIn ads is 'Salesforce' running? What's their split across video, image and carousel?Who is 'Datadog' targeting on LinkedIn? Break down the audience, seniority and locations across their ads.Find LinkedIn ads mentioning 'AI agents' and tell me which offers they're pushing — demos, webinars or reports.Do a deep comparison of the messaging between 'HubSpot' and 'Salesforce' on LinkedIn. Give it a nice forwardable summary.Installation
Prerequisites
Python 3.12+
Anthropic Claude Desktop app (or Cursor)
Pip (Python package manager), install with
python -m pip installAn API key for an ads data provider, set as
SCRAPECREATORS_API_KEY(see configuration below)A Google Gemini API key for video analysis (optional, only needed for video ads)
Prefer not to deal with API keys? See the Hosted Version above to skip setup entirely.
Quick Install (Recommended)
Clone and run the install script
git clone https://github.com/proxy-intell/linkedin-ads-library-mcp.git cd linkedin-ads-library-mcp # For macOS/Linux: ./install.sh # For Windows: install.batConfigure your API keys
Edit the
.envfile that was created and add your API keys:Set your ads data API key as
SCRAPECREATORS_API_KEYGet your Gemini API key at Google AI Studio (optional, for video analysis)
Follow the displayed MCP configuration
The install script will show you the exact configuration to add to Claude Desktop or Cursor.
Manual Install
If you prefer to install manually:
Clone this repository
git clone https://github.com/proxy-intell/linkedin-ads-library-mcp.git cd linkedin-ads-library-mcpInstall dependencies
pip install -r requirements.txtConfigure API keys
Copy the template and configure your API keys:
cp .env.template .env # Then edit .env with your actual API keysTo obtain API keys:
Set your ads data API key as
SCRAPECREATORS_API_KEYin the.envfileGet a Google Gemini API key here (optional, for video analysis)
Connect to the MCP server
Add the MCP server configuration to your Claude Desktop or Cursor config:
{ "mcpServers": { "linkedin_ads_library": { "command": "/usr/local/opt/python@3.13/bin/python3", "args": [ "{{PATH_TO_PROJECT}}/linkedin-ads-library-mcp/mcp_server.py" ] } } }Replace
{{PATH_TO_PROJECT}}with the full path to where you cloned this repository.Note: API keys are automatically loaded from the
.envfile. Command line arguments are still supported and take priority over environment variables if provided.For Claude Desktop:
Save this as
claude_desktop_config.jsonin your Claude Desktop configuration directory at:~/Library/Application Support/Claude/claude_desktop_config.jsonFor Cursor:
Save this as
mcp.jsonin your Cursor configuration directory at:~/.cursor/mcp.jsonRestart Claude Desktop / Cursor
Open Claude Desktop and you should now see the LinkedIn Ads Library as an available integration.
Or restart Cursor.
Technical Details
Claude sends requests to the Python MCP server
The MCP server queries the ads data API for LinkedIn Ad Library data
Data flows back through the chain to Claude
LinkedIn Ads
This server connects to LinkedIn's public Ad Library:
Three ways to search.
companymatches an advertiser name,keywordmatches ad copy across advertisers, andcompany_idpins one exact organisation. Prefercompany_idwhen you have it — name matching can pull in similarly named companies.Targeting is the differentiator. LinkedIn publishes the audience an advertiser selected — language, location, and audience criteria like job seniority, function or company size. No other ad library exposes this, and it's the most useful field for B2B competitive work.
Ads run from people as well as pages.
posterTitleandpromotedBytell you whether an ad is served from a company page or boosted from an employee's personal profile — a common founder-led B2B pattern.Creative lives in three fields.
image,videoandcarouselImagesare populated depending on ad type, and carousel entries come back as either bare URLs or objects. The server normalises all of this intoimage_urls/video_url.Detail lookups need a URL. The upstream detail endpoint takes a
linkedin.com/ad-library/detail/...URL rather than an ID, soget_linkedin_ad_detailsaccepts either and builds the URL for you.
Tips:
Search by
company_idfor exact advertiser matching; fall back tocompanyname if you don't have itUse
keywordto research a topic or category rather than a single advertiserNarrow with
countriesandstart_date/end_datewhen an advertiser runs a lot of ads
Available MCP Tools
This MCP server provides tools for interacting with LinkedIn Ad Library objects:
Tool Name | Description |
| Searches the LinkedIn Ad Library by company, keyword or company ID, with country and date filters |
| Gets full detail for a specific ad — targeting, per-country impressions, creative and destination |
| Downloads and analyzes ad images for visual elements, text, colors, and composition |
| Downloads and analyzes ad videos using Gemini AI for comprehensive video insights |
| Gets statistics about cached media (images and videos) and storage usage |
| Searches previously analyzed media by brand, colors, people, or media type |
| Cleans up old cached media files to free disk space |
Troubleshooting
Common Issues
API Key Not Found Error:
Ensure your
.envfile is in the project root directoryIf you don't have a
.envfile, copy it from the template:cp .env.template .envCheck that your API keys are correctly formatted without quotes
Verify the
.envfile containsSCRAPECREATORS_API_KEY=your_key_hereFor video analysis, ensure
GEMINI_API_KEY=your_key_hereis also added
Search Returns No Ads:
Use the company name exactly as it appears on their LinkedIn page
Better still, search by
company_idfor an exact matchThe advertiser may not have run ads in the period or countries you filtered to
Video Analysis Not Working:
Confirm you have a valid Google Gemini API key in your
.envfilePass
ad_idalongsidemedia_urlso analysis caches per ad — LinkedIn CDN URLs carry expiry parameters that rotate
MCP Server Connection Issues:
Verify the path in your MCP configuration points to the correct location
Make sure you've installed all dependencies with
pip install -r requirements.txtRestart Claude Desktop/Cursor after configuration changes
For additional Claude Desktop integration troubleshooting, see the MCP documentation. The documentation includes helpful tips for checking logs and resolving common issues.
Tests
The response parsing has a self-check that runs without network access or API keys:
python3 test_parsing.pyFAQ
What is the easiest way to use the LinkedIn Ads Library MCP? The easiest way is the hosted version from Proxy (useproxy.dev). It requires no API keys, no installation, and no server — you connect it to ChatGPT, Claude, Cursor, or any MCP client and start querying immediately. You can start for free.
Do I need an API key to use this MCP?
Only if you self-host. The hosted version at useproxy.dev handles all data access for you, so no ScrapeCreators or Gemini keys are needed. Self-hosting requires a SCRAPECREATORS_API_KEY (and a Gemini key for video analysis).
What can I get from LinkedIn that I can't get from the other ad libraries? Targeting. LinkedIn publishes the audience each advertiser selected — language, location, and criteria like job seniority, function and company size — which makes it the most useful ad library for B2B competitive research.
Which MCP clients does it work with? Both the hosted and self-hosted versions work with ChatGPT, Claude (Desktop and web), Cursor, Manus, and any other client that supports the Model Context Protocol.
Is there a free version? Yes — the hosted version from Proxy offers a free tier so you can start analyzing ads without any setup.
Should I self-host or use the hosted version? Use the hosted version if you just want fast, reliable access to LinkedIn Ad Library data with zero maintenance — this fits most users. Self-host only if you want to modify or extend the server code yourself.
Feedback
Your feedback will be massively appreciated. Please tell us which features on that list you like to see next or request entirely new ones.
License
This project is licensed under the MIT License.
Made with ❤️ by the team at Proxy.
Available Tools
7 toolsanalyze_ad_imageARead-only
REQUIRED for analyzing images from LinkedIn ads. Download and analyze ad images (single image creatives, carousel cards and document/thumbnail covers) to extract visual elements, text content, colors, people, brand elements, and composition details. This tool should be used for EVERY image URL returned by search_linkedin_ads when doing comprehensive analysis. Uses intelligent caching so multiple image analysis calls are efficient and cost-free.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | No | ||
| media_url | Yes | ||
| brand_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the description only needs to add extra context. It discloses the caching behavior ('intelligent caching... efficient and cost-free') and implies network access via downloading, which adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with 'REQUIRED' and immediately conveys the core action. Every sentence adds value, including the caching note and usage rule, with no fluff 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?
For a tool with a simple schema and no output schema, the description is quite complete. It explains what types of images are handled, lists the extracted elements (giving a sense of output), and provides caching and usage context. Minor gaps such as error handling or prerequisites are not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 3 parameters with 0% description coverage, so the description should compensate. It references media_url by mentioning 'image URL' but does not explain ad_id or brand_name, leaving their purpose unclear. The required parameter is implicitly covered, but optional parameters lack guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: downloading and analyzing ad images to extract visual elements, text content, colors, people, brand elements, and composition details. It distinguishes itself from sibling tool analyze_ad_video by explicitly focusing on images and listing supported image types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage context: 'should be used for EVERY image URL returned by search_linkedin_ads when doing comprehensive analysis.' It clearly indicates when to use the tool, but does not mention specific alternatives or exclusions, though the sibling tool list implicitly differentiates video analysis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_ad_videoARead-only
REQUIRED for analyzing video ads from LinkedIn. Downloads and analyzes ad videos using Gemini's video understanding to extract the hook, scene-by-scene storytelling, on-screen text, voiceover, sound-off readability and B2B offer positioning. Pass ad_id alongside media_url so results cache per ad rather than per (expiring) CDN URL. Uses intelligent caching for efficiency.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | No | ||
| media_url | Yes | ||
| brand_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses meaningful behavioral context beyond annotations: downloads and analyzes video via Gemini, uses caching per ad rather than CDN URL, and mentions intelligent caching. This aligns with readOnlyHint while adding practical details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with 'REQUIRED', followed by function, analysis details, and caching guidance. No redundant phrases or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and minimal param descriptions, the description covers purpose, cached behavior, and analysis dimensions well. Missing brand_name semantics and explicit return format, but the extracted-elements list implies output structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description adds meaning for media_url (required video URL) and ad_id (caching key), but brand_name is entirely unexplained. This leaves one parameter without semantic clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'analyzing video ads from LinkedIn' with specific outputs (hook, storytelling, on-screen text, voiceover, etc.). It distinguishes from sibling tools like analyze_ad_image by explicitly focusing on video.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a strong usage signal with 'REQUIRED for analyzing video ads' and advises passing ad_id for correct caching. It doesn't explicitly name alternative tools but the sibling context makes the differentiation obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cleanup_media_cacheA
REQUIRED for cleaning up old cached media files (images and videos) and freeing disk space. Use this tool when users want to remove old cached media, clean up storage space, or when cache becomes too large. Essential for cache maintenance and storage management.
| Name | Required | Description | Default |
|---|---|---|---|
| max_age_days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false (a mutating operation), and the description confirms by mentioning 'cleaning up' and 'freeing disk space.' However, it doesn't disclose that files are permanently deleted, potential irreversibility, or any side effects beyond space freeing. The description adds some context but could be richer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences but contains redundancy: 'freeing disk space,' 'clean up storage space,' and 'storage management' all express the same idea. The leading 'REQUIRED' is unnecessary and adds noise. It is front-loaded but could be more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description should hint at what the tool returns (e.g., number of files deleted, space freed). It also doesn't mention irreversibility or any confirmation flow. For a destructive tool with annotations indicating mutation, this is a notable gap, but the core purpose and trigger conditions are 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 0%, and the description does not mention the only parameter 'max_age_days' at all. The parameter name is somewhat self-explanatory, but the description fails to clarify its role (e.g., cutoff age for deletion), leaving the agent without additional guidance beyond the schema's default value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('cleaning up old cached media files') and resource ('images and videos'), distinguishing it from sibling tools like get_cache_stats or search_cached_media. The verb 'cleanup' is unambiguous and tied to a concrete outcome (freeing disk space).
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?
Explicitly states when to use the tool: 'when users want to remove old cached media, clean up storage space, or when cache becomes too large.' It doesn't explicitly mention when not to use it, but the context and sibling tools make that implicit, which is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cache_statsARead-only
REQUIRED for checking media cache status and storage usage. Use this tool when users ask about cache statistics, storage space used by cached media (images and videos), or how many files have been analyzed and cached. Essential for cache management and monitoring.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is clear. The description adds useful behavioral context about what statistics are provided (storage usage, file counts) and positions it as essential for monitoring. It does not introduce any side effects or contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the essential purpose ('REQUIRED for checking media cache status') and followed by usage cues. It is efficient overall, but the final sentence 'Essential for cache management and monitoring' adds little beyond the earlier text, making it slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no params, read-only, no output schema), the description covers the core purpose and user intents. It does not describe return format or how it relates to cleanup decisions, but these are not critical given the annotations and simplicity. The description is sufficient for accurate selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is inherently 100% covered. No parameter explanation is needed, and the description appropriately omits any. This aligns with the baseline of 4 for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: checking media cache status and storage usage. It lists specific outputs (storage space used by cached media, number of files analyzed/cached) and distinguishes it from siblings like cleanup_media_cache (mutation) and search_cached_media (search).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use: 'when users ask about cache statistics, storage space used by cached media, or how many files have been analyzed and cached.' It provides strong contextual guidance, though it does not explicitly mention when not to use it or name alternative tools for related tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_linkedin_ad_detailsARead-only
Get detailed information about a specific LinkedIn ad including full targeting (language, location, audience), per-country impression breakdown, creative and destination URL. Use this with an ad id from search_linkedin_ads, or a linkedin.com/ad-library/detail/ URL. Essential for understanding who an advertiser is targeting and extracting media URLs for visual analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses input variations (ad id or full URL) and enumerates the returned data fields (targeting, per-country impressions, creative, destination URL). It also highlights the ability to extract media URLs for visual analysis, adding useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with zero fluff. First sentence lists the output details; second sentence states the input source and purpose. Highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description is remarkably complete. It covers the input source, the returned information categories, and the practical use case (visual analysis and ad targeting understanding). No missing pieces for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only lists ad_id as a string, but the description explains that it can be an ad id from search_linkedin_ads or a linkedin.com/ad-library/detail/ URL. This thoroughly compensates for the schema's 0% description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: get detailed information about a specific LinkedIn ad. It lists specific content (targeting, per-country impressions, creative, URL) and distinguishes from the sibling search_linkedin_ads by focusing on detailed lookup for a single ad.
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?
Explicitly instructs when to use: with an ad id from search_linkedin_ads or a LinkedIn ad library detail URL. It also states it's essential for understanding targeting and extracting media URLs, providing clear context and alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cached_mediaARead-only
REQUIRED for finding previously analyzed ad media (images and videos) in cache. Use this tool when users want to search for cached media by brand name, find media with people, search by colors, or filter by media type. Essential for retrieving past analysis results without re-downloading media.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| brand_name | No | ||
| has_people | No | ||
| media_type | No | ||
| color_contains | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint and openWorldHint, and the description adds useful context like 'previously analyzed' and 'without re-downloading media.' However, it does not disclose details about return formatting, ordering, or behavior when no results are found. The added context is helpful but not extensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with 'REQUIRED,' and uses three short sentences that each add value. It captures the purpose, use cases, and benefit without extraneous 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?
Given the five optional parameters and no output schema, the description covers the main search dimensions and conveys the tool's purpose and typical use cases. It doesn't explain the return structure, but it implies the retrieval of prior analysis results, which is sufficient for an annotated read-only search tool.
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 0%, so the description must compensate. It names the searchable filters (brand_name, has_people, color_contains, media_type) and maps them to user intents, adding meaning beyond the raw schema. However, it does not explain value formats or the meaning of the limit parameter, leaving some gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds 'previously analyzed ad media (images and videos) in cache' with a specific verb and resource. It distinguishes itself from siblings by emphasizing 'cached media' and the search use cases (brand name, people, colors, media type).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'REQUIRED for finding previously analyzed ad media' and lists specific user intents (search by brand, find media with people, search by colors, filter by media type). It lacks explicit when-not-to-use or alternative tool references, but the context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_linkedin_adsARead-only
Search LinkedIn's Ad Library for the ads a company is running. Search by company name, by keyword across ad copy, or by LinkedIn company ID (most precise). Supports country and date-range filters. Returns headline, description, CTA, destination URL, targeting, impressions and media URLs. For complete analysis of visual elements, colors, design, or creative content, you MUST also use analyze_ad_image or analyze_ad_video on the media returned by each ad.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| company | No | ||
| keyword | No | ||
| end_date | No | ||
| countries | No | ||
| company_id | No | ||
| start_date | No | ||
| pagination_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, and the description adds useful behavioral context: it lists the returned fields (headline, description, CTA, destination URL, targeting, impressions, media URLs) and notes media URLs are meant for downstream analysis. This goes beyond the annotation, but it doesn't address pagination behavior, result ordering, or potential incompleteness of the Ad Library data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five sentences, each adding distinct value: purpose, search methods, filter support, returned fields, and cross-tool directive. There is no filler or redundant phrasing, and the most critical information is front-loaded in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and sparse annotations, the description covers the essential return fields and provides clear pointers for further analysis. However, it omits pagination (pagination_token) and the meaning of `limit`, which are relevant for handling large result sets. A fully complete description would mention these to help agents use the tool effectively at scale.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no per-parameter descriptions (0% coverage), so the description must compensate. It explains company, keyword, company_id, countries, and date-range filters, but leaves `limit` and `pagination_token` entirely unexplained. It also does not specify date or country formats, so the parameter guidance is helpful but incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Search LinkedIn's Ad Library for the ads a company is running,' which precisely identifies the verb (search), resource (Ad Library), and scope (ads of a company). It distinguishes itself from siblings by explicitly directing visual analysis to analyze_ad_image/analyze_ad_video, making its own search-and-return purpose clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states multiple search strategies (by company name, keyword, or LinkedIn company ID) and even highlights company_id as 'most precise.' It explicitly instructs using analyze_ad_image or analyze_ad_video for visual analysis, which serves as a when-not-to-use this tool guidance. However, it does not mention when to use get_linkedin_ad_details compared to this search tool.
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.
7 tool updates
v0.1.0- First observed
analyze_ad_image - First observed
analyze_ad_video - First observed
cleanup_media_cache - First observed
get_cache_stats - First observed
get_linkedin_ad_details - First observed
search_cached_media - First observed
search_linkedin_ads
TDQS
Scored across 7 tools
Each tool targets a distinct resource and action: live ad search, ad details, image analysis, video analysis, and cache management operations. There is no meaningful overlap between searching LinkedIn ads and searching cached media, and the analysis tools are cleanly separated by media type.
All tool names follow a consistent verb_noun snake_case pattern (e.g., search_linkedin_ads, analyze_ad_image, cleanup_media_cache). Verbs are descriptive and specific, with no mixing of conventions or vague names.
With 7 tools, the server is well-scoped for its purpose: searching and analyzing LinkedIn ads plus managing the media cache. Each tool serves a distinct function without redundancy or bloat.
The tool surface covers the full workflow: searching ads, retrieving detailed targeting/creative info, analyzing images and videos, and managing the cache that stores analyzed media. No obvious gaps or dead ends exist; cache stats and cleanup ensure lifecycle coverage.
Maintenance
Related MCP Connectors
Search Meta, Google Ads, LinkedIn, and TikTok ad libraries plus creative analysis via MCP.
Create, launch & analyze ad campaigns, spy on competitors - Google, Meta, TikTok, LinkedIn & more.
Competitive ad intelligence for AI agents: portfolios, ad/content search, analytics, discovery.
Conversational access to advertising performance data, creative analysis, and campaign insights
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables searching and analyzing Facebook's public ads library for any brand, including ad images, text, and video analysis.824 npm299MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to search LinkedIn's Ad Library for sponsored ads, job postings, and paid endorsements, providing insights into competitor strategies and hiring signals.3MIT
- FlicenseNot gradedqualityCmaintenanceEnables users to monitor and analyze competitor LinkedIn posts, extract insights, generate original post concepts, and create graphics-ready content with metadata.-
- AlicenseNot gradedqualityCmaintenanceEnables management and analysis of LinkedIn ad campaigns, including listing accounts, campaigns, creatives, and retrieving analytics, through natural language queries.5 npmMIT