Skip to main content
Glama
thenavidm

Facebook Ad Library MCP

by thenavidm

Facebook Ad Library MCP Server & CLI

Stars License npm Downloads CI YouTube X LinkedIn

Facebook Ad Library MCP server and CLI for Claude Code, Codex and AI agents. 9 tools that read every ad running on Facebook, Instagram, Messenger, Threads and Audience Network, for any advertiser in any country, free and with no API key.

One install gives you both surfaces, the same 9 tools under the same names, reading one array of tool definitions so they cannot drift apart.

Meta's Ad Library is the largest public archive of advertising creative in the world, and it is completely open. This puts it inside your agent.

You: What is Ridge testing right now?

Claude: They have 34 ads live. The oldest has run 214 days: a single static image, "The last wallet you will buy", straight to a product page. The eleven newest are all video with a founder talking to camera, and every one of them points at a quiz funnel instead. They are moving from product-led to problem-led, and the old ad is still running because it still works.

Built by Navid Moazzez. Built on Slipway, which turns one definition of each tool into the MCP server and the CLI.

Two ways to use it

Command line

facebook-ad-library-cli runs every tool as a command. Agents that run commands, like Claude Code, Codex and OpenCode, use it on their own, and you can type the same commands in a terminal, a script or a cron job:

facebook-ad-library-cli                                   # every command, one line each
facebook-ad-library-cli list-advertisers --query ridge    # find a brand's Page ID
facebook-ad-library-cli search-ads --page-id 123456789 --country US
facebook-ad-library-cli search-ads --query "wallet" --json --select ads.library_id,ads.days_active
facebook-ad-library-cli ad-library-url --query "wallet" --country GB
facebook-ad-library-cli <command> --help                  # what any command takes

Every command reads a public archive, so nothing needs --confirm. --json gives JSON, --compact puts it on one line, --select keeps only the fields you name, and --agent is compact JSON with no prompts. Exit codes are 0 ok, 1 an unexpected error, 2 usage, 3 not found, 4 a rejected key, 5 upstream, 7 out of credits and 10 a backend that is not set up, so a script branches on the number.

facebook-ad-library-cli schema <command> prints the exact JSON Schema an MCP client receives for that tool.

MCP server, for your AI app

facebook-ad-library-mcp is what Claude Code, Claude Desktop, Cursor and the rest launch. You never run it by hand:

claude mcp add facebook-ad-library -- npx -y @thenavidm/facebook-ad-library-mcp-cli

In Claude Desktop, the .mcpb extension installs on a double click. Section 4 has every other client.

Which one

Where you are

What you can reach

An agent that can run shell commands, like Claude Code or Cursor

Both. The CLI is the cheaper one: it costs nothing until you type it

claude.ai, the Claude Desktop chat tab, or a phone

The server only. There is no shell to run a command in

A terminal, a script, cron or CI

The CLI only. There is no MCP client in a shell

They are the same program reading the same tool definitions, so anything one can do, the other can.

What each costs

Both surfaces are the same program with the same 9 tools. The difference is when the model pays for them. Measured in Claude Code:

Cost

MCP server

CLI

Every message, with every tool loaded

3,900 tokens

nothing

Every message, Claude Code's default

740 tokens

nothing

When the Ad Library comes up

nothing more, or the tools it picks

3,400 tokens for SKILL.md, once

20 messages with the Ad Library in 1, every tool loaded

78,000 tokens

3,400 tokens

Claude Code's tool search is on by default: it sends only the tool names and the server instructions, and loads a tool's full definition when the model reaches for it. An app that loads every tool up front pays the first line on every message, whether the Ad Library comes up or not. With the skill added, Claude Code also lists its one-line description, about 170 tokens.

To spend less, turn the server off when you are not using it, which in Claude Code is the /mcp panel. Or install the CLI and add the server on the days it earns its place.

Measured on 2026-10-05 with Claude Code 2.1.286 on Claude Opus 5.5: one short prompt with and without the server connected, once with ENABLE_TOOL_SEARCH=false and once with the default, the difference read from the API's own usage figures. SKILL.md was measured the same way. Other apps and models count tokens a little differently.

Against 0.5.1, measured the same day: every tool loaded costs 3,894 tokens instead of 4,190, tool search 737 against 735, within what two runs of the same build vary by, and SKILL.md the same within 4 tokens. In Codex 0.159.3 on gpt-6.1-sol, the same task, "find the command that turns a brand name into the advertiser's Facebook Page ID, and the flags it requires", read a median of 82,997 input tokens on 0.6.0 against 83,018 on 0.5.1 over the CLI, and 45,167 against 45,180 over MCP, five runs each. Codex prints the tool list with a script and reads it, 5,839 tokens on both versions.

Related MCP server: Meta Ads MCP Server

Features

Every tool is both a command and an MCP tool, with the same name. The command is the tool name with dashes.

Capability

CLI command

MCP tool

Search ads by keyword or advertiser

facebook-ad-library-cli search-ads

search_ads

Find a brand's Page ID

facebook-ad-library-cli list-advertisers

list_advertisers

Read one ad in full, or look at its images

facebook-ad-library-cli get-ad / view-ad-creative

get_ad / view_ad_creative

Transcribe a video ad

facebook-ad-library-cli transcribe-ad

transcribe_ad

See what an advertiser started and stopped

facebook-ad-library-cli diff-advertiser

diff_advertiser

EU spend, reach and demographics

facebook-ad-library-cli get-eu-transparency

get_eu_transparency

A link a person can open

facebook-ad-library-cli ad-library-url

ad_library_url

Check your setup

facebook-ad-library-cli doctor

backend_status

All nine are in section 6.

Contents

#

Section

What is in it

1

What you can ask it

Real prompts, not features

2

Quick install

One command, no account

3

Setup

Optional, and why you probably do not need it

4

Connect your client

Every client, copy and paste

5

Check it worked

doctor, and what actually fails

6

Tools

All nine, and what each reaches

7

How it works

Why it returns more than a scraper

8

Limits, honestly

What no source can tell you

9

FAQ

Including what an MCP server is

1. What you can ask it 💬

  • "What ads is Ridge running right now, and which has been live longest?"

  • "Show me every hook Athletic Greens is testing this month, grouped by angle."

  • "Compare two competitors: who runs more creative, and who refreshes it faster?"

  • "Find advertisers running cold plunge ads in the UK, ranked by ad count."

  • "Pull every ad from this Page and tell me which landing pages they send to."

  • "What changed for this advertiser since last week?"

  • "Which of these are video and which are static? Give me the video URLs."

  • "This ad has run 8 months. Read the copy and tell me why it works."

  • "What is this German brand spending, and who is paying for it?"

2. Quick install ⚡

Node 22 or newer. Nothing else.

npx -y @thenavidm/facebook-ad-library-mcp-cli --version

The free backend drives a real browser, so install Chromium once:

npx playwright install chromium

That is the whole install. No account, no API key, no credential.

For the CLI as a command you or your agent can run anywhere, install it once:

npm install -g @thenavidm/facebook-ad-library-mcp-cli
facebook-ad-library-cli

3. Setup 🔑

There is nothing to set up. The default backend needs no key and no account.

Everything below is optional, and only worth doing if you hit a specific limit.

Optional: a provider key, for speed and scale

The free backend runs Chromium on your machine, so a search takes 30 to 60 seconds and Meta will rate limit you if you hammer it. Two hosted providers remove both problems for money.

Backend

Roughly

Adds

scrapecreators

$1.88 per 1,000 ads

fast, serverless, transcribe_ad

apify

$3.40 to $5.80 per 1,000 ads

fast, serverless, e-commerce enrichment

Set FBADS_BACKEND and the matching key in your client config. Every tool behaves identically on all three.

Optional: EU spend and reach

Meta's official Ad Library API publishes real spend, impressions and demographics. It is free, and it covers political and issue ads worldwide plus every ad delivered in the EU.

  1. Go to developers.facebook.com and create an app.

  2. Generate an access token for it.

  3. Set it as META_ADS_ARCHIVE_TOKEN.

get_eu_transparency then returns data. Everything else works without it.

4. Connect your client 🔌

The long version, every step with what to do when one fails, is in INSTALL.md.

Claude Code

claude mcp add facebook-ads -- npx -y @thenavidm/facebook-ad-library-mcp-cli@latest

--scope user makes it available in every project rather than the current one.

With a provider key:

claude mcp add facebook-ads \
  -e FBADS_BACKEND=scrapecreators \
  -e SCRAPECREATORS_API_KEY=xxx \
  -- npx -y @thenavidm/facebook-ad-library-mcp-cli@latest

Claude Desktop

The short way: download the .mcpb extension from the latest release and double-click it. It carries its own dependencies, and Claude Desktop asks which backend to use. The free browser backend still needs Chromium installed once with npx playwright install chromium; the scrapecreators and apify backends need only their key.

The long way, if you would rather edit the config yourself:

Platform

Path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "facebook-ads": {
      "command": "npx",
      "args": ["-y", "@thenavidm/facebook-ad-library-mcp-cli@latest"]
    }
  }
}

Tip Claude Desktop does not inherit your shell PATH. If npx is not found, use the absolute path from which npx.

Quit Claude Desktop completely and reopen it.

claude.ai on the web

claude.ai runs connectors from Anthropic's cloud, not from your machine, so it needs a public HTTPS URL.

npx -y @thenavidm/facebook-ad-library-mcp-cli@latest --http --port 8000

Host that somewhere with a public HTTPS URL, then in claude.ai: Customize, Connectors, +, Add custom connector. Paste the URL and click Add. A page from another site is refused unless FBADS_HTTP_ALLOWED_ORIGINS lists it.

Note the free backend needs a real browser, so whatever hosts it must be able to run Chromium. A provider backend is the easier choice for a hosted deployment.

Cursor

.cursor/mcp.json, same JSON shape as Claude Desktop, key mcpServers.

Windsurf

~/.codeium/windsurf/mcp_config.json, key mcpServers.

VS Code

.vscode/mcp.json. The key is servers, not mcpServers, and each entry takes "type": "stdio".

{
  "servers": {
    "facebook-ads": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@thenavidm/facebook-ad-library-mcp-cli@latest"]
    }
  }
}

Codex CLI

~/.codex/config.toml:

[mcp_servers.facebook-ads]
command = "npx"
args = ["-y", "@thenavidm/facebook-ad-library-mcp-cli@latest"]

Gemini CLI

~/.gemini/settings.json, key mcpServers.

Everything else

Any stdio MCP client takes the same three things: the command npx, the args, and an optional env block.

Or let the CLI write the entry, in each client's own format:

npx -y -p @thenavidm/facebook-ad-library-mcp-cli facebook-ad-library-cli install claude-code

It takes claude-code, codex, claude-desktop, cursor, vscode or gemini, and --dry-run shows the change first.

5. Check it worked 🩺

npx -y @thenavidm/facebook-ad-library-mcp-cli@latest doctor

It launches a browser, runs a real search, and tells you whether ads came back.

Symptom

Fix

"Chromium will not launch"

npx playwright install chromium

"Meta served a captcha"

Wait a few minutes, or set a provider key

Empty results on every search

Meta is rate limiting this machine

Server missing from the client

npx not on the client's PATH, use an absolute path

6. Tools 🛠️

Every tool is read-only. This server cannot post, cannot spend, and cannot reach an ad account.

Tool

What it does

search_ads

Keyword search, or every ad from one Page. The main one.

list_advertisers

Resolve a brand name to Page IDs, ranked by ad count.

get_ad

One ad in full: every creative, every copy variant.

diff_advertiser

What an advertiser started and stopped running since last look.

get_eu_transparency

Spend, reach and demographics. EU and political ads only.

transcribe_ad

Speech to text on a video ad. Needs the scrapecreators backend.

backend_status

Which backend is active and whether it costs money.

view_ad_creative

The ad's actual images, so the model can see them rather than only read the copy.

ad_library_url

Turn filters into a URL a person can open and check.

Plus two prompts, competitor-teardown and creative-angles, and two resources so a client can read the config and the Ad Library's own concepts without spending a tool call.

diff_advertiser is the one worth knowing about. Every other tool answers "what is running". That one answers "what changed", which needs a memory of last time. The first call records a baseline.

7. How it works ⚙️

Worth knowing, because it explains what you get back.

The Ad Library is a React app. Meta hands it every ad as structured JSON. The obvious way to scrape it is to let the page render, flatten it to text, and pull the fields back out with regular expressions.

That round trip loses most of the ad. You get one creative instead of the six in the carousel, a redirect instead of the real landing page, and an empty platform list because those render as icons rather than text.

This server reads the JSON the page was already given. Same browser, same cost, no parsing step.

It reads two places, because Meta uses two: the first page of results is embedded in the document, and later pages arrive over the wire as you scroll. Reading only the second is why scrapers return nothing on the first search.

What that buys you, per ad:

Creatives

all of them, with HD and SD video URLs

Platforms

Facebook, Instagram, Messenger, Threads, Audience Network

Destination

the real URL, query string intact

Call to action

SHOP_NOW, from the payload rather than matched against a label list

Pagination

a real cursor, plus Meta's own total result count

Also

page likes, ad format, variant count, EU spend and reach

8. Limits, honestly 🧭

No performance data exists. Conversions, revenue, cost per acquisition, return on ad spend: none of it is public for another advertiser, from any source, at any price.

What you can infer is longevity. An ad running six months is probably working, because advertisers turn off ads that lose money. That is a hypothesis worth acting on, and it is not a measurement. The server's own instructions tell the model not to report it as one.

Spend and reach are usually null. They exist only for ads delivered in the EU, under the Digital Services Act, and for political ads anywhere. A null on a US ecommerce ad is the correct answer, not a bug.

The free backend gets rate limited. It drives a real browser against a public site. If searches start coming back empty, wait. That is also the point where a provider key starts paying for itself.

Creative URLs expire. Meta's CDN links are short-lived. Download what you want to keep, when you find it.

9. FAQ ❓

An MCP server is a standard way to give an AI assistant real tools. Once this is connected, your assistant can search the Ad Library itself instead of you copying results into a chat.

facebook-ad-library-cli is the same program as the MCP server, run as commands. AI agents that run commands, like Claude Code, Codex and OpenCode, use it on their own, and you can type the same commands in a terminal, a script or a cron job. Every tool is a command with dashes, so search_ads runs as facebook-ad-library-cli search-ads.

Use the MCP server in an app with no terminal, like Claude Desktop's chat. Use the CLI anywhere commands run: an agent like Claude Code, Codex or OpenCode, a script or a cron job. The MCP server's tools take up context on every message, and the CLI costs nothing until it runs.

You do not need one. The Ad Library is public and this reads it without signing in to anything.

It is free by default. The free backend runs on your machine. The two provider backends bill per ad and are opt-in.

The free backend launches a real browser and scrolls a page, which takes 30 to 60 seconds. A provider backend answers in about a second, for money.

Only for EU-delivered ads and political ads, through get_eu_transparency. For a US commercial advertiser that number is not published anywhere.

No, and nothing can. You can see which have run longest, which is a reasonable proxy and not the same thing.

It is a catalog ad. Meta fills those tokens per product at delivery. That is the real ad text.

Yes, with --http. The free backend needs Chromium available, and a provider backend is easier to host.

The Ad Library is published deliberately, for transparency, and is open without login. This reads it the way a browser does. You are responsible for your own use.

All of them. Pass any two-letter country code.

It cannot. Every tool reads Meta's public Ad Library, the same pages anyone can open in a browser. Nothing here signs in to an ad account, posts, pays or deletes, so there is no approval step and no read-only switch to set.

The one thing it keeps is diff_advertiser's snapshots of what an advertiser was running, on your own machine, so it can tell you what changed.

With @latest in your client's config, npx fetches the newest version when the client starts the server, so there is nothing to update by hand. A global install updates with npm i -g @thenavidm/facebook-ad-library-mcp-cli.

To remove it, delete its entry from your client's config and restart the client, or run npm uninstall -g @thenavidm/facebook-ad-library-mcp-cli for a global install. The snapshots diff_advertiser keeps live in FBADS_STORE_DIR, or your app data folder, and can be deleted with it.

Environment variables

Credentials, all optional. The default browser backend needs none of them.

Variable

Default

What it does

FBADS_BACKEND

browser

browser (free, drives Chromium), scrapecreators or apify

SCRAPECREATORS_API_KEY

none

For the scrapecreators backend

APIFY_TOKEN

none

For the apify backend

APIFY_ACTOR

lite

full switches to the larger Apify actor

META_ADS_ARCHIVE_TOKEN

none

Unlocks EU spend, reach and demographics. Free from Meta

Tuning.

Variable

Default

What it does

FBADS_HEADED

off

1 shows the browser, to see why a search came back empty

FBADS_HYDRATE_MS

9000

How long to let the Ad Library page load

FBADS_SCROLL_WAIT_MS

4000

Pause between scrolls while collecting ads

FBADS_RETRIES

1

Retries when the browser comes back empty

FBADS_CACHE_DAYS

1

How old a ScrapeCreators cached answer may be. 0 always fetches fresh

FBADS_STORE_DIR

your app data folder

Where diff_advertiser keeps its snapshots

HTTP, for --http only.

Variable

Default

What it does

FBADS_HTTP_PORT

8787

Port

FBADS_HTTP_HOST

127.0.0.1

Interface to bind

FBADS_HTTP_TOKEN

none

Bearer token for the endpoint

FBADS_HTTP_ALLOWED_ORIGINS

none

Comma-separated browser origins allowed to connect; a page from any other site is refused

Slipway's own.

Variable

Default

What it does

FBADS_SURFACE

full

search lists three tools that find, describe and run the rest

FBADS_TOOL_TIMEOUT_MS

none

Give up on any tool after this long

FBADS_DEBUG

0

1 prints debug lines on stderr

Dependencies

Package

License

Why

Slipway

Apache-2.0

the MCP server and the CLI from one definition of each tool

MCP TypeScript SDK

Apache-2.0

the MCP protocol and transports, through Slipway

zod

MIT

tool argument schemas

playwright

Apache-2.0

drives Chromium for the free backend, optional

Questions

Run into a problem or have a question? Open an issue and I will help.

About the author

Navid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. He creates useful free tools, MCP servers and CLIs that creators and founders can use in their own workflows.

Links

If this is useful, star the repo and come say hi on X.

License

MIT. Free to use, modify, and share.

Not affiliated with, endorsed by, or connected to Meta Platforms, Inc.


© 2026 Navid Media. Made with ❤️ by Navid Moazzez.

Available Tools

9 tools
ad_library_urlBuild an Ad Library URLA
Read-onlyIdempotent

Turn a set of filters into the public Ad Library URL, so a person can open the same search in a browser and check the results independently. Useful when a search comes back empty and you need to tell 'no results' apart from 'blocked'.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoKeyword to search for.
countryNoTwo-letter country code. Default US.
page_idNoAdvertiser Page ID, instead of a keyword.
media_typeNo
active_statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/no-open-world, so safety is covered. The description adds real behavioral context beyond that: the output is a human-openable public URL for independent verification, and the tool is a diagnostic fallback. It doesn't mention form/expiry of the URL, but the added context is substantive.

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

Conciseness5/5

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

Two sentences, front-loaded with what the tool produces, followed by the diagnostic rationale. No filler, no repetition of the title or schema.

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

Completeness4/5

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

An output schema exists (the URL) so return values need no explanation, and annotations cover the safety profile. The description supplies purpose plus the key diagnostic rationale, leaving only minor gaps such as whether any filter combination is invalid.

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

Parameters3/5

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

At 60% schema description coverage, three params (query, country, page_id) are documented in the schema and two (media_type, active_status) are covered only by self-explanatory enums. The description adds nothing parameter-specific beyond the generic word 'filters', so the schema does the heavy lifting and the baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb and resource: it 'turns a set of filters into the public Ad Library URL.' That is unambiguous and clearly distinct in kind from the retrieval siblings (search_ads, get_ad), though it never names an alternative tool to contrast against, so it stops short of a 5.

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

Usage Guidelines4/5

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

It gives a concrete usage context — diagnosing whether an empty search means 'no results' versus 'blocked' — which is exactly the situation that selects this tool over search_ads. It provides no explicit when-not-to-use or named alternative, so 4 rather than 5.

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

backend_statusBackend statusA
Read-onlyIdempotent

Which backend is serving requests, whether it costs money per call, and which optional features are available in this configuration. Call this when a tool reports something unavailable, before telling the user it cannot be done.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
backendYes
needs_api_keyYes
tracked_advertisersYes
costs_money_per_requestYes
transcription_availableYes
eu_transparency_availableYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered structurally. The description adds no behavioral traits beyond that (no side effects, auth needs, or rate limits), and the return content it names is already captured by the existing output schema. No contradiction, but limited added value.

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

Conciseness5/5

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

Two tight sentences with no filler. The purpose is front-loaded and the call condition follows immediately, so every clause earns its place.

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 an output schema documenting return values and annotations covering safety, the description only needs to convey purpose and when to invoke it, and it does both. Nothing an agent needs to call a zero-parameter diagnostic 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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies a no-argument diagnostic call.

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 states exactly what the tool reports: the serving backend, per-call cost, and available optional features in the current configuration. This is a distinct diagnostic/config resource that cannot be confused with any ad-related sibling tool, so an agent can identify its role without opening the schema.

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

Usage Guidelines4/5

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

It gives an explicit trigger: 'Call this when a tool reports something unavailable, before telling the user it cannot be done.' That is a clear, actionable condition. It does not name when-not-to-call or alternatives, but the siblings are unrelated ad tools with no overlapping function, so there is little to exclude.

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

diff_advertiserWhat changed for an advertiserA
Read-onlyIdempotent

Compare an advertiser's ads now against the last time this server looked, and report what they started and stopped running. The first call on a Page records a baseline and reports nothing changed, which is expected: call it again later to see movement. This is the only tool here that answers 'what changed' rather than 'what is running'.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many ads to pull for the comparison. Keep it consistent between calls.
countryNoTwo-letter country code. Default US.
page_idYesAdvertiser Page ID to compare. Get it from list_advertisers.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
page_idYes
running_nowNo
tracked_nowNo
no_longer_seenNo
started_runningNo
baseline_createdYes
previously_trackedNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive, open-world behavior, so the description's added value is the baseline/no-op-on-first-call semantics and the dependency on when the server last looked, both genuinely non-obvious. It stops short of anything about snapshot freshness limits, rate limits, or how a large limit affects the diff, so it is strong but not exhaustive.

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

Conciseness5/5

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

Three sentences, front-loaded with the action and outcome, then the baseline caveat, then the sibling differentiation. No filler and nothing buried.

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?

An output schema exists, so return shape need not be explained; the description instead spends its words on the one thing an agent would otherwise get wrong (the empty first diff). For a 3-parameter read tool with full annotation coverage, nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents page_id, limit and country, including the 'keep limit consistent between calls' advice. The description adds no parameter-level detail beyond the comparison framing, which is the expected baseline when the schema does the heavy lifting.

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?

States a specific verb and resource: compare an advertiser's ads against the last snapshot and report what started/stopped. It explicitly positions itself against every sibling with 'the only tool here that answers "what changed" rather than "what is running"', so an agent can route without opening another schema.

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?

Gives the non-obvious usage condition directly: the first call records a baseline and reports no change, so it must be called again later to observe movement. It also states the differentiation from search_ads/list_advertisers-style tools, leaving little to inference.

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

get_adGet one ad in fullA
Read-onlyIdempotent

Fetch a single ad by its Ad Library ID, with every creative, all copy variants, the full destination URL and any transparency data. Use this after search_ads when one ad is worth studying properly.

ParametersJSON Schema
NameRequiredDescriptionDefault
countryNoTwo-letter country code. Default US.
library_idYesThe Ad Library ID, the long number in an ad's URL.

Output Schema

ParametersJSON Schema
NameRequiredDescription
adNo
noteNo
foundYes
library_idNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds content-scope behavior (full creative, all copy variants, transparency data) that helps the agent anticipate result richness beyond what the annotations say.

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

Conciseness5/5

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

Two sentences, zero filler, with the resource and return scope front-loaded before the routing hint. Every clause earns its place.

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 rich annotations, an output schema, and fully documented parameters, the description needs only to state purpose, scope and routing, which it does. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are documented in the schema, including the country default of US. The description reinforces the library_id meaning ("the long number in an ad's URL" is already in the schema) but adds no new syntax or format detail, so baseline 3 applies.

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?

States a specific verb (Fetch) and resource (a single ad by Ad Library ID) and enumerates exactly what is returned: creative, copy variants, destination URL, transparency data. This distinguishes it clearly from search_ads, which retrieves sets rather than one ad in full.

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

Usage Guidelines4/5

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

"Use this after search_ads when one ad is worth studying properly" names the sibling and the condition that selects it, which is real routing guidance. It stops short of an explicit when-not or a note on other siblings like view_ad_creative, so it is clear but not exhaustive.

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

get_eu_transparencyEU spend and reachA
Read-onlyIdempotent

Spend, impressions, reach and demographic breakdown from Meta's official Ad Library API. Covers ads delivered in the EU and political or issue ads anywhere. Returns nothing for an ordinary US commercial ad because that data is not published, which is the correct answer rather than an error. Needs META_ADS_ARCHIVE_TOKEN, which is free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum ads to return.
queryNoBrand or advertiser name to look up.
countryNoTwo-letter EU country code, e.g. DE, FR, IE. Default DE.
page_idsNoComma-separated Page IDs, as a more precise alternative to query.

Output Schema

ParametersJSON Schema
NameRequiredDescription
adsYes
nextNo
noteNo
countYes
countryYes
fields_returnedYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the read-only, idempotent, open-world, non-destructive profile, so the bar is lower. The description still adds real context: the empty-result case is a valid answer rather than an error, and a free token is required. It doesn't discuss rate limits or pagination behavior.

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

Conciseness5/5

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

Three sentences, front-loaded with what is returned and where, followed by the non-obvious empty-result semantics and auth need. No filler or repetition of structured fields.

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 an output schema present, return-value explanation is unnecessary, and the description covers scope, the negative-result edge case, and the credential requirement. An agent has everything needed to call it and interpret an empty response.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented, including the DE default and the page_ids-vs-query distinction. The description adds only indirect meaning via the EU/political scope, so the baseline 3 applies.

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?

States a specific resource set (spend, impressions, reach, demographics) from a named source (Meta's official Ad Library API), which no sibling like search_ads, get_ad, or list_advertisers provides. The EU/political scope clause further pins down the resource it returns.

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

Usage Guidelines4/5

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

Explains the crucial when-not case: an ordinary US commercial ad yields nothing and that is the correct answer, not a failure. It also states the auth prerequisite (META_ADS_ARCHIVE_TOKEN). It stops short of routing the agent to a specific sibling for non-EU/non-political ads.

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

list_advertisersFind advertisersA
Read-onlyIdempotent

Resolve a brand name to the advertiser Pages actually running ads for it, ranked by how many ads each is running. Use this first when you know the brand but not its Page ID, then pass that ID to search_ads to get everything they run.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesBrand or company name to look up.
countryNoTwo-letter country code. Default US.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countYes
advertisersYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavior beyond that: results are ranked by ad volume, and the tool performs fuzzy brand-name resolution rather than exact lookup. It does not mention result limits or ambiguity handling, so it stops short of a 5.

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

Conciseness5/5

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

Two sentences, no waste, front-loaded with the core purpose and followed by the workflow handoff. Every clause earns its place.

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 an output schema present, the description needn't explain return values, and it covers purpose, ranking, and the chaining workflow to search_ads. Nothing an agent needs to select or invoke this tool correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented, and the description adds no syntax or format detail for them. It clarifies the intent of the query (brand-name resolution) but says nothing about the country parameter, so the baseline 3 applies.

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?

States a specific verb (resolve) and resource (brand name → advertiser Pages), plus the ranking behavior. It is clearly distinguishable from search_ads and the other siblings, which retrieve ads rather than resolve brand names to Page IDs.

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?

Explicitly says to use this first when you know the brand but not its Page ID, and names the downstream alternative (search_ads) plus the handoff artifact (the ID). This is a complete when/when-not routing instruction.

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

search_adsSearch the Ad LibraryA
Read-onlyIdempotent

Search Meta's public Ad Library by keyword, or list every ad from one advertiser by passing page_id. Returns advertiser, copy, creative count, destination domain, call to action, platforms and how long each ad has run. Works for ordinary commercial advertisers in any country. Spend and reach are null outside the EU, which is correct rather than a failure: that data is only published for EU and political ads.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many ads to return. On the browser backend a higher number costs more time.
queryNoKeyword: a brand, product or angle. Optional if page_id is given.
ad_typeNoAd category. 'all' covers ordinary commercial ads and is what you usually want.
countryNoTwo-letter country the ads were delivered in, e.g. US, GB, DE. Default US.
page_idNoAdvertiser Page ID. Returns that Page's ads instead of a keyword search. Use list_advertisers first if you only know the brand name.
media_typeNoFilter by creative type. 'meme' is Meta's name for an image with text on it.
active_statusNoOnly ads running now, only stopped ads, or both. Default active.

Output Schema

ParametersJSON Schema
NameRequiredDescription
adsYes
urlNo
noteNo
countYes
cursorNo
backendYes
has_moreYes
total_availableNoMeta's own count of matching ads.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish the safety profile (readOnly, idempotent, non-destructive, open-world), so the description's real contribution is behavioral: it lists what comes back (advertiser, copy, creative count, domain, CTA, platforms, run duration) and preempts a likely misinterpretation by explaining that null spend/reach outside the EU is expected, not an error. That is genuinely additive context beyond the annotations.

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

Conciseness5/5

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

Three sentences, zero padding, with the core capability front-loaded and the EU-data caveat placed at the end where it serves as a footnote. Every sentence carries information an agent needs.

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?

For a read-only search tool with a full input schema, output schema, and complete annotations, the description supplies the missing pieces: the two search modes, the returned field set, and the EU spend/reach caveat. Nothing needed to call it correctly is absent.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all seven parameters, including enum values and defaults. The description reinforces the query/page_id mode split but adds no syntax, format, or default detail beyond what the schema states, so the baseline of 3 applies.

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

Purpose4/5

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

The description names a specific verb and resource ('Search Meta's public Ad Library') and cleanly separates its two invocation modes: keyword search versus listing all ads for one advertiser via page_id. It stops short of differentiating itself from siblings like get_ad or list_advertisers, so it is clear but not fully sibling-aware.

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

Usage Guidelines4/5

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

It gives clear context for choosing between the two modes ('by keyword, or ... by passing page_id') and states the domain of applicability ('ordinary commercial advertisers in any country'). There is no explicit when-not guidance or pointer to alternative tools, which keeps it below a 5.

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

transcribe_adTranscribe a video adA
Read-onlyIdempotent

Speech to text for a video ad, so its spoken script becomes readable. Only the scrapecreators backend can do this. On any other backend it explains that rather than failing silently.

ParametersJSON Schema
NameRequiredDescriptionDefault
library_idYesThe Ad Library ID of a video ad.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
backendNo
availableYes
library_idNo
transcriptNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds genuinely new behavioral context: the backend dependency and the graceful-degradation behavior ('explains that rather than failing silently'), which an agent needs to interpret a non-transcript response. It does not contradict any annotation.

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

Conciseness5/5

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

Three short sentences, zero filler, and the core purpose is front-loaded before the backend caveat. Every sentence carries distinct information.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description supplies the key operational caveat (backend requirement, non-silent failure), though it omits any note about non-video ads or transcript availability limits.

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

Parameters3/5

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

There is a single required parameter whose schema description (100% coverage) already documents it as the Ad Library ID of a video ad. The description adds no extra meaning about the parameter, so the baseline 3 for high schema coverage applies.

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?

States a specific transformation (speech to text) on a specific resource (a video ad) and clarifies the output is the readable spoken script. This is clearly distinguishable from siblings like get_ad or view_ad_creative, which retrieve ad data rather than transcribe it.

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

Usage Guidelines3/5

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

The description states a precondition for success ('Only the scrapecreators backend can do this') but never says when an agent should choose this tool over alternatives such as view_ad_creative, nor which ads are eligible. Usage is implied (you want the transcript of a video ad) rather than explicitly guided.

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

view_ad_creativeLook at an ad's imagesA
Read-onlyIdempotent

Return the actual images from one ad so you can see them, rather than only reading its copy. Use this when the question is about what an ad looks like: the visual hook, the layout, the product shot, how the text sits on the image, or what several ads have in common visually. A carousel returns each card in order. Video ads have no still to show and report that instead. Needs no API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many images to return, up to 6. Carousels have several.
countryNoTwo-letter country code. Default US.
library_idYesThe Ad Library ID, from search_ads.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description earns credit for the extra behavior it discloses: carousels return each card in order, video ads have no still and report that instead, and it needs no API key. These edge cases and auth details go well beyond structured fields.

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

Conciseness5/5

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

Front-loaded with the core action, followed by when-to-use, then edge-case behavior in compact sentences. Every sentence carries distinct information with no filler.

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 no output schema, the description compensates by explaining return shape for carousels (each card in order) and the video-ad exception, and annotations carry the safety profile. Nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so library_id, country, and limit are already fully documented, including the 'up to 6' limit and 'Carousels have several' note. The description adds no param syntax or format detail beyond that, making the baseline 3 correct.

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

Purpose4/5

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

The description states a specific verb+resource: 'Return the actual images from one ad.' It distinguishes itself functionally from copy-reading siblings via 'rather than only reading its copy,' which implies the contrast with get_ad, though no sibling is named outright.

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

Usage Guidelines4/5

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

It gives concrete trigger conditions: 'Use this when the question is about what an ad looks like: the visual hook, the layout, the product shot...'. Strong when-to-use guidance, but no explicit when-not or named alternative such as get_ad for text-only questions.

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.

  1. 9 tool updatesv0.6.1
    • Changedad_library_url3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedbackend_status2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changeddiff_advertiser3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_ad3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_eu_transparency3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedlist_advertisers3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedsearch_ads3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedtranscribe_ad3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedview_ad_creative2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / additionalProperties
        Removed value: -false
  2. 9 tool updatesv0.4.0
    • First observedad_library_url
    • First observedbackend_status
    • First observeddiff_advertiser
    • First observedget_ad
    • First observedget_eu_transparency
    • First observedlist_advertisers
    • First observedsearch_ads
    • First observedtranscribe_ad
    • First observedview_ad_creative

TDQS

A4.2/5.0

Scored across 9 tools

Disambiguation4/5

Most tools have clearly distinct roles: list_advertisers resolves a brand to a Page, search_ads finds ads, get_ad fetches one ad, and diff_advertiser tracks change over time. The cluster around examining a single ad's creative (get_ad, view_ad_creative, transcribe_ad) has mild overlap, but each is scoped to a different output (metadata, images, speech), so descriptions keep them separable.

Naming Consistency4/5

The dominant pattern is verb_noun (search_ads, list_advertisers, get_ad, transcribe_ad, view_ad_creative, diff_advertiser, get_eu_transparency). Two tools break it with noun phrases (ad_library_url, backend_status), but they remain readable and the overall convention is predictable.

Tool Count5/5

Nine tools is well-scoped for a read-only Ad Library exploration domain. Each tool covers a distinct capability (search, resolve, fetch, transcribe, visualize, diff, EU data, diagnostics) with no filler.

Completeness4/5

The surface covers the core lifecycle of a public ad-research workflow: finding advertisers, searching, inspecting single ads, viewing creatives, transcribing, diffing over time, and EU transparency data, plus a diagnostics tool. Minor gaps exist (no explicit pagination/export or bulk creative handling), but nothing blocks typical agent workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables management and analysis of Meta (Facebook/Instagram) ads through natural language conversations, with 30 tools for reading and writing ad data.
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides read-only access to Meta Ads API, enabling campaign management, creative analysis, targeting research, and performance analytics via 39 tools.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to browse and query Facebook Ads data including ad accounts, campaigns, ad sets, and performance insights via natural language.
    30 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI clients to read Meta Ads performance with breakdowns and diagnostics and to create, update, or pause campaigns, ad sets, ads, creatives, audiences, and catalogs, with every write requiring explicit user approval. Runs as a hosted, OAuth-authenticated remote server with no local install.
    1
    MIT