Meta Ads MCP
The Meta Ads MCP server allows AI models to interact with the Meta Ads API to manage and analyze advertising campaigns across Meta platforms. With this server, you can:
Account Management: Retrieve accessible ad accounts, get detailed account information, and associated pages
Campaign Operations: Create, retrieve, and analyze campaigns with filtering options
Ad Set Management: Create, retrieve, and update ad sets, including targeting, bidding strategies, and optimization goals
Ad Management: Create, retrieve, and update ads, including status and bid amounts
Creative Handling: Upload images, retrieve creative details, and troubleshoot image issues
Insights and Analytics: Obtain performance metrics for campaigns, ad sets, ads, or accounts
Authentication: Generate login links for Meta Ads authentication
Budget Management: Create budget schedules for campaigns
Provides tools for managing and analyzing Facebook advertising campaigns, including performance metrics, campaign creation, and creative assessment.
Offers functionality to access, analyze and manage Instagram advertising campaigns through Meta's advertising platform.
Enables access to Meta's advertising APIs, allowing retrieval of ad performance data, campaign management, budget optimization, and viewing ad creatives across Meta platforms.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Meta Ads MCPshow me last week's top performing campaigns"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Meta Ads MCP
A Model Context Protocol (MCP) server that lets AI assistants — Claude, ChatGPT, Perplexity, Cursor, or any MCP client — run your Meta Ads end to end: launch campaigns, upload creatives, update budgets, and analyze performance through natural conversation across Facebook, Instagram, and every Meta ad surface. Available as a hosted remote MCP — no developer token, no self-hosting required.
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.
mcp-name: co.pipeboard/meta-ads-mcp
Community & Support
Discord. Join the community.
Email Support. Email us for support.
Related MCP server: Meta Ads 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) |
| 42 tools — campaigns, ad sets, ads, creatives (incl. dynamic creative testing), image upload, insights, interest / behavior / demographic / geo targeting, page management |
Google Ads MCP |
| 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 |
| 59 tools — campaigns, ad groups, ads, identities, image and video upload, audience and creative management, insights |
Snap Ads MCP |
| 37 tools — ad accounts, campaigns, ad squads, ads, creatives, media upload, insights |
Reddit Ads MCP |
| 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, Perplexity, 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 7605685552884596737Sub-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.
Getting started with Remote MCP (Recommended)
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
Go to claude.ai/settings/integrations (requires Claude Pro or Max)
Click "Add Integration" and enter:
Name: "Pipeboard Meta Ads" (or any name you prefer)
Integration URL:
https://meta-ads.mcp.pipeboard.co/
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_TOKENGet 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_TOKENThis 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
Remote MCP (Recommended)
✨ 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
mcp_meta_ads_get_ad_accountsGet 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 userlimit: Maximum number of accounts to return (default: 200)
Returns: List of accessible ad accounts with their details
mcp_meta_ads_get_account_infoGet 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
mcp_meta_ads_get_account_pagesGet 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
mcp_meta_ads_get_campaignsGet 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
mcp_meta_ads_get_campaign_detailsGet 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
mcp_meta_ads_create_campaignCreate 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 nameobjective: Campaign objective (ODAX, outcome-based). Must be one of:OUTCOME_AWARENESSOUTCOME_TRAFFICOUTCOME_ENGAGEMENTOUTCOME_LEADSOUTCOME_SALESOUTCOME_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_AWARENESS→OUTCOME_AWARENESSREACH→OUTCOME_AWARENESSLINK_CLICKS,TRAFFIC→OUTCOME_TRAFFICPOST_ENGAGEMENT,PAGE_LIKES,EVENT_RESPONSES,VIDEO_VIEWS→OUTCOME_ENGAGEMENTLEAD_GENERATION→OUTCOME_LEADSCONVERSIONS,CATALOG_SALES,MESSAGES(sales-focused flows) →OUTCOME_SALESAPP_INSTALLS→OUTCOME_APP_PROMOTION
status: Initial campaign status (default: PAUSED)special_ad_categories: List of special ad categories if applicabledaily_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 }
mcp_meta_ads_get_adsetsGet 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
mcp_meta_ads_get_adset_detailsGet 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
mcp_meta_ads_create_adsetCreate 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 toname: Ad set namestatus: Initial ad set status (default: PAUSED)daily_budget: Daily budget in account currency (in cents) as a stringlifetime_budget: Lifetime budget in account currency (in cents) as a stringtargeting: 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
mcp_meta_ads_get_adsGet 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 byadset_id: Optional ad set ID to filter by
Returns: List of ads matching the criteria
mcp_meta_ads_create_adCreate a new ad with an existing creative
Inputs:
account_id: Meta Ads account ID (format: act_XXXXXXXXX)name: Ad nameadset_id: Ad set ID where this ad will be placedcreative_id: ID of an existing creative to usestatus: Initial ad status (default: PAUSED)bid_amount: Optional bid amount (in cents)tracking_specs: Optional tracking specificationsaccess_token(optional): Meta API access token
Returns: Confirmation with new ad details
mcp_meta_ads_get_ad_detailsGet 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
mcp_meta_ads_get_ad_creativesGet 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
mcp_meta_ads_create_ad_creativeCreate a new ad creative using an uploaded image hash
Inputs:
account_id: Meta Ads account ID (format: act_XXXXXXXXX)name: Creative nameimage_hash: Hash of the uploaded imagepage_id: Facebook Page ID for the adlink_url: Destination URLmessage: Ad copy/textheadline: 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 settingscall_to_action_type: CTA button type (e.g., 'LEARN_MORE')instagram_actor_id: Optional Instagram account IDaccess_token(optional): Meta API access token
Returns: Confirmation with new creative details
mcp_meta_ads_update_ad_creativeUpdate an existing ad creative with new content or settings
Inputs:
creative_id: Meta Ads creative ID to updatename: New creative namemessage: New ad copy/textheadline: 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 settingscall_to_action_type: New call to action button typeaccess_token(optional): Meta API access token (will use cached token if not provided)
Returns: Confirmation with updated creative details
mcp_meta_ads_upload_ad_imageUpload 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 uploadname: Optional name for the imageaccess_token(optional): Meta API access token
Returns: JSON response with image details including hash
mcp_meta_ads_get_ad_imageGet, 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
mcp_meta_ads_update_adUpdate an ad with new settings
Inputs:
ad_id: Meta Ads ad IDstatus: 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
mcp_meta_ads_update_adsetUpdate an ad set with new settings including frequency caps
Inputs:
adset_id: Meta Ads ad set IDfrequency_control_specs: List of frequency control specificationsbid_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_automationaccess_token(optional): Meta API access token (will use cached token if not provided)
Returns: Confirmation with updated ad set details and a confirmation link
mcp_meta_ads_get_insightsGet 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 accounttime_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
mcp_meta_ads_get_login_linkGet 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
mcp_meta_ads_create_budget_scheduleCreate a budget schedule for a Meta Ads campaign
Inputs:
campaign_id: Meta Ads campaign IDbudget_value: Amount of budget increasebudget_value_type: Type of budget value ("ABSOLUTE" or "MULTIPLIER")time_start: Unix timestamp for when the high demand period should starttime_end: Unix timestamp for when the high demand period should endaccess_token(optional): Meta API access token
Returns: JSON string with the ID of the created budget schedule or an error message
mcp_meta_ads_search_interestsSearch 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
mcp_meta_ads_get_interest_suggestionsGet 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
mcp_meta_ads_validate_interestsValidate 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
mcp_meta_ads_search_behaviorsGet 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
mcp_meta_ads_search_demographicsGet 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
mcp_meta_ads_search_geo_locationsSearch 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
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:
Verify Account Access: Ask your LLM to use
mcp_meta_ads_get_ad_accountsCheck Account Details: Use
mcp_meta_ads_get_account_infowith your account IDList Campaigns: Try
mcp_meta_ads_get_campaignsto 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
37 toolscompute_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.
| Name | Required | Description | Default |
|---|---|---|---|
| crop_keys | No | ||
| image_width | Yes | ||
| image_height | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and handles it well. It discloses the algorithm behavior (largest centered region matching aspect ratio, equivalent to 'Original' crop), the default set of crop keys with their aspect ratios and placements, and the inclusion of validation notes for invalid keys. This gives a complete picture of what happens during execution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args and Returns sections. Though it contains a detailed list of crop keys, every element adds value. The opening sentence provides an immediate summary, and no content is superfluous or redundant with schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a small parameter set (3) and an output schema, so the description doesn't need to document return format in detail. It covers algorithm, defaults, parameter meanings, downstream usage, and error handling (validation notes), making it fully complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates. It explains image_width and image_height with pixel units and examples, and details crop_keys as an optional list with the six defaults, each enriched with aspect ratio and placement context. This is far beyond schema basics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a clear, specific verb+resource combination: 'Compute image_crops coordinates for a source image of the given dimensions.' It uniquely identifies the tool's function, distinguishing it from all sibling tools which focus on ad/account management. No ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the output is 'ready to pass directly to create_ad_creative or bulk_create_ad_creatives', which clearly signals when to use this tool (before creating ad creatives). However, it doesn't explicitly state when not to use it or mention alternatives, though none are apparent among siblings. The context is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| status | No | PAUSED | |
| adset_id | Yes | ||
| account_id | Yes | ||
| bid_amount | No | ||
| creative_id | Yes | ||
| access_token | No | ||
| tracking_specs | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 the default PAUSED status, optional access_token with a cached fallback, and the dynamic-creative constraint with a specific error subcode. These are useful behavioral details, though it does not mention permissions or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a front-loaded one-sentence summary, a parameter list with helpful details, and a critical note. Each line earns its place, and the tracking_specs example is valuable despite adding length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a Meta Ads API create operation with 8 parameters, the description covers all parameter semantics, the default behavior, and a known failure mode. It is sufficiently complete given an output schema exists. A minor gap is the lack of accepted status values and account/adset consistency constraints, but these are not essential for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no property descriptions (0% coverage), but the description compensates by explaining every parameter, including the act_ format for account_id, bid_amount in cents, a tracking_specs JSON example, and the optional cached access token. 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create a new ad with an existing creative,' clearly stating the action (create), the resource (ad), and a key constraint (existing creative). This distinguishes it from sibling tools like create_ad_creative or update_ad.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'with an existing creative' gives clear context that a pre-existing creative ID is required, implying that creative creation should happen first via a different tool. The dynamic creative note also provides a specific prerequisite. However, it does not explicitly name alternative tools or say 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:<phone_number>" (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
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| images | No | ||
| videos | No | ||
| caption | No | ||
| message | No | ||
| page_id | No | ||
| event_id | No | ||
| headline | No | ||
| link_url | No | ||
| messages | No | ||
| url_tags | No | ||
| video_id | No | ||
| headlines | No | ||
| account_id | Yes | ||
| ad_formats | No | ||
| image_hash | No | ||
| description | No | ||
| image_crops | No | ||
| access_token | No | ||
| descriptions | No | ||
| image_hashes | No | ||
| phone_number | No | ||
| reminder_data | No | ||
| thumbnail_url | No | ||
| object_story_id | No | ||
| lead_gen_form_id | No | ||
| optimization_type | No | ||
| instagram_actor_id | No | ||
| call_to_action_type | No | ||
| dynamic_creative_spec | No | ||
| creative_features_spec | No | ||
| disable_all_enhancements | No | ||
| facebook_branded_content | No | ||
| asset_customization_rules | No | ||
| instagram_branded_content | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description thoroughly discloses behavioral traits: error codes (error_subcode=1487390, error 1885800), video processing delays with retry logic, Meta silently collapsing multiple image_hashes in DOF mode, auto-handling of ad_formats for videos, and quirks like link_url requirement for asset customization. It goes beyond basic expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very long but well-structured with sections for creative modes, parameter details, and examples. It front-loads the purpose and modes, then uses bullet points and clear headings. Some redundancy exists (e.g., asset_customization_rules explained twice), but the structure supports the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high complexity (35 parameters, multiple modes, error handling) and minimal output schema, the description covers interactions, constraints, and behavioral notes comprehensively. However, the return value description is minimal ('JSON response with created creative details'), lacking details about typical response fields or status codes, which could be improved for full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by detailing each of the 35 parameters: formats (e.g., account_id as 'act_XXXXXXXXX', instagram_actor_id as string), constraints (e.g., 'cannot be used with image_hash'), nested structures (e.g., messages as string or dict, asset_customization_rules format), and caveats (e.g., phone_number E.164 format and internal handling). The description adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new ad creative' and lists six distinct creative modes (existing post, simple image/video, multi-variant copy, placement customization, dynamic creative, FLEX/Advantage+). It distinguishes the tool from siblings like create_ad and compute_image_crops by focusing on creative creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use each creative mode and how to combine parameters, including mutual exclusivity rules (e.g., image_hash vs video_id vs object_story_id) and prerequisites (e.g., link_url required for asset customization even for lead ads). It also warns about common errors and suggests alternatives like using compute_image_crops before image_crops.
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": <value>} 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": {"<dim>": {"<value>": <float>, "default": <float>}}}
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": "<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": "<id>", "taiwan_universal_payer": "<id>"}
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)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| status | No | PAUSED | |
| end_time | No | ||
| dsa_payor | No | ||
| targeting | No | ||
| account_id | Yes | ||
| bid_amount | No | ||
| start_time | No | ||
| campaign_id | Yes | ||
| access_token | No | ||
| bid_strategy | No | ||
| daily_budget | No | ||
| billing_event | Yes | ||
| bid_adjustments | No | ||
| bid_constraints | No | ||
| dsa_beneficiary | No | ||
| lifetime_budget | No | ||
| promoted_object | No | ||
| attribution_spec | No | ||
| destination_type | No | ||
| optimization_goal | Yes | ||
| is_dynamic_creative | No | ||
| multi_advertiser_ads | No | ||
| frequency_control_specs | No | ||
| regional_regulated_categories | No | ||
| regional_regulation_identities | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully bears the burden. It discloses many behaviors: frequency_control_specs immutability after creation, promoted_object cannot be added via update, bid_adjustments requires allowlisted capability, error subcodes, and the need for DSA fields for EU targeting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with each parameter on a new line, but it is very long and verbose. It could be more concise by summarizing some lists (e.g., valid optimization_goal values) or linking to external documentation. However, it is well-organized and front-loaded with the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the tool (26 parameters, no annotations, no schema descriptions), the description is exceptionally complete. It covers budget inheritance, bid strategies, targeting defaults, regulatory fields, and even error subcodes. An agent can confidently invoke this tool with the information provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates with detailed explanations for each of the 26 parameters. It provides valid values, formats, examples, constraints, and relationships. For example, optimization_goal lists all valid values per destination_type, bid_strategy specifies which require bid_amount, and frequency_control_specs gives an example and immutability note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new ad set in a Meta Ads account.' This provides a specific verb (create) and resource (ad set). It distinguishes itself from sibling tools like update_adset 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides extensive when-to-use and when-not-to-use guidance, e.g., CBO budget inheritance ('Do NOT set this if the parent campaign already has a budget'), bid_amount requirements per bid strategy, and valid optimization_goal combinations per campaign objective. It also warns against using invalid values like 'LOWEST_COST' and 'ON_AD' for OUTCOME_ENGAGEMENT.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| time_end | Yes | ||
| time_start | Yes | ||
| campaign_id | Yes | ||
| access_token | No | ||
| budget_value | Yes | ||
| budget_value_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the return format ('JSON string containing the ID... or an error message'), the meaning of budget_value_type ('ABSOLUTE' or 'MULTIPLIER'), and the optional access_token fallback. It does not mention rate limits or reversibility, but for a create operation, this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-line purpose, a brief contextual sentence, a clearly formatted Args list, and a Returns line. Every sentence earns its place, with no fluff or redundancy. It is appropriately sized for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, no annotations, output schema present), the description is complete. It covers all parameters, explains the return value, and provides enough context for an agent to select and invoke the tool correctly. No gaps are apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates by documenting every parameter: campaign_id, budget_value, budget_value_type, time_start, time_end, and access_token. It adds meaning beyond the schema, such as the interpretation of budget_value based on budget_value_type and the Unix timestamp requirement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a budget schedule for a Meta Ads campaign' with a specific verb and resource, and further explains its purpose: 'Allows scheduling budget increases based on anticipated high-demand periods.' This distinguishes it from sibling tools, none of which handle scheduling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly conveys when to use the tool via 'Allows scheduling budget increases based on anticipated high-demand periods,' which is clear context. It also provides practical guidance on Unix timestamps. It does not explicitly mention alternatives or exclusions, but no sibling offers similar functionality, so the guidance is adequate.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| status | No | PAUSED | |
| bid_cap | No | ||
| objective | Yes | ||
| spend_cap | No | ||
| account_id | Yes | ||
| buying_type | No | ||
| access_token | No | ||
| bid_strategy | No | LOWEST_COST_WITHOUT_CAP | |
| daily_budget | No | ||
| lifetime_budget | No | ||
| special_ad_categories | No | ||
| ab_test_control_setups | No | ||
| use_adset_level_budgets | No | ||
| campaign_budget_optimization | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 that the tool returns a campaign id, warns about start_time limitation, legacy objectives, and bid strategy implications for child ad sets. It does not cover permissions or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear overview, a note section, and an args list. It is front-loaded with purpose. However, it could be slightly more concise; some details like the full list of ODAX objectives are repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high parameter count (15) and no annotations, the description covers many aspects: hierarchy context, warnings, return value. It does not address error handling, pagination, or rate limits, but these are not critical for a creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It provides detailed explanations for all parameters, including account_id format, objective enums with usage warnings, budget units, bid strategy enums, conditional usage of daily_budget/lifetime_budget, and an example for ab_test_control_setups.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that it creates a Facebook or Instagram ad campaign, specifies it as the first step in the campaign hierarchy, and lists alternative names. It distinguishes from sibling tools by defining its role as the entry point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context on when to use (first step of hierarchy) and includes a note about start_time and objective mapping. However, it lacks explicit guidance on when NOT to use this tool versus alternatives like update_campaign or create_adset.
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
| Name | Required | Description | Default |
|---|---|---|---|
| targeting | No | ||
| account_id | No | ||
| access_token | No | ||
| interest_list | No | ||
| optimization_goal | No | REACH | |
| interest_fbid_list | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden of behavioral disclosure. It provides valuable context: access_token is optional and falls back to a cached token, account_id is required for comprehensive estimation, interest_list and interest_fbid_list are deprecated backward-compatibility parameters, and optimization_goal defaults to 'REACH' with stated options. It also describes the return value as a JSON string including estimated_audience_size and reach_estimate. This goes well beyond a terse description, though it does not cover error cases or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a leading summary sentence, followed by Args and Returns sections. The example targeting object is highly informative without being bloated. Every sentence contributes value, including the explicit deprecation notices. It is appropriately sized for a complex tool and does not waste words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 6 parameters, zero annotations, and an output schema. The description covers all core aspects: what it does, when to use it, each parameter's purpose and format, deprecated options, and the shape of the return value. The provided example fills in gaps that the abstract schema cannot. Given the tool's complexity and the absence of annotations, the description is notably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the input schema's bare property definitions. It does so thoroughly: every parameter is explained in the Args section, with details like 'format: act_XXXXXXXXX' for account_id, a concrete JSON example for targeting, a list of options for optimization_goal, and explicit deprecation notes for legacy params. This adds meaning far beyond the schema's type and default declarations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, action-oriented statement: 'Estimate audience size for targeting specifications using Meta's delivery_estimate API.' This clearly identifies the resource (audience size estimation) and the target API, and it distinguishes the tool from siblings like search_interests or search_geo_locations by focusing on estimation rather than discovery. The mention of 'comprehensive audience estimation for complex targeting combinations' further clarifies its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool: for comprehensive estimation of complex targeting combinations (demographics, geography, interests, behaviors) and for backwards-compatible simple interest validation. It stops short of explicitly naming alternative tools for different use cases or saying 'use X instead,' but the guidance is sufficient to place the tool correctly among its siblings.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that the tool does not make direct API calls, only returns cached records, and returns 'Record not found' if the record wasn't cached. It also notes the session scoping, providing essential behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: main purpose, important limitations, alternatives, args, and returns. Every sentence provides necessary information, and the key limitation is front-loaded. Length is justified by the complexity and requirement to prevent misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description explains the return behavior ('JSON response with record data, or 'Record not found''), which is essential. It covers the single parameter, use cases, limitations, and alternatives, making it complete for this relatively simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only lists an 'id' string with no description. The description adds critical meaning: the required format ('type:id', e.g., 'account:act_123456') and that the record must have been returned by a previous 'search' call. This is substantial value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch') and resource ('a record previously returned by the 'search' tool'), clearly distinguishing this from sibling tools. It explicitly notes this is not for direct ID lookups, which further sharpens its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool (after a prior 'search' call) and when NOT to use it ('Do NOT use this tool to look up campaigns, adsets, or ads by ID directly'), and then lists specific alternative tools for those cases. This is model guidance.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| account_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description adds value by explaining optional token caching, default fields, and a critical nuance for prepaid account balance calculation. However, it does not disclose read-only status, required permissions, or rate limits, leaving some behavioral aspects opaque.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description starts with a clear one-line purpose, then lists parameters in a structured format. The prepaid account explanation is valuable but adds length; overall it is reasonably concise without unnecessary redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, parameter semantics, and a key edge case (prepaid balance). With an output schema present, return value documentation is not needed. It does not discuss prerequisites or error handling, but is generally adequate for a read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description fully explains all three parameters: account_id format (act_XXXXXXXXX), access_token caching behavior, and fields parameter with default list and prepaid account note. This exceeds the baseline and compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get detailed information about a specific ad account,' specifying both the action (get) and resource (ad account). This clearly distinguishes it from sibling tools like get_ad_accounts (which lists accounts) and get_insights (analytics).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, such as when to use get_ad_accounts for listing or get_campaign_details for campaign-specific info. It lacks explicit when-to-use or when-not-to-use instructions.
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
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing behavior. It notes the optional access_token and cached-token fallback, giving insight into authentication behavior. It also states the return format (JSON). It could mention what happens when no token is available, but for a simple GET operation, this is adequately transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args and Returns sections, front-loading the purpose. Every sentence provides useful information without unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with an output schema, the description covers the essential aspects: purpose, parameters, and return value. It is complete enough for an agent to select and invoke the tool correctly, especially given the explicit parameter format and caching note.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate. It explains account_id format (act_XXXXXXXXX) and the optional access_token with caching behavior, adding meaningful context beyond the bare schema. Both parameters are effectively documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets pages associated with a Meta Ads account, using a specific verb and resource. It naturally distinguishes itself from sibling tools like search_pages_by_name by focusing on account association rather than name-based search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: when you need pages linked to a specific Meta Ads account. It does not explicitly mention alternatives or exclusions, but the purpose is unambiguous enough to infer the 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_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)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| user_id | No | me | |
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden of behavioral disclosure. It only mentions that amount_spent and balance are in currency units, but fails to disclose pagination behavior, error cases, token permission requirements, or data freshness. This is insufficient for a tool that likely returns a list of sensitive financial data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: first sentence states purpose, then a note about behavior, then the parameter list. No filler words. The parameter list uses a clear 'name: explanation' format. Front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 optional parameters and an output schema, the description covers the basic semantics and a behavioral note (currency units). However, it omits important context like whether results are paginated, how to handle errors, or what happens when no ad accounts are available. The output schema exists but the description should still provide enough context for an agent to decide whether to call the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains all three parameters: access_token (optional, cached), user_id (default 'me'), limit (maximum accounts, default 200). This adds value beyond the schema's type annotations, but could be improved by clarifying the format of access_token or user_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get ad accounts accessible by a user', which is a specific verb and resource. It distinguishes itself from sibling tools like get_ads and get_campaigns by focusing on ad accounts and user accessibility. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when listing ad accounts for a user, but does not explicitly state when to use this tool over alternatives, nor does it provide exclusions or when-not scenarios. The presence of similar sibling tools (e.g., get_account_info) suggests differentiation is needed, but none is given.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the token caching behavior and the required ad_id, which is helpful. But it doesn't mention whether the operation is read-only, possible errors, or any rate limits—basic behavioral context for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief, front-loaded with the core purpose, and uses a clean Args list. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only 2 parameters and an output schema, the description covers the workflow, prerequisites, and parameter semantics. Its brevity is appropriate given the low complexity and available output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does this thoroughly by explaining that ad_id is the Meta Ads ad ID and that access_token is optional with a cached-token fallback, adding meaning the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' and clearly identifies the resource: creative details for a specific ad. It distinguishes itself from siblings by emphasizing the ad_id requirement (not account_id) and directs users to get_ads first, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context by stating the prerequisite (use get_ads first) and clarifies the required ID type. However, it doesn't explicitly name alternative tools or when-not-to-use, so it stops short of a 5.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It adds useful behavioral context about the access_token parameter, noting that a cached token is used if not provided. However, it does not explicitly mention read-only safety, error handling, or what 'detailed information' includes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences plus a clear argument list. It is front-loaded with the purpose statement and concise, with no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-resource read operation with an output schema, the description is fairly complete. It covers what the tool does, both parameters, and the token fallback behavior. The only notable gap is the lack of usage guidance, which is already penalized under usage_guidelines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no descriptions for parameters (0% coverage), so the description fully compensates. It explains ad_id as 'Meta Ads ad ID' and access_token as 'Meta API access token (optional - will use cached token if not provided),' adding semantic meaning beyond the schema's bare type and default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get detailed information about a specific ad.' This distinguishes it from plural listing tools like get_ads and other detail tools like get_adset_details or get_creative_details by specifying 'ad' and 'specific'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of alternatives or exclusions, which is problematic given the many sibling 'get_*_details' tools that could be confused.
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
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| access_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While no annotations exist, the description discloses the read-only nature (get/download) and that it returns the currently serving image. Could mention if any side effects or rate limits, but adequate overall.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise: main action in first sentence, alternate usage in second, then Args/Returns. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool, the description covers purpose, input, output, and alternatives. No output schema needed given the simple return type.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description explains both parameters: ad_id as Meta Ads ad ID, access_token as optional with caching behavior, adding significant value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets, downloads, and visualizes the image attached to an existing Meta ad, distinguishing it from get_image_by_hash which is for image hash lookups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (have ad ID) and when to avoid (only have image hash), and provides the alternative get_image_by_hash.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| adset_id | No | ||
| account_id | Yes | ||
| campaign_id | No | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It explains optional token caching and default limit but omits behaviors like pagination, error handling, or whether only active ads are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bullet points and front-loaded purpose. Minor verbosity (e.g., 'optional - will use cached token if not provided') could be trimmed, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters, required account_id, and presence of output schema, the description covers all necessary aspects. It lacks mention of pagination or result scope (e.g., active vs. all ads), but is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by detailing each parameter: account_id format, access_token optionality, limit default, and filter fields. Adds significant meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get ads for a Meta Ads account with optional filtering,' specifying the verb, resource, and context. It distinguishes from sibling tools like get_adsets or get_campaigns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lists optional filters but does not explicitly guide when to use this tool versus alternatives like search or get_campaigns. No exclusions or when-not-to-use 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_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"
}
| Name | Required | Description | Default |
|---|---|---|---|
| adset_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must communicate behavioral traits. It discloses that access_token is optional and will use a cached token if not provided, which is useful. However, it does not mention potential errors, permission requirements, or the read-only nature explicitly (though 'get' implies it). This provides some transparency but leaves gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: a one-sentence purpose, a clear Args list, and an example. It is well-organized and front-loaded with the purpose. No unnecessary wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of an output schema, the description is largely complete. It explains the parameters and how to call the function. However, it omits any mention of error conditions or how the response is structured, but the output schema covers that. The description suffices for selection and basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero descriptions for its properties, so the description must compensate. It explains adset_id as 'Meta Ads ad set ID' and access_token as an optional token with caching behavior. It also provides a concrete invocation example. This adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get detailed information about a specific ad set.' The verb 'get' and resource 'adset details' distinguish it from sibling tools like get_adsets (which lists adsets) and get_ad_details (which handles ads, not adsets).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus alternative tools like get_adsets. It implies you need a specific adset_id, but offers no contextual information about when to choose this over others. The example focuses on invocation syntax rather than selection criteria.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| account_id | Yes | ||
| campaign_id | No | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as pagination behavior, ordering, or side effects. It only describes the basic operation (read) without clarifying limits or error handling, which is insufficient given the absence of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with a single sentence summary followed by a structured Args block. It is front-loaded and every sentence provides useful information, though the Args block slightly repeats schema info without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool simplicity and existence of an output schema, the description covers basic functionality and parameters. However, it lacks context on edge cases (no results), error messages, or rate limits, leaving it minimally complete for a production setting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description compensates by explaining account_id format ('act_XXXXXXXXX'), access_token optionality with cached token note, limit default, and campaign_id optionality. This adds value beyond the schema, though it could detail limit behavior or filter semantics more.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get ad sets for a Meta Ads account with optional filtering by campaign.' It specifies the verb 'Get', the resource 'ad sets', the context 'Meta Ads account', and an additional feature. This distinguishes it from siblings like get_ads (different resource) and get_adset_details (specific ad set).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions optional filtering by campaign but does not explicitly state when to use this tool vs alternatives like get_adset_details or get_ads. There is no guidance on prerequisites or use cases, leaving the agent to infer context from the tool 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)
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | No | ||
| video_id | No | ||
| account_id | No | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full disclosure responsibility. It thoroughly explains behavior: polling for video status, error prevention by waiting for 'ready' status, and the advantage of providing account_id to avoid API errors. The video_status field values ('processing', 'ready') are clearly documented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with two paragraphs and a bulleted list. It is concise yet comprehensive, with each sentence adding value. The front-loaded purpose statement is immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 optional parameters, no enums, and an output schema, the description covers all necessary aspects: purpose, parameters, usage context (polling, error avoidance), and behavioral details. An agent can correctly select and invoke this tool without additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates excellently. It explains each parameter's purpose: ad_id auto-extracts video, video_id for direct use, account_id enables advideos edge, and access_token is optional. This provides critical context beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get video details and source URL for a Meta ad video creative.' It lists specific outputs (source URL, thumbnail, status, metadata) and distinguishes from sibling tools like get_ad_image by focusing on video-specific data and polling usage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context for when to use the tool, particularly for polling after bulk_upload_ad_videos. It explains the relationship with create_ad_creative and the importance of waiting for 'ready' status. However, it does not explicitly list alternatives or when not to use this tool versus others.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool requests a fixed set of fields and notes the availability of other Meta API fields, setting expectations about data completeness. It also explains access_token fallback behavior. However, it does not mention error handling, pagination, or the exact return envelope, leaving some behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose sentence, a useful note about field limitations, and an Args list. The note about modifying the 'fields' parameter in code is slightly tangential for an AI agent but still relevant. It is not overly verbose and each section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple read-only nature of the tool and the presence of an output schema, the description is reasonably complete. It explains the limited field set, covers both parameters, and notes token caching. However, it lacks explicit guidance on how this tool fits with sibling tools, such as when to prefer get_campaign_details over get_campaigns, which would elevate completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It defines campaign_id as 'Meta Ads campaign ID' and access_token as 'Meta API access token (optional - will use cached token if not provided),' adding real semantic meaning not present in the schema. This explains both the purpose and optionality clearly, though it could add constraints like format validation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb and resource: 'Get detailed information about a specific campaign.' The word 'specific' explicitly distinguishes it from sibling get_campaigns, which would list campaigns. This makes the tool's scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when you need details for a specific campaign) and emphasizes 'specific,' but it does not explicitly name alternatives or state when not to use it. No mention of sibling tools like get_campaigns or update_campaign leaves usage guidance implicit rather than explicit.
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
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| limit | No | ||
| account_id | Yes | ||
| access_token | No | ||
| status_filter | No | ||
| objective_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It describes the default field subset, optional token handling, pagination via 'after', and filtering behavior. It does not mention rate limits or destructive actions, but adequately explains the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections and bullet points, but slightly verbose. Every sentence adds value; however, some details like valid objectives could be condensed. Still, it is clear and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no schema descriptions, no annotations, and presence of an output schema, the description is remarkably complete. It covers all parameters, default behavior, pagination, and filtering nuances, making it fully self-contained for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description adds thorough meaning: explains account_id format, access_token optionality, limit default, status_filter mapping and array handling, objective_filter valid values and examples, and after for pagination. This fully compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves campaigns for a Meta Ads account with optional filtering, using specific verbs and resources. It distinguishes from sibling tools like get_campaign_details, get_ads, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on when to use, explains the default field behavior and the limitation of not exposing all fields. It indirectly suggests when not to use (if all fields needed) but does not explicitly enumerate alternatives.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| creative_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 of behavioral disclosure. It only says 'Get detailed information' without describing side effects, required permissions, rate limits, pagination, or what 'detailed information' includes. The read-only nature is not explicitly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, with a clear first sentence stating the purpose and a structured Args list. Every sentence contributes value with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool, the description covers the basic purpose and parameters, and an output schema exists so return values need not be explained. However, it lacks usage guidance and behavioral transparency, making it only minimally complete for an agent to confidently select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema coverage is 0%, and the description's Args section provides basic meaning for both parameters (Meta Ads creative ID, optional access token). This adds some context beyond the schema types, but it lacks format details or how the access token is used, so it does not fully compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Get' and the resource 'ad creative by its ID', which clearly distinguishes this from sibling tools like get_ad_creatives (likely listing) and update_ad_creative (modification). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for a single creative by ID but provides no explicit comparison to alternatives such as get_ad_creatives or guidance on when not to use this tool. There is no mention of exclusions or alternative tools, so the context is only implied.
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
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | ||
| image_hash | Yes | ||
| access_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries the full burden. It explains what the tool does (retrieve and visualize image), that access_token is optional, and input formats. However, it does not specify return type (binary, URL, base64) or clarify if 'download' implies 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with a clear one-line summary, usage context, and parameter list. The parameter descriptions are concise but informative. A minor redundancy is the note about access_token being optional repeated in the list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should specify the return format (binary, base64, URL). It only says 'ready for direct visual analysis', which is vague. It covers parameters and usage context adequately but lacks output details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description adds value by explaining that account_id accepts 'act_XXXXXXXXX or bare numeric', image_hash is the hash, and access_token is optional with fallback to cached token. This clarifies usage beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get, download, and visualize') and the resource ('a Meta ad image by its hash'). It distinguishes from sibling tool get_ad_image by specifying when to use each.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool ('when you have an image_hash without an ad') and when to use an alternative ('prefer get_ad_image(ad_id)'). Provides concrete examples of image hash sources.
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".
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | No | ||
| after | No | ||
| level | No | ad | |
| limit | No | ||
| compact | No | ||
| adset_id | No | ||
| breakdown | No | ||
| object_id | No | ||
| account_id | No | ||
| time_range | No | maximum | |
| campaign_id | No | ||
| access_token | No | ||
| action_breakdowns | No | ||
| action_attribution_windows | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: fixed field return, auto-handling of platform_position and media_type breakdowns, restrictions on unsupported fields, pagination details, and the impact of the compact parameter. This provides complete transparency for an AI agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized with clear sections and bullet points. While every sentence adds value, the length could be slightly reduced for quicker scanning. However, given the tool's complexity, the structure earns a high score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's high parameter count (14), lack of schema descriptions, and complex behaviors, the description covers all necessary context: parameter details, constraints, auto-behaviors, and even alternative tool recommendations. The output schema exists, so return value explanation is unnecessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% coverage, but the description exhaustively explains each parameter: object_id aliases, time_range presets with examples, breakdown valid values with notes and auto-applied behaviors, level, limit, after, attribution windows, action_breakdowns, and compact. This adds immense meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves performance insights for campaigns, ad sets, ads, or accounts. It distinguishes itself from sibling tools like get_ad_details by focusing on aggregated insights rather than individual entity details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives, such as recommending bulk_get_insights for large result sets or when only specific metrics are needed. It also clarifies limitations like fixed field sets and potential response size issues.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| access_token | No | ||
| interest_list | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses behavioral traits like optional access_token caching, default limit, and output format. However, it does not mention rate limits or side effects, but for a read-only tool it is fairly transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured with a brief purpose followed by clear bullet-like parameter explanations. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers parameters, return, and optional behavior. However, it lacks context about the source of suggestions (e.g., Meta's ad targeting taxonomy) and potential input limitations. Overall fairly complete for a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description fully compensates by providing clear semantics for each parameter: interest_list examples, access_token optionality and caching, limit default. The return value is also described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Get') and resource ('interest suggestions'), and differentiates from siblings like search_interests by specifying it is 'based on existing interests.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when the agent has a list of interests and wants related suggestions, but does not provide explicit when-not-to-use instructions or mention alternatives among siblings like search_interests.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_login_linkA
Get a clickable login link for Meta Ads authentication.
NOTE: This method should only be used if you're using your own Facebook app.
If using Pipeboard authentication (recommended), set the PIPEBOARD_API_TOKEN
environment variable instead (token obtainable via https://pipeboard.co).
Args:
access_token: Meta API access token (optional - will use cached token if not provided)
Returns:
A clickable resource link for Meta authentication
| Name | Required | Description | Default |
|---|---|---|---|
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses caching behavior (optional access_token, will use cached token) and the return type, but does not explicitly state whether generating the link has side effects (e.g., creates a session, expires) or requires specific permissions. This is a moderate gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-sentence purpose, a note, and clear Args/Returns sections. Every sentence adds value and no space is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one optional param), and the description provides usage context, parameter details, and return value. It could mention prerequisites like having a custom Facebook app, but the 'NOTE' section partially covers this. Overall, it is complete for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only provides the parameter name and type, while the description adds meaningful semantics: 'Meta API access token (optional - will use cached token if not provided).' This explains the optionality and fallback behavior, compensating for the schema's minimal coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb and resource: 'Get a clickable login link for Meta Ads authentication.' This unambiguously distinguishes it from the sibling ad-management tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: the method should only be used when using your own Facebook app, and the recommended Pipeboard authentication path is described with a concrete alternative (setting PIPEBOARD_API_TOKEN). This is a model of when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Search through Meta Ads data and return matching record IDs.
It searches across ad accounts, campaigns, ads, pages, and businesses to find relevant records
based on the provided query.
Args:
query: Search query string to find relevant Meta Ads records
access_token: Meta API access token (optional - will use cached token if not provided)
Returns:
JSON response with list of matching record IDs
Example Usage:
search(query="active campaigns")
search(query="account spending")
search(query="facebook ads performance")
search(query="facebook pages")
search(query="user businesses")
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states that the tool returns matching record IDs, searches across multiple entity types, and clarifies that access_token is optional and uses a cached token if not provided. This adds meaningful context beyond the schema, though it does not cover potential limitations like result limits or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a concise intro, Args, Returns, and Example Usage sections. The example usage includes five queries, which is slightly repetitive but useful for illustrating query variety. Overall, it is efficient and not verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, no nested objects) and the presence of an output schema, the description is adequately complete. It covers purpose, parameter semantics, return type, and examples. However, it does not mention pagination, result limits, or error behavior, which are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions (0% coverage), so the description compensates by explaining 'query' as 'Search query string to find relevant Meta Ads records' and 'access_token' as optional with cached-token behavior. This adds clear semantic value beyond the plain schema, though it could provide more detail on query syntax or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Search through Meta Ads data and return matching record IDs.' It specifies the resource (Meta Ads data) and scope (across ad accounts, campaigns, ads, pages, and businesses), effectively distinguishing it from sibling tools like search_pages_by_name or search_ads_archive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for use through examples like 'search(query="active campaigns")' and 'search(query="facebook pages")', implying it is a broad cross-entity search. However, it does not explicitly state when not to use it or mention alternatives, so it earns a 4 rather than a 5.
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=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/ads_archive"
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| fields | No | ad_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_type | No | ALL | |
| access_token | No | ||
| search_terms | Yes | ||
| ad_reached_countries | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure. It mentions that access_token can be omitted to use a cached token, but it lacks details on pagination, rate limits, or the read-only nature of the operation. The description covers only a small portion of potential behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-sentence purpose, an Args breakdown, and a curl example. The example is somewhat verbose and partially redundant with the Args list, but the overall organization is clear and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides a complete invocation recipe including all parameters, a usage example, and defaults. Since an output schema exists, not detailing return values is acceptable. It lacks some context like pagination behavior, but for a moderately simple search tool it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the Args list explains every parameter with examples and formats. For instance, it specifies ad_reached_countries as a list of country codes, ad_type with concrete enum-like examples, and fields as a comma-separated string. 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search the Facebook Ads Library archive,' with a specific verb and resource. This distinguishes it from sibling tools like search_pages_by_name, making it unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an example and parameter list but does not explicitly explain when to use this tool versus alternatives. There is no mention of exclusions or any guidance on choosing among sibling search tools.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It fails to disclose behavioral traits such as authentication requirements (beyond an optional token), rate limits, or side effects. The description is minimal and does not add significant context beyond the obvious.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line purpose, then each parameter with description, and a return value description. Every sentence is informative with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and low schema coverage, the description covers input parameters and return format adequately but lacks context on prerequisites, error scenarios, or how this tool fits among siblings. It is minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains that access_token is optional and defaults to null, with caching behavior noted, and limit has a default of 50 and a description. This adds meaningful value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves 'all available behavior targeting options', with a specific verb ('Get') and resource ('behavior targeting options'). It distinguishes from sibling search tools like search_demographics and search_interests by specifying 'behavior'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lacks explicit guidance on when to use this tool versus alternatives. No 'when not to use' or comparison to similar sibling tools is provided; the name alone differentiates it.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| access_token | No | ||
| demographic_class | No | demographics |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that access_token is optional and that a cached token may be used, which is useful. However, it does not explicitly state that the operation is read-only, nor does it mention pagination behavior, rate limits, or error conditions. The 'Get' verb implies reading, but more explicit behavioral context would be beneficial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with clear Args and Returns sections. Every sentence contributes essential information, with no redundancy or fluff. It is succinct yet comprehensive, fitting the ideal length for a tool with three parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all parameters and the return value structure, which is sufficient for a search-like tool with no nested objects. However, it lacks details on potential pagination (beyond the limit parameter) or rate limiting, which might be relevant for large result sets. An output schema exists, so return type is further clarified, but the absence of explicit edge-case behavior keeps it from being a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by explaining every parameter: access_token's optional nature and fallback behavior, demographic_class with its enumerated options and default, and limit with its default. This exceeds what the schema alone provides and gives clear semantic meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves demographic targeting options with the verb 'Get' and a specific resource. It is unambiguous, but it does not explicitly differentiate itself from sibling tools like search_interests or search_behaviors; the distinctiveness comes from the resource name rather than the description itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as search_interests, search_behaviors, or search_geo_locations. It only describes the function itself, leaving the agent to infer usage context from the name.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| access_token | No | ||
| location_types | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses access_token caching behavior, returns a JSON string with location data, and implies a read-only search operation. While it doesn't mention rate limits or pagination, it provides solid transparency for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description uses a clean, structured Args/Returns format. Every line earns its place, listing parameters and return value without any filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, all parameters, token handling, and return structure. Given the tool's simple search nature and no annotations, this is complete enough for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description fully compensates by explaining each parameter: query, access_token, location_types (including available options), and limit with default. This adds complete semantic meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search for geographic targeting locations' with a specific verb and resource. This distinguishes it from sibling search tools like search_interests and search_behaviors, making the tool's scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates this is for geographical targeting locations, which gives clear context for when to use it. However, it does not explicitly mention alternatives or exclusion criteria, only implying the use case through the resource type.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It describes the function as a search returning JSON with specific fields. However, it does not disclose any required permissions or potential side effects beyond being 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured with a one-line summary, clear Args block, and Returns section. Every sentence provides useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters (1 required) and an output schema, the description covers all essential aspects: parameter explanations, default values, and return format summary. It is complete and self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds significant value: explains query with examples ('baseball', 'cooking'), mentions access_token is optional and uses cached token, and specifies limit default (25) and purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search for interest targeting options by keyword,' specifying a unique verb and resource. Sibling tools like search_behaviors and search_demographics have distinct names, so this tool stands out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (searching for interests by keyword) but does not explicitly mention when not to use it or suggest alternatives. The context is clear, but lacks exclusions.
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
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | ||
| search_term | No | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It discloses some behaviors: access_token can be omitted and 'will use cached token if not provided', and search_term is optional with a defined fallback. However, it does not mention authentication requirements, rate limits, permissions, or response structure beyond 'JSON response with matching pages'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description uses a structured Arg/Returns format that is easy to scan. It is concise with no superfluous content, though the docstring formatting adds some lines. Overall it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with 3 parameters and an output schema, this description is sufficiently informative. It covers all parameters and the return type, plus the account_id format. Minor gaps exist (no pagination, no error behavior), but these are not critical for a straightforward search operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description compensates. It explains all three parameters: account_id with format 'act_XXXXXXXXX', access_token with cached-token fallback, and search_term with behavior when omitted. However, it lacks details on search_term matching semantics (e.g., exact vs substring, case sensitivity).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Search for pages by name within an account.' The verb 'search' and the resource 'pages' with the qualifier 'by name' make the purpose specific and distinguish it from siblings like 'get_account_pages' or 'search_ads_archive'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by explaining optional parameters (e.g., 'returns all pages if not provided'), but it does not explicitly state when to use this tool versus alternatives or mention any exclusions. No direct references to sibling tools.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| ad_id | Yes | ||
| status | No | ||
| bid_amount | No | ||
| creative_id | No | ||
| access_token | No | ||
| tracking_specs | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose mutation behavior. It only hints at side effects via creative_id ('changes the ad's image/content') and notes access_token caching, but omits permission requirements, reversibility, partial vs full update semantics, and potential failures. This is insufficient 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A one-sentence purpose followed by a compact argument list. Information is front-loaded and concise, though a few parameter descriptions (e.g., 'New ad name') are self-evident and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 params) and lack of annotations, the parameter meanings are well covered and an output schema exists to describe return values. However, usage guidance and mutation caveats are absent, making it only partially complete for an agent to safely invoke.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description compensates fully by explaining all 7 parameters, including units (cents for USD), optionality, and behavioral effects (creative changes content). This adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear action verb 'Update' with explicit resource 'an ad' and scope 'new settings'. It distinguishes from sibling update_ad_creative by noting creative_id changes the ad's image/content, and from other update tools by focusing on ad-level fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by naming the resource and update action, and the parameter list provides context for what can be changed. However, it does not explicitly state when to prefer this over sibling tools like update_ad_creative, update_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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| message | No | ||
| headline | No | ||
| messages | No | ||
| headlines | No | ||
| ad_formats | No | ||
| creative_id | Yes | ||
| description | No | ||
| access_token | No | ||
| descriptions | No | ||
| lead_gen_form_id | No | ||
| optimization_type | No | ||
| call_to_action_type | No | ||
| dynamic_creative_spec | No | ||
| creative_features_spec | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the critical API limitation on content fields and notes that many parameters may be rejected. However, it omits potential behaviors like rate limits or authentication requirements beyond the optional access token, which could be relevant for agents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear title, an important note, and an organized Args list. However, it is lengthy and could be more concise by grouping some content fields under a single note to reduce repetition without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (15 parameters, 1 required, no enums), the description covers the key limitations, parameter behaviors, and provides a Returns section. It fully compensates for the lack of schema descriptions and gives enough context for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Since the input schema has no descriptions (0% coverage), the description's Args section provides essential meaning for all 15 parameters. It distinguishes between single and plural variants, notes which ones are likely to be rejected, and explains the usage of ad_formats and creative_features_spec. This goes well beyond the schema's scope.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing ad creative's name or optimization settings, specifying the verb 'update' and the resource 'ad creative'. It distinguishes itself by noting the limitation on content fields, which differentiates it from other tools like create_ad_creative or update_ad.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states that the Meta API does not allow updating content fields, so this tool should only be used for name and optimization settings. It provides an alternative workflow: create a new creative and update the ad reference via update_ad. This gives clear 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.
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": <value>} 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": {"<dim>": {"<value>": <float>, "default": <float>}}}
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)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| status | No | ||
| adset_id | Yes | ||
| end_time | No | ||
| dsa_payor | No | ||
| targeting | No | ||
| bid_amount | No | ||
| start_time | No | ||
| access_token | No | ||
| bid_strategy | No | ||
| daily_budget | No | ||
| bid_adjustments | No | ||
| bid_constraints | No | ||
| dsa_beneficiary | No | ||
| lifetime_budget | No | ||
| attribution_spec | No | ||
| optimization_goal | No | ||
| is_dynamic_creative | No | ||
| multi_advertiser_ads | No | ||
| frequency_control_specs | No | ||
| regional_regulated_categories | No | ||
| regional_regulation_identities | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses many behavioral traits: warnings about immutable fields, deprecated parameters, field requirements, and optional token usage. It notes that certain changes require creating a new ad set. However, it does not mention the return value or side effects like overwriting existing settings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with line breaks separating parameters, and the purpose is front-loaded. Despite its length (22 parameters), each entry is concise and informative. Some repetition could be avoided (e.g., similar warnings for different fields), but overall it is well-organized for a complex tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (22 parameters), the description covers all necessary details including constraints and warnings. An output schema exists but is not referenced; describing the return value (e.g., 'returns the updated ad set') would improve completeness. Nevertheless, the description is thorough and handles edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so excellently by providing detailed semantics for each parameter: examples, valid values, interdependencies, requirements, and warnings. For bid_strategy, it lists all valid options and notes; for bid_constraints, it gives a concrete example. This far exceeds the schema's bare information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Update an ad set with new settings including frequency caps and budgets.' The verb 'Update' and the required adset_id parameter indicate modification of an existing ad set, but it does not explicitly differentiate from sibling tools like create_adset or update_campaign beyond the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides minimal usage guidance. It includes specific warnings (e.g., is_dynamic_creative is immutable, attribution_spec unsupported) but lacks general guidance on when to use this tool versus alternatives like create_adset or update_ad. No explicit exclusions or context for tool selection.
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}]
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| status | No | ||
| bid_cap | No | ||
| objective | No | ||
| spend_cap | No | ||
| campaign_id | Yes | ||
| access_token | No | ||
| bid_strategy | No | ||
| daily_budget | No | ||
| adset_budgets | No | ||
| lifetime_budget | No | ||
| special_ad_categories | No | ||
| use_adset_level_budgets | No | ||
| campaign_budget_optimization | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description fully discloses critical behaviors: campaign cannot use start_time, CBO→ABO migration mechanics with atomicity, deprecation of use_adset_level_budgets, and that objective may not always be updatable. This is exemplary transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a purpose statement, informative note, migration section, and parameter list. While lengthy, every part earns its place. Could be slightly more concise, but clarity is prioritized over brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all parameters, includes migration guidance, deprecation info, and a key constraint. An output schema exists so return values are assumed covered. Missing mention of errors or rate limits, but given complexity this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, so description must explain all 14 parameters. It provides meaningful descriptions for each, including units, examples for adset_budgets, and notes on optional vs required. Some parameters like bid_strategy lack possible values, but overall adds significant value beyond schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update an existing campaign in a Meta Ads account.' This directly conveys the tool's action and resource, distinguishing it from sibling tools like create_campaign or get_campaign_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: start_time note, migration details, and deprecation warning. However, it does not explicitly state when to use this tool versus create or get tools, though the name and first line are sufficient.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | ||
| name | No | ||
| image_url | No | ||
| account_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations present, so description fully handles behavioral disclosure. Explains two methods for image input (file vs image_url), optional access_token, default name behavior, and details return object structure including image_hash and images list. No mention of destructive actions or limits, but behavior is well-covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise with a one-line summary followed by clearly labeled Args and Returns sections. No extraneous information; every sentence contributes to understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters, no annotations, and presence of an output schema (which is compensated by the description's return section), the description is complete. It explains input, output, and ties to other tools (create_ad_creative, get_image_by_hash). No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, yet description adds full meaning for each parameter: account_id format 'act_XXXXXXXXX', file as data URL or base64, image_url as direct URL, access_token optional with fallback, name defaults to filename. This compensates fully 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.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Upload an image to use in Meta Ads creatives.' Identifies the specific resource (image) and action (upload), distinguishing it from retrieval tools like get_ad_image and creative-building tools like create_ad_creative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context on when to use (for ad creatives) and how output image_hash ties into create_ad_creative and get_image_by_hash. Lacks explicit 'when not to use' but implies the tool is for uploading, not for other operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
37 tool updates
v1.0.112- Added
compute_image_crops - Added
create_ad - Added
create_ad_creative - Added
create_adset - Added
create_budget_schedule - Added
create_campaign - Added
estimate_audience_size - Added
fetch - Added
get_account_info - Added
get_account_pages - Added
get_ad_accounts - Added
get_ad_creatives - Added
get_ad_details - Added
get_ad_image - Added
get_ad_video - Added
get_ads - Added
get_adset_details - Added
get_adsets - Added
get_campaign_details - Added
get_campaigns - Added
get_creative_details - Added
get_image_by_hash - Added
get_insights - Added
get_interest_suggestions - Added
get_login_link - Added
search - Added
search_ads_archive - Added
search_behaviors - Added
search_demographics - Added
search_geo_locations - Added
search_interests - Added
search_pages_by_name - Added
update_ad - Added
update_ad_creative - Added
update_adset - Added
update_campaign - Added
upload_ad_image
36 tool updates
v1.0.109- Removed
compute_image_crops - Removed
create_ad - Removed
create_ad_creative - Removed
create_adset - Removed
create_budget_schedule - Removed
create_campaign - Removed
estimate_audience_size - Removed
fetch - Removed
get_account_info - Removed
get_account_pages - Removed
get_ad_accounts - Removed
get_ad_creatives - Removed
get_ad_details - Removed
get_ad_image - Removed
get_ad_video - Removed
get_ads - Removed
get_adset_details - Removed
get_adsets - Removed
get_campaign_details - Removed
get_campaigns - Removed
get_creative_details - Removed
get_insights - Removed
get_interest_suggestions - Removed
get_login_link - Removed
search - Removed
search_ads_archive - Removed
search_behaviors - Removed
search_demographics - Removed
search_geo_locations - Removed
search_interests - Removed
search_pages_by_name - Removed
update_ad - Removed
update_ad_creative - Removed
update_adset - Removed
update_campaign - Removed
upload_ad_image
36 tool updates
v1.0.105- Added
compute_image_crops - Added
create_ad - Added
create_ad_creative - Added
create_adset - Added
create_budget_schedule - Added
create_campaign - Added
estimate_audience_size - Added
fetch - Added
get_account_info - Added
get_account_pages - Added
get_ad_accounts - Added
get_ad_creatives - Added
get_ad_details - Added
get_ad_image - Added
get_ad_video - Added
get_ads - Added
get_adset_details - Added
get_adsets - Added
get_campaign_details - Added
get_campaigns - Added
get_creative_details - Added
get_insights - Added
get_interest_suggestions - Added
get_login_link - Added
search - Added
search_ads_archive - Added
search_behaviors - Added
search_demographics - Added
search_geo_locations - Added
search_interests - Added
search_pages_by_name - Added
update_ad - Added
update_ad_creative - Added
update_adset - Added
update_campaign - Added
upload_ad_image
36 tool updates
v1.0.103- Removed
compute_image_crops - Removed
create_ad - Removed
create_ad_creative - Removed
create_adset - Removed
create_budget_schedule - Removed
create_campaign - Removed
estimate_audience_size - Removed
fetch - Removed
get_account_info - Removed
get_account_pages - Removed
get_ad_accounts - Removed
get_ad_creatives - Removed
get_ad_details - Removed
get_ad_image - Removed
get_ad_video - Removed
get_ads - Removed
get_adset_details - Removed
get_adsets - Removed
get_campaign_details - Removed
get_campaigns - Removed
get_creative_details - Removed
get_insights - Removed
get_interest_suggestions - Removed
get_login_link - Removed
search - Removed
search_ads_archive - Removed
search_behaviors - Removed
search_demographics - Removed
search_geo_locations - Removed
search_interests - Removed
search_pages_by_name - Removed
update_ad - Removed
update_ad_creative - Removed
update_adset - Removed
update_campaign - Removed
upload_ad_image
1 tool update
v1.0.101- Changed
update_campaign1 field changed- added
Input schema / properties / adset_budgetsAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Adset Budgets" +}
1 tool update
v1.0.97- Changed
get_insights1 field changed- added
Input schema / properties / action_breakdownsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Action Breakdowns" +}
3 tool updates
v1.0.94- Changed
create_ad_creative3 fields changed- changed
Input schema / properties / descriptions / anyOfPrevious value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / headlines / anyOfPrevious value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / messages / anyOfPrevious value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
get_account_info1 field changed- added
Input schema / properties / fieldsAdded value: +{ + "default": "", + "title": "Fields", + "type": "string" +}
- Changed
update_ad_creative3 fields changed- changed
Input schema / properties / descriptions / anyOfPrevious value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / headlines / anyOfPrevious value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / messages / anyOfPrevious value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": true, + "type": "object" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } +]
TDQS
Scored across 37 tools
The tools are generally well-named with clear prefixes (get_, create_, update_, search_) and specific object types (campaign, ad, creative, image). Some potential confusion exists between get_ad_creatives and get_ad_image, but the descriptions and parameter hints help disambiguate.
Most tools use a consistent snake_case verb-noun pattern (get_campaigns, create_budget_schedule). Minor inconsistencies exist, such as mixing get_ and search_ (get_account_pages vs. search_ads) and occasional bulk_ prefix variations, but overall the pattern is consistent.
37 tools is a substantial but comprehensive surface for Meta Ads, covering account setup, campaign/creative management, insights, budget schedules, and asset handling. The breadth is justified given the complexity of the Meta Ads API, though it may be overwhelming for simple use cases.
Covers the core ad lifecycle: accounts, pages, campaigns, ad sets, creatives, images, videos, insights, and budget schedules. Missing some advanced features like detailed reporting, async job handling, or audience insights, but the surface is reasonably complete for standard ad management.
Maintenance
Related MCP Connectors
Meta Ads MCP (Facebook + Instagram) - analyze performance, manage budgets, pause campaigns.
60+ Meta Ads tools for AI agents: audits, campaign management, audiences and CAPI tracking.
Read and manage Meta Ads campaigns, ad sets, ads, audiences, pages and Business Manager. You provide
Conversational access to advertising performance data, creative analysis, and campaign insights
Related MCP Servers
- AlicenseCqualityCmaintenanceA local Model Context Protocol server that enables interaction with the Meta Marketing API to manage ad accounts, campaigns, and creatives. It provides tools for targeting research, insight reporting, and campaign management through local MCP clients like Claude Code and Cursor.4051AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceAn MCP server for programmatic management of Meta (Facebook/Instagram) advertising campaigns through AI assistants. It enables campaign creation, ad set management, creative upload, analytics, audience management, and conversion tracking.144 npm4MIT
- AlicenseAqualityCmaintenanceA Model Context Protocol server for the Meta (Facebook) Ads API, providing 54 tools to manage ad accounts, campaigns, ad sets, ads, creatives, media, insights, targeting, and more via the Meta Graph API.35144 npm14MIT
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol server that lets AI assistants run your Meta Ads end to end — launch campaigns, upload creatives, update budgets, and dig into performance through natural conversation. Works across Facebook, Instagram, and other Meta surfaces.Business Source 1.1