scaleforge-mcp-meta-ads
Control Facebook Ads from MCP-compatible agents using Meta Graph API v24.0. Provides tools for managing ad accounts, campaigns, ad sets, ads, creatives, and performance insights.
Control Instagram Ads from MCP-compatible agents using Meta Graph API v24.0. Provides tools for managing Instagram ad placements, Page-Backed Instagram Accounts (PBIA), and Instagram user IDs for ad creatives.
Control Facebook & Instagram Ads from MCP-compatible agents using Meta Graph API v24.0. Offers 32 tools for ad account management, bulk campaign operations, image and video asset uploads, and automated error handling for rate limits and token expiry.
Meta Ads MCP by ScaleForge
Control Facebook & Instagram Ads from Claude, ChatGPT, Cursor, or any MCP-compatible agent.
Direct Meta Graph API v24.0 wrapper. 32 tools. No backend required — just bring your own Meta access token.
The problem
Meta's Marketing API is powerful but punishing. Anyone who's tried to automate Meta Ads has run into these five walls:
Rate-limit whack-a-mole (error code #17). Your script hits
User request limit reachedhalfway through a launch and leaves campaigns in a half-configured state. Meta's per-account budget of calls resets over 5 minutes, but nothing in the API tells you that without context.Token expiry chaos. User access tokens from the Graph API Explorer die every ~2 hours. You fix a bug, come back from lunch, and every request is suddenly
(#190) Error validating access token.v22 → v24 deprecations (Sept 2025).
instagram_actor_id→instagram_user_id,degrees_of_freedom_specis gone entirely,asset_feed_idhas been deprecated since v3.1. Copy-pasted sample code from Stack Overflow breaks silently.Image hashes are per-ad-account. An image uploaded on Account A cannot be used on Account B — you get
Image Not Foundon the second account. Video IDs are global, but image hashes are not. This trips up 100% of first-time multi-account automations.The 250-ads-per-Page cap. Meta limits ads-running-or-in-review per Page (not per account) — and this limit is shared across every account using that Page. Overshoot and the 251st ad silently fails review.
Related MCP server: facebook-business-mcp
The solution
This MCP is a thin, typed wrapper over Meta's Graph API with those five pains baked out:
Auto-batch for bulk ops (
pause_campaigns_batch,activate_campaigns_batch,update_bids_batch) — up to 50 ops per HTTP request, chunked automatically. Sidesteps rate-limit code #17 for bulk work.Pre-flight ads_volume check before every bulk activation — warns you when a Page is near the 250-ad cap, per ad account, before Meta silently fails the reviews.
Enhanced error messages with actionable links — when your token expires or a rate limit fires, the MCP tells your agent exactly what to do (create a System User token, wait 5 min, etc.).
v24.0 everywhere — current field names, no deprecated spec shapes.
PBIA auto-provisioning (
get_pbia) — when a Page has no linked Instagram account, the MCP creates a Page-Backed Instagram Account on demand so IG placements work.
No ScaleForge backend is in the chain. Your agent → this MCP → https://graph.facebook.com/v24.0/*. That's it.
Hosted endpoint (no install)
Use the ScaleForge-hosted Streamable HTTP endpoint — zero install, nothing to run locally:
Smithery listing:
https://smithery.ai/server/kirichyk-misha/meta-ads(one-click install for Claude Desktop, Cursor, Windsurf, Continue, ChatGPT Desktop — Smithery prompts for your Meta token, writes the config).Direct URL for custom clients:
https://getscaleforge.com/mcp(MCP Streamable HTTP). Supply your token via Smithery session config orAuthorization: Bearer <token>header.
Prefer a local npm install? Use the stdio package below.
Quick start — pick one
Smithery (easiest, auto-configures the client)
npx -y @smithery/cli install @getscaleforge/mcp-meta-ads --client claude
# also: --client cursor | --client windsurf | --client continueSmithery will prompt you for the Meta access token and write the config file.
Claude Code CLI
claude mcp add scaleforge \
--env META_ACCESS_TOKEN=YOUR_TOKEN \
-- npx -y @getscaleforge/mcp-meta-adsVerify with claude mcp list.
Claude Desktop (manual JSON config)
Edit ~/Library/Application Support/Claude/claude_desktop_config.json on macOS (or the Windows / Linux equivalent — Claude Desktop creates it if missing):
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "@getscaleforge/mcp-meta-ads"],
"env": {
"META_ACCESS_TOKEN": "YOUR_TOKEN_HERE"
}
}
}
}Restart Claude Desktop. The 32 tools appear under the hammer icon.
Cursor
Create .cursor/mcp.json in your project (or ~/.cursor/mcp.json globally):
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "@getscaleforge/mcp-meta-ads"],
"env": { "META_ACCESS_TOKEN": "YOUR_TOKEN_HERE" }
}
}
}Local test (no client setup)
META_ACCESS_TOKEN=YOUR_TOKEN npx -y @getscaleforge/mcp-meta-adsThe server starts on stdio. Poke it interactively with @modelcontextprotocol/inspector:
npx -y @modelcontextprotocol/inspector \
env META_ACCESS_TOKEN=YOUR_TOKEN npx -y @getscaleforge/mcp-meta-adsArchitecture
┌──────────────┐ MCP stdio ┌───────────────────┐ HTTPS + OAuth token ┌──────────────────────┐
│ Claude / GPT │ ◄────────────────────► │ mcp-meta-ads │ ◄───────────────────────► │ Meta Graph API v24 │
│ Cursor │ JSON-RPC over stdio │ (this package) │ graph.facebook.com │ Marketing API │
│ ChatGPT Desk │ │ │ │ │
└──────────────┘ └───────────────────┘ └──────────────────────┘The MCP is a thin, typed translation layer. It does not cache, does not proxy, does not phone home. Every call goes from your machine straight to Meta's servers with your token.
Get a Meta Access Token
You need an access token with ads_management, ads_read, business_management, and (for Page-scoped work like PBIA provisioning) pages_read_engagement + pages_manage_ads.
There are two kinds of tokens. Pick based on your use case.
Option 1 — Quick token (2 minutes, expires in ~2 hours)
Good for: trying the MCP, quick experiments, one-off scripts.
Open the Graph API Explorer.
In the User or Page dropdown, select User Token.
Click Add a Permission and select:
ads_management,ads_read,business_management,pages_read_engagement,pages_manage_ads.Click Generate Access Token and approve the dialog.
Copy the token at the top. That's your
META_ACCESS_TOKEN.
The token expires in ~2 hours. When it dies, the MCP will return an enhanced error pointing you here.
Option 2 — Stable token (never expires)
Good for: production, scheduled jobs, anything you don't want to re-auth every 2 hours.
You generate a System User token inside Meta Business Manager. System User tokens have no expiry and can be scoped to specific assets (ad accounts + Pages). This is the same token type ScaleForge and every production Meta integration uses.
Create a Facebook App (if you don't have one) at developers.facebook.com/apps. Any app works — Business type is fine.
Create a Business Manager at business.facebook.com. You need this as the container for your System User.
Add your ad accounts and Pages to the Business under Business Settings → Accounts → Ad Accounts / Pages. (If they're owned by another Business, request access.)
Create a System User: Business Settings → Users → System Users → Add → name it (e.g.
mcp-meta-ads) → role Admin. [screenshot: Business Settings → Users → System Users tab with "Add" button]Assign ad accounts to the System User: click the System User → Add Assets → pick Ad Accounts → select yours → turn on Manage permission. Repeat for Pages. [screenshot: Add Assets dialog with "Manage" toggle highlighted]
Generate the token: click Generate New Token → select your Facebook App → pick scopes:
ads_managementads_readbusiness_managementpages_read_engagementpages_manage_adsread_insights(optional — needed for some insight breakdowns) [screenshot: Generate Token dialog with scopes checklist]
Click Generate and copy the token. It never expires. Store it in a secret manager / env var / password manager.
Now use it:
META_ACCESS_TOKEN=EAAB...your-token... npx -y @getscaleforge/mcp-meta-adsIf you revoke or regenerate later, the old token stops working immediately.
Baked-in pain point fixes
Meta pain point | How this MCP handles it |
Rate limit code #17 in bulk ops |
|
250-ads-per-Page silent cap |
|
Token-expired errors |
|
Instagram placements without IG login |
|
v22 deprecations | Uses |
Image hash scoping | Documented on |
Tools reference
32 tools across 10 categories.
Accounts (3)
Name | Purpose |
| List Ad Accounts accessible to the token |
| Detailed info for one account (status, spend cap, balance) |
| Per-Page running-ads count + limit + remaining slots (pre-flight check) |
Campaigns (5)
Name | Purpose |
| Paginated campaign list |
| Single campaign by ID |
| WRITE — create new campaign (defaults to PAUSED) |
| WRITE — update any mutable field |
| WRITE — hard delete |
Ad Sets (5)
Name | Purpose |
| List by ad_account_id OR campaign_id |
| Single ad set by ID |
| WRITE — create ad set under a campaign |
| WRITE — update targeting, bid, budget, status |
| WRITE — hard delete |
Ads (4)
Name | Purpose |
| List by ad_account_id, adset_id, or campaign_id |
| Single ad by ID (incl. creative + issues + preview link) |
| WRITE — update name, status, swap creative |
| WRITE — hard delete |
Creatives (4)
Name | Purpose |
| List all creatives in an ad account |
| Single creative by ID |
| WRITE — single-text creative via |
| WRITE — dynamic/multi-text creative via |
Media (2)
Name | Purpose |
| WRITE — upload video via remote URL (returns video_id) |
| WRITE — upload image via remote URL (returns image_hash, scoped to account) |
Insights (3)
Name | Purpose |
| Metrics at campaign level with breakdowns |
| Metrics at ad set level |
| Metrics at ad level (compare creatives) |
Bulk (3)
Name | Purpose |
| WRITE (BULK) — pause many campaigns via Batch API |
| WRITE (BULK) — activate many + pre-flight ads_volume check |
| WRITE (BULK) — update |
Pages (2)
Name | Purpose |
| Facebook Pages the token can manage |
| Get or auto-create a Page-Backed Instagram Account |
Ads Library (1)
Name | Purpose |
| Public Meta Ad Library search for competitive research |
Example prompts
Once the server is connected, try these in your agent.
Read-only
"List my Meta ad accounts and show me which ones are active, currency, and spend cap."
"For campaign
1234567890, pull last_14d insights with breakdown by placement — which placement has the lowest CPL?""Show me the ads_volume for account
act_555— any Page over 85% of its limit?""Search the Meta Ad Library for ads from Competitor X running in the US in the last month."
"List all ad sets in campaign
ABCDand show which ones have is_dynamic_creative=true."
Write (confirm first)
Write operations change live Meta Ads state — spend starts or stops immediately. A well-behaved agent (Claude, GPT-4) will show you the target list and ask "proceed?" before calling these.
"Pause campaigns
111,222,333— show me their names and current spend first, then pause.""Activate campaigns
444and555. Run the ads_volume pre-flight first; if any Page is over 85%, abort and tell me which.""Bump the bid on ad sets
6001and6002to $4.50. Convert to cents for me.""Create a new campaign in
act_777called 'Spring Promo Test', OUTCOME_LEADS objective, daily_budget 5000 cents, PAUSED."
FAQ
How do I get a Meta access token?
See Get a Meta Access Token above. Two options: quick 2-hour token (Graph API Explorer) or stable System User token (Business Manager, never expires).
Why does my token keep expiring?
You're using a User access token from the Graph API Explorer. Those expire in ~2 hours by design. For anything beyond experimentation, generate a System User token via Business Manager — those never expire. Full steps here.
What's ads_volume?
Meta limits how many ads can be "running or in review" per Facebook Page — default 250 — and this limit is shared across every ad account using that Page. The get_ads_volume tool shows you how much headroom each Page has. activate_campaigns_batch calls it automatically as a pre-flight check.
Is this free?
Yes. MIT license, npm package is free. You pay Meta for ads as usual. There is no ScaleForge account or subscription needed to use this MCP.
How does this compare to Pipeboard / other MCPs?
Pipeboard / hosted MCPs — run on their server, you send your token to them, they rate-limit you. Fine for very light usage, but the token lives on someone else's machine.
This MCP — runs locally, your token never leaves your box, direct path to Meta. 32 tools (more coverage than any other Meta MCP we've seen).
ScaleForge managed platform (see below) — a separate product for teams that want managed Meta access, RedTrack integration, scheduled auto-rules, UI dashboards. This MCP is a standalone tool that does not depend on it.
Can I use this without ScaleForge?
Yes. This MCP is a standalone npm package — it talks straight to graph.facebook.com. No account anywhere.
Can I contribute more tools?
Please do. PRs welcome at github.com/Mike25app/scaleforge-mcp-meta-ads. Each tool is a small file in src/tools/ — copy one of the existing files as a template.
Powered by ScaleForge
Built and maintained by the ScaleForge team. If you need managed Meta access (System User provisioning, RedTrack integration, scheduled auto-rules, dashboards), check out the full platform — this MCP stays free and standalone regardless.
Security
Generate least-privilege tokens. Scope your System User to only the ad accounts + Pages it needs. Revoking a token takes effect immediately.
Never commit tokens to source control. The MCP reads from
META_ACCESS_TOKENenv var — keep it in your agent host's secret store (Claude Desktop's env block, shell profile with 600 perms, 1Password, etc.).Rotate periodically. Even non-expiring System User tokens should be rotated on a team policy. Regenerating in Business Manager invalidates the old one.
No telemetry. This MCP does not phone home. The only outbound requests it makes are to
https://graph.facebook.com/v24.0/*.Rate limits apply per token / per ad account (Meta-side). Bulk tools automatically use Meta Batch API to stay under.
Links
ScaleForge (managed platform): getscaleforge.com
Meta Marketing API docs: developers.facebook.com/docs/marketing-apis
License
MIT — see LICENSE.
Available Tools
32 toolsactivate_campaigns_batchA
WRITE (BULK): Activate many campaigns in one Batch API call. BEFORE activation we run a per-Page ads_volume pre-flight for every distinct ad account — warnings are returned in the response so the agent / user can abort if a Page is over capacity. Agents MUST confirm with the user before calling this (activation starts spend immediately).
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_ids | Yes | ||
| skip_preflight | No | Skip the ads_volume check (not recommended) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavior: it is a WRITE (BULK) operation, runs a pre-flight ads_volume check, returns warnings, and starts spend immediately. This is adequate transparency for safe usage.
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 serving a purpose: purpose, behavioral detail, and usage guideline. No unnecessary words, and the most important information is front-loaded.
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 and no annotations, the description covers the key aspects: what it does, the pre-flight check, warnings, and user confirmation. It could mention response format or error handling, but it is sufficient for a batch 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?
The description explains the skip_preflight parameter and the pre-flight process, adding context beyond the schema. The campaign_ids parameter is implied to be the list of campaigns to activate. Schema description coverage is 50%, but the description compensates well.
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 starts with 'Activate many campaigns in one Batch API call,' which is a specific verb+resource+mode. It clearly distinguishes from siblings like 'pause_campaigns_batch' and individual 'update_campaign'.
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?
It explicitly states 'Agents MUST confirm with the user before calling this (activation starts spend immediately).' This provides clear when-to-use guidance. However, it does not mention when not to use or suggest alternative tools like individual activation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ad_creativeA
WRITE: Create a single-text ad creative from an object_story_spec. Pass page_id plus ONE of: video_data (for video ads — needs video_id from upload_video), link_data (for image / link ads — needs image_hash from upload_image + link + message). If the Page is not linked to Instagram, pass instagram_user_id from get_pbia() to enable IG placements.
Note: image hashes are per-ad-account in Meta — a hash uploaded on account A is NOT valid on account B. Re-upload to each target account.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | Yes | 'act_123' or '123' | |
| name | Yes | ||
| page_id | Yes | Facebook Page ID (the advertiser) | |
| instagram_user_id | No | Instagram actor ID or PBIA id (from get_pbia). Optional. | |
| video_id | No | From upload_video | |
| image_hash | No | From upload_image | |
| message | No | Primary text / body copy | |
| title | No | Headline for link_data | |
| link | No | Landing page URL (for link_data) | |
| call_to_action | No | e.g. {type: 'SHOP_NOW', value: {link: 'https://...'}} | |
| description | No | ||
| url_tags | No | UTM tracking params | |
| thumbnail_url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. It discloses write behavior, prerequisites (video_id, image_hash), critical constraint that image hashes are per-account, and Instagram placement condition. Lacks rate limits or error details but adequate.
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?
Five sentences, front-loaded with purpose, each sentence adds value. No redundancy, and the important note about image hashes is included without bloating.
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?
Covers the main use case and key constraints well given 13 parameters and no output schema. Could mention return value (e.g., created creative ID) but not essential for selection; the description enables correct 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?
Adds significant meaning beyond schema: explains the two data type branches (video_data vs link_data), maps specific parameters to each, clarifies conditional use of instagram_user_id, and notes image hash scope. Schema coverage is 77%, but description compensates richly.
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 it creates a single-text ad creative from an object_story_spec, distinguishes from sibling create_ad_creative_with_asset_feed, and explicitly marks it as a WRITE operation.
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?
Provides clear conditions for when to use: pass page_id plus ONE of video_data or link_data, and instagram_user_id if page not linked to Instagram. Does not explicitly exclude the asset feed sibling but the context implies this is for single-text creatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ad_creative_with_asset_feedA
WRITE: Create a DYNAMIC (multi-text) creative using asset_feed_spec. Meta will auto-combine the bodies/titles/descriptions and optimize the best mix. The parent ad set MUST have is_dynamic_creative=true. Pass arrays of texts plus either video_id(s) or image_hash(es).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | Yes | 'act_123' or '123' | |
| name | Yes | ||
| page_id | Yes | ||
| instagram_user_id | No | ||
| video_ids | No | ||
| image_hashes | No | ||
| bodies | Yes | Primary text variants | |
| titles | No | Headline variants | |
| descriptions | No | ||
| link_urls | Yes | Landing page variants | |
| call_to_action_types | No | e.g. ['SHOP_NOW','LEARN_MORE'] | |
| url_tags | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that Meta will auto-combine and optimize text combinations, and requires the parent ad set to be dynamic. However, it does not mention potential rate limits, authentication needs, or any side effects beyond creation. The behavior is adequately described for a creation tool.
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 extremely concise with only two sentences. It leads with 'WRITE:' to signal action, then clearly states the tool's unique behavior and prerequisites. Every word serves a purpose with no redundancy.
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 12 parameters and no output schema, the description covers the core mechanism (dynamic creative) and a key prerequisite. However, it does not explain what the tool returns (likely a creative object), nor does it address parameters like url_tags or instagram_user_id. It is adequate but not fully comprehensive.
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 low at 42%, but the description adds value by grouping text arrays (bodies, titles, descriptions) and stating the requirement to provide either video_ids or image_hashes. This clarifies the relationship among parameters. However, it does not explain parameters like url_tags or instagram_user_id, leaving some ambiguity.
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 it creates a DYNAMIC (multi-text) creative using asset_feed_spec, which distinguishes it from the sibling create_ad_creative tool. The verb 'create' and resource 'ad creative' are specific, and the dynamic nature is emphasized.
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?
It explicitly states that the parent ad set MUST have is_dynamic_creative=true, providing a crucial prerequisite. It also instructs to pass arrays of texts and either video or image identifiers, guiding parameter selection. However, it does not explicitly say when to use this vs. non-dynamic creative creation, though the dynamic distinction is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_adsetA
WRITE: Create an ad set under a campaign. Default status is PAUSED. targeting is a Meta targeting spec object (geo_locations, age_min, age_max, interests, etc.). bid_amount is in account currency minor units (cents). For multi-text / dynamic creative ads you MUST set is_dynamic_creative=true — otherwise asset_feed_spec ads will be rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | Yes | 'act_123' or '123' | |
| campaign_id | Yes | ||
| name | Yes | ||
| targeting | Yes | Meta targeting spec object (JSON) | |
| optimization_goal | Yes | e.g. OFFSITE_CONVERSIONS | |
| billing_event | Yes | ||
| bid_amount | No | Bid in minor currency units (cents). Always set at adset level. | |
| daily_budget | No | For ABO; omit under CBO | |
| lifetime_budget | No | ||
| start_time | No | ISO 8601, e.g. '2026-01-15T00:00:00+0000' | |
| end_time | No | ||
| status | No | ||
| is_dynamic_creative | No | Must be true for asset_feed_spec / multi-text creatives | |
| promoted_object | No | e.g. {pixel_id: 'XXX', custom_event_type: 'PURCHASE'} for conversion optimization | |
| pacing_type | No | e.g. ['standard'] or ['no_pacing'] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses default status (PAUSED), field semantics (targeting is Meta spec, bid_amount in cents), and conditional behavior (is_dynamic_creative required for multi-text). No annotations provided, so description carries the burden; covers key behaviors well.
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 sentences, zero waste. Front-loaded with purpose and default status, then field explanations, then critical constraint. Each sentence earns its place.
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?
Covers purpose, default behavior, key field semantics, and a crucial constraint. No output schema, so return value is not explained, but for a create operation this is acceptable. Could mention what is returned (e.g., ad set ID) for completeness.
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?
Adds value beyond the input schema for targeting (explains it includes geo_locations, interests, etc.), bid_amount (minor units), and is_dynamic_creative (must be true for multi-text). Schema coverage is 60%, but description fills gaps for important 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?
Description starts with 'WRITE: Create an ad set under a campaign', clearly stating the verb and resource. It distinguishes from siblings like 'update_adset' by focusing on creation and adding specific details like default status and field semantics.
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?
Provides clear guidance on when to use (create ad sets) and includes important constraints (e.g., is_dynamic_creative must be true for multi-text ads). Does not explicitly mention when not to use or contrast with update_adset, but the context of sibling tool names makes it adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_campaignA
WRITE: Create a new campaign. Default status is PAUSED (recommended — set ACTIVE only after creating ad sets and ads). For CBO, pass daily_budget or lifetime_budget at this level; for ABO leave budget off and set it on the ad set. special_ad_categories is required (empty array [] is fine for normal advertising).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | Yes | Ad Account ID — 'act_123456' or '123456' | |
| name | Yes | Campaign name | |
| objective | Yes | Campaign objective (ODAX v24.0 enum) | |
| status | No | Default PAUSED | |
| daily_budget | No | CBO daily budget in account currency minor units (cents) | |
| lifetime_budget | No | CBO lifetime budget in minor units | |
| bid_strategy | No | ||
| special_ad_categories | No | Required by Meta. Use [] for normal ads, or include 'HOUSING'/'EMPLOYMENT'/'CREDIT' etc. where legally required | |
| buying_type | No | Defaults to AUCTION |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses default status, budget behavior, and required field nuances. It does not mention return values or error conditions, but the creation behavior is well explained.
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?
Four concise sentences, front-loaded with 'WRITE: Create a new campaign.' Every sentence adds value without redundancy. Ideal length for a creation tool.
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 complexity (9 parameters, budget strategies, required special categories), the description covers the essential workflow. It could mention return format, but without an output schema, this is acceptable. Slightly incomplete for full autonomy.
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 89% coverage, but the description adds significant meaning: clarifies the CBO/ABO budget distinction, recommends PAUSED over ACTIVE, and explains special_ad_categories usage. This goes beyond the schema's inline descriptions.
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 explicitly states 'WRITE: Create a new campaign,' clearly identifying the verb and resource. It distinguishes from sibling tools such as update_campaign, delete_campaign, and activate_campaigns_batch.
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 guidance: recommends PAUSED as default, explains when to pass budgets for CBO vs ABO, and notes that special_ad_categories is required. It gives clear context on when and how to use this tool effectively.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_adA
WRITE: Hard-delete an ad. Prefer update_ad status=ARCHIVED to keep history.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the description clearly states it's a hard-delete (irreversible write operation), which is sufficient for a simple tool.
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?
Two concise sentences front-loading the action and providing usage guidance with no extra words.
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?
Adequately covers purpose and usage for a simple delete tool with one parameter and no output schema, though could mention return behavior.
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 single parameter ad_id is self-explanatory from the tool name and description, but no additional semantic details are provided beyond the schema.
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 'Hard-delete an ad' with a specific verb and resource, distinguishing it from sibling tools like update_ad.
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?
Provides explicit guidance: 'Prefer update_ad status=ARCHIVED to keep history' indicates when to use an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_adsetA
WRITE: Hard-delete an ad set (and its ads). Prefer update_adset status=ARCHIVED to keep history.
| Name | Required | Description | Default |
|---|---|---|---|
| adset_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses the destructive nature ('hard-delete') and that ads are also deleted. It is fairly transparent for a delete operation, though could mention irreversibility.
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?
Two concise sentences, front-loaded with the action, no wasted words. Structure is efficient and clear.
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 deletion tool, the description covers the core action and provides usage guidance. It does not explain return values, but that may be acceptable for a delete operation. Minor gap: no mention of idempotency or reversibility.
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 adds no additional semantics beyond what the schema already provides for the 'adset_id' parameter. The parameter is not even explicitly mentioned.
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 'Hard-delete an ad set (and its ads)', using a specific verb and resource, and distinguishes itself from the sibling 'update_adset' tool by recommending an alternative.
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 advises to prefer 'update_adset status=ARCHIVED to keep history', providing a clear when-to-use vs. when-not-to-use recommendation with a specific alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_campaignA
WRITE: Hard-delete a campaign (and its ad sets / ads). Prefer update_campaign with status=ARCHIVED if you want to keep historical data.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses hard-delete and cascade behavior. Without annotations, description carries the burden and covers key destructive aspects, though could mention irreversibility or permissions.
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?
Two sentences, front-loaded with 'WRITE:' to signal mutation. No fluff, every word adds value.
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 simplicity, description covers purpose, behavior, and usage guidance. Completeness is adequate without output schema.
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?
Single parameter campaign_id is implied but not described in detail. With 0% schema coverage, description should add format or constraints, but the purpose is clear.
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?
Clearly states it hard-deletes a campaign and cascades to ad sets/ads. Distinct from sibling update_campaign for soft deletion.
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 recommends using update_campaign with ARCHIVED status for preserving historical data, providing clear when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adA
Get a single ad by ID. Returns full creative + issues + preview link.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description says it returns creative, issues, and preview link, which helps set expectations. However, it omits details like error handling, auth needs, or rate limits.
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?
Single sentence with front-loaded action and key results. Every word earns its place.
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?
Template-level tool with no output schema; description gives high-level return info but lacks details on parameter format, error cases, and edge behavior.
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 has 0% description coverage; description only explains ad_id implicitly but completely ignores the 'fields' parameter, leaving its purpose and format undocumented.
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?
Clearly states verb 'Get' and resource 'single ad by ID', distinguishing it from list_ads and other get tools. Also specifies return contents: creative, issues, preview link.
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?
Implies usage when an ad ID is known, but provides no explicit guidance on when not to use it or alternatives like list_ads or get_creative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_accountA
Get detailed info for a single Ad Account: status, spend cap, balance, funding source, business, timezone, disable_reason. Returns the full configuration record — use this for deep inspection of one account.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | Yes | Ad Account ID — accepts 'act_123456' or just '123456' | |
| fields | No | Comma-separated Meta API field list (overrides default field set) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden. It implies a read-only operation but doesn't explicitly state safety or side effects, which is acceptable for a get tool.
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?
Two sentences efficiently convey purpose, fields, and usage hint without any waste.
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?
The description lists return fields, compensating for the missing output schema, and is adequate for a simple retrieval tool, though it omits error conditions.
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 100%, so the description adds no additional parameter details beyond what is already in the schema.
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 'Get detailed info for a single Ad Account' and lists specific fields, distinguishing it from siblings like list_ad_accounts.
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?
It advises 'use this for deep inspection of one account', providing clear context but not explicitly excluding alternatives or detailing when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_insightsA
Pull performance metrics for ONE ad. Same fields/breakdowns as get_campaign_insights. Use this to compare creative performance at the individual-ad level.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| date_preset | No | Default last_7d | |
| time_range | No | {since:'YYYY-MM-DD', until:'YYYY-MM-DD'} — overrides date_preset | |
| breakdowns | No | e.g. ['age','gender'] or ['country','publisher_platform'] | |
| action_breakdowns | No | e.g. ['action_type'] | |
| time_increment | No | 1 = per-day rows, 7 = weekly, 'monthly', etc. | |
| filtering | No | Meta filtering spec | |
| fields | No | Override default metric list | |
| limit | No | ||
| after | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It only states 'pull performance metrics,' which implies a read operation but does not disclose caching, rate limits, or other important behaviors.
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 sentences, with the first stating the core purpose and the second providing usage guidance. No redundant information, extremely concise and front-loaded.
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 has 10 parameters, no output schema, and is a read operation, the description covers core purpose and sibling comparison but lacks details on return format, pagination, or limits. It is minimally adequate.
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 70%, and the description adds no additional meaning beyond the schema. It neither explains nor contextualizes the parameters beyond their names and basic usage.
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 explicitly states it pulls performance metrics for one ad, and distinguishes from get_campaign_insights by specifying individual-ad level comparison. This is specific and clear.
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 says to use this for comparing creative performance at the individual-ad level, implying when to use. It contrasts with campaign-level insights, but does not elaborate on when not to use or all alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adsetA
Get a single ad set by ID. Returns default fields plus anything in fields.
| Name | Required | Description | Default |
|---|---|---|---|
| adset_id | Yes | ||
| fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It mentions return of default fields plus custom fields, which is helpful but vague about what default fields are, response structure, or any side effects (none expected for a read). Not misleading but incomplete.
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 with two short sentences, no redundancy. However, it could benefit from slightly more detail without becoming verbose.
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 omits return structure, pagination hints, or error handling. It covers the core functionality but leaves gaps for a tool with low schema coverage and no 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?
Schema coverage is 0%, and the description only clarifies that the 'fields' parameter customizes output. It does not explain the expected format (e.g., comma-separated string) or the meaning of 'adset_id.' Minimal added 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 'Get a single ad set by ID,' specifying the verb (Get), resource (ad set), and unique identifier. It distinguishes from sibling list tools like list_adsets by emphasizing retrieval of a single entity.
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 implies usage for retrieving a specific ad set by ID but lacks explicit guidance on when to use this versus alternatives (e.g., list_adsets for multiple) or any exclusions. It provides no when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adset_insightsB
Pull performance metrics for ONE ad set. Same fields/breakdowns as get_campaign_insights.
| Name | Required | Description | Default |
|---|---|---|---|
| adset_id | Yes | ||
| date_preset | No | Default last_7d | |
| time_range | No | {since:'YYYY-MM-DD', until:'YYYY-MM-DD'} — overrides date_preset | |
| breakdowns | No | e.g. ['age','gender'] or ['country','publisher_platform'] | |
| action_breakdowns | No | e.g. ['action_type'] | |
| time_increment | No | 1 = per-day rows, 7 = weekly, 'monthly', etc. | |
| filtering | No | Meta filtering spec | |
| fields | No | Override default metric list | |
| limit | No | ||
| after | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It only says 'Pull performance metrics' with no details on pagination, rate limits, authorization requirements, or any side effects. The scope 'ONE ad set' is clear but minimal behavioral context.
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?
Two sentences, no filler. Front-loaded with verb 'Pull' and immediately specifies scope 'ONE ad set'. Every word earns its place.
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?
Tool has 10 parameters, no output schema, no annotations. The description is too brief: it does not explain the return format, default time range, or handle pagination, which are essential for a data-fetching tool with such complexity.
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?
Input schema has 10 parameters with 70% coverage. The description does not add any parameter-specific meaning beyond the schema; it only references get_campaign_insights for fields/breakdowns. With high schema coverage, the baseline is adequate.
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?
Clearly states 'Pull performance metrics for ONE ad set', distinguishing from sibling tools like get_ad_insights (ad-level) and get_campaign_insights (campaign-level). The reference to similar fields/breakdowns reinforces purpose.
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 says 'ONE ad set' indicating when to use, and references get_campaign_insights for comparable fields. However, it does not explicitly state when not to use (e.g., for multiple ads) or mention alternatives like get_ad_insights.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ads_volumeA
PRE-FLIGHT CHECK: Get per-Page ads-running-or-in-review counts and limits for an ad account. Meta caps active ads per Page (default 250) and this limit is SHARED across every account using the same Page. Always call this before a bulk activation to avoid silent review failures. Returns one row per Page actor.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | Yes | Ad Account ID — accepts 'act_123456' or just '123456' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes as a pre-flight check (implied non-destructive), details the shared limit behavior, and specifies output format. No annotation provided, but description compensates well. Lacks explicit read-only declaration.
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?
Four sentences, front-loaded with 'PRE-FLIGHT CHECK'. Every sentence adds value: purpose, limit explanation, usage guidance, output description. No redundancy.
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 read tool with one parameter and no output schema, description explains output format ('one row per Page actor'), shared limit behavior, and usage context. Comprehensive given simplicity.
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 covers the parameter fully with description. Tool description does not add new parameter details beyond the schema. Context about shared limits is behavioral, not parameter-specific.
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?
Clearly states it gets per-Page ads-running-or-in-review counts and limits. Distinct from sibling tools by specifying 'pre-flight check' and explicit return structure.
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 call before bulk activation to avoid silent failures, and explains why (shared per-Page limit). Provides clear when-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaignA
Get a single campaign by ID. Returns all default fields plus anything in fields. Use this for deep inspection of one campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | Meta Campaign ID | |
| fields | No | Override default field list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must cover behavior. It states returns default fields plus `fields` parameter. It does not mention idempotency, error handling, or authentication, which is acceptable for a simple read tool but leaves minor gaps.
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?
Two sentences: first states purpose, second adds capability and usage guidance. No unnecessary words; front-loaded.
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?
Adequately covers purpose, parameters, and usage guidance. No output schema, but the return format is implied. Could mention error handling but not critical for a simple GET-like 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 coverage is 100% with descriptions for both parameters. Description adds 'anything in `fields`', clarifying that arbitrary fields can be requested, which adds value beyond the schema's 'Override default field list'.
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 'Get a single campaign by ID', which is a specific verb+resource. It distinguishes from siblings like list_campaigns by focusing on a single campaign and deep inspection.
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 says 'Use this for deep inspection of one campaign', implying it's for detailed view vs. list. Does not mention when not to use, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaign_insightsA
Pull performance metrics for ONE campaign. Default fields: spend, impressions, clicks, cpc, cpm, ctr, reach, frequency, actions, conversions, purchase_roas. Default range: last_7d. Use breakdowns for cuts (age, gender, country, placement). Use time_increment=1 for day-by-day rows.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | ||
| date_preset | No | Default last_7d | |
| time_range | No | {since:'YYYY-MM-DD', until:'YYYY-MM-DD'} — overrides date_preset | |
| breakdowns | No | e.g. ['age','gender'] or ['country','publisher_platform'] | |
| action_breakdowns | No | e.g. ['action_type'] | |
| time_increment | No | 1 = per-day rows, 7 = weekly, 'monthly', etc. | |
| filtering | No | Meta filtering spec | |
| fields | No | Override default metric list | |
| limit | No | ||
| after | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It covers default fields, date range, and breakdowns but omits important details like pagination behavior (via limit/after), authentication needs, rate limits, or error handling (e.g., for invalid campaign_id).
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, with no redundant sentences. It front-loads the main purpose and efficiently lists defaults and options. Every sentence contributes meaning.
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 complexity (10 parameters, nested objects, no output schema), the description covers the main purpose, defaults, and key options. However, it lacks explanation of filtering, action_breakdowns, pagination (limit/after), and the structure of the response. The provided defaults partially compensate.
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 70%, and the description adds value by explaining defaults (e.g., 'Default range: last_7d') and usage patterns (e.g., 'Use breakdowns for cuts'). It clarifies parameter relationships beyond what the schema provides.
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?
Description clearly states 'Pull performance metrics for ONE campaign,' using a specific verb and resource. It explains default fields, default date range, and available options like breakdowns and time_increment, fully distinguishing the tool's purpose from siblings like get_ad_insights.
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 implies using this tool for campaign-level insights but does not explicitly state when to use alternatives or when not to use it. No comparison with sibling tools like get_ad_insights or get_adset_insights is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_creativeB
Get a single ad creative by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| creative_id | Yes | ||
| fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description implicitly indicates a non-destructive read operation via the verb 'get', but it does not disclose any additional behavioral traits such as error handling, performance, or rate limits.
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 a single, concise sentence with no extraneous words, but it sacrifices parameter and behavioral details.
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 and lack of output schema, the description fails to explain the 'fields' parameter or the return format, making it incomplete for an agent to invoke correctly.
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 coverage is 0% and the description adds no explanation for the 'fields' parameter or its possible values, leaving the agent without guidance on how to use the optional parameter.
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 action (get), resource (ad creative), and scope (single by ID), which distinguishes it from sibling tools like list_creatives that return multiple items.
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?
No guidance is provided on when to use this tool versus alternatives like list_creatives or create_ad_creative. The description only states what it does, not when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pbiaA
Get (or auto-create) a Page-Backed Instagram Account for a Facebook Page. Use this when the Page has no linked Instagram account but you want to run ads with IG placements — Meta lets a Page act as its own IG presence via PBIA (same option as 'Use Facebook Page for Instagram' in Ads Manager).
Flow: GET the Page's access_token, list existing PBIAs, create one if none exists. Returns {page_backed_instagram_account_id, created (bool)}.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Facebook Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the auto-create behavior, the flow (GET access token, list, create if none), and the return value structure. It does not detail permissions or rate limits, but the information is sufficient for safe use.
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 with three sentences covering purpose, use case, and flow. Every sentence adds value without redundancy.
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 low complexity (1 parameter, no output schema), the description is nearly complete. It explains what, when, and how. It could mention that the tool may create a resource (i.e., side effect), but it already includes 'auto-create' and the 'created' flag.
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 coverage is 100%, so baseline is 3. The description mentions 'page_id' in the flow context but does not add additional meaning beyond what the schema provides.
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 gets or auto-creates a Page-Backed Instagram Account for a Facebook Page. It specifies the verb ('Get (or auto-create)') and the resource ('PBIA'), distinguishing it from sibling tools which focus on ad campaigns and creatives.
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?
Explicit usage context is provided: 'Use this when the Page has no linked Instagram account but you want to run ads with IG placements.' It also outlines the flow. However, it does not explicitly state when not to use the tool or mention alternatives, though no direct sibling alternatives exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ad_accountsA
List Meta Ad Accounts accessible to the current access token. Returns id (act_XXX), name, account_status, currency, business_name, spend_cap, timezone_name. Use this first to discover what you can work with.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max accounts per page (Meta caps ~500, default 100) | |
| after | No | Cursor for next page (from previous response's paging.cursors.after) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explains pagination via 'limit' and 'after', and lists return fields. It discloses that results are based on the current access token. While it doesn't explicitly state read-only or rate limits, the nature of a list operation is safely implied.
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?
Two sentences front-load the purpose and key information. Every phrase adds value: the action, returned fields, and usage guidance. No redundancy.
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?
Despite having no output schema, the description fully compensates by listing returned fields. With only two simple parameters and no nested objects, the description covers purpose, parameters, output, and usage guidance adequately.
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 coverage is 100% with descriptions for both 'limit' and 'after'. The description adds value beyond the schema by specifying Meta's cap (~500) and default (100) for limit, and the cursor source ('paging.cursors.after') for after, aiding correct parameter usage.
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 verb 'List', the resource 'Meta Ad Accounts', and the scope 'accessible to the current access token'. It enumerates the returned fields and positions itself as the starting point for discovery, distinguishing it from siblings like 'get_ad_account' which fetches a single account.
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 says 'Use this first to discover what you can work with', guiding the agent to invoke it before other account-specific tools. However, it does not explicitly mention when not to use or directly compare to alternatives like 'get_ad_account'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_adsB
List ads. Pass either ad_account_id (all ads in account), adset_id (ads in one ad set), or campaign_id (ads in a campaign). Returns id, name, adset_id, creative, status.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | No | ||
| adset_id | No | ||
| campaign_id | No | ||
| limit | No | ||
| after | No | ||
| effective_status | No | ||
| fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It lists return fields (id, name, adset_id, creative, status) but omits behavioral details such as pagination (limit, after parameters exist), rate limits, or that this is a read operation. The description adds some value but leaves significant gaps.
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 sentences, front-loaded with the purpose and key parameters. It is efficient but could add a note on output structure without hurting conciseness.
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 7 parameters, no output schema, and no annotations, the description is incomplete. It covers only filtering by IDs and return fields but ignores pagination, status filtering, and field selection. A more complete description would mention these capabilities.
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 explains the three ID parameters (ad_account_id, adset_id, campaign_id) but does not mention limit, after, effective_status, or fields, leaving 4 of 7 parameters undescribed. The explanation for the IDs is good but insufficient overall.
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?
Description clearly states 'List ads' and specifies the three filter options (ad_account_id, adset_id, campaign_id), distinguishing it from sibling tools like list_adsets or list_campaigns. The verb-resource combination is explicit and the scope is well-defined.
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 tells the agent to pass one of three IDs but does not provide guidance on when to use this tool over siblings like search_ads_library or get_ad. There is no explicit when-not or alternative suggestion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_adsetsA
List ad sets. Pass either ad_account_id (lists all adsets in account) OR campaign_id (lists adsets of one campaign). Returns id, name, campaign_id, status, daily_budget, bid_amount, billing_event, optimization_goal, targeting, is_dynamic_creative.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | No | 'act_123' or '123' | |
| campaign_id | No | ||
| limit | No | ||
| after | No | ||
| effective_status | No | ||
| fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description only lists returned fields but omits important behavioral details like pagination (limit, after), rate limits, or read-only nature.
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?
Two sentences, front-loaded with purpose, no wasted words. Could be slightly more structured but 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?
Provides basic usage but lacking explanation of pagination, filtering, and optional fields; incomplete for a tool with 6 parameters and no output schema.
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?
Adds meaning for ad_account_id and campaign_id, and lists return fields, but 4 out of 6 parameters (limit, after, effective_status, fields) are undocumented in both schema and description.
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?
Clearly states 'List ad sets' and explains the two key filtering options (by account or campaign), distinguishing it from sibling tools like list_ads or list_campaigns.
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 pass either ad_account_id or campaign_id, with clear return descriptions. However, lacks guidance on when not to use or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_campaignsA
List campaigns in an ad account. Returns id, name, status, objective, daily_budget, lifetime_budget, bid_strategy, created_time. Paginated via limit + after cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | Yes | Ad Account ID — accepts 'act_123456' or just '123456' | |
| limit | No | Default 100 | |
| after | No | Pagination cursor | |
| effective_status | No | Filter by effective_status (e.g. ['ACTIVE','PAUSED']) | |
| fields | No | Override default field list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses pagination and return fields. No annotations provided, so description carries burden; but doesn't explicitly state it's read-only or mention side effects, though implicit.
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?
Two concise sentences, front-loaded with purpose and return fields, then pagination detail. No verbose or redundant content.
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?
Compensates for lack of output schema by listing return fields. Mentions pagination. Could add ordering, error info, but sufficient for a list 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 coverage is 100%, but description adds value by listing return fields and confirming pagination cursor usage, which are not fully in schema descriptions.
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?
Clearly states verb 'list' and resource 'campaigns in an ad account', and lists specific return fields, differentiating from siblings like get_campaign or batch operations.
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?
Implies use for listing campaigns but lacks explicit guidance on when to use vs alternatives (e.g., get_campaign for single, search tools). No exclusions noted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_creativesB
List ad creatives in an account. Returns id, name, object_story_spec, asset_feed_spec, thumbnail_url, video_id, image_hash, body/title.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | Yes | 'act_123' or '123' | |
| limit | No | ||
| after | No | ||
| fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description lists returned fields, which is helpful, but does not disclose pagination behavior, rate limits, authentication requirements, or that it is a read operation. With no annotations, the description carries the full burden and only partially addresses it.
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?
Two concise sentences: first defines purpose, second lists return fields. No fluff, front-loaded 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 tool with 4 parameters and no output schema, the description only covers purpose and return fields. Missing explanations for pagination parameters and how to specify fields. Adequate but not thorough.
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 coverage is low (25%), and the description adds no meaning to parameters beyond the schema. It does not explain 'limit', 'after', or 'fields', leaving the agent to infer their usage.
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 action (list), the resource (ad creatives), and the scope (in an account). It distinguishes from sibling tools like 'get_creative' (single creative) and 'create_ad_creative' (creates).
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?
No guidance on when to use this tool versus alternatives such as 'get_creative' or other list tools. No context about prerequisites or filtering options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pagesA
List Facebook Pages the current user/System User manages. Each row has id, name, access_token (Page Access Token — needed for PBIA provisioning), category, tasks (what this token can do on the Page, e.g. 'MANAGE', 'CREATE_CONTENT', 'ADVERTISE').
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| after | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses output fields and token purpose, but lacks details on read-only nature, rate limits, or authentication requirements beyond 'current user/System User'.
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?
Single sentence front-loads purpose, but is slightly verbose; 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?
Covers purpose and output fields adequately, but lacks parameter details and behavioral context given no output schema and no 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?
Schema has two parameters (limit, after) but the description provides no information about them despite 0% schema description coverage. Baseline should be higher, but fails to add 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 the tool lists Facebook Pages managed by the current user, specifying the fields returned (id, name, access_token, category, tasks). This distinguishes it from sibling tools focused on ads and campaigns.
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?
Implied usage for retrieving page access tokens needed for PBIA provisioning, but no explicit guidance on when to use this tool versus alternatives like list_ad_accounts or get_pbia.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_campaigns_batchA
WRITE (BULK): Pause many campaigns in a single Meta Batch API call (up to 50/request; arrays bigger than 50 are chunked automatically with a 2s delay between chunks to sidestep rate-limit code 17). Returns {results: Array<{code, body}>} — one entry per campaign. code: 200 = success.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_ids | Yes | Meta Campaign IDs to pause |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses key behaviors: WRITE operation, batch API usage, chunking, rate-limit handling, and specific return format. With no annotations, this is strong, though could mention partial failure behavior.
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?
Two dense sentences, front-loaded with primary action and limits. Every word adds value, 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?
With only one parameter and no output schema, the description covers purpose, behavior, limits, and response structure thoroughly, leaving no obvious gaps.
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?
Parameter 'campaign_ids' is fully described in schema (100% coverage) as 'Meta Campaign IDs to pause'. Description adds no extra meaning beyond what the schema provides, so baseline 3 applies.
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?
Description clearly states the action (pause), resource (campaigns), and scope (bulk batch). The WRITE label and specific verb 'pause' distinguish it from siblings like 'activate_campaigns_batch' and individual update tools.
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?
Provides explicit limits (50/request), automatic chunking, and 2s delay to avoid rate limits. While it doesn't directly compare to alternatives, the batch context and sibling names imply when to use this vs. individual updates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_ads_libraryA
Search Meta's public Ad Library for competitive research. Returns active and inactive ads matching search_terms OR search_page_ids in the selected countries. Default country = ['US']. Returns ad_snapshot_url (preview), creative bodies/titles, page_id, delivery times, publisher_platforms.
Note: only ads in categories subject to public transparency (political / housing / employment / credit) return full metadata; other categories return lighter data.
| Name | Required | Description | Default |
|---|---|---|---|
| search_terms | No | Keywords to search ad text/creative | |
| search_page_ids | No | Specific Facebook Page IDs to look at | |
| ad_reached_countries | No | ISO-2 country codes. Default ['US'] | |
| ad_type | No | Default ALL | |
| ad_active_status | No | Default ACTIVE | |
| publisher_platforms | No | ||
| limit | No | ||
| after | No | ||
| fields | No | Override default field list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses important behavioral nuance: only ads in political/housing/employment/credit categories return full metadata, others return lighter data. No annotations exist, so description compensates well.
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?
Two concise paragraphs with front-loaded purpose, no wasted words. Every sentence adds value.
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?
Covers main functionality and limitations, but does not address pagination details or publisher_platforms filtering. Adequate for a search tool with no output schema.
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?
Description adds context beyond schema by explaining search logic (OR between search_terms and search_page_ids), default country, and returned fields. Schema coverage is 67%, so description helps fill 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 searches Meta's public Ad Library for competitive research, with specific verbs and resource. It distinguishes from sibling tools focused on account-level ads management.
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?
Implies usage for competitive research but does not explicitly guide when to use this vs alternatives like get_ad, list_ads, or when not to use it. No exclusions or alternative tool mentions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_adA
WRITE: Update an ad's name, status, or swap its creative. To replace the creative pass creative: {creative_id: 'XXX'}.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| name | No | ||
| status | No | ||
| creative | No | e.g. {creative_id: '123456'} |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explicitly states this is a write operation and mentions updating status (includes DELETED via enum), but does not disclose implications of creative swap or any authentication or rate limit requirements.
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?
Two sentences, no fluff. The critical action is front-loaded with 'WRITE' prefix, and the second sentence provides a concrete example. Every word earns its place.
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?
While the description lists updatable fields, it omits important context: return value, prerequisites, behavior of swapping creative (e.g., is the old creative deleted?), and that only ad_id is required. For a write tool with 4 params and no output schema, this is insufficient.
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 only 25% (creative param has description). The description adds minimal meaning: it lists name, status, and creative as updatable fields but does not explain ad_id, nor does it elaborate beyond what the schema already shows for creative. It does not compensate for low coverage.
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?
Description starts with 'WRITE: Update an ad's name, status, or swap its creative.' This clearly states the verb (update) and resource (ad) with specific modifiable fields, effectively distinguishing it from sibling tools like delete_ad or create_ad.
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?
Provides a specific usage tip for replacing the creative, but lacks guidance on when to use this tool versus alternatives (e.g., update_adset) and does not exclude any scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_adsetA
WRITE: Update any mutable field on an ad set (status, bid_amount, daily_budget, targeting, name, etc.). Pass only the fields you want to change.
| Name | Required | Description | Default |
|---|---|---|---|
| adset_id | Yes | ||
| name | No | ||
| status | No | ||
| bid_amount | No | ||
| daily_budget | No | ||
| lifetime_budget | No | ||
| targeting | No | ||
| optimization_goal | No | ||
| billing_event | No | ||
| start_time | No | ||
| end_time | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It signals 'WRITE:' and says 'Update any mutable field,' but does not mention side effects, permissions, idempotency, rate limits, validation behavior, or what happens if invalid values are passed. For a mutation tool, this is insufficient.
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?
Two sentences, front-loaded with 'WRITE:', no fluff. Every word contributes to clarity. Efficient and well-structured.
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?
With 11 parameters, no output schema, and no annotations, the description is too brief. It lacks return value information, error scenarios, required permissions, and guidance on when to use this over other update tools (e.g., update_bids_batch). Incomplete for a complex write operation.
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 lists several parameter names (status, bid_amount, daily_budget, targeting, name) which adds context beyond the schema's property names. However, it does not explain format, constraints (e.g., currency units), or the meaning of 'targeting' object, and uses vague 'etc.'.
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 updates an ad set, lists specific mutable fields (status, bid_amount, etc.), and distinguishes from create_adset and delete_adset by explicitly saying 'Update' and mentioning pass-only-changed-fields.
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 a key usage instruction: 'Pass only the fields you want to change.' This implies partial updates. It does not explicitly exclude other tools like update_campaign, but the context of ad set versus campaign is clear. No when-not-to-use or alternative tools mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_bids_batchA
WRITE (BULK): Update bid_amount on many ad sets in one Batch API call. Input is an array of {adset_id, bid_amount_cents} pairs. Bid values are in minor currency units (cents). Chunks of 50 automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| updates | Yes | Array of {adset_id, bid_amount_cents} to apply |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the burden. It discloses auto-chunking of 50 and that it's a WRITE operation, but does not mention idempotency, failure handling, or permission requirements. Adequate but not comprehensive.
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?
Two sentences, immediately labeling the tool as 'WRITE (BULK)' and front-loading the verb and resource. No wasted words.
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?
No output schema. The description covers the input format and batch behavior but lacks information about return values, error handling, or success confirmation. Adequate for a simple bulk update tool but could be more complete.
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 coverage is 100%, so baseline is 3. The description adds value by specifying that bid values are in minor currency units (cents) and that chunks of 50 are automatically handled, which goes beyond the schema's parameter description.
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 'Update bid_amount on many ad sets' with a bulk WRITE annotation. It distinguishes from sibling tools like update_adset (single) by explicitly stating 'BULK' and 'many ad sets'.
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?
It clearly indicates when to use this tool (bulk updates to bid_amount) and implies it's for multiple adsets, distinguishing from single-update tools. However, it does not explicitly exclude single-adset use or mention update_adset as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_campaignC
WRITE: Update any mutable field on a campaign (name, status, daily_budget, lifetime_budget, bid_strategy). Pass only the fields you want to change.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | ||
| name | No | ||
| status | No | ||
| daily_budget | No | ||
| lifetime_budget | No | ||
| bid_strategy | No | ||
| special_ad_categories | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only signals 'WRITE' and mentions mutable fields, but lacks disclosure of permissions, idempotency, error handling, rate limits, or other behavioral traits.
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 a single, efficient sentence with no wasted words. It is front-loaded with 'WRITE:' to indicate the action, achieving high conciseness.
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 has 7 parameters, no annotations, and many sibling tools, the description is too brief. It does not explain return values, error conditions, or full usage context, leaving gaps for an AI agent.
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 description lists the main mutable fields and clarifies that only desired fields need to be passed, adding meaning beyond the raw schema. However, it omits the 'special_ad_categories' parameter and provides no detail on enum values, which are already in the schema.
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?
Description clearly states 'Update any mutable field on a campaign' with a list of specific fields, making the purpose obvious. However, it does not explicitly differentiate from sibling update tools like update_ad or update_adset, though the name and context provide sufficient distinction.
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 says 'Pass only the fields you want to change,' which is a basic guideline for partial updates. It does not provide when-to-use or when-not-to-use guidance, nor does it mention alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageA
WRITE: Upload an image to an ad account. Returns {images: {filename: {hash}}}. The hash is what you pass to create_ad_creative as image_hash.
IMPORTANT: Meta image hashes are SCOPED TO THE AD ACCOUNT — a hash uploaded on account A cannot be used on account B. If you need the same image across multiple accounts, call this once per account. (ScaleForge's backend caches hashes per account to avoid re-uploads within the same account.)
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | Yes | 'act_123' or '123' | |
| url | No | Remote URL (recommended) | |
| filename | No | Descriptive filename (Meta keys the response by this) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description covers key behavioral aspects: it is a write operation, returns a hash, scoped per account, and mentions backend caching. It does not cover file size limits or supported formats but is sufficient for a simple upload.
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 and front-loaded with 'WRITE:' and the main purpose, then return format and important note. Each sentence adds value, though minor redundancy could be trimmed.
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?
The description explains the return format and provides cross-account advice. However, it lacks details on error cases, file size limits, or supported image types. Given no output schema, it covers the essentials but could be more complete.
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 coverage is 100%, so baseline is 3. The description adds context like 'Recommended' for url and explains how filename is used by Meta, but does not significantly expand beyond the schema descriptions.
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 explicitly states 'Upload an image to an ad account' and details the return format. It distinguishes this tool from siblings like create_ad_creative and upload_video by explaining how the returned hash is used in creative creation.
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 clear context on when to use this tool, especially the note about hash scoping and cross-account usage. However, it does not explicitly mention alternatives or 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.
upload_videoA
WRITE: Upload a video to an ad account. Returns {id, title}. Prefer file_url (remote URL Meta fetches server-side) — streaming a local file over MCP stdio is awkward and rarely needed when videos live in S3 / Dropbox / a CDN. Local file_path is accepted for completeness but may be blocked on Windows / sandboxed MCP hosts.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_account_id | Yes | 'act_123' or '123' | |
| file_url | No | Remote URL Meta fetches (recommended for MCP usage) | |
| file_path | No | Local path — only works when Node can read the file | |
| title | No | Video title (shown in Ad Library) | |
| name | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that it is a WRITE operation, returns `{id, title}`, and notes potential limitations for `file_path` (blocked on Windows/sandboxed hosts). This goes beyond basic function and adds useful context.
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?
Two sentences, front-loaded with 'WRITE:', and no wasted words. Every sentence provides essential information without redundancy.
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?
No output schema exists, so description adequately explains the return value (`{id, title}`). It covers main usage patterns and a key limitation. Lacks error scenarios or detailed response fields, but is reasonably complete for a video upload 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 has 6 params with 67% coverage; description adds significant value by explaining why `file_url` is recommended over `file_path` and mentions the return structure. This clarifies the intent of key parameters beyond their schema definitions.
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?
Description clearly states 'WRITE: Upload a video to an ad account.' It specifies the action, resource, and context, and distinguishes itself from siblings by focusing on video file upload. The return value is also mentioned.
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?
Provides excellent guidance on when to use `file_url` vs `file_path` and explains why `file_path` may be unsuitable. However, it does not compare this tool to sibling tools like `create_ad_creative` or `upload_image`, leaving the when-to-use-this-tool-vs-alternatives partially incomplete.
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.
32 tool updates
v0.3.0- First observed
activate_campaigns_batch - First observed
create_ad_creative - First observed
create_ad_creative_with_asset_feed - First observed
create_adset - First observed
create_campaign - First observed
delete_ad - First observed
delete_adset - First observed
delete_campaign - First observed
get_ad - First observed
get_ad_account - First observed
get_ad_insights - First observed
get_ads_volume - First observed
get_adset - First observed
get_adset_insights - First observed
get_campaign - First observed
get_campaign_insights - First observed
get_creative - First observed
get_pbia - First observed
list_ad_accounts - First observed
list_ads - First observed
list_adsets - First observed
list_campaigns - First observed
list_creatives - First observed
list_pages - First observed
pause_campaigns_batch - First observed
search_ads_library - First observed
update_ad - First observed
update_adset - First observed
update_bids_batch - First observed
update_campaign - First observed
upload_image - First observed
upload_video
TDQS
Scored across 32 tools
Each tool targets a distinct resource and operation. Lists, gets, creates, updates, deletes, batch operations, and special utilities are clearly separated. Even similar operations like get_ad vs get_ad_insights are differentiated by purpose. No significant overlap.
All tools follow a consistent verb_noun pattern in snake_case (e.g., list_ad_accounts, create_campaign, update_bids_batch). Minor exceptions like get_pbia are justified by acronyms. The naming is predictable and easy to navigate.
32 tools might seem high, but the Meta Ads domain is complex, requiring tools for CRUD on multiple entities, batch operations, insights, pre-flight checks, and competitive research. Each tool serves a clear, non-redundant purpose, making the count appropriate.
The tool surface covers the full lifecycle: campaign, ad set, ad, and creative CRUD; listing and detail retrieval; batch operations; image/video upload; insights; account and page management; pre-flight checks; and competitive search. No obvious gaps exist for standard ad management workflows.
Maintenance
Related MCP Connectors
AI agents that manage paid ads on Meta, LinkedIn, and Google Ads from any MCP client.
Meta Ads MCP: bulk-create Facebook & Instagram ads across accounts from Drive folders, guardrailed.
Google Ads, Meta Ads & GA4 MCP server - 250+ tools for campaigns, creatives, audiences & reports.
MCP-native ad server. Monetize AI chatbots and agents with conversational ads.
Related MCP Servers
- AlicenseAqualityBmaintenanceA Model Context Protocol server that allows AI models to access, analyze, and manage Meta advertising campaigns, enabling LLMs to retrieve performance data, visualize ad creatives, and provide strategic insights for Facebook and Instagram platforms.371,252Business Source 1.1
- AlicenseNot gradedqualityCmaintenanceUnofficial MCP server implementation for Facebook Business API. Enables LLMs to manage ad campaigns and ads via natural language.2MIT
- AlicenseAqualityCmaintenanceA Model Context Protocol server for the Meta (Facebook) Ads API, providing 54 tools to manage ad accounts, campaigns, ad sets, ads, creatives, media, insights, targeting, and more via the Meta Graph API.35206 npm12MIT
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol server that lets AI assistants run your Meta Ads end to end — launch campaigns, upload creatives, update budgets, and dig into performance through natural conversation. Works across Facebook, Instagram, and other Meta surfaces.Business Source 1.1