Skip to main content
Glama
mcp-meta-ad-library-monitor

mcp-meta-ad-library-monitor

Find Meta Ads

find_meta_ads
Read-onlyIdempotent

Search Meta Ad Library for a company's Facebook and Instagram ads, returning one row per ad with creative text, headlines, dates, surfaces, and snapshot URLs. Coverage varies by region.

Instructions

Search the Meta Ad Library for a company's ads through Facebook's sanctioned Graph API and return ONE FLAT ROW PER AD with creative text, headline, delivery dates, the Meta surfaces it ran on and Meta's permanent snapshot URL for the rendered ad. COVERAGE IS NOT UNIVERSAL: the Ad Library holds all ads only in the EU and only political and issue ads elsewhere, so a commercial advertiser outside the EU is legitimately absent and every row carries a coverage note saying what the search could have found. Requires the caller's own Meta app access token, as the metaAccessToken argument or the META_ACCESS_TOKEN environment variable. Use it to check whether a company advertises on Facebook and Instagram right now or to pull a creative history; each call is a point in time read, so monitoring means calling it on a schedule and comparing rows. Not for organic posts or follower counts, which the brand presence mappers cover. Impressions and spend exist for political ads only and arrive as bands, so a null there is not zero spend. Read only; requires an APIFY_TOKEN and consumes Apify credits per call.

Input Schema

NameRequiredDescriptionDefault
maxAdsNoHow many ad rows to return per company. This is a cost dial, not a change of answer: the row always reports how many ads matched before the cap.
ad_typeNoALL returns every ad the Ad Library holds for those countries. POLITICAL_AND_ISSUE_ADS narrows to the political archive, which is the only archive that carries impressions and spend, and which requires a verified identity on your Meta account.
skipCacheNoDefault false: a successful lookup is cached for seven days and reused, which costs nothing on a repeated run. Set true to force a fresh fetch.
media_typeNoNarrow to a creative format. Useful for a creative teardown where you only care about video, and irrelevant for a simple "are they advertising" check.
company_nameNoStrongly recommended here. Meta advertiser search is a fuzzy text search over page names, so the company name is what the identity gate compares a matched page against. Without it the gate falls back to the domain stem, which is weaker.
company_domainNoBare company domain, for example gymshark.com. Used to derive the advertiser search term when no company name is given, and used by the identity gate to check that a matched advertiser page really is this company.
metaAccessTokenNoYOUR OWN Meta app access token, free to create at developers.facebook.com. Required unless the server was started with the META_ACCESS_TOKEN environment variable, which keeps the token out of the chat transcript; the Ad Library API is not open, so with neither the call returns an error before any Apify run starts. Political and issue ad data additionally requires a verified identity on your Meta account, which is a Meta requirement.
ad_active_statusNoWhether to return currently running ads, stopped ads, or both. ACTIVE is the default because a currently running ad is the buying signal; ALL is what you want for a creative history or a competitive teardown.
ad_reached_countriesNoWhich country audiences to search. This parameter is REQUIRED by Meta and a request without it fails outright. The EU set is where the Ad Library covers ALL ads rather than only political ones, so it is the default.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changedv1.1.1
    • removedInput schema / additionalProperties
      Removed value: -false
    • changedInput schema / properties / ad_active_status / description
      Previous value: -"Whether to return currently running ads, stopped ads, or both. ACTIVE is the default because a currently running ad is the buying signal; ALL is what you want for a creative history or a competitive teardown. Sent as a string for Clay compatibility."New value: +"Whether to return currently running ads, stopped ads, or both. ACTIVE is the default because a currently running ad is the buying signal; ALL is what you want for a creative history or a competitive teardown."
    • changedInput schema / properties / ad_reached_countries / description
      Previous value: -"Which country audiences to search. This parameter is REQUIRED by Meta and a request without it fails outright. The EU set is where the Ad Library covers ALL ads rather than only political ones, so it is the default. Sent as a string for Clay compatibility."New value: +"Which country audiences to search. This parameter is REQUIRED by Meta and a request without it fails outright. The EU set is where the Ad Library covers ALL ads rather than only political ones, so it is the default."
    • changedInput schema / properties / ad_type / description
      Previous value: -"ALL returns every ad the Ad Library holds for those countries. POLITICAL_AND_ISSUE_ADS narrows to the political archive, which is the only archive that carries impressions and spend, and which requires a verified identity on your Meta account. Sent as a string for Clay compatibility."New value: +"ALL returns every ad the Ad Library holds for those countries. POLITICAL_AND_ISSUE_ADS narrows to the political archive, which is the only archive that carries impressions and spend, and which requires a verified identity on your Meta account."
    • changedInput schema / properties / maxAds / description
      Previous value: -"How many ad rows to return per company. This is a cost dial, not a change of answer: the row always reports how many ads matched before the cap. Sent as a string for Clay compatibility."New value: +"How many ad rows to return per company. This is a cost dial, not a change of answer: the row always reports how many ads matched before the cap."
    • changedInput schema / properties / media_type / description
      Previous value: -"Narrow to a creative format. Useful for a creative teardown where you only care about video, and irrelevant for a simple \"are they advertising\" check. Sent as a string for Clay compatibility."New value: +"Narrow to a creative format. Useful for a creative teardown where you only care about video, and irrelevant for a simple \"are they advertising\" check."
    • changedInput schema / properties / metaAccessToken / description
      Previous value: -"YOUR OWN Meta app access token, free to create at developers.facebook.com. REQUIRED: the Ad Library API is not open. Political and issue ad data additionally requires a verified identity on your Meta account, which is Meta requirement and not ours. Marked secret, so the value never renders on this page."New value: +"YOUR OWN Meta app access token, free to create at developers.facebook.com. Required unless the server was started with the META_ACCESS_TOKEN environment variable, which keeps the token out of the chat transcript; the Ad Library API is not open, so with neither the call returns an error before any Apify run starts. Political and issue ad data additionally requires a verified identity on your Meta account, which is a Meta requirement."
    • changedInput schema / properties / skipCache / description
      Previous value: -"When \"false\" (default) a successful lookup is cached for seven days and reused, which costs you nothing on a repeated run. Set \"true\" to force a fresh fetch. Sent as a string for Clay compatibility."New value: +"Default false: a successful lookup is cached for seven days and reused, which costs nothing on a repeated run. Set true to force a fresh fetch."
  2. First observedv1.0.1

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/open-world, but the description adds substantial non-structural context: coverage is not universal (EU vs political-only elsewhere, with coverage notes on every row), the caller must supply their own Meta app token or META_ACCESS_TOKEN, political data needs a verified identity, Apify credits are consumed, null impressions/spend mean 'not reported' rather than zero, and each call is a point-in-time read. That is exactly the behavioral burden the annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It leads with purpose and return shape, then coverage caveats, then auth, then usage, then exclusions — a sensible priority order with essentially no filler sentences. It is dense and long, and a few clauses (e.g., restating the EU coverage rule) could be tightened, which keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 9 parameters, no required fields, no output schema, and a complex external API, the description carries everything an agent needs: what a row contains, the coverage trap that produces false negatives, token/credit prerequisites, idempotency via caching, and the point-in-time nature. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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

Schema coverage is 100% with rich per-parameter descriptions, so the baseline is 3. The description still adds cross-cutting meaning over the schema: it explains that the row always reports total matches before the maxAds cap, that caching makes repeated runs free, and that ad_reached_countries is what determines whether coverage is universal or political-only.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence gives a specific verb (search), a specific resource (Meta Ad Library / Facebook Graph API), and even the return shape (one flat row per ad with named fields), so an agent knows exactly what it gets back. It has no siblings to disambiguate against, so nothing is left for inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the two legitimate uses ("check whether a company advertises... right now or to pull a creative history"), explains the monitoring pattern (call on a schedule and diff rows), and explicitly excludes organic posts and follower counts by naming the mappers that cover them. That is when-to-use, how-to-use repeatedly, and when-not-to-use in one place.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools