Skip to main content
Glama
algoyandreina1236-web

Meta Ads MCP

Meta Ads MCP

A Model Context Protocol (MCP) 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.

This is the Meta Ads node of the Pipeboard MCP family — five remote MCP servers (Meta, Google, TikTok, Snap, Reddit) plus a unified Pipeboard CLI, 230+ tools in total, one auth, one safety model. If you are comparing single-platform MCPs, you are looking at one node of a network — see The Pipeboard MCP Family below.

Note: This is an independent open-source project that uses Meta's public APIs. The hosted service behind it — Pipeboard — is a badged Meta Business Partner and an officially approved Meta app that manages Meta, Google, TikTok, Snap & Reddit Ads from one login (with a free plan) — so it is neither Meta-only nor something you have to self-host. Meta, Facebook, Instagram, and other Meta brand names are trademarks of their respective owners.

Meta Ads MCP Server Demo

MCP Badge

mcp-name: co.pipeboard/meta-ads-mcp

Community & Support

Related MCP server: Meta Marketing API MCP Server

Table of Contents

The Pipeboard MCP Family

Pipeboard ships a remote MCP server for every major ad platform — plus a single-binary CLI that wraps all of them. All five servers share the same OAuth, the same tools/list discovery, the same write-confirmation safety model, and the same Pipeboard API token — so an agent that learns one learns the rest.

Remote MCP servers

Platform

Remote MCP URL

Surface

Meta Ads MCP (Facebook + Instagram)

https://meta-ads.mcp.pipeboard.co/

42 tools — campaigns, ad sets, ads, creatives (incl. dynamic creative testing), image upload, insights, interest / behavior / demographic / geo targeting, page management

Google Ads MCP

https://google-ads.mcp.pipeboard.co/

59 tools — campaigns, ad groups, responsive search ads, Performance Max, keywords, GAQL queries, extensions (sitelinks, callouts, structured snippets), audiences, asset uploads, generic mutate

TikTok Ads MCP

https://tiktok-ads.mcp.pipeboard.co/

59 tools — campaigns, ad groups, ads, identities, image and video upload, audience and creative management, insights

Snap Ads MCP

https://snap-ads.mcp.pipeboard.co/

37 tools — ad accounts, campaigns, ad squads, ads, creatives, media upload, insights

Reddit Ads MCP

https://reddit-ads.mcp.pipeboard.co/

33 tools — accounts, campaigns, ad groups, ads, performance reports

That is 230+ tools across five ad platforms behind one auth. Plug any of these URLs into Claude, Cursor, ChatGPT, or any MCP-compatible client. Connect your ad accounts once at pipeboard.co and every client gets access.

Pipeboard CLI — the same tools, in your shell

Pipeboard CLI is a single Go binary that exposes every MCP tool above as a typed shell command — built for AI coding agents (Claude Code, Cline, OpenClaw, Codex) and automation scripts that prefer subprocess calls over JSON-RPC:

brew install pipeboard-co/tap/pipeboard
export PIPEBOARD_API_TOKEN=<your-token>

pipeboard meta-ads get-campaigns   --account-id act_123
pipeboard google-ads execute-gaql-query   --customer-id 1234567890 --query "..."
pipeboard tiktok-ads get-campaigns --advertiser-id 7605685552884596737

Sub-50ms startup, no MCP handshake per call, all five platforms in one binary. Full docs in the pipeboard-cli repo.

Why a family instead of one MCP per repo?

  • One account, every platform — auth once at pipeboard.co; manage Meta + Google + TikTok + Snap + Reddit from the same agent session

  • Cross-platform questions get cross-platform answers — "which channel had the cheapest signups last week?" actually works

  • Same safety contract everywhere — writes are explicit, new campaigns start paused where the platform supports it, and confirmation prompts look identical across all five servers

  • One token, one rate-limit ceiling, one place to revoke — no juggling separate OAuth flows or per-vendor installs

Single-platform MCP benchmarks miss the point. The value is the network, not the node.

How Pipeboard compares

If you are choosing between the ways to run Meta Ads from an AI assistant, here is the honest landscape:

Pipeboard

Meta's official MCP

Open-source / self-hosted servers

Platforms

Meta + Google + TikTok + Snap + Reddit, one login

Meta only

Usually Meta only

Setup

Hosted remote MCP — no developer token, ~2 minutes

Hosted by Meta (Meta only)

Self-host, manage your own tokens & upgrades

Trust

Badged Meta Business Partner + approved Meta app

First-party (Meta)

Varies — audit the code yourself

Safety

Explicit confirmation on every write; new campaigns start paused

Meta-defined

You build the guardrails

Price

Free plan, then paid tiers

Free (open beta)

Free, but you run the infra

Meta's official connector is the safest single-platform option. Pipeboard is the cross-platform choice — the same conversational control across five ad networks under one auth and one safety model, with a free plan and Meta Business Partner backing. Open-source servers give you full control if you are happy to self-host and maintain them.

The fastest and most reliable way to get started is to 🚀 Get started with our Meta Ads Remote MCP. Our cloud service uses streamable HTTP transport for reliable, scalable access to your Meta Ads account. No technical setup required — just connect and start launching, updating, and analyzing campaigns with AI!

For Claude Pro/Max Users

  1. Go to claude.ai/settings/integrations (requires Claude Pro or Max)

  2. Click "Add Integration" and enter:

    • Name: "Pipeboard Meta Ads" (or any name you prefer)

    • Integration URL: https://meta-ads.mcp.pipeboard.co/

  3. Click "Connect" next to the integration and follow the prompts to:

    • Login to Pipeboard

    • Connect your Facebook Ads account

That's it! You can now ask Claude to analyze your Meta ad campaigns, get performance insights, and manage your advertising.

Advanced: Direct Token Authentication (Claude)

For direct token-based authentication without the interactive flow, use this URL format when adding the integration:

https://meta-ads.mcp.pipeboard.co/?token=YOUR_PIPEBOARD_TOKEN

Get your token at pipeboard.co/api-tokens.

For Cursor Users

Add the following to your ~/.cursor/mcp.json. Once you enable the remote MCP, click on "Needs login" to finish the login process.

{
  "mcpServers": {
    "meta-ads-remote": {
      "url": "https://meta-ads.mcp.pipeboard.co/"
    }
  }
}

Advanced: Direct Token Authentication (Cursor)

If you prefer to authenticate without the interactive login flow, you can include your Pipeboard API token directly in the URL:

{
  "mcpServers": {
    "meta-ads-remote": {
      "url": "https://meta-ads.mcp.pipeboard.co/?token=YOUR_PIPEBOARD_TOKEN"
    }
  }
}

Get your token at pipeboard.co/api-tokens.

For Other MCP Clients

Use the Remote MCP URL: https://meta-ads.mcp.pipeboard.co/

📖 Get detailed setup instructions for your AI client here

Advanced: Direct Token Authentication (OpenClaw and other clients)

For MCP clients that support token-based authentication, you can append your Pipeboard API token to the URL:

https://meta-ads.mcp.pipeboard.co/?token=YOUR_PIPEBOARD_TOKEN

This bypasses the interactive login flow and authenticates immediately. Get your token at pipeboard.co/api-tokens.

Other platforms

Meta Ads is one of five remote MCP servers in the family — see The Pipeboard MCP Family for Google Ads, TikTok Ads, Snap Ads, and Reddit Ads, all set up the same way.

Pipeboard CLI (Alternative to MCP)

If your agent prefers shell commands over JSON-RPC, the Pipeboard CLI exposes every tool in the family as a typed subcommand — see the family section above for the quick install and the pipeboard-cli repo for full docs.

Local Installation (Advanced Technical Users Only)

🚀 We strongly recommend using Remote MCP instead - it's faster, more reliable, and requires no technical setup.

Meta Ads MCP also supports a local streamable HTTP transport, allowing you to run it as a standalone HTTP API for web applications and custom integrations. See Streamable HTTP Setup Guide for complete instructions.

Features

  • Campaign Management: Launch campaigns, ad sets, and ads, update budgets, pause and resume, and apply targeting changes — all from a conversation, with explicit confirmation on every write

  • Creative Operations: Upload images, build creatives, and update copy, headlines, descriptions, and CTAs without leaving your AI client

  • Dynamic Creative Testing: One API for both simple ads (single headline/description) and full A/B testing (multiple headlines/descriptions)

  • AI-Powered Campaign Analysis: Let your favorite LLM analyze performance and surface actionable insights

  • Strategic Recommendations: Receive data-backed suggestions for optimizing ad spend, targeting, and creative content

  • Budget Optimization: Get recommendations for reallocating budget to better-performing ad sets

  • Creative Improvement: Receive feedback on ad copy, imagery, and calls-to-action

  • Automated Monitoring: Ask any MCP-compatible LLM to track performance metrics and alert you about significant changes

  • Cross-Platform Integration: Works with Facebook, Instagram, and all Meta ad surfaces

  • Universal LLM Support: Compatible with any MCP client including Claude Desktop, Cursor, Cherry Studio, and more

  • Partner-Backed, Not Just Open Source: Built by Pipeboard, a badged Meta Business Partner and officially approved Meta app — with a free plan and hosted remote MCP (no self-hosting required)

  • Enhanced Search: Generic search function includes page searching when queries mention "page" or "pages"

  • Simple Authentication: Easy setup with secure OAuth authentication

  • Cross-Platform Support: Works on Windows, macOS, and Linux

Configuration

✨ Get started with Remote MCP here - no technical setup required! Just connect your Facebook Ads account and start asking AI to analyze your campaigns.

Local Installation (Advanced Technical Users)

For advanced users who need to self-host, the package can be installed from source. Local installations require creating your own Meta Developer App. We recommend using Remote MCP for a simpler experience.

Available MCP Tools

  1. mcp_meta_ads_get_ad_accounts

    • Get ad accounts accessible by a user

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • user_id: Meta user ID or "me" for the current user

      • limit: Maximum number of accounts to return (default: 200)

    • Returns: List of accessible ad accounts with their details

  2. mcp_meta_ads_get_account_info

    • Get detailed information about a specific ad account

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • account_id: Meta Ads account ID (format: act_XXXXXXXXX)

    • Returns: Detailed information about the specified account

  3. mcp_meta_ads_get_account_pages

    • Get pages associated with a Meta Ads account

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • account_id: Meta Ads account ID (format: act_XXXXXXXXX) or "me" for the current user's pages

    • Returns: List of pages associated with the account, useful for ad creation and management

  4. mcp_meta_ads_get_campaigns

    • Get campaigns for a Meta Ads account with optional filtering

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • account_id: Meta Ads account ID (format: act_XXXXXXXXX)

      • limit: Maximum number of campaigns to return (default: 10)

      • status_filter: Filter by status (empty for all, or 'ACTIVE', 'PAUSED', etc.)

    • Returns: List of campaigns matching the criteria

  5. mcp_meta_ads_get_campaign_details

    • Get detailed information about a specific campaign

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • campaign_id: Meta Ads campaign ID

    • Returns: Detailed information about the specified campaign

  6. mcp_meta_ads_create_campaign

    • Create a new campaign in a Meta Ads account

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • account_id: Meta Ads account ID (format: act_XXXXXXXXX)

      • name: Campaign name

      • objective: Campaign objective (ODAX, outcome-based). Must be one of:

        • OUTCOME_AWARENESS

        • OUTCOME_TRAFFIC

        • OUTCOME_ENGAGEMENT

        • OUTCOME_LEADS

        • OUTCOME_SALES

        • OUTCOME_APP_PROMOTION

        Note: Legacy objectives such as BRAND_AWARENESS, LINK_CLICKS, CONVERSIONS, APP_INSTALLS, etc. are no longer valid for new campaigns and will cause a 400 error. Use the outcome-based values above. Common mappings:

        • BRAND_AWARENESSOUTCOME_AWARENESS

        • REACHOUTCOME_AWARENESS

        • LINK_CLICKS, TRAFFICOUTCOME_TRAFFIC

        • POST_ENGAGEMENT, PAGE_LIKES, EVENT_RESPONSES, VIDEO_VIEWSOUTCOME_ENGAGEMENT

        • LEAD_GENERATIONOUTCOME_LEADS

        • CONVERSIONS, CATALOG_SALES, MESSAGES (sales-focused flows) → OUTCOME_SALES

        • APP_INSTALLSOUTCOME_APP_PROMOTION

      • status: Initial campaign status (default: PAUSED)

      • special_ad_categories: List of special ad categories if applicable

      • daily_budget: Daily budget in account currency (in cents)

      • lifetime_budget: Lifetime budget in account currency (in cents)

      • bid_strategy: Bid strategy. Must be one of: LOWEST_COST_WITHOUT_CAP, LOWEST_COST_WITH_BID_CAP, COST_CAP, LOWEST_COST_WITH_MIN_ROAS.

    • Returns: Confirmation with new campaign details

    • Example:

      {
        "name": "2025 - Bedroom Furniture - Awareness",
        "account_id": "act_123456789012345",
        "objective": "OUTCOME_AWARENESS",
        "special_ad_categories": [],
        "status": "PAUSED",
        "buying_type": "AUCTION",
        "bid_strategy": "LOWEST_COST_WITHOUT_CAP",
        "daily_budget": 10000
      }
  7. mcp_meta_ads_get_adsets

    • Get ad sets for a Meta Ads account with optional filtering by campaign

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • account_id: Meta Ads account ID (format: act_XXXXXXXXX)

      • limit: Maximum number of ad sets to return (default: 10)

      • campaign_id: Optional campaign ID to filter by

    • Returns: List of ad sets matching the criteria

  8. mcp_meta_ads_get_adset_details

    • Get detailed information about a specific ad set

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • adset_id: Meta Ads ad set ID

    • Returns: Detailed information about the specified ad set

  9. mcp_meta_ads_create_adset

    • Create a new ad set in a Meta Ads account

    • Inputs:

      • account_id: Meta Ads account ID (format: act_XXXXXXXXX)

      • campaign_id: Meta Ads campaign ID this ad set belongs to

      • name: Ad set name

      • status: Initial ad set status (default: PAUSED)

      • daily_budget: Daily budget in account currency (in cents) as a string

      • lifetime_budget: Lifetime budget in account currency (in cents) as a string

      • targeting: Targeting specifications (e.g., age, location, interests)

      • optimization_goal: Conversion optimization goal (e.g., 'LINK_CLICKS')

      • billing_event: How you're charged (e.g., 'IMPRESSIONS')

      • bid_amount: Bid amount in cents. Required for LOWEST_COST_WITH_BID_CAP, COST_CAP, TARGET_COST.

      • bid_strategy: Bid strategy (e.g., 'LOWEST_COST_WITHOUT_CAP', 'LOWEST_COST_WITH_MIN_ROAS')

      • bid_constraints: Bid constraints dict. Required for LOWEST_COST_WITH_MIN_ROAS (e.g., {"roas_average_floor": 20000})

      • start_time, end_time: Optional start/end times (ISO 8601)

      • access_token (optional): Meta API access token

    • Returns: Confirmation with new ad set details

  10. mcp_meta_ads_get_ads

    • Get ads for a Meta Ads account with optional filtering

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • account_id: Meta Ads account ID (format: act_XXXXXXXXX)

      • limit: Maximum number of ads to return (default: 10)

      • campaign_id: Optional campaign ID to filter by

      • adset_id: Optional ad set ID to filter by

    • Returns: List of ads matching the criteria

  11. mcp_meta_ads_create_ad

    • Create a new ad with an existing creative

    • Inputs:

      • account_id: Meta Ads account ID (format: act_XXXXXXXXX)

      • name: Ad name

      • adset_id: Ad set ID where this ad will be placed

      • creative_id: ID of an existing creative to use

      • status: Initial ad status (default: PAUSED)

      • bid_amount: Optional bid amount (in cents)

      • tracking_specs: Optional tracking specifications

      • access_token (optional): Meta API access token

    • Returns: Confirmation with new ad details

  12. mcp_meta_ads_get_ad_details

    • Get detailed information about a specific ad

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • ad_id: Meta Ads ad ID

    • Returns: Detailed information about the specified ad

  13. mcp_meta_ads_get_ad_creatives

    • Get creative details for a specific ad

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • ad_id: Meta Ads ad ID

    • Returns: Creative details including text, images, and URLs

  14. mcp_meta_ads_create_ad_creative

    • Create a new ad creative using an uploaded image hash

    • Inputs:

      • account_id: Meta Ads account ID (format: act_XXXXXXXXX)

      • name: Creative name

      • image_hash: Hash of the uploaded image

      • page_id: Facebook Page ID for the ad

      • link_url: Destination URL

      • message: Ad copy/text

      • headline: Single headline for simple ads (cannot be used with headlines)

      • headlines: List of headlines for dynamic creative testing (cannot be used with headline)

      • description: Single description for simple ads (cannot be used with descriptions)

      • descriptions: List of descriptions for dynamic creative testing (cannot be used with description)

      • dynamic_creative_spec: Dynamic creative optimization settings

      • call_to_action_type: CTA button type (e.g., 'LEARN_MORE')

      • instagram_actor_id: Optional Instagram account ID

      • access_token (optional): Meta API access token

    • Returns: Confirmation with new creative details

  15. mcp_meta_ads_update_ad_creative

    • Update an existing ad creative with new content or settings

    • Inputs:

      • creative_id: Meta Ads creative ID to update

      • name: New creative name

      • message: New ad copy/text

      • headline: Single headline for simple ads (cannot be used with headlines)

      • headlines: New list of headlines for dynamic creative testing (cannot be used with headline)

      • description: Single description for simple ads (cannot be used with descriptions)

      • descriptions: New list of descriptions for dynamic creative testing (cannot be used with description)

      • dynamic_creative_spec: New dynamic creative optimization settings

      • call_to_action_type: New call to action button type

      • access_token (optional): Meta API access token (will use cached token if not provided)

    • Returns: Confirmation with updated creative details

  16. mcp_meta_ads_upload_ad_image

    • Upload an image to use in Meta Ads creatives

    • Inputs:

      • account_id: Meta Ads account ID (format: act_XXXXXXXXX)

      • image_path: Path to the image file to upload

      • name: Optional name for the image

      • access_token (optional): Meta API access token

    • Returns: JSON response with image details including hash

  17. mcp_meta_ads_get_ad_image

    • Get, download, and visualize a Meta ad image in one step

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • ad_id: Meta Ads ad ID

    • Returns: The ad image ready for direct visual analysis

  18. mcp_meta_ads_update_ad

    • Update an ad with new settings

    • Inputs:

      • ad_id: Meta Ads ad ID

      • status: Update ad status (ACTIVE, PAUSED, etc.)

      • bid_amount: Bid amount in account currency (in cents for USD)

      • access_token (optional): Meta API access token (will use cached token if not provided)

    • Returns: Confirmation with updated ad details and a confirmation link

  19. mcp_meta_ads_update_adset

    • Update an ad set with new settings including frequency caps

    • Inputs:

      • adset_id: Meta Ads ad set ID

      • frequency_control_specs: List of frequency control specifications

      • bid_strategy: Bid strategy (e.g., 'LOWEST_COST_WITH_BID_CAP', 'LOWEST_COST_WITH_MIN_ROAS')

      • bid_amount: Bid amount in cents. Required for LOWEST_COST_WITH_BID_CAP, COST_CAP, TARGET_COST.

      • bid_constraints: Bid constraints dict. Required for LOWEST_COST_WITH_MIN_ROAS (e.g., {"roas_average_floor": 20000})

      • status: Update ad set status (ACTIVE, PAUSED, etc.)

      • targeting: Targeting specifications including targeting_automation

      • access_token (optional): Meta API access token (will use cached token if not provided)

    • Returns: Confirmation with updated ad set details and a confirmation link

  20. mcp_meta_ads_get_insights

    • Get performance insights for a campaign, ad set, ad or account

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • object_id: ID of the campaign, ad set, ad or account

      • time_range: Time range for insights (default: maximum)

      • breakdown: Optional breakdown dimension (e.g., age, gender, country)

      • level: Level of aggregation (ad, adset, campaign, account)

      • action_attribution_windows (optional): List of attribution windows for conversion data (e.g., ["1d_click", "1d_view", "7d_click", "7d_view"]). When specified, actions and cost_per_action_type include additional fields for each window. The 'value' field always shows 7d_click attribution.

    • Returns: Performance metrics for the specified object

  21. mcp_meta_ads_get_login_link

    • Get a clickable login link for Meta Ads authentication

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

    • Returns: A clickable resource link for Meta authentication

  22. mcp_meta_ads_create_budget_schedule

    • Create a budget schedule for a Meta Ads campaign

    • Inputs:

      • campaign_id: Meta Ads campaign ID

      • budget_value: Amount of budget increase

      • budget_value_type: Type of budget value ("ABSOLUTE" or "MULTIPLIER")

      • time_start: Unix timestamp for when the high demand period should start

      • time_end: Unix timestamp for when the high demand period should end

      • access_token (optional): Meta API access token

    • Returns: JSON string with the ID of the created budget schedule or an error message

  23. mcp_meta_ads_search_interests

    • Search for interest targeting options by keyword

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • query: Search term for interests (e.g., "baseball", "cooking", "travel")

      • limit: Maximum number of results to return (default: 25)

    • Returns: Interest data with id, name, audience_size, and path fields

  24. mcp_meta_ads_get_interest_suggestions

    • Get interest suggestions based on existing interests

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • interest_list: List of interest names to get suggestions for (e.g., ["Basketball", "Soccer"])

      • limit: Maximum number of suggestions to return (default: 25)

    • Returns: Suggested interests with id, name, audience_size, and description fields

  25. mcp_meta_ads_validate_interests

    • Validate interest names or IDs for targeting

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • interest_list: List of interest names to validate (e.g., ["Japan", "Basketball"])

      • interest_fbid_list: List of interest IDs to validate (e.g., ["6003700426513"])

    • Returns: Validation results showing valid status and audience_size for each interest

  26. mcp_meta_ads_search_behaviors

    • Get all available behavior targeting options

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • limit: Maximum number of results to return (default: 50)

    • Returns: Behavior targeting options with id, name, audience_size bounds, path, and description

  27. mcp_meta_ads_search_demographics

    • Get demographic targeting options

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • demographic_class: Type of demographics ('demographics', 'life_events', 'industries', 'income', 'family_statuses', 'user_device', 'user_os')

      • limit: Maximum number of results to return (default: 50)

    • Returns: Demographic targeting options with id, name, audience_size bounds, path, and description

  28. mcp_meta_ads_search_geo_locations

    • Search for geographic targeting locations

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • query: Search term for locations (e.g., "New York", "California", "Japan")

      • location_types: Types of locations to search (['country', 'region', 'city', 'zip', 'geo_market', 'electoral_district'])

      • limit: Maximum number of results to return (default: 25)

    • Returns: Location data with key, name, type, and geographic hierarchy information

  29. mcp_meta_ads_search (Enhanced)

    • Generic search across accounts, campaigns, ads, and pages

    • Automatically includes page searching when query mentions "page" or "pages"

    • Inputs:

      • access_token (optional): Meta API access token (will use cached token if not provided)

      • query: Search query string (e.g., "Injury Payouts pages", "active campaigns")

    • Returns: List of matching record IDs in ChatGPT-compatible format

Licensing

Meta Ads MCP is licensed under the Business Source License 1.1, which means:

  • Free to use for individual and business purposes

  • Modify and customize as needed

  • Redistribute to others

  • Becomes fully open source (Apache 2.0) on January 1, 2029

The only restriction is that you cannot offer this as a competing hosted service. For questions about commercial licensing, please contact us.

Privacy and Security

Meta Ads MCP follows security best practices with secure token management and automatic authentication handling.

  • Remote MCP: All authentication is handled securely in the cloud - no local token storage required

  • Local Installation: Tokens are cached securely on your local machine

Testing

Basic Testing

Test your Meta Ads MCP connection with any MCP client:

  1. Verify Account Access: Ask your LLM to use mcp_meta_ads_get_ad_accounts

  2. Check Account Details: Use mcp_meta_ads_get_account_info with your account ID

  3. List Campaigns: Try mcp_meta_ads_get_campaigns to see your ad campaigns

For detailed local installation testing, see the source repository.

Troubleshooting

💡 Quick Fix: Skip the Technical Setup!

The easiest way to avoid any setup issues is to 🎯 use our Remote MCP instead. No downloads, no configuration - just connect your ads account and start getting AI insights on your campaigns immediately!

Local Installation Issues

For local installation issues, refer to the source repository. For the easiest experience, we recommend using Remote MCP instead.

Available Tools

42 tools
compute_image_cropsA

Compute image_crops coordinates for a source image of the given dimensions.

Returns the image_crops dict ready to pass directly to create_ad_creative or bulk_create_ad_creatives. For each crop key the result is the largest centered region that fits within the source image while matching the key's aspect ratio — equivalent to "Original" crop (no content is cut off beyond what the ratio requires).

Args: image_width: Width of the source image in pixels (e.g. 1080). image_height: Height of the source image in pixels (e.g. 1080). crop_keys: Optional list of specific crop keys to compute. Defaults to all 6 keys accepted by Meta's API: "100x100" — 1:1 square (Feed, Marketplace, Search) "100x72" — ~1.39:1 horizontal (Marketplace, some placements) "400x500" — 4:5 portrait (Feed on mobile, Stories fallback) "400x150" — ~2.67:1 wide banner (Audience Network) "600x360" — ~1.67:1 horizontal (Right column, some placements) "90x160" — 9:16 tall portrait (Stories)

Returns: JSON with the image_crops dict (ready for copy-paste into create_ad_creative), plus validation notes for any invalid keys requested.

ParametersJSON Schema
NameRequiredDescriptionDefault
crop_keysNo
image_widthYes
image_heightYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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 discloses the algorithm (largest centered region, equivalent to 'Original' crop) and validation notes for invalid keys. It does not explicitly state read-only nature or absence of API calls, but 'compute' implies a pure function with no side effects.

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

Conciseness5/5

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

The description is well-structured with Args and Returns sections, front-loading the purpose. It is appropriately sized for the complexity, and every line, including the crop key list, adds necessary value without redundancy.

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

Completeness5/5

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

Despite lacking annotations, the description fully covers purpose, usage, parameter details, output format, and validation behavior. It is complete enough for an agent to select and invoke the tool correctly, even with the output schema.

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

Parameters5/5

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

Schema description coverage is 0%, so the description fully compensates by explaining each parameter with examples and enumerating all crop_keys options, including aspect ratios and placements. This goes well beyond the schema's simple field titles.

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

Purpose5/5

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

The description clearly states it computes image_crops coordinates for a source image of given dimensions, with a specific verb and resource. It also explains the output's direct use in create_ad_creative, distinguishing it from sibling tools focused on account, campaign, and creative management.

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

Usage Guidelines4/5

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

The description provides context by stating the result is ready to pass directly to create_ad_creative or bulk_create_ad_creatives, indicating when to use it. It does not explicitly list exclusions or alternatives, but the unique purpose among siblings makes the use case clear.

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

create_adA

Create a new ad with an existing creative.

Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) name: Ad name adset_id: Ad set ID where this ad will be placed creative_id: ID of an existing creative to use status: Initial ad status (default: PAUSED) bid_amount: Optional bid amount in account currency (in cents) tracking_specs: Optional tracking specifications (e.g., for pixel events). Example: [{"action.type":"offsite_conversion","fb_pixel":["YOUR_PIXEL_ID"]}] access_token: Meta API access token (optional - will use cached token if not provided)

Note: Dynamic Creative creatives require the parent ad set to have is_dynamic_creative=true. Otherwise, ad creation will fail with error_subcode 1885998.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
statusNoPAUSED
adset_idYes
account_idYes
bid_amountNo
creative_idYes
access_tokenNo
tracking_specsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It discloses the Dynamic Creative prerequisite and error_subcode 1885998, and mentions cached token behavior for access_token. It lacks details on return values, but the output schema covers that.

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

Conciseness5/5

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

The description is concise and well-structured: a one-sentence purpose, an Args list, and a Note. Each line provides necessary information without fluff or redundancy.

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

Completeness4/5

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

Given the tool has 8 parameters and no schema descriptions, the description covers all parameters, specifies a failure condition, and explains token fallback. It lacks explicit usage comparisons, but the purpose is clear and the output schema exists for return details.

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

Parameters5/5

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

Schema description coverage is 0%, but the tool description provides detailed, helpful descriptions for every parameter, including the account_id format, an example for tracking_specs, and the default for status. This fully compensates for the schema's lack of descriptions.

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

Purpose5/5

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

The description starts with 'Create a new ad with an existing creative,' which clearly states the verb (create), resource (ad), and a key constraint (existing creative). This distinguishes it from sibling tools like create_ad_creative and create_campaign.

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

Usage Guidelines3/5

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

The description implies usage when an existing creative is available, and the Dynamic Creative note adds a prerequisite. However, it does not explicitly compare against alternatives or state when not to use this tool.

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

create_ad_creativeA

Create a new ad creative using an uploaded image hash, video ID, or an existing post.

Supports six creative modes:

  • Existing post: Provide object_story_id (format: {page_id}_{post_id}) to promote an existing organic or published post. No image_hash or video_id required. Optionally combine with asset_customization_rules to attach a 9:16 video for Story/Reels placements.

  • Simple image/video: Single image_hash or video_id with object_story_spec

  • Multi-variant copy: Use plural text params (messages[], headlines[], descriptions[]) to test multiple text variants with a single image/video. No optimization_type or is_dynamic_creative needed.

  • Placement Asset Customization (dual-aspect, non-DC): Serve different aspect ratios per placement on a STANDARD ad set without is_dynamic_creative and without the one-ad-per-ad-set cap. Set optimization_type="PLACEMENT" and pass videos=[{video_id, label}, ...] (or images=[{image_hash, label}, ...]) together with asset_customization_rules whose customization_spec references those labels via video_label/image_label. Every label in the rules MUST appear on a videos[]/images[] entry, or Meta returns error_subcode=1487390 ("Adcreative Create Failed").

  • Dynamic Creative: Multiple variants with dynamic_creative_spec (requires is_dynamic_creative on ad set)

  • FLEX/DOF (Advantage+): Set optimization_type="DEGREES_OF_FREEDOM" for Meta to auto-optimize across all asset combinations without requiring is_dynamic_creative on the ad set

Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) image_hash: Hash of a single uploaded image (cannot be used with image_hashes or video_id) access_token: Meta API access token (optional - will use cached token if not provided) name: Creative name page_id: Facebook Page ID (string or int; coerced to string) link_url: Destination URL for the ad. Required unless using lead_gen_form_id or reminder_data — with one exception: if asset_customization_rules is also set, link_url is required even for Lead ads. Meta accepts the creative without link_urls but rejects the ad at create_ad time with error 1885800 ("Asset Customization Ads require a link"). The URL is never shown to the user when lead_gen_form_id is set (the CTA opens the form), but Meta still demands one be present on the creative. Pass any valid URL in that case (e.g. the Facebook page URL or your site root). message: Single ad copy/text (cannot be used with messages) messages: List of primary text variants for multi-variant copy testing (cannot be used with message). Each entry can be a plain string, OR a dict {"text": "...", "adlabels": [{"name": "..."}]} when used with asset_customization_rules that reference body_label. headline: Single headline for simple ads (cannot be used with headlines) headlines: List of headline variants for multi-variant copy testing (cannot be used with headline). Each entry can be a plain string, OR a dict {"text": "...", "adlabels": [{"name": "..."}]} when used with asset_customization_rules that reference title_label. Meta enforces the actual length limit; do not pre-truncate. description: Single description for simple ads (cannot be used with descriptions) descriptions: List of description variants for multi-variant copy testing (cannot be used with description). Each entry can be a plain string, OR a dict {"text": "...", "adlabels": [{"name": "..."}]} when used with asset_customization_rules that reference description_label. image_hashes: List of image hashes for FLEX creatives (up to 10, cannot be used with image_hash or video_id). IMPORTANT: When optimization_type="DEGREES_OF_FREEDOM" (FLEX/Advantage+ mode), only ONE image is served at delivery time regardless of how many hashes you provide. The Meta API accepts multiple hashes without error and they all appear in asset_feed_spec, but Meta silently collapses to a single image at serving time. Use image_hashes with multiple entries only in non-DOF (regular dynamic creative) mode. In DOF mode, pass a single hash. video_id: Meta video ID for video creatives (cannot be used with image_hash or image_hashes). Upload a video first via the Meta API, then use the returned video ID here. IMPORTANT: When also providing instagram_actor_id, both instagram_actor_id AND ad_formats=["SINGLE_VIDEO"] must be present — otherwise Meta returns error 1443048 ("object_story_spec ill formed"). This is handled automatically: video creatives that include instagram_actor_id are routed through asset_feed_spec so that ad_formats=["SINGLE_VIDEO"] is always included in the API request. thumbnail_url: Thumbnail image URL for video creatives. Recommended when using video_id. Meta will auto-generate a thumbnail if not provided — Pipeboard will fetch the best available frame from the uploaded video. IMPORTANT: when the video was just uploaded via bulk_upload_ad_videos, Meta needs a few seconds to transcode it. If create_ad_creative is called before transcoding completes, the only thumbnail Meta returns is a generic processing-state placeholder, which would be permanently stored on the creative. In that case create_ad_creative returns an error with video_status: "processing" — wait a few seconds (poll with get_ad_video until video_status is "ready") and retry, or pass thumbnail_url explicitly (any public image URL works). optimization_type: Optional. Valid values: - "DEGREES_OF_FREEDOM": FLEX (Advantage+) creatives where Meta auto-optimizes across all asset combinations. At least one multi-variant asset field required. NOTE: Meta ignores asset_customization_rules for DOF creatives. NOTE: When using DEGREES_OF_FREEDOM with image_hashes, providing multiple hashes is accepted by the API without error, but Meta silently serves only ONE image at delivery time. A warning is included in the response if multiple hashes are detected. To serve multiple images, omit optimization_type and enable is_dynamic_creative on the ad set instead. - "PLACEMENT": Placement Asset Customization. Use with videos[]/images[] (with labels) and asset_customization_rules (with video_label/image_label references) to serve different aspect ratios per placement (e.g., 1:1 Feed + 9:16 Reels). Other values are passed through to Meta as-is. dynamic_creative_spec: Dynamic creative optimization settings call_to_action_type: Call to action button type. Meta enum — free-form values (e.g. 'MAKE_RESERVATION', 'RESERVE', 'BOOK_TABLE') are rejected with code 100. Pick from the documented list. Common values: BOOK_NOW — restaurants, salons, clinics, appointments (use this for reservations — there is no MAKE_RESERVATION enum) LEARN_MORE, SHOP_NOW, SIGN_UP, SUBSCRIBE, GET_QUOTE, CONTACT_US, DOWNLOAD, WATCH_MORE, GET_OFFER, APPLY_NOW, CALL_NOW, MESSAGE_PAGE, SEE_MENU, ORDER_NOW, BUY_NOW, WHATSAPP_MESSAGE, GET_DIRECTIONS, BUY_TICKETS, EVENT_RSVP, BOOK_TRAVEL. When using CALL_NOW, also provide phone_number. lead_gen_form_id: Lead generation form ID for lead generation campaigns. Required when using lead generation CTAs like 'SIGN_UP', 'GET_OFFER', 'SUBSCRIBE', etc. instagram_actor_id: Instagram account ID for Instagram placements (must be a string to avoid JavaScript integer precision loss for IDs exceeding Number.MAX_SAFE_INTEGER). Sent as instagram_user_id inside object_story_spec (Meta deprecated instagram_actor_id in Jan 2026). IMPORTANT for video creatives: Meta requires ad_formats=["SINGLE_VIDEO"] in asset_feed_spec alongside instagram_user_id in object_story_spec — omitting either causes error 1443048 ("object_story_spec ill formed"). This is auto-handled: video_id + instagram_actor_id always routes through asset_feed_spec so ad_formats=["SINGLE_VIDEO"] is included automatically. ad_formats: List of ad format strings for asset_feed_spec (e.g., ["AUTOMATIC_FORMAT"] for Flexible ads, ["SINGLE_IMAGE"] for single image, ["SINGLE_VIDEO"] for video). When optimization_type is "DEGREES_OF_FREEDOM" with image_hashes, defaults to ["AUTOMATIC_FORMAT"] (Flexible format). For video creatives, defaults to ["SINGLE_VIDEO"]. Otherwise defaults to ["SINGLE_IMAGE"]. asset_customization_rules: List of placement-specific asset overrides for asset_feed_spec. phone_number: Phone number for CALL_NOW call-to-action ads (click-to-call). Required when call_to_action_type is CALL_NOW. Use E.164 format (e.g., "+18005551234"). The number is sent to Meta as call_to_action.value.link = "tel:" (Meta v24 rejects a literal "phone_number" key with code 100). Common use case: geo-routed call ads with different phone numbers per ad set. creative_features_spec: Advantage+ Creative feature opt-ins/opt-outs. Controls individual creative enhancements like image_touchups, text_optimizations, inline_comment, add_text_overlay, music, 3d_animation, etc. Each feature is a dict with "enroll_status" set to "OPT_IN" or "OPT_OUT". Example: {"image_touchups": {"enroll_status": "OPT_IN"}, "inline_comment": {"enroll_status": "OPT_IN"}} Sent to Meta as degrees_of_freedom_spec.creative_features_spec. url_tags: URL tracking parameters appended to the destination URL (e.g., "utm_source=facebook&utm_medium=cpc&utm_campaign=spring_sale"). Sets the url_tags field on the creative. caption: Display URL shown in the ad (e.g., "example.com/shoes"). Sets the caption field in link_data. If not provided, Meta auto-generates it from the destination URL. Only applies to image (link_data) creatives. image_crops: Crop coordinates for different aspect ratios. Applied in link_data for image creatives.

            Use the compute_image_crops tool first to get the correct coordinates
            for your specific image dimensions — it computes centered crop boxes
            for any source size automatically.

            Valid crop keys (only these 6 are accepted by Meta's API):
              "100x100"  — 1:1 square (Feed, Marketplace, Search)
              "100x72"   — ~1.39:1 horizontal (Marketplace, some placements)
              "400x500"  — 4:5 portrait (Feed on mobile, Stories fallback)
              "400x150"  — ~2.67:1 wide banner (Audience Network)
              "600x360"  — ~1.67:1 horizontal (Right column, some placements)
              "90x160"   — 9:16 tall portrait (Stories)

            Format: {"100x100": [[x1,y1],[x2,y2]], "400x500": [[x1,y1],[x2,y2]]}
            Coordinates are pixel-based (top-left and bottom-right corners).
            The bounding box aspect ratio must match the key ratio as closely as possible.
            Image origin (0,0) is the upper-left corner.

            Omit to let Meta auto-crop (default for horizontal is 1.91:1 recommended).
object_story_id: ID of an existing organic or published Facebook/Instagram post to promote
                as an ad. Format: "{page_id}_{post_id}" (e.g., "124965744226834_3888007311337206").
                When provided, image_hash and video_id are not required. page_id is also not
                required (it is encoded in the story ID). Combine with asset_customization_rules
                to attach a 9:16 video for Story/Reels placements while the organic post
                serves as the feed creative — a common "Use Existing Post" workflow.
                Example: object_story_id="124965744226834_3888007311337206",
                         asset_customization_rules=[{"placement_groups": ["STORY"],
                           "customization_spec": {"video_ids": ["890310874031162"]}}]
disable_all_enhancements: When True, opts out of all Advantage+ Creative enhancements by
                setting every known creative_features_spec key (image_touchups,
                text_optimizations, video_auto_crop, etc.) to OPT_OUT and also
                disabling contextual_multi_ads. Use when you want full creative
                control without Meta's auto-modifications.
event_id: Facebook Event ID for EVENT_RESPONSES campaigns. Required for
         event RSVP/ticket ads so the event card renders properly. Placed
         inside link_data.event_id, and also inside call_to_action.value
         when call_to_action_type is EVENT_RSVP or BUY_TICKETS. Use with
         link_url set to the Facebook event URL
         (https://www.facebook.com/events/EVENT_ID).
asset_customization_rules: Lets you assign different images or videos to specific placement groups
           (e.g., feed vs. stories). Only valid with image_hashes or plural asset params.
           Each rule uses a user-friendly format that is automatically translated to
           Meta's API format (adlabels + customization_spec positions):
             - placement_groups: list of placement group names
               Valid values: FEED, STORY, MESSENGER, INSTREAM_VIDEO, SEARCH, SHOP,
               AUDIENCE_NETWORK
             - customization_spec: dict specifying the asset to use for those placements
               Supported keys: image_hashes (list), video_ids (list),
               bodies, titles, descriptions (text overrides)
           All image hashes referenced in rules must also be in image_hashes.
           Example (feed gets one image, stories gets another):
           [
             {"placement_groups": ["FEED"],
              "customization_spec": {"image_hashes": ["<feed_hash>"]}},
             {"placement_groups": ["STORY"],
              "customization_spec": {"image_hashes": ["<story_hash>"]}}
           ]
videos: List of video objects for placement asset customization (multiple videos with
           different aspect ratios). Each entry: {"video_id": "...", "thumbnail_url": "...",
           "label": "my_label"}. The "label" field is converted to adlabels for use with
           asset_customization_rules video_label references. Cannot be used with video_id.
           Use with optimization_type="PLACEMENT" and asset_customization_rules.
images: List of image objects for placement asset customization (multiple images with
           different aspect ratios). Each entry: {"image_hash": "...", "label": "my_label"}.
           The "label" field is converted to adlabels for use with asset_customization_rules
           image_label references. Cannot be used with image_hash or image_hashes.
           Use with optimization_type="PLACEMENT" and asset_customization_rules.
reminder_data: Inline reminder event data for Instagram Reminder Ads
              (REMINDERS_SET optimization goal). Placed in
              object_story_spec.link_data.reminder_data. Use this instead of
              upcoming_events (which requires an existing ig_upcoming_event_id).
              Required fields:
                - event_name (str): Display title of the reminder event
                - start_time (int): Event start as a Unix timestamp (seconds)
                - end_time (int): Event end as a Unix timestamp (seconds)
              Example:
                {"event_name": "Summer Sale", "start_time": 1745596800, "end_time": 1745611200}
              The ad set must use optimization_goal=REMINDERS_SET and the placement
              must be restricted to Instagram feeds/stories. link_url is still
              recommended (the URL users visit after the reminder fires).
facebook_branded_content: Branded content settings for Facebook partnership ads.
              Used when a brand sponsors a creator's content on Facebook.
              Format: {"sponsor_page_id": "<page_id>"} where sponsor_page_id is the
              Facebook Page ID of the sponsoring brand. Passed as a top-level field
              on the ad creative. The creator's page should be set as page_id.
instagram_branded_content: Branded content settings for Instagram partnership ads.
              Used when a brand sponsors a creator's content on Instagram.
              Format: {"sponsor_id": "<instagram_user_id>"} where sponsor_id is the
              Instagram account ID of the sponsoring brand. Passed as a top-level
              field on the ad creative.

Returns: JSON response with created creative details

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
imagesNo
videosNo
captionNo
messageNo
page_idNo
event_idNo
headlineNo
link_urlNo
messagesNo
url_tagsNo
video_idNo
headlinesNo
account_idYes
ad_formatsNo
image_hashNo
descriptionNo
image_cropsNo
access_tokenNo
descriptionsNo
image_hashesNo
phone_numberNo
reminder_dataNo
thumbnail_urlNo
object_story_idNo
lead_gen_form_idNo
optimization_typeNo
instagram_actor_idNo
call_to_action_typeNo
page_welcome_messageNo
dynamic_creative_specNo
creative_features_specNo
disable_all_enhancementsNo
facebook_branded_contentNo
asset_customization_rulesNo
instagram_branded_contentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden. It discloses error codes and subcodes (error_subcode=1487390, error 1885800, error 1443048), automatic routing behavior (video_id + instagram_actor_id always routes through asset_feed_spec), silent serving behavior (DOF collapses multiple image_hashes to one image), and thumbnail processing states. It also notes the 'Returns: JSON response with created creative details' line. This is far beyond basic 'create' semantics.

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

Conciseness3/5

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

The description is extremely long and includes some redundancy (asset_customization_rules appears in two places). It is well-structured with markdown headers and examples, and it is front-loaded with the core purpose. However, it could be tightened; not every sentence is essential, and the length may hinder quick parsing.

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

Completeness5/5

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

Given the tool's 36 parameters and six distinct modes, the description is remarkably complete. It covers error handling, defaults (e.g., ad_formats default to ['SINGLE_IMAGE']), prerequisites (e.g., upload video first), and cross-field dependencies (e.g., link_url required for Lead ads when asset_customization_rules set). The only minor omission is page_welcome_message, and the output schema would handle return-value documentation.

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

Parameters5/5

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 does so thoroughly: each parameter is explained with formats, constraints, examples, and cross-field compatibility. For instance, object_story_id format '{page_id}_{post_id}', image_crops valid keys with aspect ratios, phone_number E.164 format, and the note that messages can be plain string or dict with adlabels. It covers 35 of 36 parameters, omitting only page_welcome_message from the schema.

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

Purpose5/5

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

The description opens with a clear verb+resource statement: 'Create a new ad creative using an uploaded image hash, video ID, or an existing post.' It then enumerates six creative modes, distinguishing it from siblings like create_carousel_ad_creative and update_ad_creative. This is specific and non-tautological.

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

Usage Guidelines4/5

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

The description provides extensive when-to-use guidance for each of the six modes (e.g., 'Simple image/video: Single image_hash or video_id with object_story_spec') and explicit parameter constraints like 'cannot be used with image_hashes or video_id'. It also gives practical workarounds (e.g., 'wait a few seconds ... and retry'). However, it does not explicitly name sibling tools as alternatives (e.g., 'use create_carousel_ad_creative for carousels'), so it falls short of a perfect 5.

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

create_adsetA

Create a new ad set in a Meta Ads account.

Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) campaign_id: Meta Ads campaign ID this ad set belongs to name: Ad set name optimization_goal: Conversion optimization goal. Valid values depend on the campaign objective and destination_type. OUTCOME_ENGAGEMENT + destination_type=WEBSITE: OFFSITE_CONVERSIONS, LANDING_PAGE_VIEWS, LINK_CLICKS, IMPRESSIONS, REACH. OUTCOME_ENGAGEMENT + On Post (destination_type=ON_POST): POST_ENGAGEMENT, IMPRESSIONS, REACH. Also set promoted_object={page_id} at creation (immutable; without it create_ad fails with subcode 1885154). Do NOT use ON_AD here — ON_AD is the OUTCOME_LEADS instant-form destination and Meta rejects it for OUTCOME_ENGAGEMENT (subcode 1815715). OUTCOME_ENGAGEMENT + On Video (destination_type=ON_VIDEO): THRUPLAY, TWO_SECOND_CONTINUOUS_VIDEO_VIEWS. OUTCOME_ENGAGEMENT + On Event (destination_type=ON_EVENT): EVENT_RESPONSES, IMPRESSIONS, POST_ENGAGEMENT, REACH. OUTCOME_ENGAGEMENT + On Page (destination_type=ON_PAGE): PAGE_LIKES. OUTCOME_ENGAGEMENT + Messaging (MESSENGER/WHATSAPP/INSTAGRAM_DIRECT): CONVERSATIONS, LINK_CLICKS. OUTCOME_ENGAGEMENT "Profile and Page visits" (PROFILE_AND_PAGE_ENGAGEMENT with destination_type INSTAGRAM_PROFILE / FACEBOOK_PAGE / INSTAGRAM_PROFILE_AND_FACEBOOK_PAGE) is shown in Ads Manager but NOT supported via the Marketing API — Meta rejects every variant (code 100). Closest API-supported option is POST_ENGAGEMENT + ON_POST. OUTCOME_TRAFFIC + WEBSITE: LANDING_PAGE_VIEWS, LINK_CLICKS, IMPRESSIONS, REACH. OUTCOME_AWARENESS: REACH, IMPRESSIONS, AD_RECALL_LIFT, THRUPLAY. OUTCOME_LEADS: LEAD_GENERATION, QUALITY_LEAD (forms), QUALITY_CALL (calls), OFFSITE_CONVERSIONS, LINK_CLICKS (website). OUTCOME_SALES: OFFSITE_CONVERSIONS, VALUE, CONVERSATIONS, LINK_CLICKS, IMPRESSIONS, REACH. OUTCOME_APP_PROMOTION: APP_INSTALLS, APP_INSTALLS_AND_OFFSITE_CONVERSIONS, VALUE. billing_event: How you're charged (e.g., 'IMPRESSIONS', 'LINK_CLICKS') status: Initial ad set status (default: PAUSED) daily_budget: Daily budget in account currency (in cents) as a string. CBO NOTE: Do NOT set this if the parent campaign already has a budget (Campaign Budget Optimization / CBO mode). Meta only allows budgets at one level: either the campaign OR the ad set, not both. If the campaign has a daily_budget or lifetime_budget, omit this field — the ad set will automatically use the campaign budget. lifetime_budget: Lifetime budget in account currency (in cents) as a string. CBO NOTE: Do NOT set this if the parent campaign already has a budget (Campaign Budget Optimization / CBO mode). Omit this field when the campaign uses CBO — the ad set inherits the campaign budget automatically. targeting: Targeting specs (age, location, interests, etc). targeting_automation.advantage_audience defaults to 0 if not set (Meta API v24+ requirement). Set to 1 to enable Advantage+ Audience (requires age_max>=65). Use search_interests for interest IDs. bid_amount: Bid amount in account currency (in cents). REQUIRED for: LOWEST_COST_WITH_BID_CAP, COST_CAP, TARGET_COST. NOT USED by: LOWEST_COST_WITH_MIN_ROAS (uses bid_constraints instead). May also be required if the parent campaign's bid strategy requires it. bid_strategy: Bid strategy. Valid values: - 'LOWEST_COST_WITHOUT_CAP' (recommended) - no bid_amount required - 'LOWEST_COST_WITH_BID_CAP' - REQUIRES bid_amount - 'COST_CAP' - REQUIRES bid_amount - 'LOWEST_COST_WITH_MIN_ROAS' - REQUIRES bid_constraints with roas_average_floor, and optimization_goal='VALUE'. Does NOT use bid_amount. Note: 'LOWEST_COST' is NOT valid - use 'LOWEST_COST_WITHOUT_CAP'. Campaign-level bid strategy may constrain ad set choices. bid_constraints: Bid constraints dict. Required for LOWEST_COST_WITH_MIN_ROAS. Use {"roas_average_floor": } where value = target ROAS * 10000. Example: 2.0x ROAS -> {"roas_average_floor": 20000} bid_adjustments: Bid multipliers per targeting dimension. Pass-through to Meta. Shape: {"user_groups": {"": {"": , "default": }}} Dims: age, gender, user_os, device_platform, position_type, publisher_platform, user_bucket, home_location, locale, etc. Multipliers are floats, typically 0.0-1.0. Example: {"user_groups": {"user_os": {"iOS": 0.9, "Android": 0.7, "default": 1.0}}} NOTE: Writing bid_adjustments requires a Meta app capability that must be allowlisted. Apps without it get OAuthException (#3). start_time: Start time in ISO 8601 format (e.g., '2023-12-01T12:00:00-0800'). To schedule future delivery: set start_time to a future date and status=ACTIVE. Meta will show effective_status as SCHEDULED and automatically begin delivery at start_time. NOTE: Only ad set start_time controls delivery scheduling. Campaigns do not support start_time. end_time: End time in ISO 8601 format. Required when lifetime_budget is specified. dsa_beneficiary: DSA beneficiary for European compliance (person/org that benefits from ads). Required for EU-targeted ad sets along with dsa_payor. dsa_payor: DSA payor for European compliance (person/org paying for the ads). Required for EU-targeted ad sets along with dsa_beneficiary. promoted_object: For APP_INSTALLS: app config, required application_id + object_store_url. For OUTCOME_ENGAGEMENT On-Post (destination_type=ON_POST): set {"page_id": ""} at creation — required for ads (else create_ad fails with subcode 1885154) and immutable afterward (cannot be added via update_adset). destination_type: Conversion location / where users go. Pass-through to Meta (no client-side validation). Common values: 'WEBSITE', 'WHATSAPP', 'MESSENGER', 'INSTAGRAM_DIRECT', 'APP', 'FACEBOOK', 'SHOP_AUTOMATIC'. OUTCOME_ENGAGEMENT on-asset locations: 'ON_POST' (post engagement; needs promoted_object={page_id}), 'ON_PAGE' (PAGE_LIKES), 'ON_EVENT', 'ON_VIDEO'. 'ON_AD' is the OUTCOME_LEADS instant-form destination — do NOT use it for OUTCOME_ENGAGEMENT (Meta rejects it with subcode 1815715). Also supports multi-channel combos like 'MESSAGING_MESSENGER_WHATSAPP'. is_dynamic_creative: Enable Dynamic Creative for this ad set. frequency_control_specs: Frequency cap specs. MUST be set at creation time — Meta makes this field immutable after the ad set is created (error 1815198). Only works with OUTCOME_AWARENESS campaigns + optimization_goal REACH or THRUPLAY. Example: [{"event": "IMPRESSIONS", "interval_days": 7, "max_frequency": 1}] multi_advertiser_ads: Set to 0 to opt out of Multi-Advertiser Ads, 1 to opt in. This is a TOP-LEVEL ad set parameter — do NOT put it inside the targeting object. regional_regulated_categories: List of regional regulated categories for the ad set. Required for ads targeting regulated regions (Taiwan, Australia, etc.). Valid values: TAIWAN_FINSERV, TAIWAN_UNIVERSAL, AUSTRALIA_FINSERV, INDIA_FINSERV, SINGAPORE_UNIVERSAL, THAILAND_UNIVERSAL. Example: ["TAIWAN_UNIVERSAL"] or ["TAIWAN_FINSERV", "TAIWAN_UNIVERSAL"] regional_regulation_identities: Dict of verified identity IDs for regional transparency compliance. Required when regional_regulated_categories is set. The identity IDs come from completing advertiser verification in Meta Business Settings. Keys depend on the categories declared: - TAIWAN_UNIVERSAL: taiwan_universal_beneficiary, taiwan_universal_payer - TAIWAN_FINSERV: taiwan_finserv_beneficiary, taiwan_finserv_payer - AUSTRALIA_FINSERV: australia_finserv_beneficiary, australia_finserv_payer - SINGAPORE_UNIVERSAL: singapore_universal_beneficiary, singapore_universal_payer Example: {"taiwan_universal_beneficiary": "", "taiwan_universal_payer": ""} attribution_spec: Attribution window specification for the ad set. Controls how conversions are attributed to ads. Default is 7-day click if not specified. Example for 1-day click: [{"event_type": "CLICK_THROUGH", "window_days": 1}] Example for 1-day click + 1-day view: [{"event_type": "CLICK_THROUGH", "window_days": 1}, {"event_type": "VIEW_THROUGH", "window_days": 1}] Valid event_type values: CLICK_THROUGH, VIEW_THROUGH. Valid window_days values: 1, 7, 28 (depends on event_type and optimization_goal). access_token: Meta API access token (optional - will use cached token if not provided)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
statusNoPAUSED
end_timeNo
dsa_payorNo
targetingNo
account_idYes
bid_amountNo
start_timeNo
campaign_idYes
access_tokenNo
bid_strategyNo
daily_budgetNo
billing_eventYes
bid_adjustmentsNo
bid_constraintsNo
dsa_beneficiaryNo
lifetime_budgetNo
promoted_objectNo
attribution_specNo
destination_typeNo
optimization_goalYes
is_dynamic_creativeNo
multi_advertiser_adsNo
frequency_control_specsNo
regional_regulated_categoriesNo
regional_regulation_identitiesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries full behavioral disclosure. It reveals defaults (status=PAUSED, advantage_audience=0), immutability (promoted_object, frequency_control_specs), error subcodes (1885154, 1815715, 1815198), API limitations (ON_AD rejection, profile/page visits not supported), and CBO inheritance behavior. This goes far beyond basic description.

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

Conciseness4/5

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

The description is long but appropriately sized for 26 parameters. It is front-loaded with a clear purpose, then organized into per-parameter blocks. Minor redundancy exists (CBO note repeated for daily_budget and lifetime_budget), but overall each sentence adds essential information.

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

Completeness5/5

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

Given the complexity of 26 parameters and no schema descriptions, the description comprehensively covers all parameter semantics, valid values, required combinations, error cases, and practical examples. It even addresses edge cases like EU DSA compliance and regional regulations, leaving no major gaps for an agent to fall into.

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

Parameters5/5

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 — and it does exceptionally. Every parameter gets format, units (cents), valid values, dependencies, and often concrete examples. It explains precise semantics like lowcost minimization for bid_strategy, budget inheritance, and targeting automation defaults, making parameter usage unambiguous.

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

Purpose5/5

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

The description opens with 'Create a new ad set in a Meta Ads account' — a specific verb and resource that clearly distinguishes it from sibling tools like update_adset or create_campaign. The extensive parameter details reinforce the exact purpose without ambiguity.

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

Usage Guidelines4/5

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

The description provides clear context on when to use the tool and when to avoid certain settings (e.g., CBO budget notes, bid strategy requirements, optimization_goal constraints). It doesn't explicitly name alternatives like update_adset, but the creation-specific guidance is strong enough to guide correct usage.

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

create_budget_scheduleA

Create a budget schedule for a Meta Ads campaign.

Allows scheduling budget increases based on anticipated high-demand periods. The times should be provided as Unix timestamps.

Args: campaign_id: Meta Ads campaign ID. budget_value: Amount of budget increase. Interpreted based on budget_value_type. budget_value_type: Type of budget value - "ABSOLUTE" or "MULTIPLIER". time_start: Unix timestamp for when the high demand period should start. time_end: Unix timestamp for when the high demand period should end. access_token: Meta API access token (optional - will use cached token if not provided).

Returns: A JSON string containing the ID of the created budget schedule or an error message.

ParametersJSON Schema
NameRequiredDescriptionDefault
time_endYes
time_startYes
campaign_idYes
access_tokenNo
budget_valueYes
budget_value_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior2/5

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

With no annotations provided, the description must fully disclose behavioral traits. It states the operation ('Create') and return format (JSON string with ID or error), but does not mention permissions, idempotency, reversibility, or effects on existing schedules. For a mutation tool, this is a significant gap in behavioral transparency.

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

Conciseness5/5

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

The description is concise and well-structured. It front-loads the purpose, then lists arguments in a clear Args block, and ends with the return value. Every sentence serves a purpose, with no redundant or filler content.

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

Completeness3/5

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

The description covers all parameters and the return value, and an output schema is present. However, for a create-type tool with no annotations, it lacks guidance on prerequisites, permissions, or edge cases (e.g., overlapping schedules, budget limits). It is adequate but leaves gaps that an agent would need to infer.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It does explain each parameter: campaign_id, budget_value, budget_value_type (with 'ABSOLUTE' or 'MULTIPLIER' values), time_start/end (Unix timestamps), and access_token (optional, cached token). However, it leaves ambiguity around what MULTIPLIER means exactly and how budget_value is interpreted for each type, so it is helpful but not complete.

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

Purpose5/5

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

The description begins with a specific verb+resource: 'Create a budget schedule for a Meta Ads campaign.' It clearly states the tool's function and distinguishes it from sibling tools, none of which mention budget scheduling. The second sentence adds the specific purpose of scheduling increases for high-demand periods.

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

Usage Guidelines4/5

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

The description provides a clear context for when to use the tool: 'Allows scheduling budget increases based on anticipated high-demand periods.' It does not explicitly mention alternatives or exclusions, but the context is sufficiently distinct from the other tools in the list. The optional access_token behavior is also stated.

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

create_campaignA

Create a new Facebook or Instagram ad campaign in a Meta Ads account. Use this to start a new campaign with an ODAX objective (OUTCOME_LEADS, OUTCOME_SALES, OUTCOME_AWARENESS, OUTCOME_TRAFFIC, OUTCOME_ENGAGEMENT, OUTCOME_APP_PROMOTION), pick CBO (campaign budget optimization) or ABO (ad-set-level budgets), and set bid strategy, spend cap, and special ad categories. This is the first step of the campaign group → ad set → ad hierarchy on Meta. Returns the new campaign id. Also known as: create campaign, new campaign, make campaign, campaign group, ABO campaign, CBO campaign.

Note: Campaigns do not support start_time for scheduling — set start_time on the ad set instead.

Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) name: Campaign name objective: Campaign objective (ODAX, outcome-based). Must be one of: OUTCOME_AWARENESS, OUTCOME_TRAFFIC, OUTCOME_ENGAGEMENT, OUTCOME_LEADS, OUTCOME_SALES, OUTCOME_APP_PROMOTION. Note: Legacy objectives like BRAND_AWARENESS, LINK_CLICKS, CONVERSIONS, APP_INSTALLS, etc. are not valid for new campaigns and will cause a 400 error. Use the outcome-based values above (e.g., BRAND_AWARENESS → OUTCOME_AWARENESS). access_token: Meta API access token (optional - will use cached token if not provided) status: Initial campaign status (default: PAUSED) special_ad_categories: List of special ad categories if applicable daily_budget: Daily budget in account currency (in cents) as a string (only used if use_adset_level_budgets=False) lifetime_budget: Lifetime budget in account currency (in cents) as a string (only used if use_adset_level_budgets=False) buying_type: Buying type (e.g., 'AUCTION') bid_strategy: Bid strategy (default: LOWEST_COST_WITHOUT_CAP). Must be one of: 'LOWEST_COST_WITHOUT_CAP', 'LOWEST_COST_WITH_BID_CAP', 'COST_CAP', 'LOWEST_COST_WITH_MIN_ROAS'. WARNING: If you use LOWEST_COST_WITH_BID_CAP or COST_CAP, all child ad sets will require bid_amount to be set. bid_cap: Bid cap in account currency (in cents) as a string spend_cap: Spending limit for the campaign in account currency (in cents) as a string campaign_budget_optimization: Whether to enable campaign budget optimization (only used if use_adset_level_budgets=False) ab_test_control_setups: Settings for A/B testing (e.g., [{"name":"Creative A", "ad_format":"SINGLE_IMAGE"}]) use_adset_level_budgets: If True, budgets will be set at the ad set level instead of campaign level (default: False)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
statusNoPAUSED
bid_capNo
objectiveYes
spend_capNo
account_idYes
buying_typeNo
access_tokenNo
bid_strategyNoLOWEST_COST_WITHOUT_CAP
daily_budgetNo
lifetime_budgetNo
special_ad_categoriesNo
ab_test_control_setupsNo
use_adset_level_budgetsNo
campaign_budget_optimizationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full transparency burden and excels. It discloses the return value (new campaign id), a critical constraint (start_time not supported on campaigns), error conditions (legacy objectives cause 400 errors), and interdependencies (certain bid strategies require bid_amount on child ad sets). It also explains budget semantics (cents, ABO vs CBO) and defaults.

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

Conciseness4/5

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

The description is long but appropriately structured for a tool with 15 parameters. It front-loads the core purpose, then provides a note and a well-organized Args section. Some redundancy exists (e.g., 'Also known as' list and repeated mention of campaign group), but it does not detract from usability.

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

Completeness5/5

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

Given the tool's complexity (15 parameters, no annotations, no schema descriptions), the description is remarkably complete. It covers all parameter semantics, return value, error behaviors, the broader campaign hierarchy, and special considerations like A/B testing and special ad categories. The output schema further reduces the need to describe return structure.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully compensate—and it does. Every parameter is explained with type, format, valid values, defaults, or usage context. For example, objective lists valid ODAX values and warns against legacy values, bid_strategy enumerates options and flags child ad set requirements, and budgets clarify they are in cents.

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

Purpose5/5

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

The description clearly states the tool's function with a specific verb and resource: 'Create a new Facebook or Instagram ad campaign in a Meta Ads account.' It also distinguishes itself from sibling tools by noting it is 'the first step of the campaign group → ad set → ad hierarchy,' which separates it from create_adset and create_ad.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool ('Use this to start a new campaign') and includes practical guidance like setting start_time on the ad set instead. However, it does not explicitly name alternative tools for different operations (e.g., update_campaign for modifications), so exclusions are implied rather than stated.

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

create_page_postA

Crea una publicación ORGÁNICA en la Página de Facebook (NO es un anuncio pago).

Modos: - Solo texto: pasa 'message'. - Texto + enlace: 'message' + 'link'. - Foto: 'image_url' (URL pública de la imagen) + 'message' como pie de foto.

Args: published: True publica de inmediato; False lo crea oculto (dark post) para luego promocionarlo como anuncio. access_token: token de usuario/system-user (se obtiene el Page Token solo).

Requiere que el usuario/system-user sea administrador de la página.

Returns: JSON con el id del post creado (o error).

ParametersJSON Schema
NameRequiredDescriptionDefault
linkNo
messageNo
page_idYes
image_urlNo
publishedNo
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral disclosure burden. It discloses important traits: admin requirement, immediate vs. hidden publishing, and return format. It stops short of covering edge cases like conflicting parameters or idempotency, but it is substantially informative.

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

Conciseness5/5

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

The description is well-organized with labeled sections (Modes, Args, Requires, Returns). Every sentence adds value, and there is no fluff or repetition. It is concise yet complete for its complexity.

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

Completeness5/5

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

Given the tool's complexity (6 params, no annotations) and the presence of an output schema, the description covers key behavioral aspects: modes, auth requirements, publishing behavior, and return value. It is sufficiently complete for an AI agent to invoke correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description compensates by explaining message, link, image_url, published, and access_token, including their roles across modes. It does not explicitly describe page_id, but the opening sentence implies its meaning. Overall, strong parameter guidance for a 0%-coverage schema.

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

Purpose5/5

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

The description clearly states the tool's function with a specific verb and resource: 'Crea una publicación ORGÁNICA en la Página de Facebook'. It explicitly distinguishes from paid advertising ('NO es un anuncio pago'), which differentiates it from sibling ad-creation tools.

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

Usage Guidelines4/5

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

The description provides context on when to use the tool and when not to (not for paid ads), and explains that published=False creates a dark post for later promotion. However, it does not explicitly name alternative sibling tools, so it falls short of the highest bar for usage guidelines.

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

duplicate_campaignA

Duplica una campaña existente usando el endpoint /copies de Meta. Ideal para escalamiento horizontal (clonar una campaña que ya funciona).

Args: campaign_id: ID de la campaña a duplicar. deep_copy: True (default) copia también sus conjuntos de anuncios y anuncios. status_option: Estado de la copia. 'PAUSED' (default, recomendado — la copia queda en pausa), 'INHERITED_FROM_SOURCE' o 'ACTIVE_PAUSED'. rename_suffix: Sufijo para el nombre de la copia (ej. ' - Copia').

Returns: JSON con el id de la nueva campaña (copied_campaign_id) o el error de Meta.

ParametersJSON Schema
NameRequiredDescriptionDefault
deep_copyNo
campaign_idYes
access_tokenNo
rename_suffixNo - Copia
status_optionNoPAUSED

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It explains key behaviors: deep_copy affects ad sets/ads, status_option controls the copy's state with PAUSED recommended, and the return JSON includes the new campaign ID. It doesn't discuss authentication or permissions, but the core behavioral aspects are disclosed.

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

Conciseness5/5

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

The description is well-structured with Args and Returns sections, uses concise Spanish, and front-loads the purpose. Every sentence adds value; no filler or redundancy.

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

Completeness4/5

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

The description covers purpose, parameter semantics, and return format adequately for a 5-parameter tool. It lacks any mention of access_token and does not elaborate on error conditions beyond 'el error de Meta', but overall it provides enough context for an agent to invoke the tool correctly.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate. It adds meaningful explanations for campaign_id, deep_copy, status_option, and rename_suffix, including defaults and examples. However, it omits access_token entirely, leaving one parameter undocumented.

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

Purpose5/5

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

The description clearly states it duplicates an existing campaign via the Meta /copies endpoint, and positions it as ideal for horizontal scaling. This specific verb+resource combination distinguishes it from siblings like create_campaign and update_campaign.

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

Usage Guidelines4/5

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

Provides a clear use case ('Ideal para escalamiento horizontal (clonar una campaña que ya funciona)'), implying when to use it. However, it does not explicitly mention alternatives or when not to use it, so it lacks the full 'when/when-not' guidance of a top-tier score.

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

estimate_audience_sizeA

Estimate audience size for targeting specifications using Meta's delivery_estimate API.

This function provides comprehensive audience estimation for complex targeting combinations including demographics, geography, interests, and behaviors. It also maintains backwards compatibility for simple interest validation.

Args: access_token: Meta API access token (optional - will use cached token if not provided) account_id: Meta Ads account ID (format: act_XXXXXXXXX) - required for comprehensive estimation targeting: Complete targeting specification including demographics, geography, interests, etc. Example: { "age_min": 25, "age_max": 65, "geo_locations": {"countries": ["PL"]}, "flexible_spec": [ {"interests": [{"id": "6003371567474"}]}, {"interests": [{"id": "6003462346642"}]} ] } optimization_goal: Optimization goal for estimation (default: "REACH"). Options: "REACH", "LINK_CLICKS", "IMPRESSIONS", "CONVERSIONS", etc. interest_list: [DEPRECATED - for backwards compatibility] List of interest names to validate interest_fbid_list: [DEPRECATED - for backwards compatibility] List of interest IDs to validate

Returns: JSON string with audience estimation results including estimated_audience_size, reach_estimate, and targeting validation

ParametersJSON Schema
NameRequiredDescriptionDefault
targetingNo
account_idNo
access_tokenNo
interest_listNo
optimization_goalNoREACH
interest_fbid_listNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden. It discloses behavioral traits such as optional access_token with cached token fallback, account_id being required for comprehensive estimation, and deprecated parameters. It does not explicitly state side effects or rate limits, but the 'estimate' action implies read-only behavior. The disclosure is reasonably thorough.

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

Conciseness4/5

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

The description is organized with an intro, Args block, and Returns section. It is somewhat long but each sentence serves a purpose. The example for targeting is illustrative, and deprecated notes are clearly marked. A minor redundancy is the 'This function provides...' sentence which could be implicit, but overall structure is efficient.

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

Completeness5/5

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

Given the six-parameter complexity, zero annotations, and no schema descriptions, the description covers every parameter, provides an example, notes defaults, explains the return value, and flags deprecated fields. It even mentions the API name. This is sufficient for an agent to select and invoke the tool effectively.

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

Parameters5/5

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

Schema coverage is 0%, so the description must explain all parameters. It does so thoroughly: access_token (cached fallback), account_id (format and requirement), targeting (with a full example), optimization_goal (default and options), and interest_list/interest_fbid_list (deprecated). This adds substantial meaning beyond the raw schema.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Estimate audience size for targeting specifications using Meta's delivery_estimate API.' This clearly states what the tool does and distinguishes it from sibling tools like search_interests or search_behaviors, which are search utilities rather than estimation endpoints.

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

Usage Guidelines4/5

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

Provides clear context: the tool is for comprehensive audience estimation for complex targeting combinations, and also maintains backwards compatibility for simple interest validation. This implies when it should be used (complex targeting) and notes the deprecated fallback usage. However, it does not explicitly name alternatives or state 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.

fetchA

Fetch a record previously returned by the 'search' tool in the same session.

IMPORTANT LIMITATIONS:

  • This tool ONLY returns records that were cached by a prior 'search' call. It does NOT make direct API calls to Meta. If the record was not found by 'search' first, this tool will return "Record not found".

  • Do NOT use this tool to look up campaigns, adsets, or ads by ID directly.

For direct lookups by ID, use these tools instead:

  • get_campaign_details(campaign_id=...) - for campaigns

  • get_adset_details(adset_id=...) - for ad sets

  • get_ads(account_id=..., campaign_id=...) - for ads

  • get_adsets(account_id=..., campaign_id=...) - for ad sets in a campaign

Args: id: The record ID to fetch (format: "type:id", e.g., "account:act_123456"). Must have been returned by a previous 'search' call.

Returns: JSON response with record data, or "Record not found" if the record was not previously cached by 'search'.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description fully bears the burden of behavioral disclosure. It clearly states that the tool does NOT make direct API calls to Meta, only returns records cached by 'search', and returns 'Record not found' if the record was not previously cached. This is transparent about its limitations and expected behavior.

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

Conciseness5/5

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

The description is well-structured and front-loaded, with the main purpose in the first sentence. It uses clear sections for limitations, alternative tools, arguments, and return value. Every sentence adds necessary value, and the length is appropriate for the complexity of the tool's behavior.

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

Completeness5/5

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

Given that this is a simple tool with one parameter and no annotations, the description covers all essential context: what it does, its limitations, when to use alternatives, the parameter format, and the return value. It also works well with the existing output schema, making the tool self-explanatory.

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

Parameters5/5

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

The input schema only defines 'id' as a string with no description. The description compensates fully by explaining the exact format ('type:id', e.g., 'account:act_123456') and the requirement that it must have been returned by a previous 'search' call. This adds significant meaning beyond the schema.

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

Purpose5/5

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

The description clearly states that the tool fetches a record previously returned by the 'search' tool in the same session, using a specific verb+resource+scope. It distinguishes itself from sibling lookup tools by explicitly noting it does NOT make direct API calls and only works on cached records.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use and when-not-to-use guidance, including a list of alternative tools for direct lookups by ID (e.g., get_campaign_details, get_adset_details, get_ads, get_adsets). It also explains the critical prerequisite that the record must have been returned by a prior 'search' call.

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

get_account_infoA

Get detailed information about a specific ad account.

Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided) fields: Optional comma-separated Graph API fields to return. When provided, replaces the default field set. Useful for fetching extras like funding_source_details, spend_cap, is_prepay_account, min_daily_budget, disable_reason, capabilities. Default fields: id, name, account_id, account_status, amount_spent, balance, currency, age, business_city, business_country_code, timezone_name. For prepaid accounts (is_prepay_account=true, common in Brazil), the Business Manager "available balance" is the sum of funding_source_details STORED_BALANCE entries plus coupons — the balance field alone is the amount due to be billed, not the available pre-paid funds.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNo
account_idYes
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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 access_token is optional and uses a cached token if omitted, that fields replace the default set, and it explains the precise meaning of 'balance' for prepaid accounts (common in Brazil). This goes well beyond basic read-only behavior and provides critical financial semantics.

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

Conciseness5/5

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

The description is well-structured with a concise opening and structured Args breakdown. Every sentence adds valuable detail—especially the prepaid account note about Brazilian accounts—without excessive padding or repetition. It is appropriately sized for the tool's complexity.

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

Completeness5/5

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

Given the tool's simplicity (3 params, output schema present), the description is exceedingly complete. It covers parameter formats, defaults, field replacement semantics, and a geographic edge case. The output schema handles return values, so the description's job is to provide usage context, which it does exceptionally.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must explain all parameters. It does so thoroughly: account_id includes the required format, access_token explains its optionality, and fields not only lists examples but explains that they replace the defaults and describes the default field set. It even clarifies edge-case behavior for prepaid accounts.

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

Purpose5/5

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

The description opens with 'Get detailed information about a specific ad account,' which clearly states the verb, resource, and scope. The use of 'specific' distinguishes it from sibling tools like get_ad_accounts (which lists accounts), making the tool's purpose unambiguous.

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

Usage Guidelines4/5

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

The description provides clear context for fetching a single account's details, including the optional access_token and customizable fields. It never explicitly names alternative tools for listing accounts or says when not to use this tool, but the 'specific' wording strongly implies its appropriate use case.

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

get_account_pagesA

Get pages associated with a Meta Ads account.

Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided)

Returns: JSON response with pages associated with the account

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYes
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the burden. It adds useful context by specifying the account_id format (act_XXXXXXXXX) and disclosing access_token is optional and will use a cached token when not provided. However, it lacks details on permissions, error cases, or pagination, leaving some behavioral aspects undisclosed.

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

Conciseness5/5

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

The description is concise and well-structured: a one-line purpose, an Args section with clear parameter explanations, and a Returns line. No fluff, and the main purpose is front-loaded.

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

Completeness4/5

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

For a simple 2-parameter read tool with no annotations and an assumed output schema, the description covers the essential information: what it does, parameter formats, and return type. It lacks only extended usage guidance and behavioral depth, which are minor for this tool. The presence of an output schema alleviates the need to detail the return structure.

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

Parameters5/5

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

The schema has no descriptions (0% coverage), and the description compensates fully. It explains account_id format and the optional/fallback behavior of access_token, adding meaning beyond the raw schema properties.

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

Purpose5/5

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

The description clearly states the tool's function with a specific verb and resource: 'Get pages associated with a Meta Ads account.' It distinguishes from siblings like get_account_info (account info) and get_page_posts (posts on a page) by focusing on pages tied to an ad account.

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

Usage Guidelines3/5

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

Usage is implied by the clear purpose: an agent would invoke this when needing pages linked to a Meta Ads account. However, there is no explicit comparison to alternatives or when-not-to-use guidance, so it stops at implied usage without exclusions.

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

get_ad_accountsA

Get ad accounts accessible by a user.

amount_spent and balance are returned in currency units (e.g. USD dollars), not cents.

Args: access_token: Meta API access token (optional - will use cached token if not provided) user_id: Meta user ID or "me" for the current user limit: Maximum number of accounts to return (default: 200)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
user_idNome
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations are absent, so the description must carry the full burden. It provides useful behavioral details: currency units (not cents), optional access_token with caching, and default limit. However, it doesn't explicitly state read-only behavior, rate limits, error cases, or other side effects. Given the lack of annotations, this is incomplete but not misleading.

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

Conciseness4/5

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

The description is concisely structured with a main line, a units note, and an Args list. Every section earns its place, though the Args list format could be slightly tightened. It avoids redundant filler and is well-organized.

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

Completeness4/5

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

For a simple list operation with an output schema present, the description covers the essential aspects: parameters, defaults, token caching, and units for specific returned fields. It does not delve into pagination or error handling, but given the existence of an output schema and the simplicity of a get, it is adequately complete.

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

Parameters5/5

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

Schema description coverage is 0%, and the description fully compensates by explaining each parameter: access_token (optional, cached), user_id (Meta user ID or 'me'), and limit (default 200). This adds meaning significantly beyond the schema's type/default definitions.

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

Purpose5/5

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

The description starts with a clear verb+resource: 'Get ad accounts accessible by a user.' This specifically identifies the tool's function and distinguishes it from sibling tools like get_account_pages (pages) and get_account_info (likely a single account). The resource and scope are unambiguous.

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

Usage Guidelines2/5

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. While the purpose is clear, there is no mention of alternatives, exclusions, or specific scenarios (e.g., 'use this when you need a list of all accounts'). The description relies solely on the name and first line to convey usage context.

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

get_ad_creativesA

Get creative details for a specific ad. Requires an ad_id (not account_id). Use get_ads first to find ad IDs.

Args: ad_id: Meta Ads ad ID (required) access_token: Meta API access token (optional - will use cached token if not provided)

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idYes
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden. It discloses that access_token is optional and will use a cached token if not provided, which is useful. It also notes the ad_id requirement. However, it does not explicitly state whether the operation is read-only, nor does it mention error cases or rate limits, leaving some behavioral traits undisclosed.

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

Conciseness5/5

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

The description is concise (two lines plus an args list) with the purpose stated upfront. Every sentence adds value, including the workflow hint and parameter details. No redundant information is present.

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

Completeness4/5

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

For a simple getter with an output schema, the description covers purpose, usage, and parameters adequately. It includes a helpful pointer to get_ads and clarifies the required input. It does not mention error handling or edge cases, but given the tool's simplicity and existing output schema, it is largely complete.

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

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by explaining each parameter: ad_id is 'Meta Ads ad ID (required)' and access_token is 'Meta API access token (optional - will use cached token if not provided)'. This adds meaningful context beyond the schema's type/required fields.

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

Purpose5/5

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

The description clearly states 'Get creative details for a specific ad' with a specific verb and resource. It also distinguishes from siblings by specifying 'Requires an ad_id (not account_id)' and pointing to get_ads for finding IDs, which differentiates it from tools like get_creative_details or get_ad_details.

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

Usage Guidelines4/5

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

It explicitly says 'Use get_ads first to find ad IDs', giving a clear workflow. It also clarifies the input constraint 'not account_id'. However, it does not mention alternative tools like get_creative_details when only a creative ID is available, but this is not a significant omission.

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

get_ad_detailsA

Get detailed information about a specific ad.

Args: ad_id: Meta Ads ad ID access_token: Meta API access token (optional - will use cached token if not provided)

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idYes
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It discloses a useful behavioral detail: the access_token is optional and a cached token will be used if not provided. However, it does not mention other traits like error behavior, rate limits, or read-only nature, leaving some gaps.

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

Conciseness5/5

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

The description is extremely concise: one clear sentence plus an args list. Every part adds value, and the structure is front-loaded with the main purpose. No waste.

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

Completeness4/5

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

Given the tool's simplicity (2 params, output schema present), the description is complete enough. It states purpose, parameters, and token behavior. The presence of an output schema means detailed return values are already defined, so the description need not explain them.

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

Parameters4/5

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

Schema description coverage is 0%, but the description compensates by explaining ad_id as 'Meta Ads ad ID' and access_token as 'Meta API access token (optional - will use cached token if not provided)', adding meaning beyond the schema's bare field titles.

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

Purpose5/5

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

The description clearly states the tool's function: 'Get detailed information about a specific ad.' It uses a specific verb and resource, and the singular 'specific ad' distinguishes it from sibling tools like get_ads (which likely lists ads).

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

Usage Guidelines3/5

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

The description implies usage: when you need details for a single ad. However, it does not explicitly mention when not to use it or recommend alternatives like get_ads for listing. The guidance is implied rather than stated.

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

get_ad_imageA

Get, download, and visualize the image attached to an existing Meta ad.

Takes a Meta ad ID and returns the image the ad is currently serving. If all you have is an image hash (no ad), use get_image_by_hash instead.

Args: ad_id: Meta Ads ad ID access_token: Meta API access token (optional - will use cached token if not provided)

Returns: The ad image ready for direct visual analysis

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idYes
access_tokenNo

TDQS

A4.8/5.0
Behavior4/5

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 discloses that the tool returns 'the image the ad is currently serving,' indicating the image may change over time, and mentions the optional access_token behavior ('will use cached token if not provided'). It implies a read-only operation and return format ('ready for direct visual analysis'). However, it doesn't explicitly state error handling or side effects, though for a get operation this is less critical.

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

Conciseness5/5

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

The description is concise and well-structured. It starts with a clear summary sentence, then provides usage context, an alternative tool reference, and a structured Args/Returns section. No redundant information; every sentence adds value.

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

Completeness5/5

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

Despite having no output schema and no annotations, the description is complete for this simple tool. It explains the input parameters, the return behavior ('The ad image ready for direct visual analysis'), and provides contextual guidance on when to use an alternative tool. There are no significant gaps for the agent to make correct usage decisions.

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

Parameters5/5

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 both parameters in the Args section: ad_id ('Meta Ads ad ID') and access_token ('Meta API access token (optional - will use cached token if not provided)'). This adds meaningful context beyond the bare schema, especially for the token behavior.

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

Purpose5/5

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

The description clearly identifies the tool's function: 'Get, download, and visualize the image attached to an existing Meta ad.' It uses a specific verb (get/download/visualize) and resource (existing Meta ad image). It also distinguishes itself from the sibling tool get_image_by_hash, explicitly stating 'If all you have is an image hash (no ad), use get_image_by_hash instead.'

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

Usage Guidelines5/5

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

The description provides explicit usage guidance, including when to use this tool (when you have a Meta ad ID) and when not to (when you only have an image hash). It names the alternative tool (get_image_by_hash), making the decision process clear for the agent.

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

get_adsA

Get ads for a Meta Ads account with optional filtering.

Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of ads to return (default: 10) campaign_id: Optional campaign ID to filter by adset_id: Optional ad set ID to filter by

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
adset_idNo
account_idYes
campaign_idNo
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the full burden. It adds useful behavioral context: optional access_token falls back to cached token, limit defaults to 10, and filtering by campaign/adset is supported. However, it does not disclose pagination behavior, rate limits, or the exact scope of returned ads, leaving gaps.

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

Conciseness4/5

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

The description is concise with a one-sentence purpose followed by an argument list. Each line is informative and earns its place, though the arg list could be seen as slightly redundant with the schema. Overall efficient and readable.

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

Completeness4/5

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

With an output schema present, return values need not be explained. The description covers purpose, all parameters, and some behavioral details (caching, defaults). It lacks explicit usage guidelines and deeper behavioral disclosure, but for a simple list tool it is reasonably complete.

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

Parameters5/5

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

Schema description coverage is 0%, and the description fully compensates by explaining every parameter: account_id format, access_token optionality with fallback, limit default, and campaign/adset filter purposes. This goes well beyond the bare schema.

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

Purpose5/5

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

The description clearly states 'Get ads for a Meta Ads account with optional filtering,' which identifies the verb (get), resource (ads), and scope (Meta Ads account). This distinguishes it from siblings like get_ad_details (specific ad) and get_campaigns (campaigns).

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as get_ad_details or search_ads_archive. The description mentions optional filtering but does not explain when this listing tool is preferred over other ad-related tools.

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

get_adset_detailsA

Get detailed information about a specific ad set.

Args: adset_id: Meta Ads ad set ID access_token: Meta API access token (optional - will use cached token if not provided)

Example: To call this function through MCP, pass the adset_id as the first argument: { "args": "YOUR_ADSET_ID" }

ParametersJSON Schema
NameRequiredDescriptionDefault
adset_idYes
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It states that access_token is optional and a cached token will be used if not provided, which is useful. However, it does not disclose return format, possible errors, or side effects, though the presence of an output schema mitigates this.

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

Conciseness4/5

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

The description is concise, starting with a clear one-sentence purpose, followed by a structured Args block and a brief example. No wasted words, though the example is somewhat redundant.

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

Completeness3/5

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

Given the tool's simplicity, the description covers the essential parameters and provides an example. The existence of an output schema covers return values. However, it lacks usage guidelines and prerequisites, making it minimally complete.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains adset_id as 'Meta Ads ad set ID' and access_token as optional with cached fallback, adding meaning beyond the schema. However, it lacks format or source details for the ID.

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

Purpose5/5

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

The description clearly states the tool gets detailed information about a specific ad set, using a specific verb (get) and resource (ad set). It distinguishes from siblings like get_adsets (list) and get_ad_details (ad-level details).

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

Usage Guidelines3/5

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

The description implies use when you need details for a single ad set, but does not explicitly mention alternatives or exclusions. Sibling tool names like get_adsets suggest listing, but no direct guidance is provided.

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

get_adsetsA

Get ad sets for a Meta Ads account with optional filtering by campaign.

Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of ad sets to return (default: 10) campaign_id: Optional campaign ID to filter by

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
account_idYes
campaign_idNo
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Without annotations, the description provides some behavioral context by explaining the access_token caching behavior ('will use cached token if not provided') and the default limit. However, it does not discuss error behavior, pagination, or explicitly confirm it is a read-only operation.

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

Conciseness5/5

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

The description is a compact docstring with a one-sentence purpose followed by a numbered Args list. Every line provides necessary information; there is no fluff or repetition.

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

Completeness3/5

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

The tool has 4 parameters and no schema descriptions, but the description covers all parameters and the core behavior. Missing pieces are usage guidance relative to sibling tools and explicit handling of edge cases or errors, though the output schema covers return values.

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

Parameters5/5

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

The input schema provides only titles and types with no descriptions, so the description is the sole source of parameter meaning. It explains the account_id format ('act_XXXXXXXXX'), the optional access_token with caching, the limit default (10), and the campaign_id filter, adding significant value beyond the schema.

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

Purpose5/5

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

The description opens with a clear statement: 'Get ad sets for a Meta Ads account with optional filtering by campaign.' This specifies the verb (Get), resource (ad sets), and scope (account, optional campaign filter), distinguishing it from sibling tools like get_campaigns or get_ads.

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

Usage Guidelines2/5

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

No guidance is given about when to use this tool versus get_adset_details (likely for a single ad set) or other sibling tools. The description does not mention exclusions or alternative scenarios, leaving the agent to infer from the name.

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

get_ad_videoA

Get video details and source URL for a Meta ad video creative. Returns the video source URL (direct download link), thumbnail URL, processing status, and metadata (title, description, duration).

Also useful for polling after bulk_upload_ad_videos: video_status is "processing" while Meta is still transcoding and "ready" when the real video frames (and a usable thumbnail) are available. Calling create_ad_creative before status is "ready" returns an error because the only thumbnail Meta returns during processing is a generic placeholder that would be permanently stored on the creative.

Provide either ad_id (to auto-extract the video from the ad creative) or video_id directly. Providing account_id is strongly recommended — it enables the advideos edge which works with Business Manager tokens (avoids error 100/33 and error #10 on account-uploaded videos).

Args: ad_id: Meta Ads ad ID (will extract video_id from the ad creative) video_id: Meta video ID (use this if you already have it from get_ad_creatives) account_id: Ad account ID (e.g. "act_123" or "123"). Enables advideos edge lookup. access_token: Meta API access token (optional - will use cached token if not provided)

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idNo
video_idNo
account_idNo
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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 discloses the processing status lifecycle ('processing' vs 'ready'), the error consequence for premature creative creation, and the rationale for using the advideos edge with account_id. This goes well beyond a simple read operation.

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

Conciseness5/5

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

The description is structured with a purpose statement, usage context, and parameter details. Every sentence adds value—the polling explanation, the account_id recommendation, and the Args list are all necessary. It is front-loaded with the core purpose and avoids redundancy.

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

Completeness5/5

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

The description is complete for a tool with an output schema. It covers the return values, the critical polling behavior, error scenarios, and parameter selection. The guidance on when to use versus when not to use create_ad_creative provides essential context for correct invocation.

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

Parameters5/5

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

Schema description coverage is 0%, and the description fully compensates by detailing each parameter in the Args section: ad_id extracts video, video_id for direct use, account_id enables edge lookup, and access_token defaults to cached token. This adds substantial meaning beyond raw schema types.

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

Purpose5/5

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

The description clearly states the tool's function: 'Get video details and source URL for a Meta ad video creative' and lists specific return values (video source URL, thumbnail URL, processing status, metadata). It distinguishes itself from siblings like get_ad_image and create_ad_creative by focusing on video retrieval and polling.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance: 'useful for polling after bulk_upload_ad_videos' and a clear when-not-to-use warning: 'Calling create_ad_creative before status is "ready" returns an error'. It also explains when to provide which ID and recommends account_id for avoiding specific errors.

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

get_campaign_detailsA

Get detailed information about a specific campaign.

Note: This function requests a specific set of fields ('id,name,objective,status,...'). The Meta API offers many other fields for campaigns (e.g., 'effective_status', 'source_campaign_id', etc.) that could be added to the 'fields' parameter in the code if needed.

Args: campaign_id: Meta Ads campaign ID access_token: Meta API access token (optional - will use cached token if not provided)

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYes
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It discloses that only a predefined set of fields is requested and that access_token is optional with a cached-token fallback. However, it doesn't mention error handling, rate limits, or what happens for invalid IDs. Some behavioral context is added, but it's 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.

Conciseness4/5

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

The description is structured with a clear main purpose, a useful note about field selection, and formatted argument explanations. Every sentence adds value, though the note could be seen as slightly tangential to basic usage. Overall efficient and well-organized.

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

Completeness4/5

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

Given it's a simple read operation with an output schema present, the description covers purpose, parameter semantics, and some behavioral nuances. It doesn't explain return values (covered by output schema) but lacks explicit guidance on when to use it vs alternatives. Good enough for the tool's complexity.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It clearly explains campaign_id as a Meta Ads campaign ID and access_token as optional with cached-token behavior. This adds meaningful context beyond the bare schema properties.

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

Purpose4/5

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

The description 'Get detailed information about a specific campaign' clearly states the action and resource. It distinguishes from the sibling get_campaigns (which presumably lists campaigns) by focusing on a single campaign's details, though it doesn't explicitly mention when to use it over alternatives.

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

Usage Guidelines3/5

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

Usage is implied by the name and description ('a specific campaign'), but no explicit when-to-use or when-not-to-use guidance is provided. The note about requesting only a specific set of fields is more implementation detail than usage guidance.

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

get_campaignsA

Get campaigns for a Meta Ads account with optional filtering.

Note: By default, the Meta API returns a subset of available fields. Other fields like 'effective_status', 'spend_cap', 'budget_remaining', 'promoted_object', 'source_campaign_id', etc., might be available but require specifying them in the API call (currently not exposed by this tool's parameters).

Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of campaigns to return (default: 10) status_filter: Filter by effective status (e.g., 'ACTIVE', 'PAUSED', 'ARCHIVED'). Maps to the 'effective_status' API parameter, which expects an array (this function handles the required JSON formatting). Leave empty for all statuses. objective_filter: Filter by campaign objective(s). Can be a single objective string or a list of objectives. Valid objectives: 'OUTCOME_AWARENESS', 'OUTCOME_TRAFFIC', 'OUTCOME_ENGAGEMENT', 'OUTCOME_LEADS', 'OUTCOME_SALES', 'OUTCOME_APP_PROMOTION'. Examples: 'OUTCOME_LEADS' or ['OUTCOME_LEADS', 'OUTCOME_SALES']. Leave empty for all objectives. after: Pagination cursor to get the next set of results

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNo
limitNo
account_idYes
access_tokenNo
status_filterNo
objective_filterNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It discloses that Meta API returns a subset of fields by default, that other fields may require explicit specification (not exposed), and explains how status_filter maps to effective_status. It also mentions token caching. This adds genuine behavioral context beyond the schema.

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

Conciseness4/5

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

The description is well-structured with a clear opening sentence, a note about API field limitations, and an organized Args list. While somewhat long, every section adds value and the front-loading makes it scannable.

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

Completeness4/5

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

Given the tool's complexity (6 params, pagination, API quirks) and the presence of an output schema, the description covers the essential operational details. It explains filters, pagination, token handling, and field limitations. It omits error handling or permission requirements, but these are not critical for basic usage.

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

Parameters5/5

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

The schema has no parameter descriptions (0% coverage), but the description provides detailed explanations for all six parameters, including formats, defaults, valid values, mapping to API parameters, and pagination. This fully compensates for the schema's lack of descriptions.

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

Purpose5/5

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

The description clearly states 'Get campaigns for a Meta Ads account' which specifies the verb, resource, and scope. It also mentions optional filtering, which distinguishes it from siblings like get_campaign_details (singular detail) and create_campaign/update_campaign.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool (retrieve campaigns for an account) and lists optional filters. It does not explicitly name alternatives or exclusions, but the context is strong enough for an agent to select it over sibling tools.

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

get_creative_detailsA

Get detailed information about a specific ad creative by its ID.

Args: creative_id: Meta Ads creative ID (required) access_token: Meta API access token (optional)

ParametersJSON Schema
NameRequiredDescriptionDefault
creative_idYes
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior2/5

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

No annotations are provided, and the description does not disclose any behavioral aspects beyond the basic 'get' operation. It doesn't mention required permissions, potential errors, rate limits, or what fields are returned (though an output schema exists). The description adds little beyond what is obvious from the tool name.

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

Conciseness5/5

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

The description is succinct, front-loaded with the core purpose, and uses a well-structured Args list for parameters. Every sentence adds value; there is no fluff or redundancy.

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

Completeness4/5

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

Given the tool's simplicity (2 params, output schema present), the description adequately covers its purpose and parameters. It doesn't describe return values, but the output schema handles that. The only missing context is broader usage guidance, which is scored separately.

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

Parameters4/5

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

The schema has 0% coverage, but the description's Args section explains both parameters: creative_id as a Meta Ads creative ID (required) and access_token as an optional Meta API access token. This adds meaningful semantics beyond the bare type/title in the schema, though it doesn't elaborate on value formats or edge cases.

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

Purpose5/5

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

The description clearly states the tool gets detailed information about a specific ad creative by ID, using a specific verb and resource. It distinguishes from sibling tools like get_ad_creatives (which likely lists) and get_ad_details (which targets ads rather than creatives).

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

Usage Guidelines4/5

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

The description provides clear context: use when you have a specific creative ID and need its details. It doesn't explicitly exclude alternatives or mention when not to use it, but the 'by its ID' phrasing implies single-item retrieval rather than listing.

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

get_image_by_hashA

Get, download, and visualize a Meta ad image by its hash.

Use this when you have an image_hash without an ad — e.g. the hash returned by upload_ad_image / bulk_upload_ad_images, or one referenced in a creative (object_story_spec.link_data.image_hash, asset_feed_spec images[].hash, etc.). To view the image of an existing ad, prefer get_ad_image(ad_id).

Args: account_id: Meta Ads account ID (act_XXXXXXXXX or bare numeric — both accepted) image_hash: Meta image hash access_token: Meta API access token (optional - will use cached token if not provided)

Returns: The image ready for direct visual analysis

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYes
image_hashYes
access_tokenNo

TDQS

A4.4/5.0
Behavior3/5

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

Annotations are absent, so the description carries full burden. It adds behavioral context like optional access_token with 'will use cached token if not provided' and implies read-only via 'get, download, visualize.' However, it does not explicitly state that it is read-only, nor does it disclose potential failure modes, rate limits, or required permissions. This is a moderate omission.

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

Conciseness5/5

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

The description is efficiently structured in three sections: purpose, usage guidance, and args/returns. Every sentence earns its place—there is no fluff, and the key information is front-loaded. The clear organization makes it easy for an agent to parse quickly.

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

Completeness4/5

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

For a simple tool with no annotations and no output schema, the description covers purpose, usage, parameters, and return value. The return statement 'The image ready for direct visual analysis' gives a general idea but could be more explicit about the format (e.g., URL, binary data). Still, given the tool's simplicity, this is near-complete.

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

Parameters4/5

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

The schema provides only titles and types, with 0% description coverage. The description's Args section compensates well: it explains the accepted formats for account_id ('act_XXXXXXXXX or bare numeric'), the purpose of image_hash, and the optionality of access_token with caching behavior. This adds meaningful semantics beyond the schema, though the image_hash description could be more detailed.

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

Purpose5/5

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

The description opens with a clear verb+resource: 'Get, download, and visualize a Meta ad image by its hash.' It also explicitly distinguishes from the sibling tool by stating 'To view the image of an existing ad, prefer get_ad_image(ad_id),' which removes ambiguity about when this tool is appropriate.

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

Usage Guidelines5/5

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

It gives explicit usage context: 'Use this when you have an image_hash without an ad' and provides concrete examples of how such hashes arise. It also clearly states an alternative tool for a different scenario, satisfying both 'when to use' and '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_insightsA

Get performance insights for a campaign, ad set, ad or account.

Args: object_id: ID of the campaign, ad set, ad or account. You can also use the alias parameters below. account_id: Alias for object_id when querying account-level insights campaign_id: Alias for object_id when querying campaign-level insights adset_id: Alias for object_id when querying ad-set-level insights ad_id: Alias for object_id when querying ad-level insights access_token: Meta API access token (optional - will use cached token if not provided) time_range: Either a preset time range string or a dictionary with "since" and "until" dates in YYYY-MM-DD format Preset options: today, yesterday, this_month, last_month, this_quarter, maximum, data_maximum, last_3d, last_7d, last_14d, last_28d, last_30d, last_90d, last_week_mon_sun, last_week_sun_sat, last_quarter, last_year, this_week_mon_today, this_week_sun_today, this_year Dictionary example: {"since":"2023-01-01","until":"2023-01-31"} breakdown: Optional breakdown dimension. Valid values include: Demographic: age, gender, country, region, dma Platform/Device: device_platform, platform_position, publisher_platform, impression_device NOTE: platform_position is a Meta-restricted breakdown — Meta requires it to be paired with publisher_platform (otherwise "(#100) ... (action_type, platform_position) is invalid"). When you pass platform_position, this tool auto-adds publisher_platform, and the action-typed fields (actions, action_values, conversions, cost_per_action_type) are returned per placement, so you get leads/CPL/conversions broken down by placement. Creative Assets: ad_format_asset, body_asset, call_to_action_asset, description_asset, image_asset, link_url_asset, title_asset, video_asset, media_type, creative_relaxation_asset_type, flexible_format_asset_type, gen_ai_asset_type NOTE: Asset breakdowns (image_asset, video_asset, etc.) only return data for ads running with Dynamic Creative; for non-DCO ads, expect empty rows. NOTE: media_type collides with the default action_breakdowns=[action_type], so this tool auto-overrides action_breakdowns to [] when you pass media_type. Action-typed metrics (actions, action_values, conversions) are still returned but are no longer sliced by action_type alongside media_type. media_asset_url, media_creator, media_destination_url, media_format, media_origin_url, and media_text_content are NOT supported by Meta's Insights API (Meta returns "(#100) Tried accessing nonexisting field"). Use the asset breakdowns above instead. Campaign/Ad Attributes: breakdown_ad_objective, breakdown_reporting_ad_id, app_id, product_id Conversion Tracking: coarse_conversion_value, conversion_destination, standard_event_content_type, signal_source_bucket, is_conversion_id_modeled, fidelity_type, redownload Time-based: hourly_stats_aggregated_by_advertiser_time_zone, hourly_stats_aggregated_by_audience_time_zone, frequency_value Extensions/Landing: ad_extension_domain, ad_extension_url, landing_destination, mdsa_landing_destination Attribution: sot_attribution_model_type, sot_attribution_window, sot_channel, sot_event_type, sot_source Mobile/SKAN: skan_campaign_id, skan_conversion_id, skan_version, postback_sequence_index CRM/Business: crm_advertiser_l12_territory_ids, crm_advertiser_subvertical_id, crm_advertiser_vertical_id, crm_ult_advertiser_id, user_persona_id, user_persona_name Advanced: hsid, is_auto_advance, is_rendered_as_delayed_skip_ad, mmm, place_page_id, marketing_messages_btn_name, impression_view_time_advertiser_hour_v2, comscore_market, comscore_market_code level: Level of aggregation (ad, adset, campaign, account) limit: Maximum number of results to return per page (default: 25, Meta API allows much higher values) after: Pagination cursor to get the next set of results. Use the 'after' cursor from previous response's paging.next field. action_attribution_windows: Optional list of attribution windows (e.g., ["1d_click", "7d_click", "1d_view"]). When specified, actions include additional fields for each window. The 'value' field always shows 7d_click. action_breakdowns: Optional list of action_breakdowns to apply to action-typed metrics. Pass [] to disable the default action_type slicing (required when combining action data with breakdowns that collide with action_type, e.g. media_type — auto-applied for media_type when not set). Meta supports values like action_type, action_target_id, action_destination, etc. compact: When True, strips redundant action-type duplicates from the response (omni_*, onsite_web_*, offsite_conversion.fb_pixel_*, etc.) to reduce payload size by ~60%. The canonical action types (purchase, add_to_cart, view_content, etc.) are always preserved. Default: False.

Note on response size: This tool always returns a fixed set of fields (impressions, clicks, spend, cpc, cpm, ctr, reach, actions, action_values, etc.) and cannot filter to a subset. For large result sets (50+ rows), the actions/action_values arrays can make responses very large (1–2MB+). If you only need specific metrics like spend or impressions, consider using bulk_get_insights with compact=true and the fields parameter: bulk_get_insights(level="ad", account_ids=[...], compact=true, fields=["spend", "impressions"]) bulk_get_insights supports level="ad", "adset", "campaign", and "account".

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idNo
afterNo
levelNoad
limitNo
compactNo
adset_idNo
breakdownNo
object_idNo
account_idNo
time_rangeNomaximum
campaign_idNo
access_tokenNo
action_breakdownsNo
action_attribution_windowsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the behavioral disclosure burden, and it excels. It reveals important behavioral quirks: auto-adding publisher_platform when platform_position is passed, auto-overriding action_breakdowns for media_type, unsupported breakdown fields that cause Meta errors, response size implications, and the compact mode behavior. This goes well beyond minimal disclosure.

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

Conciseness4/5

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

The description is long and detailed, but every sentence contributes useful information for correct usage. It is well-structured with an Args section and note blocks, and it front-loads the main purpose. It loses one point for verbosity—the breakdown list could be trimmed or moved to schema enums—but overall, it is appropriately sized for a 14-parameter tool.

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

Completeness5/5

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

The description is exceptionally complete for the tool's complexity. It covers all 14 parameters, enumerates valid breakdown values, explains restrictions, describes response size behavior, and provides an alternative tool. Even with an output schema present, the description adds critical context about return fields and aggregates, making it self-sufficient 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.

Parameters5/5

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 does so comprehensively: each parameter is explained with its purpose, accepted values, presets, aliases, and special rules (e.g., time_range presets, breakdown valid values, pagination cursor). The description adds extensive meaning beyond the schema's bare titles and defaults.

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

Purpose5/5

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

The description opens with 'Get performance insights for a campaign, ad set, ad or account,' which combines a specific verb, resource scope, and clear output type. This immediately distinguishes it from sibling tools like get_campaign_details or get_ads, which focus on configuration details rather than performance metrics.

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

Usage Guidelines5/5

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

The description explicitly says 'If you only need specific metrics like spend or impressions, consider using bulk_get_insights with compact=true and the fields parameter,' naming the alternative and the conditions under which it should be used. It also notes that this tool always returns a fixed set of fields, implying when not to use it. This satisfies the when-to-use vs. alternatives requirement.

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

get_interest_suggestionsA

Get interest suggestions based on existing interests.

Args: interest_list: List of interest names to get suggestions for (e.g., ["Basketball", "Soccer"]) access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of suggestions to return (default: 25)

Returns: JSON string containing suggested interests with id, name, audience_size, and description fields

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
access_tokenNo
interest_listYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral transparency burden. It discloses useful traits: access_token is optional and a cached token is used if not provided, and the return is a JSON string with specific fields. This goes beyond the basic 'get' semantics.

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

Conciseness5/5

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

The description is well-structured with a clear opening sentence, followed by a concise Args section and a Returns line. Every line earns its place, with no redundant or verbose content.

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

Completeness4/5

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

The description covers all core aspects: purpose, parameters, token handling, and return format. It does not mention error cases or network calls, but for a straightforward suggestion tool with an output schema, it is sufficiently complete for correct invocation.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully explain parameters. It does so effectively: interest_list with an example, access_token with caching note, and limit with default value. This adds significant meaning beyond the schema's raw type definitions.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Get interest suggestions based on existing interests.' This specifies a verb ('get') and resource ('interest suggestions') and distinguishes it from sibling tools like search_interests by emphasizing the suggestion generation from existing interests.

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

Usage Guidelines3/5

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

The usage is implied from the description: provide an interest_list to receive related suggestions. However, there is no explicit guidance on when to use this tool versus alternatives like search_interests or estimate_audience_size, and no exclusions are mentioned.

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

get_page_postsA

Lista las publicaciones ORGÁNICAS de la Página con sus métricas de interacción (reacciones, comentarios, compartidos) e insights (impresiones, alcance, clics).

Args: page_id: ID de la Página de Facebook. limit: Máximo de publicaciones a devolver (default 25).

Returns: JSON con la lista de posts: id, message, created_time, permalink_url, y los conteos de reacciones/comentarios/compartidos + insights por post.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
page_idYes
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It does disclose that only organic posts are returned and enumerates the post fields and metrics. However, it does not mention authentication requirements (despite an access_token parameter), rate limits, or pagination, leaving some behavioral ambiguity for a read operation.

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

Conciseness5/5

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

The description is concise, front-loaded with the main purpose, and well-structured using Args/Returns blocks. Every sentence contributes meaningful information without repetition or filler.

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

Completeness4/5

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

For a list-style tool with a modest parameter set and an output schema present, the description covers the essentials: purpose, key arguments, and return value structure. The main gap is access_token semantics and lack of pagination details, but overall it is sufficient for most use cases.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains page_id and limit clearly ('ID de la Página', 'Máximo de publicaciones a devolver (default 25)'), adding meaning beyond the bare schema. However, it omits the access_token parameter entirely, leaving one parameter undocumented in both schema and description.

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

Purpose5/5

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

The description begins with a specific verb and resource: 'Lista las publicaciones ORGÁNICAS de la Página' (lists the page's organic posts), and further details the included metrics and insights. This clearly distinguishes it from sibling tools like get_insights, which likely aggregates page-level insights, and create_page_post, which creates posts.

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

Usage Guidelines4/5

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

The description clearly implies the tool is for retrieving a page's organic posts with interaction and insight metrics. However, it does not explicitly state when to use this over alternatives (e.g., get_insights for aggregated insights) or mention exclusions like paid posts or pagination behavior.

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

search_ads_archiveA

Search the Facebook Ads Library archive.

Args: search_terms: The search query for ads. ad_reached_countries: List of country codes (e.g., ["US", "GB"]). access_token: Meta API access token (optional - will use cached token if not provided). ad_type: Type of ads to search for (e.g., POLITICAL_AND_ISSUE_ADS, HOUSING_ADS, ALL). limit: Maximum number of ads to return. fields: Comma-separated string of fields to retrieve for each ad.

Example Usage via curl equivalent: curl -G
-d "search_terms='california'"
-d "ad_type=POLITICAL_AND_ISSUE_ADS"
-d "ad_reached_countries=['US']"
-d "fields=ad_snapshot_url,spend"
-d "access_token="
"https://graph.facebook.com//ads_archive"

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
fieldsNoad_creation_time,ad_creative_body,ad_creative_link_caption,ad_creative_link_description,ad_creative_link_title,ad_delivery_start_time,ad_delivery_stop_time,ad_snapshot_url,currency,demographic_distribution,funding_entity,impressions,page_id,page_name,publisher_platform,region_distribution,spend
ad_typeNoALL
access_tokenNo
search_termsYes
ad_reached_countriesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden. It does disclose that access_token is optional and falls back to a cached token, and the curl example reveals it's a GET request, but it omits pagination, rate limits, and error handling.

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

Conciseness4/5

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

The description is well-organized with a concise purpose statement, an Args list, and a practical example. It is slightly long, but each section serves a clear function.

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

Completeness4/5

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

For a search tool with an output schema, this description covers the core purpose, all parameters, and usage context. It lacks explicit guidance on pagination and alternative tools, but is otherwise complete.

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

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by explaining every parameter in the Args section and providing a concrete curl example. It adds meaning beyond the schema by clarifying optionality and example values.

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

Purpose5/5

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

The description uses a specific verb 'Search' and names the resource 'Facebook Ads Library archive', clearly defining the tool's functionality. This resource scoping distinguishes it from sibling search tools like search_pages_by_name or search_interests.

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

Usage Guidelines3/5

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

The description implies usage through a curl example, but it never explicitly states when to use this tool over alternatives like search_pages_by_name or search_interests. No exclusion or alternative guidance is provided.

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

search_behaviorsA

Get all available behavior targeting options.

Args: access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of results to return (default: 50)

Returns: JSON string containing behavior targeting options with id, name, audience_size bounds, path, and description

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

No annotations exist, so the description carries the transparency burden. It discloses that access_token is optional and a cached token is used if not provided, and it describes the return format (JSON string with id, name, audience_size bounds, etc.). This adds meaningful context beyond the schema, though it does not mention rate limits or max limit constraints.

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

Conciseness5/5

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

The description is concise and well-structured with separate Args and Returns sections. Every sentence provides useful information without redundancy, making it easy to scan.

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

Completeness5/5

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

Given the tool's simplicity, the description covers the purpose, parameters, and return format effectively. It is self-contained and sufficient for an agent to invoke correctly, even without an output schema (which is present anyway).

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

Parameters5/5

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

The description explicitly explains both parameters: access_token (Meta API token, optional) and limit (maximum results, default 50). This adds meaning beyond the schema's types and defaults, compensating for the 0% schema description coverage.

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

Purpose5/5

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

The description uses a specific verb ('Get') and resource ('behavior targeting options'), clearly distinguishing it from sibling tools like search_interests or search_demographics. The scope is well-defined and immediately understandable.

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

Usage Guidelines3/5

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

The description implies usage for retrieving behavior targeting options but does not explicitly state when to use it versus alternatives such as search_interests or search_demographics. No exclusions or alternative tool references are provided.

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

search_demographicsA

Get demographic targeting options.

Args: access_token: Meta API access token (optional - will use cached token if not provided) demographic_class: Type of demographics to retrieve. Options: 'demographics', 'life_events', 'industries', 'income', 'family_statuses', 'user_device', 'user_os' (default: 'demographics') limit: Maximum number of results to return (default: 50)

Returns: JSON string containing demographic targeting options with id, name, audience_size bounds, path, and description

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
access_tokenNo
demographic_classNodemographics

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses that access_token is optional and falls back to a cached token, lists all accepted demographic_class values, and explains the return JSON format with specific fields. Since no annotations are provided, the description carries the full burden and does so effectively, though it omits details like rate limits or error behavior.

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

Conciseness5/5

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

The description is front-loaded with a one-sentence purpose, then follows a clear Args/Returns structure. Every line serves a purpose, with no redundant information.

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

Completeness5/5

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

With no annotations and a relatively simple read-only tool, the description covers purpose, parameters, defaults, allowed values, and return format. This is fully sufficient for an agent to select and invoke the tool correctly, especially given the output schema exists.

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

Parameters5/5

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

The input schema has 0% description coverage, so the description provides essential meaning for all three parameters: access_token behavior, demographic_class allowed values with default, and limit default. This goes well beyond the bare schema.

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

Purpose5/5

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

The description clearly states it retrieves demographic targeting options, with a specific verb and resource. The list of demographic_class values (e.g., 'life_events', 'income') differentiates it from sibling search tools like search_interests and search_behaviors.

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

Usage Guidelines3/5

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

Usage is implied through the demographic_class parameter and the tool's name, but the description does not explicitly state when to use this tool versus alternatives like search_interests or search_geo_locations. There are no direct comparisons or exclusions.

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

search_geo_locationsA

Search for geographic targeting locations.

Args: query: Search term for locations (e.g., "New York", "California", "Japan") access_token: Meta API access token (optional - will use cached token if not provided) location_types: Types of locations to search. Options: ['country', 'region', 'city', 'zip', 'geo_market', 'electoral_district']. If not specified, searches all types. limit: Maximum number of results to return (default: 25)

Returns: JSON string containing location data with key, name, type, and geographic hierarchy information

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
access_tokenNo
location_typesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and discloses important behaviors: access_token is optional with cached fallback, location_types defaults to all, limit defaults to 25, and the return format is a JSON string. However, it does not mention rate limits, permissions, or error handling, so it's not fully transparent.

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

Conciseness4/5

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

The description is structured with Args and Returns, leading with a clear purpose sentence. It is somewhat list-heavy but appropriately sized given the need to document four parameters with no schema descriptions. No wasted words.

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

Completeness4/5

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

The description covers all parameters, defaults, and return format. With an output schema present, it does not need to fully explain return fields, but it does mention key fields. It lacks pagination or no-result behavior, but for a search tool this is acceptable.

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

Parameters5/5

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

Schema description coverage is 0%, and the description fully compensates by explaining every parameter: query with examples, access_token behavior, location_types options, and limit default. This adds substantial meaning beyond the bare schema titles.

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

Purpose5/5

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

The description clearly states 'Search for geographic targeting locations,' which is a specific verb + resource. It distinguishes this from sibling tools like search_interests and search_behaviors by explicitly focusing on geographic locations.

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

Usage Guidelines3/5

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

The description implies its use for geographic targeting but does not explicitly state when to use it over alternatives like search_interests or search_behaviors. No exclusions or alternative tool references are provided.

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

search_interestsA

Search for interest targeting options by keyword.

Args: query: Search term for interests (e.g., "baseball", "cooking", "travel") access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of results to return (default: 25)

Returns: JSON string containing interest data with id, name, audience_size, and path fields

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It adds value by specifying the return format as a JSON string with fields (id, name, audience_size, path) and by disclosing that access_token is optional and will use a cached token if not provided. This goes beyond the schema's basic parameter types.

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

Conciseness5/5

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

The description is tightly structured with a one-sentence purpose followed by a concise Args/Returns list. Every line serves a clear informational purpose with no redundancy or filler.

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

Completeness4/5

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

The tool definition covers purpose, all parameters, and return format. While it lacks explicit error handling or limitations, the presence of an output schema and the detailed parameter/return descriptions make it sufficiently complete for a straightforward search operation.

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

Parameters5/5

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

Despite the input schema having 0% description coverage, the tool description fully compensates by explaining all three parameters: query with concrete examples, access_token with caching behavior, and limit with its default value. This provides semantic meaning well beyond the schema.

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

Purpose5/5

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

The description uses a specific verb 'Search' and clearly identifies the resource as 'interest targeting options'. This distinguishes it from sibling tools like search_behaviors and search_demographics, which target different entity types.

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

Usage Guidelines3/5

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

The description implies usage by defining the tool as a keyword search for interests, but it does not explicitly state when to use it over alternatives like search_behaviors or get_interest_suggestions, nor does it provide any exclusionary guidance.

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

search_pages_by_nameA

Search for pages by name within an account.

Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided) search_term: Search term to find pages by name (optional - returns all pages if not provided)

Returns: JSON response with matching pages

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYes
search_termNo
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

No annotations are provided, so the description carries the transparency burden. It discloses two important behavioral traits: access_token is optional and falls back to a cached token, and search_term is optional and returns all pages when omitted. It also specifies the return type as JSON. This goes beyond basic schema info, though it doesn't cover pagination or error behavior.

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

Conciseness5/5

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

The description is concise and well-structured: a single purpose sentence followed by an Args section and a Returns line. No wasted words. 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.

Completeness4/5

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

For a simple 3-parameter tool with an output schema, the description covers the essential context: what the tool does, parameter meanings, and return type. It omits potential pagination or rate-limit details, but given the tool's simplicity and the presence of an output schema, it is sufficiently complete.

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

Parameters5/5

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

The schema has no descriptions for its parameters (0% coverage). The description compensates fully with an Args section that explains each parameter: account_id format, access_token optionality with cached token behavior, and search_term optionality with 'return all pages' behavior. This adds significant meaning beyond the bare schema.

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

Purpose4/5

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

The description clearly states the tool's function: 'Search for pages by name within an account.' It specifies the resource (pages), the action (search), and the scope (by name within an account). While it doesn't explicitly compare to sibling tools like get_account_pages, the 'by name' qualifier implies a distinction from listing all pages.

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

Usage Guidelines3/5

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

The description implies usage: use this tool when you need to find pages by name. It does not explicitly state when _not_ to use it or mention alternatives, but the purpose sentence is enough to infer when it is appropriate. No exclusions or alternatives are provided.

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

update_adA

Update an ad with new settings.

Args: ad_id: Meta Ads ad ID name: New ad name status: Update ad status (ACTIVE, PAUSED, etc.) bid_amount: Bid amount in account currency (in cents for USD) tracking_specs: Optional tracking specifications (e.g., for pixel events). creative_id: ID of the creative to associate with this ad (changes the ad's image/content) access_token: Meta API access token (optional - will use cached token if not provided)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
ad_idYes
statusNo
bid_amountNo
creative_idNo
access_tokenNo
tracking_specsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description must disclose behavior. It does add useful context: access_token is optional and 'will use cached token if not provided,' and creative_id 'changes the ad's image/content.' However, it does not disclose whether unspecified fields are reset, rate limits, or other side effects, leaving some ambiguity for a mutation tool.

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

Conciseness5/5

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

The description is efficiently structured with a purpose line followed by a compact Args list. Each parameter gets a single line with no wasted words, making it easy to parse.

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

Completeness3/5

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

Given the tool has 7 parameters and no annotations, the description covers all parameters and includes some behavioral notes. The presence of an output schema reduces the need to describe return values. However, it lacks discussion of partial vs. full update behavior or error conditions, which is a notable gap for a mutation tool.

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

Parameters4/5

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

Schema coverage is 0%, so the description fully compensates by explaining every parameter. It adds crucial semantics like bid_amount being 'in cents for USD' and tracking_specs being 'optional tracking specifications (e.g., for pixel events).' This provides meaning beyond the bare schema.

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

Purpose5/5

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

The description opens with 'Update an ad with new settings', a specific verb+resource that clearly identifies the tool's function. It distinguishes from sibling tools like update_campaign and update_adset by focusing on 'ad'.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like create_ad or update_ad_creative. It does not mention any exclusions or prerequisites, leaving the agent to infer usage from the name alone.

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

update_ad_creativeA

Update an existing ad creative's name or optimization settings.

IMPORTANT — Meta API limitation: The Meta API does NOT allow updating content fields (message, headline, description, CTA, image, video, URL) on existing creatives. Only the creative name and optimization settings (asset_feed_spec) can be changed. To change ad content, create a new creative with the desired content and update the ad to reference the new creative via update_ad.

Args: creative_id: Meta Ads creative ID to update access_token: Meta API access token (optional - will use cached token if not provided) name: New creative name (this is the most reliable update) message: New ad copy/text — NOTE: Meta API may reject this on existing creatives messages: List of primary text variants — NOTE: Meta API may reject this on existing creatives headline: Single headline — NOTE: Meta API may reject this on existing creatives headlines: New list of headlines — NOTE: Meta API may reject this on existing creatives description: Single description — NOTE: Meta API may reject this on existing creatives descriptions: New list of descriptions — NOTE: Meta API may reject this on existing creatives optimization_type: Set to "DEGREES_OF_FREEDOM" for FLEX (Advantage+) creatives dynamic_creative_spec: New dynamic creative optimization settings call_to_action_type: New call to action button type — NOTE: Meta API may reject this on existing creatives lead_gen_form_id: Lead generation form ID for lead generation campaigns ad_formats: List of ad format strings for asset_feed_spec (e.g., ["AUTOMATIC_FORMAT"] for Flexible ads, ["SINGLE_IMAGE"] for single image) creative_features_spec: Dict of Advantage+ Creative feature opt-ins/opt-outs. Each key is a feature name, value is {"enroll_status": "OPT_IN"|"OPT_OUT"}. Sent as a top-level field (not inside degrees_of_freedom_spec).

Returns: JSON response with updated creative details

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
messageNo
headlineNo
messagesNo
headlinesNo
ad_formatsNo
creative_idYes
descriptionNo
access_tokenNo
descriptionsNo
lead_gen_form_idNo
optimization_typeNo
call_to_action_typeNo
dynamic_creative_specNo
creative_features_specNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries full transparency burden. It discloses the key limitation that content fields will likely be rejected, notes the reliability of the name field, explains the access_token fallback behavior, and provides field-specific caveats. It also clarifies how creative_features_spec should be sent (top-level field).

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

Conciseness4/5

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

The description is longer than ideal, with the 'NOTE: Meta API may reject this' repeated for six separate fields. However, it is well-structured with an Args list and Returns section, and the length is justified by the need to document 15 parameters and a critical API constraint. Every section earns its place, though some repetition could be consolidated.

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

Completeness5/5

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

Given the tool's complexity (15 params, no annotations, presence of output schema), the description is complete. It covers purpose, usage boundaries, parameter semantics, and expected returns. It also references the related update_ad tool, providing necessary cross-tool context. The output schema handles return details, so the brief Returns line is sufficient.

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

Parameters5/5

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

Schema description coverage is 0%, but the description documents all 15 parameters, including type guidance (e.g., 'DEGREES_OF_FREEDOM' for flex creatives, ['AUTOMATIC_FORMAT'] for flexible ads) and explicit notes on which will likely be rejected. This fully compensates for the missing schema descriptions.

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

Purpose5/5

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

The description clearly states the tool 'Update an existing ad creative's name or optimization settings' and explicitly contrasts with content updates. It names the resource (ad creative) and the specific allowed changes, distinguishing it from siblings like create_ad_creative and update_ad.

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

Usage Guidelines5/5

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

The description explicitly explains when to use this tool (for name/optimization settings) and when not to (for content fields), and it names the alternative workflow: create a new creative and reference it via update_ad. The 'IMPORTANT — Meta API limitation' note provides clear guidance.

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

update_adsetA

Update an ad set with new settings including frequency caps and budgets.

Args: adset_id: Meta Ads ad set ID name: New ad set name frequency_control_specs: Frequency control specs (e.g. [{"event": "IMPRESSIONS", "interval_days": 7, "max_frequency": 3}]) bid_strategy: Bid strategy. Valid values: - 'LOWEST_COST_WITHOUT_CAP' (recommended) - no bid_amount required - 'LOWEST_COST_WITH_BID_CAP' - REQUIRES bid_amount - 'COST_CAP' - REQUIRES bid_amount - 'LOWEST_COST_WITH_MIN_ROAS' - REQUIRES bid_constraints with roas_average_floor Note: 'LOWEST_COST' is NOT valid - use 'LOWEST_COST_WITHOUT_CAP'. bid_amount: Bid amount in cents. Required for LOWEST_COST_WITH_BID_CAP, COST_CAP, TARGET_COST. NOT USED by LOWEST_COST_WITH_MIN_ROAS (uses bid_constraints instead). bid_constraints: Bid constraints dict. Required for LOWEST_COST_WITH_MIN_ROAS. Use {"roas_average_floor": } where value = target ROAS * 10000. Example: 2.0x ROAS -> {"roas_average_floor": 20000} bid_adjustments: Bid multipliers per targeting dimension. Pass-through to Meta. Shape: {"user_groups": {"": {"": , "default": }}} See create_adset for full docs and dim list. NOTE: Writing requires a Meta app capability that must be allowlisted. status: Update ad set status (ACTIVE, PAUSED, etc.) targeting: Complete targeting specifications (replaces existing targeting) optimization_goal: Conversion optimization goal (e.g., 'LINK_CLICKS', 'CONVERSIONS', 'VALUE') daily_budget: Daily budget in account currency (in cents) lifetime_budget: Lifetime budget in account currency (in cents) is_dynamic_creative: Enable/disable Dynamic Creative for this ad set. WARNING: This field is immutable after ad set creation. Meta's API will return success but silently ignore the change. To change this, create a new ad set. start_time: Start time in ISO 8601 format (e.g., '2023-12-01T12:00:00-0800'). Use with status=ACTIVE to schedule the ad set for future delivery (effective_status will be SCHEDULED until start_time). end_time: End time in ISO 8601 format. Required when lifetime_budget is specified. dsa_beneficiary: DSA beneficiary for European compliance (person/org that benefits from ads). Required for EU-targeted ad sets along with dsa_payor. dsa_payor: DSA payor for European compliance (person/org paying for the ads). Required for EU-targeted ad sets along with dsa_beneficiary. multi_advertiser_ads: Set to 0 to opt out of Multi-Advertiser Ads, 1 to opt in. This is a TOP-LEVEL ad set parameter — do NOT put it inside the targeting object. regional_regulated_categories: List of regional regulated categories for the ad set. Required for ads targeting regulated regions (Taiwan, Australia, etc.). Valid values: TAIWAN_FINSERV, TAIWAN_UNIVERSAL, AUSTRALIA_FINSERV, INDIA_FINSERV, SINGAPORE_UNIVERSAL, THAILAND_UNIVERSAL. Set to null/empty to remove existing categories. regional_regulation_identities: Dict of verified identity IDs for regional transparency compliance. Required when regional_regulated_categories is set. Set individual keys to null to remove them. attribution_spec: Attribution window specification for the ad set. WARNING: Meta no longer supports updating attribution_spec after ad set creation (error 1504040). To change attribution windows, create a new ad set instead. This parameter is kept for compatibility but will be rejected by Meta's API. Valid event_type values: CLICK_THROUGH, VIEW_THROUGH. Valid window_days values: 1, 7, 28 (depends on event_type and optimization_goal). access_token: Meta API access token (optional - will use cached token if not provided)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
statusNo
adset_idYes
end_timeNo
dsa_payorNo
targetingNo
bid_amountNo
start_timeNo
access_tokenNo
bid_strategyNo
daily_budgetNo
bid_adjustmentsNo
bid_constraintsNo
dsa_beneficiaryNo
lifetime_budgetNo
attribution_specNo
optimization_goalNo
is_dynamic_creativeNo
multi_advertiser_adsNo
frequency_control_specsNo
regional_regulated_categoriesNo
regional_regulation_identitiesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and excels. It discloses critical behavioral traits: silent ignore for is_dynamic_creative ('Meta's API will return success but silently ignore the change'), API rejection for attribution_spec ('will be rejected by Meta's API'), invalid bid_strategy values, allowlisting requirement for bid_adjustments, token caching, and that targeting 'replaces existing targeting.' These are genuine behavioral disclosures beyond mere parameter definitions.

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

Conciseness4/5

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

The description is long but appropriately so for a 22-parameter tool. It follows a clean Args list structure with a one-line summary at the top. Each parameter description is terse and information-dense; warnings are italicized and clearly marked. While some might argue it is verbose, every sentence adds value and there is minimal redundancy.

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

Completeness5/5

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

For an update operation with 22 optional parameters and no annotations, the description is exceptionally complete. It covers all parameters, including niche ones like DSA compliance, regional regulated categories, and multi_advertiser_ads. It notes dependencies, warns about immutable fields, references create_adset for shared documentation, and an output schema exists so return values need not be described. The description equips an agent to make correct calls with confidence.

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

Parameters5/5

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 fully—and it does. It provides concrete examples (frequency_control_specs, bid_constraints), unit clarifications (currency in cents, ISO 8601 format), valid values for bid_strategy, cross-field dependencies (bid_amount required for certain strategies, end_time required with lifetime_budget), and instructions for clearing fields (set to null). This vastly enriches the bare schema.

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

Purpose5/5

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

The description clearly states 'Update an ad set with new settings including frequency caps and budgets.' The verb 'Update' identifies a mutation operation on a specific resource, and the mention of frequency caps and budgets adds specificity. It distinguishes from sibling tools like create_adset and get_adsets by focusing on modifying an existing entity.

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

Usage Guidelines4/5

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

The description provides explicit when-not-to-use guidance for certain fields: it warns that is_dynamic_creative is immutable after creation and directs, 'To change this, create a new ad set,' and for attribution_spec it similarly advises creating a new ad set instead. However, it lacks a general statement like 'Use this to modify an existing ad set; for creation use create_adset,' so it does not fully earn a 5.

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

update_campaignA

Update an existing campaign in a Meta Ads account.

Note: Campaigns do not support start_time for scheduling — set start_time on the ad set instead.

Migrating CBO (Advantage Campaign Budget) → ABO (ad set level budgets): Pass adset_budgets with one entry per ad set in the campaign. Meta atomically removes the campaign-level budget and assigns budgets at the ad set level in a single call. This is Meta's documented mechanism — the legacy use_adset_level_budgets=true flag attempts to clear daily_budget/lifetime_budget but Meta silently ignores the empty values, so the migration does not persist.

Args: campaign_id: Meta Ads campaign ID access_token: Meta API access token (optional - will use cached token if not provided) name: New campaign name status: New campaign status (e.g., 'ACTIVE', 'PAUSED') special_ad_categories: List of special ad categories if applicable daily_budget: New daily budget in account currency (in cents). lifetime_budget: New lifetime budget in account currency (in cents). bid_strategy: New bid strategy bid_cap: New bid cap in account currency (in cents) as a string spend_cap: New spending limit for the campaign in account currency (in cents) as a string campaign_budget_optimization: Enable/disable campaign budget optimization objective: New campaign objective (Note: May not always be updatable) use_adset_level_budgets: Deprecated for CBO → ABO migration — use adset_budgets instead. Kept for backwards compatibility; sends empty daily_budget/ lifetime_budget which Meta silently ignores in most cases. adset_budgets: List of {"adset_id": "...", "daily_budget": <cents>} objects. Use to migrate from CBO to ABO: Meta removes the campaign-level Advantage budget and assigns the provided daily budgets at the ad set level in one atomic call. Example: [{"adset_id": "1234", "daily_budget": 5000}, {"adset_id": "5678", "daily_budget": 7000}]

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
statusNo
bid_capNo
objectiveNo
spend_capNo
campaign_idYes
access_tokenNo
bid_strategyNo
daily_budgetNo
adset_budgetsNo
lifetime_budgetNo
special_ad_categoriesNo
use_adset_level_budgetsNo
campaign_budget_optimizationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries full burden for behavioral disclosure. It reveals that Meta silently ignores empty daily_budget/lifetime_budget for the deprecated flag, that adset_budgets performs an atomic migration, and that objective may not always be updatable. This goes well beyond a bare 'update' statement.

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

Conciseness4/5

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

The description is well-structured with a main statement, a note, a migration section, and an Args list. It is slightly long, but the length is justified by the 14 parameters and the complex migration behavior. Every section serves a purpose.

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

Completeness5/5

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

Given the tool's complexity (14 params, no annotations, no schema descriptions), the description covers all critical aspects: parameter semantics, migration mechanism, deprecated flag behavior, and a caveat about start_time. The presence of an output schema handles return values, so the description is complete for an agent to select and invoke the tool.

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

Parameters5/5

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

Schema coverage is 0%, so the description must fully explain parameters. It does so thoroughly: each param has a clear meaning, units (cents), optionality, and examples for adset_budgets. It also flags deprecation for use_adset_level_budgets and explains the recommended alternative.

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

Purpose5/5

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

The description opens with 'Update an existing campaign in a Meta Ads account', a clear verb+resource statement. It implicitly distinguishes from create_campaign and update_adset by specifying the target object (campaign) and the action (update).

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

Usage Guidelines4/5

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

The description provides explicit guidance on when to use adset_budgets instead of the deprecated use_adset_level_budgets for CBO→ABO migration, and notes that start_time should be set on the ad set rather than the campaign. It clearly implies this tool is for updating existing campaigns, though it doesn't explicitly contrast with create_campaign or update_adset.

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

upload_ad_imageA

Upload an image to use in Meta Ads creatives.

Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided) file: Data URL or raw base64 string of the image (e.g., "data:image/png;base64,iVBORw0KG...") image_url: Direct URL to an image to fetch and upload name: Optional name for the image (default: filename)

Returns: JSON object with: - image_hash: Pass this to create_ad_creative when building the ad, or to get_image_by_hash to view the image later. - images: List of {hash, url, width, height, name}. The url is a Meta CDN link you can fetch directly to view the image — no need to call any other tool right after upload.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNo
nameNo
image_urlNo
account_idYes
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It explains that access_token is optional due to a cached token, describes the return format (image_hash and images list with CDN URL), and states that the URL can be fetched directly. It omits permissions, error conditions, or rate limits, but covers the key operational aspects beyond the tool's name.

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

Conciseness5/5

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

The description is well-structured with a one-sentence purpose, an Args list, and a Returns list. Every sentence provides essential information—no filler or redundancy. The length is appropriate for the number of parameters and return fields.

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

Completeness5/5

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

The description is fully self-sufficient: it explains all parameters, return values, and how to use the result (e.g., with create_ad_creative or get_image_by_hash). The output schema is already present, and the description adds the necessary context for an agent to invoke the tool correctly and interpret the response.

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

Parameters5/5

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

The schema description coverage is 0%, and the description fully compensates by documenting every parameter in the Args section. It provides format examples (e.g., 'data:image/png;base64,...'), clarifies the relationship between file and image_url, and notes defaults for name. This goes well beyond the schema's bare property definitions.

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

Purpose5/5

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

The description states 'Upload an image to use in Meta Ads creatives' with a specific verb, resource, and intended purpose. It clearly distinguishes itself from sibling tools like upload_ad_video by focusing on images and their use in ad creatives.

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

Usage Guidelines4/5

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

The description gives clear context: it explains what to do with the returned image_hash ('Pass this to create_ad_creative...') and notes that the CDN URL can be fetched directly, eliminating the need for immediate follow-up calls. It does not explicitly name alternatives or exclusion scenarios, but the context effectively conveys when and how to use the tool.

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

upload_ad_videoA

Sube un VIDEO a la cuenta publicitaria para usarlo luego en un anuncio (create_ad_creative con el parámetro video_id).

Meta DESCARGA el video directamente desde la URL pública (no se suben bytes), igual que upload_ad_image con image_url. El video se procesa (transcodifica) de forma ASÍNCRONA: el video_id devuelto NO es usable de inmediato en creativos flexibles/3x3. Antes de usarlo en esos casos, espera a que get_ad_video(video_id) devuelva video_status == "ready" (los creativos de un solo video suelen no verse afectados).

Args: account_id: Cuenta publicitaria (act_XXXXXXXXX). video_url: URL PÚBLICA del archivo de video (mp4). Debe ser accesible por Meta (sin login/VPN). Rutas locales (file://...) no sirven: súbelo antes a un host público. name: Nombre/archivo opcional del video. title: Título opcional del video. description: Descripción opcional del video. access_token: Token de Meta (opcional; usa el de la sesión).

Returns: JSON con { success, video_id, account_id, name } o el error de Meta. Pasa el video_id a create_ad_creative (param video_id) para crear el anuncio de video.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
titleNo
video_urlYes
account_idYes
descriptionNo
access_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description fully carries the burden. It discloses that Meta downloads from a public URL rather than receiving bytes, that processing is asynchronous and the video_id is not immediately ready for flexible creatives, and that local file paths are unsupported. These are important behavioral traits beyond the schema.

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

Conciseness4/5

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

The description is well-structured with clear sections for purpose, behavior, args, and returns, and the key warning about async processing is front-loaded. It has slight redundancy, such as mentioning create_ad_creative twice, but every paragraph earns its place.

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

Completeness5/5

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

The description is complete for the tool's complexity: it explains the async lifecycle, return shape, constraints on video_url, and how to use the result in create_ad_creative. The output schema exists but the description additionally clarifies practical usage and readiness checks.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates thoroughly by documenting all six parameters. It provides account_id format (act_XXXXXXXXX), video_url constraints (public, mp4, no file://), optional name/title/description, and access_token session fallback—all beyond the bare schema titles.

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

Purpose5/5

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

The description opens with a specific action: 'Sube un VIDEO a la cuenta publicitaria para usarlo luego en un anuncio', which clearly identifies the resource and purpose. It also references the downstream tool create_ad_creative and differentiates from the sibling upload_ad_image.

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

Usage Guidelines4/5

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

The description explains the intended flow: upload the video, use video_id in create_ad_creative, and check get_ad_video for readiness before using in flexible creatives. It does not explicitly say 'use X instead', but the context and sibling distinction are clear.

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

TDQS

A3.9/5.0
Disambiguation4/5

Most tools map cleanly to distinct resources (campaigns, adsets, ads, creatives, targeting, insights). A few overlapping pairs exist—get_ad_creatives vs get_creative_details, get_account_pages vs search_pages_by_name, get_ad_image vs get_image_by_hash—but their descriptions clarify the intended inputs and use cases.

Naming Consistency4/5

The dominant pattern is verb_noun (get_campaigns, create_adset, update_ad, upload_ad_image, search_interests). A few generic names (search, fetch) and slight deviations (get_image_by_hash not following get_<resource>) break the pattern, but the overall structure is predictable and readable.

Tool Count2/5

At 42 tools, this server exceeds the 'heavy' threshold and feels over-scoped for a single MCP server. While the Meta Ads domain is broad, many tools are narrow (e.g., compute_image_crops, create_budget_schedule) and several overlap in function, inflating the count beyond what is needed for core ad management.

Completeness4/5

The surface covers the full campaign→adset→ad→creative hierarchy with create, read, and update operations, plus insights, targeting search, page posts, and budget schedules. Notable gaps include missing delete/archive endpoints and the oddly coupled search/fetch pair, but these do not severely hamper core workflows.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    Not graded
    maintenance
    Enables AI-powered analysis, management, and optimization of Meta advertising campaigns across Facebook and Instagram, including performance insights, budget optimization, and creative testing.
    33
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to manage Facebook and Instagram advertising via the Meta Marketing API. It provides comprehensive tools for campaign lifecycle management, performance analytics, audience targeting, and creative optimization.
    27
    196
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to manage Facebook and Instagram advertising data through the Meta Marketing API. It supports full campaign lifecycle management, performance analytics, audience targeting, and creative optimization.
    1,659
    MIT
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI assistants to manage Facebook and Instagram advertising campaigns through the Meta Marketing API. Supports full campaign lifecycle management, performance analytics, audience targeting, and creative optimization.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/algoyandreina1236-web/meta-ads-mcp-pwm'

If you have feedback or need assistance with the MCP directory API, please join our Discord server