TikTok Ads Library MCP Server
Provides video ad analysis using Google Gemini to generate scene-by-scene creative insights.
Enables searching and analyzing TikTok's public Ad Library, including advertiser search, ad details, and creative analysis.
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., "@TikTok Ads Library MCP ServerWhat's the hook in the first 3 seconds of each of Duolingo's TikTok video ads?"
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.

TikTok Ads Library MCP Server
This is a Model Context Protocol (MCP) server for the TikTok Ad Library.
With this you can search TikTok's public ad library for any advertiser, see the creatives they're running and analyze their advertising. You can analyze ad images and cover frames, analyze video ads with scene-by-scene insights, compare advertisers' 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 TikTok 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: undoom-douyin-data-analysis
Example Prompts
How many TikTok ads is 'Anysphere' running? What's their split across video and image?What's the hook in the first 3 seconds of each of 'Duolingo's TikTok video ads?Analyze the video ads from 'Gymshark' and tell me which read as creator-style UGC vs polished brand production.Compare the messaging and creative style between 'Anysphere' and 'Notion Labs' on TikTok. 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 (TikTok ads are overwhelmingly video, so this is effectively required)
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/tiktok-ads-library-mcp.git cd tiktok-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
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/tiktok-ads-library-mcp.git cd tiktok-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
Connect to the MCP server
Add the MCP server configuration to your Claude Desktop or Cursor config:
{ "mcpServers": { "tiktok_ads_library": { "command": "/usr/local/opt/python@3.13/bin/python3", "args": [ "{{PATH_TO_PROJECT}}/tiktok-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 TikTok 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 TikTok Ad Library data
Data flows back through the chain to Claude
TikTok Ads
This server connects to TikTok's public Ad Library:
Advertiser names are legal entity names. TikTok indexes advertisers by their registered business name, and matching is exact and case-sensitive. Search
Anysphere, notCursor. If a brand name returns nothing, try the legal entity behind it.Video-first. Most TikTok ads are video.
analyze_ad_videois where the real signal is;analyze_ad_imagemainly covers cover frames and the occasional static creative.Media URLs expire. TikTok's CDN URLs are signed and go dead within minutes. Always pass
ad_idtoanalyze_ad_video— the server then fetches a fresh URL itself and caches the result under the ad id, so repeat analysis of the same ad is free.Coverage is EU-weighted. TikTok's public ad library is driven by EU transparency obligations, so delivery in EU markets is what's most reliably indexed.
Available MCP Tools
This MCP server provides tools for interacting with TikTok Ad Library objects:
Tool Name | Description |
| Searches the TikTok Ad Library by advertiser name or keyword, with automatic pagination |
| Gets full detail for a specific ad — landing page, country targeting, engagement, fresh video URL |
| Downloads and analyzes ad images for visual elements, text, colors, and composition |
| Downloads and analyzes ad videos using Gemini AI for scene-by-scene creative 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:
TikTok matches advertiser names exactly and case-sensitively — try the registered business name rather than the brand (e.g.
Anyspherefor Cursor)The advertiser may not have delivered ads in markets covered by TikTok's public library
Video Analysis Not Working:
Confirm you have a valid Google Gemini API key in your
.envfilePass
ad_idrather thanmedia_url. Avideo_urlcopied from an earlier search response has almost certainly expired
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 TikTok 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).
Why does searching a brand name return nothing?
TikTok's ad library indexes advertisers by registered business name with exact, case-sensitive matching. Search the legal entity (e.g. Anysphere) rather than the product name (Cursor).
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 TikTok 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 TikTok ads. Download and analyze ad images (cover frames and static creatives) 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_tiktok_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?
The annotations already indicate read-only and non-destructive behavior. The description adds that it downloads and analyzes images, uses caching for cost-efficiency, and extracts specific content types. It doesn't contradict annotations and offers useful operational context beyond the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the 'REQUIRED' label and core purpose. It lists valuable details (caching, what to extract) without repetition. The structure is efficient and each sentence adds 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?
For a simple image-analysis tool, the description covers the main functionality, usage context, and caching behavior. It does not describe return format, but the list of extracted elements gives a strong hint. Combined with annotations and sibling context, it's reasonably complete, though a brief note on output or error handling would improve it.
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 no descriptions (0% coverage), and the tool description only indirectly refers to media_url as the image URL. It does not explain the purpose or effect of ad_id or brand_name parameters. Since the description fails to compensate for the missing schema information, the agent gets little additional meaning for these parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's function: downloading and analyzing ad images from TikTok ads. It lists specific extractable elements (visual, text, colors, people, brand, composition) and distinguishes from sibling tools by focusing on images rather than videos. It leaves no ambiguity about the resource and action.
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 'REQUIRED for analyzing images from TikTok ads' and instructs to use it for every image URL from search_tiktok_ads. It provides strong when-to-use guidance, though it doesn't explicitly mention alternatives or when-not-to-use. The context is clear and compelling.
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 TikTok. Downloads and analyzes ad videos using Gemini's video understanding to extract the hook, scene-by-scene storytelling, on-screen text, audio/voiceover, pacing and brand messaging. ALWAYS pass ad_id — TikTok CDN URLs are signed and expire within minutes, and ad_id lets the server fetch a fresh URL and cache results stably across sessions. Uses intelligent caching for efficiency.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | No | ||
| media_url | No | ||
| brand_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, and the description adds substantial behavioral context: it downloads and processes videos via Gemini, extracts specific narrative elements, notes that TikTok CDN URLs expire quickly, and explains the caching strategy for stability. This goes well beyond the annotations and gives the agent a clear model of what happens during invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with 'REQUIRED', efficiently convey purpose, extraction details, parameter guidance, and caching. Every sentence adds value with no redundancy 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?
For a tool with no output schema, the description covers the core functionality, critical parameter usage, processing details, and caching behavior. The only notable gap is the roles of media_url and brand_name, which leaves some cross-parameter scenarios ambiguous. Overall, it is reasonably complete for an agent to invoke successfully.
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 0% description coverage, and the description compensates for only one of three parameters: ad_id is thoroughly explained with its signed-URL rationale. However, media_url and brand_name are left undefined, and the relationship between ad_id and media_url is not clarified. This partial coverage earns a mid-range score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool analyzes TikTok video ads, with a specific verb ('analyzing') and resource ('video ads from TikTok'). It enumerates the specific aspects extracted (hook, scene-by-scene storytelling, on-screen text, audio/voiceover, pacing, brand messaging), which distinguishes it from sibling tools like analyze_ad_image.
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 opening 'REQUIRED for analyzing video ads from TikTok' frames when to use the tool. It also gives a critical usage instruction ('ALWAYS pass ad_id') with a clear rationale. However, it does not explicitly mention when not to use it or name alternatives, though the scope restriction to video ads and the presence of analyze_ad_image imply the boundary.
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_tiktok_ad_detailsARead-only
Get detailed information about a specific TikTok ad including the full creative, landing page, country targeting, engagement metrics and a fresh playable video URL. Use this with an ad_id from search_tiktok_ads. Essential for analyzing ad content 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?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is clear. The description adds behavioral context by promising a 'fresh playable video URL' and detailing what information the response contains (creative, landing page, country targeting, engagement metrics). No contradictions found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences: the first states the function and the returned data categories, the second provides usage context. There is no redundant wording or unnecessary detail, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only lookup, the description adequately sets expectations by listing the output content categories and linking to the appropriate sibling search tool. No output schema exists, but the enumerated detail fields are sufficient for an agent to understand what the tool provides.
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 zero description coverage for the single parameter ad_id, so the description must compensate. It does so by explaining the provenance ('from search_tiktok_ads') and the purpose (identifying a specific TikTok ad), which gives the agent enough context to provide a valid 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 uses a specific verb ('Get detailed information') and identifies the exact resource ('a specific TikTok ad'), while enumerating concrete data categories (full creative, landing page, country targeting, engagement metrics, playable video URL). It clearly distinguishes itself from the sibling search_tiktok_ads by specifying that it operates on an ad_id rather than performing a 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 this tool: 'Use this with an ad_id from search_tiktok_ads' and calls it 'Essential for analyzing ad content and extracting media URLs for visual analysis.' It does not explicitly mention alternatives or exclusions, but the context is clear enough for an agent to select it appropriately.
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_tiktok_adsARead-only
Search TikTok's public Ad Library for the ads an advertiser is running. Use the registered advertiser name (exact, case-sensitive — e.g. 'Anysphere', not 'Cursor'), or a keyword to discover ads by topic. Returns ad ids, run dates, spend/impression bands and media URLs. For complete analysis of visual elements, colors, design, or creative content, you MUST also use analyze_ad_video (passing ad_id) or analyze_ad_image on the media returned by each ad.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds useful behavioral context beyond those annotations: exact case-sensitive matching, the public nature of the Ad Library, and that spend/impressions are returned as bands, not exact figures. No contradiction with 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, each earning its place: purpose, usage modes with an example, and return values plus required companion tools. It is front-loaded and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explicitly lists return fields (ad ids, run dates, spend/impression bands, media URLs) and directs to analyze tools for visual analysis. It could mention pagination behavior via cursor/limit, but the description is otherwise complete for a search tool with good annotations.
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 0% description coverage, so the description must compensate. It provides critical semantics for the primary parameter 'query', explaining it can be an exact advertiser name or a keyword, and highlights case sensitivity. However, it doesn't explain 'limit' or 'cursor', but these are standard pagination parameters and the query guidance is the key missing piece.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Search TikTok's public Ad Library for the ads an advertiser is running.' It also lists the return fields (ad ids, run dates, spend/impression bands, media URLs), distinguishing it from siblings like analyze_ad_video and analyze_ad_image.
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 to use the exact registered advertiser name (case-sensitive) or a keyword, and names appropriate alternatives: 'For complete analysis ... you MUST also use analyze_ad_video (passing ad_id) or analyze_ad_image.' This gives clear context for when to use this tool versus others, though it doesn't explicitly state when not to use it.
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_tiktok_ad_details - First observed
search_cached_media - First observed
search_tiktok_ads
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose: search finds ads, get details retrieves metadata, analyze tools process video or image content, and cache tools manage storage. No two tools overlap in function.
All tool names follow a consistent verb_noun snake_case pattern: search_tiktok_ads, analyze_ad_video, cleanup_media_cache, etc. The naming style is uniform and predictable.
With 7 tools, the set is well-scoped for TikTok ad search, analysis, and cache management. Each tool earns its place without redundancy or bloat.
The surface covers the full workflow: searching ads, retrieving details, analyzing video and image creatives, and managing cached results. No obvious missing operations are apparent.
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.
Every ad an advertiser runs on Google, from the public Ads Transparency Center. Unofficial tool.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceSearches and analyzes competitor ads and content across Meta, Google, Instagram, TikTok, and YouTube with AI-powered creative analysis and cross-platform brand discovery.1-
- AlicenseAqualityDmaintenanceEnables to search, analyze, and export Douyin (TikTok China) video and user data, including interaction metrics, content length, and keyword trends.823MIT
- AlicenseAqualityBmaintenanceEnables searching and analyzing Facebook's public ads library for any brand, including ad images, text, and video analysis.824 npm299MIT
- AlicenseAqualityCmaintenanceEnables searching and analyzing LinkedIn's public ad library for any company, including ad creatives, targeting, and competitive insights. Supports image and video analysis, company comparisons, and detailed ad lookups via natural language.76 npm2MIT