MCP Server

Ad Radar

dev.ad-radar/ad-radar
Marketing & Advertising Search & Research Public & reachable MCP 2025-11-25

What this MCP does

Searches Meta ad library data, analyzes winning hooks and patterns, and generates swipe or analysis prompts for competitor ads.

advertiser_hooks
Advertiser hooks
The hooks, hook mechanisms and angles an advertiser uses most, aggregated over all of its ads: the pattern worth swiping, not a single ad. advertiserId comes from search_ads.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['advertiserId'], 'properties': {'advertiserId': {'type': 'integer'}}, 'additionalProperties': False}
get_ad
Ad details
Full record of one ad: headline, body, CTA, full transcript, metrics, media (public URLs), links (post, Ad Library, landing page, board). The transcript is in English: when the ad runs in another language (e.g. Spanish), transcript is the English translation, translatedFrom names the language and transcriptOriginal holds the original script. Text fields are null when they aren't available for that ad; the links always point to the original.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['key'], 'properties': {'key': {'type': 'string', 'maxLength': 80, 'description': 'adKey ("meta:<id>"), a bare id, a Meta Ad Library id or "id:<internal id>"'}}, 'additionalProperties': False}
get_swipe_prompt
Swipe prompt
A ready-to-run prompt for one ad. kind='swipe' = rebuild the ad for your product: map its beats, check the fit, write a full version with the same structure, plus alternative hooks. kind='analysis' = why the ad works (audience, funnel, psychology, weak spots) and how to apply it to your business. Pass product to fill it in, then follow the returned prompt.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['key'], 'properties': {'key': {'type': 'string', 'maxLength': 80, 'description': 'adKey ("meta:<id>"), a bare id, a Meta Ad Library id or "id:<internal id>"'}, 'kind': {'enum': ['swipe', 'analysis'], 'type': 'string', 'default': 'swipe'}, 'niche': {'type': 'string', 'maxLength': 300, 'description': 'Angle or audience to lean into (swipe only)'}, 'product': {'type': 'string', 'maxLength': 500, 'description': 'Your product, the one the prompt is for'}, 'annotate': {'type': 'boolean', 'default': True, 'description': 'Mark the copy blocks inside the script when available (swipe only)'}}, 'additionalProperties': False}
list_taxonomy
Taxonomy
The board's taxonomy dimensions (awareness, angle, hook_pattern, vformat, pformat, landing...) with their valid values: the slugs to use in the tags filter of search_ads.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
search_ads
Search ads
Search the Ad Radar board: competitor ads from the Meta Ad Library, with the same filters as the board. By default only ACTIVE ads, sorted by score. Returns compact rows with an adKey: call get_ad for the full record and get_swipe_prompt for a ready-to-run prompt. Call list_taxonomy first for valid tag values. headline and body can be null when the ad's text isn't available: use the tags to understand it. spendEstimate is an ESTIMATE based on engagement, not real spend.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'page': {'type': 'integer', 'default': 1, 'maximum': 200, 'minimum': 1}, 'sort': {'enum': ['score', 'reactions', 'rpd', 'days', 'recent'], 'type': 'string', 'default': 'score'}, 'tags': {'type': 'object', 'description': 'Taxonomy filters: { "<dimension>": ["slug", ...] }. Different dimensions are ANDed, slugs within one are ORed', 'additionalProperties': {'type': 'array', 'items': {'type': 'string'}}}, 'tier': {'enum': ['winner', 'rising'], 'type': 'string', 'description': 'winner = top 10% by score and running 21+ days; rising = growing. Every ad on the radar has at least $50k estimated spend'}, 'limit': {'type': 'integer', 'default': 15, 'maximum': 50, 'minimum': 1}, 'media': {'enum': ['video', 'image', 'all'], 'type': 'string', 'default': 'all'}, 'query': {'type': 'string', 'maxLength': 300, 'description': 'Free text over headline, body, advertiser name and transcript'}, 'minDays': {'type': 'integer', 'minimum': 0, 'description': 'Minimum days running'}, 'categories': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Advertiser vertical, e.g. health, pet'}, 'advertiserId': {'type': 'integer'}, 'includePastWinners': {'type': 'boolean', 'default': False, 'description': 'Also include winners that are no longer running (archive)'}}, 'additionalProperties': False}
winning_patterns
Winning patterns
The 'What to do now' block of the analytics page: for each taxonomy value, how many times more often it produces winners than average (lift), with adoption (ads, advertisers) and example ads. doThis = above average, lower = below.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'format': {'enum': ['all', 'video', 'image'], 'type': 'string', 'default': 'all'}}, 'additionalProperties': False}
Added
winning_patterns
Oct. 5, 2026, 2:40 a.m.
Added
advertiser_hooks
Oct. 5, 2026, 2:40 a.m.
Added
list_taxonomy
Oct. 5, 2026, 2:40 a.m.
Added
get_swipe_prompt
Oct. 5, 2026, 2:40 a.m.
Added
get_ad
Oct. 5, 2026, 2:40 a.m.
Added
search_ads
Oct. 5, 2026, 2:40 a.m.