Research Meta Ads
Published by manifoldmcp in marketing-skills
What this skill does
When the user wants to research ads on Meta (Facebook and Instagram), for named competitors or across a whole category. Reads the Meta ad library by page or keyword, ranks the ads by how long they have run, reads the text, video transcripts and landing pages of the long-runners, sets recent tests apart, and hands back a table per competitor or a swipe file grouped by angle and offer. Also use when the user mentions the Facebook or Meta ad library, Instagram ads, what ads a brand runs on Facebook
Add Research Meta Ads to your agent
Review the source and files first. When you are ready, copy the prompt instruction or use the CLI command supported by your environment.
Install with a prompt
Paste this into a compatible coding agent:
add this skill "research-meta-ads" from https://github.com/manifoldmcp/marketing-skillsInstall with the CLI
Run this command in a controlled environment after reviewing the repository:
npx skills add https://github.com/manifoldmcp/marketing-skills --skill research-meta-adsSkill instructions
Research Meta ads
What advertisers pay to show on Facebook, Instagram, Messenger and Audience Network, read from the one Meta ad library: for one or more named competitors, or for a whole category by keyword so it catches advertisers the user never named. Each ad comes with its dates, offer, hook and the page it sends people to. It ends in a table per competitor or a swipe file grouped by angle, long-runners first, because an ad that keeps running is the closest thing the library has to a result.
Connector check
This skill runs on the manifold MCP server. Before the first step, confirm that its tools are available: look for ads_get_advertiser_ads, ads_search_ads and ads_get_ad (hosts often add a prefix, for example mcp__manifold__ads_get_advertiser_ads).
- If no manifold tool is there, stop and tell the user: "This needs the Manifold connector. If you installed the Manifold plugin, connect Manifold on the plugin's Connectors tab (Customize > Plugins in Claude), run
/mcpin Claude Code, or runcodex mcp login manifoldin Codex. Otherwise add the remote MCP serverhttps://mcp.manifoldmcp.com/mcpand sign in: in Claude or ChatGPT as a custom connector, in Claude Code withclaude mcp add --transport http manifold https://mcp.manifoldmcp.com/mcpand then/mcp. Other clients: https://www.manifoldmcp.com/docs/clients." Do not answer from memory instead. - If other manifold tools are there but the
ads_*tools are not, the ads group is switched off on the app's Tools page (https://www.manifoldmcp.com/docs/authentication#turn-tool-groups-off). Say so; this skill needs it. - Video ads use
facebook_get_transcript(andfacebook_get_posts,instagram_get_reelsandinstagram_get_transcriptwhen the library holds no video), and landing pagesseo_get_page. If one of those groups is off, skip its step, say which, and work from the ad text.
Product context
Before the first question, look for the product marketing context file: .agents/product-marketing.md (in older setups .claude/product-marketing.md or product-marketing-context.md). If it exists, read it and take every input it answers (the competitors, their Facebook pages and domains, the category and its words, and the market) from it; ask only for what it lacks. If it does not exist and the job needs more than two answers about the business, offer manifold-get-started first.
Inputs to settle first
- The job: named competitors' ads, or the best ads across a category (a swipe file). Take it from the request; a request for both runs the competitors first and the category around them second.
- Competitors: one to five, each with its Facebook page name or page id and its domain.
- Keywords (category job): three to five words the category's ads use: the product ("meal kit"), the problem ("dinner ideas"), the offer ("first box free") and the leading brand names. Ask for two; add the rest from the first pull.
- Running now or all:
active_only: truekeeps only ads running today. Default on for a category; for competitors, on when the user wants only what runs now. - Market: default every country. Pass
country(a two-letter code) when one market matters. - Depth: competitors, up to three pages each and the ten longest-running creatives read in full. Category, 30 ads in the file.
- Budget: say it before starting; pass
max_creditsif the user gave a budget.- Competitors: about 9 credits each: up to three list pages, one keyword search when the page name matches the wrong page, and five video transcripts. Three competitors cost about 27.
- Category: about 20 credits: four keywords at two list pages each and ten video transcripts.
- Add 1 credit for each ad read with
ads_get_adwhere a row has no text.
Steps
- Resolve each page (competitors). A name can match the wrong page: if the first rows are someone else's, take the page id from
advertiser_idon a row of the right brand (ads_search_adswithplatform: "facebook"and the brand name, 1 credit, finds one) and pass that instead. - Pull the ads. Both tools take
platform: "facebook", 1 credit a page, withcountrywhen one market matters andactive_onlyas settled.- Competitors:
ads_get_advertiser_adswith the page name or id asadvertiser, paging withmeta.cursorup to three pages while new rows come back. - Category:
ads_search_adsfor each keyword, two pages. Keyword search matches the ad's text, so a keyword with two meanings brings in other categories: drop those rows.
- Competitors:
- Rank by survival. Dedupe on
id, then group ads with the same body or headline into one creative and count its variants: many variants of one creative is a winner being scaled. Work out days running for each as the winner rules set out: Meta is the one library that marks a running ad, so still running isactive: true, and days running is today minusfirst_shownwhile it runs. Sort by days running. In a category file, cap each advertiser at five creatives, then fill the file with the long-runners first and the recent ads marked as tests. - Read the long-runners. Follow reading an ad, on each competitor's ten longest-running creatives or every ad in the category file:
- The text: Meta rows usually carry
body;ads_get_adwith the row'sidonly where it is missing (1 credit). The hook is the first line of the body. - The words of a video ad:
facebook_get_transcripton the ad'surl(1 credit), for the five best video ads per competitor or the ten best in a category file. On NoData (1 credit, do not retry), find the same video on the advertiser's own account,facebook_get_postsorinstagram_get_reelswhen it ran on Instagram (1 credit a page), matched on the caption, and transcribe that post withfacebook_get_transcriptorinstagram_get_transcript(a reel up to two minutes long). The first spoken sentence is the hook. - The landing page:
seo_get_pageon each distinctdestination_url(free):title,h1andh2show the offer the page leads with.
- The text: Meta rows usually carry
- Tag each ad from the ad itself:
- Angle: pain, outcome, social proof, comparison, founder story, demo, objection, offer-led.
- Offer: free trial, discount, free shipping, bundle, guarantee, lead magnet, demo, none.
- Proof: the number, review, logo or testimonial the ad leans on, if any.
- Format:
formatfrom the row, plus video length or carousel where the text shows it, andplacements(Facebook, Instagram or both). - CTA: the
ctafield, or the call in the last line when it is null.
- Set the recent ones apart. Ads first shown in the last 14 days are current tests. List them apart: they show where an advertiser is heading, not what works.
- Deliver, with the reminder at the top that the library shows what runs, not what converts.
- Competitors: a table per competitor: ad link, format, placements, first shown, days running, still running, variants, headline, hook, angle, offer, CTA, landing page title, and the published
impressionsandspendranges where present. Under each table, five lines: how many ads run now, their three proven creatives and why they likely work, the angles they repeat, their core offer, and their current tests. - Category: the swipe file grouped by angle. Per ad: advertiser, library link, format, days running, still running, variants, hook, offer, CTA, landing page title. Then a summary table: angle, ads, long-runners, advertisers using it, most common offer. Name the two or three angles with the most long-runners (proven in the category) and any angle no advertiser uses (an opening, or a dead end: test it small).
- End with what the user can take from it.
- Competitors: a table per competitor: ad link, format, placements, first shown, days running, still running, variants, headline, hook, angle, offer, CTA, landing page title, and the published
Judgment
- No ads found is not proof of no ads. Try another spelling, the page id, the parent brand, or a product's own page; big companies run ads from several pages.
- An ad missing from a second pull a week later has probably stopped: the library keeps few stopped ads outside the EU, so a Meta list is mostly what runs now.
- The library names surfaces, not countries:
placementssays where an ad ran andcountriesstays empty. - An agency or a reseller running ads for the competitor shows under its own page. Check
destination_urlbefore counting an ad as the competitor's. - The same offer across every ad is the advertiser's core offer. An offer that appears in one ad only is a test.
- Never copy a competitor's creative, footage, claims or words. Take the structure: the hook pattern, the angle, the offer type.
- Proven angles are table stakes. The user's ads need them and something the category does not say yet; write-ad-brief adds that from customer language.
- Keyword search is ranked by the library and never complete. A second pass with other words costs little and is cached for 24 hours.
- Meta ads tend to show the problem in the first seconds; LinkedIn ads in the same category lead with a job-title hook and a proof point. For a B2B category, research-linkedin-ads is the other half of the picture.
- Credits and handoff follow the ad libraries notes: say the estimate first, pass
max_creditson a budget, and never buy, launch or pause ads. The server keeps no state; a weekly rerun of a competitor read is monitor-competitors. - Every platform at once. When the user wants all of one competitor's ads, or a category's, across platforms, run research-meta-ads, research-google-ads, research-tiktok-ads and research-linkedin-ads in turn, then merge the tables by angle and offer. The same angle running on two platforms is a stronger signal than either alone. For a one-page view of every library, tear-down-competitor reads one page from each.
Related skills
- The same read on the other libraries: research-tiktok-ads, research-linkedin-ads, research-google-ads.
- A brief for the user's own ads from these long-runners: write-ad-brief.
- Where paid ads fit in the plan and what to spend: create-paid-ads-plan.
- Hooks from organic Instagram reels: find-instagram-hooks.
- Creators who make the UGC-style ads in the file: find-ugc-creators.
- Everything about a competitor beyond its ads: tear-down-competitor.
- New ads from the same competitors flagged every week: monitor-competitors.
Files included
- SKILL.md

