meta-ads-mcp
Provides tools for managing Meta Ads accounts, campaigns, adsets, ads, custom audiences, and lead forms, along with performance reporting and A/B testing.
Click on "Install 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-mcpget campaign performance for the last 30 days"
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 Server
A Model Context Protocol (MCP) server built with Python and fastmcp to integrate Meta Ads (Facebook Ads) Graph API directly with AI coding assistants (like Antigravity and Claude Desktop).
This server maps Meta Ads API calls directly to easy-to-use, semantic tools for account discovery, campaign/adset/ad creation, custom audiences, status updates, campaign performance queries, placement breakdowns, demographic breakdowns, video retention analysis, and statistical A/B significance testing.
📋 Table of Contents
Related MCP server: meta-ads-mcp
🛠️ Features & Tool Directory
The server exposes 21 semantic tools categorized into 5 main groups:
1. Account Discovery
list_accounts: Lists all accessible Facebook ad accounts including IDs, names, statuses, currencies, and total spent.
2. Performance Reporting (Level-specific & Segmented)
All reporting tools support outputting results as a Markdown Table (default), CSV, or raw JSON.
get_campaign_performance: Fetch campaign-level insights (impressions, clicks, CTR, spend, CPC, conversions, conversion values).get_adset_performance: Fetch adset-level performance details.get_ad_performance: Fetch ad-level performance and creative insights.get_device_performance: Segment campaign performance by device platform (mobile, desktop, etc.).get_geo_performance: Segment campaign performance by country.get_placement_performance: Segment performance by publisher platform (Facebook/Instagram), placement position (Feeds/Stories), and device platform.get_demographic_performance: Segment campaign performance by age and gender demographics.get_video_performance: Fetch detailed video-specific plays, average watch time, and watched retention milestones (25%, 50%, 75%, 95%, 100% video completions).get_creative_report: Merges ad creative details (title, body, text copy, image thumbnail) with performance metrics.
3. Audiences & Forms Management
list_custom_audiences: List remarketing lists, customer list audiences, and website pixel audiences.create_lead_form: Create Meta Lead Generation Instant Forms on a Facebook Page.
4. Advanced Analytics & A/B Testing
analyze_cross_campaign_performance: Runs cross-campaign health checks, details best/worst performing campaigns, and suggests concrete budget reallocation or creative refresh strategies.analyze_ab_test: Conducts statistical z-score calculations comparing CTR, CVR, and CPA between two campaigns (control vs variation) and indicates statistical significance (90%, 95%, 99% confidence levels).
5. Campaign & Creative Creations
create_campaign: Create new campaigns (supports objectives likeOUTCOME_TRAFFIC,OUTCOME_SALES,OUTCOME_LEADS,OUTCOME_AWARENESS,OUTCOME_ENGAGEMENT,OUTCOME_APP_PROMOTION).create_adset: Create adsets containing schedules, optimization goals, targeting specs, and budgets.create_ad_creative: Prepare ad creative layouts linked to a page.create_ad: Spin up ads under your adsets with your creatives.
6. Status Mutation
update_campaign_status: Activate (ACTIVE) or pause (PAUSED) campaigns.update_adset_status: Activate or pause adsets.update_ad_status: Activate or pause ads.
🔑 Step 1: Prerequisites & Credentials
To use the Meta Ads MCP Server, you need to obtain credentials from the Meta Developer platform.
1.1 Generate a Facebook Access Token
Go to the Meta for Developers Portal.
Create a new App (choose Business or Other depending on your business requirements).
Set up the Marketing API product inside the app dashboard.
Navigate to Marketing API -> Tools.
Select the required permissions:
ads_readads_managementbusiness_management
Click Generate Token and copy the access token.
1.2 Locate Ad Account ID
Navigate to your Meta Ads Manager.
In the account dropdown, copy the 15-digit Ad Account ID (e.g.
123456789012345).
💻 Step 2: Local Installation
Navigate to the project directory:
cd C:\Users\prala\.gemini\antigravity-ide\scratch\meta-ads-mcpCreate a virtual environment:
python -m venv venvInstall required packages:
.\venv\Scripts\pip install -r requirements.txtCreate your
.envcredentials file by creating a file named.envin the root of the project directory with the following contents:# Meta Graph API Credentials META_ADS_ACCESS_TOKEN=EACJye51NVHcBO6... (your token) META_ADS_AD_ACCOUNT_ID=act_1234567890... (your ad account ID, optional)
⚙️ Step 3: Registering with Antigravity IDE
To integrate the Meta Ads MCP Server directly with your Google Antigravity IDE assistant:
Ensure your
.envfile is populated with your active Meta credentials.Execute the registration script inside your virtual environment:
.\venv\Scripts\python configure_antigravity_mcp.pyThis script will read credentials from
.envand configure them inside the Antigravity global configuration file (C:\Users\prala\.gemini\config\mcp_config.json).Restart your Antigravity IDE (or rebuild your agent connections) to load the new server. You will see 21 tools prefixed with
mcp_meta-ads_*registered.
⚙️ Step 4: Registering with Claude Desktop
To use the connector locally with your Claude Desktop client:
Execute the local registration script:
.\venv\Scripts\python configure_local_mcp.pyThe script will write your local
.envand automatically add themeta-adsserver block into your Claude Desktop configuration file (%APPDATA%\Claude\claude_desktop_config.json).Restart your Claude Desktop App to apply the configuration.
🧪 Step 5: Verifying the Connection
You can verify that the server is functional and authenticating correctly with the Meta API:
5.1 Run the Automated Test Client
Run the verification script to confirm all 21 tools are successfully registered in FastMCP:
.\venv\Scripts\python test_client.pyExpected Output:
Importing Meta Ads MCP Server...
Successfully loaded MCP Server!
Server Name: Meta Ads MCP Server
Checking registered MCP tools:
1. Tool name: list_accounts
Description: List all Meta Ad Accounts accessible...
...
21. Tool name: analyze_ab_test
Description: Perform a statistical A/B test analysis...
Total Tools Registered: 21
Dry-run validation PASSED: Server script compiles and registers all endpoints successfully.5.2 Test Active Account Fetching
Verify that your access token is valid and can retrieve real data:
.\venv\Scripts\python -c "import server; print(server.list_accounts())"This should print a JSON array listing all your active ad accounts, their status codes, and currency configurations.
📤 Step 6: Pushing to GitHub
To push the codebase and documentations to your remote GitHub repository:
Go to your GitHub account (
pralayasimha23).Create a new public/private repository named
meta-ads-mcp.Run the automated Git push script:
.\venv\Scripts\python push_to_github.py
This script will initialize Git, commit all code, configure the remote origin, and push the repository to https://github.com/pralayasimha23/meta-ads-mcp.git.
Available Tools
36 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 or video ID.
Supports four creative modes:
- **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.
- **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)
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)
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)
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)
image_hashes: List of image hashes for FLEX creatives (up to 10, cannot be used with image_hash or video_id)
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.
thumbnail_url: Thumbnail image URL for video creatives. Recommended when using video_id.
Meta will auto-generate a thumbnail if not provided.
optimization_type: Optional. Set to "DEGREES_OF_FREEDOM" for FLEX (Advantage+) creatives that
allow Meta to auto-optimize across all asset combinations. Not required for
text-only multi-variant creatives (messages[], headlines[], descriptions[]
work without it). When using DEGREES_OF_FREEDOM, at least one asset field
(image_hashes, messages, headlines, or descriptions) must contain more than
one variant.
NOTE: If asset_customization_rules is also provided, optimization_type
is automatically removed because Meta ignores placement rules for DOF
creatives. The creative will use regular dynamic creative mode instead.
dynamic_creative_spec: Dynamic creative optimization settings
call_to_action_type: Call to action button type (e.g., 'LEARN_MORE', 'SIGN_UP', 'SHOP_NOW',
'CALL_NOW'). 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).
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 passed to Meta in
call_to_action.value.phone_number. 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).
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>"]}}
]
Returns:
JSON response with created creative details
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| caption | No | ||
| message | No | ||
| page_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 | ||
| thumbnail_url | 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 | ||
| asset_customization_rules | 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 and excels. It discloses that optimization_type is automatically removed when asset_customization_rules is provided, that instagram_actor_id is deprecated and sent as instagram_user_id, that thumbnails are auto-generated if omitted, and that ad_formats default conditionally based on media type. These details reveal side effects and API translations beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but generally necessary given 27 parameters and four modes. However, asset_customization_rules appears twice—once as a one-line placeholder and again with a complete placement-rules explanation—which is redundant and structurally confusing. The use of lists and sections otherwise keeps it navigable.
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 large parameter count and four creative modes, the description covers creation prerequisites (upload image/video first), placement-specific crop keys, CTA requirements, and behavior with asset_customization_rules. The output schema exists, so the vague 'Returns' line is acceptable. This is a complete guide for a complex 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 must fully define parameters. It does so exhaustively, providing formats, constraints, and examples for all 27 parameters—for example, phone_number must be E.164, image_crops enumerates the six valid crop keys, and instagram_actor_id must be a string to avoid integer precision loss.
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 clear verb and resource: 'Create a new ad creative using an uploaded image hash or video ID.' It then outlines four distinct creative modes (simple, multi-variant, dynamic, FLEX/DOF), which differentiates this tool from siblings like create_ad and update_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?
It provides detailed mode-selection guidance, such as requiring optimization_type='DEGREES_OF_FREEDOM' for FLEX and noting that text-only multi-variant creatives do not need it. It also lists mutual exclusions ('cannot be used with') and references related tools like compute_image_crops. However, it does not explicitly contrast with create_ad or explain when to use this tool versus creating an ad.
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: POST_ENGAGEMENT, IMPRESSIONS, REACH.
OUTCOME_ENGAGEMENT + On Video: THRUPLAY, TWO_SECOND_CONTINUOUS_VIDEO_VIEWS.
OUTCOME_ENGAGEMENT + On Event: EVENT_RESPONSES, IMPRESSIONS, POST_ENGAGEMENT, REACH.
OUTCOME_ENGAGEMENT + On Page: PAGE_LIKES.
OUTCOME_ENGAGEMENT + Messaging (MESSENGER/WHATSAPP/INSTAGRAM_DIRECT): CONVERSATIONS, LINK_CLICKS.
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
lifetime_budget: Lifetime budget in account currency (in cents) as a string
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}
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: App config for APP_INSTALLS. Required: application_id, object_store_url.
destination_type: Where users go after click. Common values: 'WEBSITE', 'WHATSAPP', 'MESSENGER',
'INSTAGRAM_DIRECT', 'ON_AD', 'APP', 'FACEBOOK', 'SHOP_AUTOMATIC'.
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_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 carries the full behavioral disclosure burden and excels. It flags API v24 default behavior for targeting_automation, immutability of frequency_control_specs (with error code 1815198), invalid bid_strategy values, scheduling semantics for start_time, and DSA/regional compliance requirements—all genuine behavioral traits beyond the parameter list.
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 for a 25-parameter API with heavy interdependencies, every section earns its place. It opens with a one-sentence purpose, then uses a clean 'Args:' list with inline examples and notes, front-loading the most critical parameters like account_id and campaign_id while maintaining scannability.
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 complex API (25 parameters, 5 required, 0% schema coverage), the description covers every parameter with concrete details, examples, and cross-parameter constraints. It also documents key API behaviors (e.g., start_time scheduling, frequency cap immutability, budget/end_time relationship) and relies on the output schema for return values. Minor gaps (e.g., at least one budget required) are present but do not undermine overall 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 description coverage is 0%, and the description compensates richly. It enumerates valid optimization_goal values per campaign objective/destination_type, maps bid_strategy to required bid_amount or bid_constraints (with ROAS example), provides attribution_spec and frequency_control_specs examples, and maps regional regulation categories to identity dictionary keys. This goes far beyond the schema's bare types and 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 opening sentence 'Create a new ad set in a Meta Ads account' uses a specific verb and resource, clearly distinguishing it from sibling tools like create_campaign or create_ad. The 'Args' list reinforces ad-set-specific parameters (campaign_id, optimization_goal, billing_event), leaving 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 gives clear context for creating an ad set, detailing prerequisites and valid parameter combinations in the 'Args' section. It also includes a cross-tool note ('Only ad set start_time controls delivery scheduling. Campaigns do not support start_time') that contrasts with sibling campaign tools, but it does not explicitly state when to prefer this tool over update_adset or other alternatives.
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 campaign in a Meta Ads account.
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, the description carries full behavioral burden. It discloses important traits: campaigns don't support start_time, legacy objectives cause a 400 error, bid strategy implications for child ad sets, and budget placement behavior via use_adset_level_budgets. It also mentions token caching. However, it doesn't describe return values or side effects beyond creation, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized for 15 parameters, with a clear structure: purpose, important note, then a parameter list. It's front-loaded with the primary action. Some entries could be more compact (e.g., repeated 'in account currency (in cents) as a string'), but overall every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 15 parameters and the absence of annotations, the description covers key behavioral warnings, parameter interdependencies, and default values. It doesn't explain the return value (though an output schema exists) or explicitly compare to sibling tools for when to use this vs create_adset, but it's largely complete for a create 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 fully compensates. Every parameter is explained with formats (e.g., act_XXXXXXXXX), allowed values (objective and bid_strategy enums), defaults, and conditional usage (e.g., budgets only used when use_adset_level_budgets=False). This goes well beyond the bare schema and adds critical warnings.
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 campaign in a Meta Ads account,' which clearly states the verb (create) and resource (campaign in a Meta Ads account). It also adds a critical distinction from sibling tools like create_adset and create_ad by specifying it's for campaigns specifically and notes that start_time belongs on ad sets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While it doesn't explicitly say 'use this instead of X,' it provides clear context about campaign creation, including the account_id format and objective requirements. The note about start_time implicitly guides users to create ad sets for scheduling, which offers some usage guidance without naming alternatives directly.
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)
| 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?
No annotations are present, so the description carries the behavioral burden. It discloses the access_token caching behavior, but does not mention permission requirements, error handling, or explicitly confirm read-only semantics beyond the verb 'Get'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the purpose, followed by a compact args section. 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?
This is a simple read tool with an output schema, so the description need not explain return values. It covers the essential purpose and parameters, but misses an explicit link to related list tools or scenarios, making it slightly incomplete.
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 explaining both parameters: account_id format (act_XXXXXXXXX) and access_token optionality with fallback to cached token.
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 ('detailed information about a specific ad account'), distinguishing it from sibling list tools like get_ad_accounts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use when you need details for a single account given its ID. No explicit alternatives or when-not-to-use conditions are provided, so guidance relies on the clear purpose.
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 per page (default: 100)
fetch_all: Whether to follow pagination cursors to fetch all accounts (default: True)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| user_id | No | me | |
| fetch_all | 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 the full burden and delivers well. It explicitly discloses that amount_spent and balance are in currency units (not cents), that access_token is optional and uses a cached token, and that fetch_all controls pagination behavior, which are key behavioral traits beyond the basic functional statement.
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 brief summary sentence followed by a clean Args list. Every sentence provides useful information without fluff. It is appropriately sized for the tool's complexity and front-loaded with the primary 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 tool has four optional parameters and an output schema, the description covers all necessary aspects: the core functionality, parameter meanings, and important behavioral details like currency units and pagination. It is complete for an agent to understand what the tool does and how to 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?
Since the input schema lacks descriptions (0% coverage), the description compensates fully. It explains every parameter: access_token (with caching behavior), user_id (including 'me'), limit (with default), and fetch_all (with pagination semantics). This adds significant meaning beyond the schema's property definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get ad accounts accessible by a user.' This specifies the action (get), the resource (ad accounts), and the scope (accessible by a user). It also distinguishes itself from sibling tools like get_account_info or get_ad_details, which focus on specific accounts or ads.
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: it explains the tool lists ad accounts for a user, with optional token caching and pagination control. However, it does not explicitly contrast with alternatives like get_account_info or get_account_pages, so agents might not know when to choose this over those tools. The guidance is clear but lacks explicit exclusions or alternatives.
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 a Meta ad image in one step. Useful to see the image in the LLM.
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?
There are no annotations, so the description bears the full burden. It discloses cached-token behavior and that the result is ready for visual analysis, but it does not explicitly state this is a read-only operation or describe any limitations/errors. These are useful additions but leave some behavioral context unstated.
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 compact and well-organized with Args and Returns sections. Every sentence contributes: purpose, usage, parameter guidance, and return behavior. No 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?
For a two-parameter tool with no output schema, the description covers purpose, arguments, and return value ('ready for direct visual analysis'). It is sufficient for an agent to invoke the tool, though it could mention error cases or specify the image format.
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 compensates by documenting both arguments. 'ad_id: Meta Ads ad ID' clarifies the identifier, and 'access_token ... will use cached token if not provided' adds the critical optional-token behavior. This goes beyond the bare schema but is not exceptionally detailed.
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 phrase 'Get, download, and visualize a Meta ad image in one step', clearly identifying the resource and action. It differentiates from siblings like get_ad_video and upload_ad_image by emphasizing visual inspection of ad images in the LLM.
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 sentence 'Useful to see the image in the LLM' provides clear when-to-use context for visual verification. It does not explicitly state exclusions or alternatives (e.g., use get_ad_video for videos), but the image-focused wording implicitly distinguishes it from video/upload tools.
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 per page (default: 10)
campaign_id: Optional campaign ID to filter by
adset_id: Optional ad set ID to filter by
after: Pagination cursor to get the next set of results
fetch_all: Whether to follow pagination cursors to fetch all ads (default: False)
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| limit | No | ||
| adset_id | No | ||
| fetch_all | 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?
With no annotations provided, the description carries the burden of behavioral disclosure. It explains that access_token is optional and uses a cached token if not provided, and describes fetch_all and pagination cursor behavior. This adds meaningful context beyond the basic 'get ads' operation, though it does not mention rate limits or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a one-line summary followed by a well-structured list of parameters. Every argument earns its place, especially given the lack of schema descriptions, and the format is easy to scan.
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 7-parameter tool with 0% schema coverage and an output schema present, the description is quite complete: it explains all parameters and key behaviors like pagination and token caching. It omits rate limits and error handling, but given the output schema and the nature of a read-only list operation, 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?
The description provides detailed explanations for all 7 parameters in the Args section, compensating for the 0% schema description coverage. It clarifies the account_id format, access_token caching behavior, limit default, filter semantics, pagination cursor, and fetch_all purpose, adding significant meaning beyond the input 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,' which identifies the specific verb (get), resource (ads), and scope (Meta Ads account). This distinguishes it from siblings like get_ad_details (single ad) and get_adsets (ad sets), providing a clear 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 provides clear context for when to use the tool: retrieving ads with optional filters by campaign, ad set, pagination, and fetch_all. It does not explicitly name alternatives or exclusions, but the filtering and pagination context make usage intuitive.
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 per page (default: 10)
campaign_id: Optional campaign ID to filter by
fetch_all: Whether to follow pagination cursors to fetch all ad sets (default: False)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| fetch_all | 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 the transparency burden. It discloses meaningful behaviors: access_token caching fallback, pagination with per-page limit, and fetch_all for following cursors. This goes beyond the basic 'Get' verb and provides useful operational details.
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: one clear purpose sentence followed by a focused parameter list. Every line adds value, no fluff, and the structure is easy to scan.
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 moderate complexity (5 params, output schema present, no annotations), the description covers purpose, all parameters, pagination, and auth fallback. It lacks explicit error conditions or rate-limit notes, but those are not critical for a listing tool with an 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?
The schema has 0% description coverage, so the description's Args section fully compensates by explaining each parameter: account_id format (act_XXXXXXXXX), access_token optionality/caching, limit default, campaign_id filter, and fetch_all pagination behavior. This adds substantial meaning beyond the schema's bare titles and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the action ('Get'), the resource ('ad sets'), and the scope ('for a Meta Ads account with optional filtering by campaign'). It is clear and distinct from siblings like get_ads or get_adset_details, though it does not explicitly name alternatives.
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 conveys when to use the tool (to retrieve ad sets, optionally filtered by campaign) via the main sentence and parameter details. It does not explicitly contrast with sibling tools or state exclusions, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_videoA
Get video details and source URL for a Meta ad video creative. Returns the video source URL
(direct download link), thumbnail URL, and metadata (title, description, duration).
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 the transparency burden. It discloses the return payload, explains error behaviors (error 100/33 and #10) and the role of account_id in bypassing them, and mentions token caching. It does not explicitly state it is read-only, but the 'get' verb and absence of side effects imply it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-sentence summary, followed by usage guidance, then a compact args list. No redundancy; every detail earns its place, including the error mitigation note.
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 moderate complexity (4 optional parameters, two alternative lookup paths), the description fully covers the functionality, parameter selection, and error context. The presence of an output schema reduces the need to describe return structure, but the description still lists the key return fields.
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 richly. Each parameter is explained with purpose, examples (account_id format), alternatives (ad_id vs video_id), and optionality (access_token falls back to cached token). This exceeds what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and resource ('video details and source URL for a Meta ad video creative'), clearly distinguishing it from sibling tools like get_ad_image or get_ad_creatives. It precisely names the returned data (source URL, thumbnail URL, metadata).
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 guidance is provided on using ad_id vs video_id, including a reference to get_ad_creatives for the video_id path. It strongly recommends account_id with a clear reason (enables advideos edge, avoids specific errors), which is valuable in choosing the right invocation.
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 per page (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
fetch_all: Whether to follow pagination cursors to fetch all campaigns (default: False)
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| limit | No | ||
| fetch_all | 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?
No annotations are provided, so the description carries the full burden. It discloses that the API returns a subset of fields by default, that certain fields are not exposed, that status_filter maps to effective_status with JSON formatting handled, and that pagination is controlled via 'after' and 'fetch_all'. This adds meaningful behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear summary, followed by a useful note about API fields, then a structured Args list. It is a bit lengthy but every sentence contributes meaningful detail, so 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?
With 7 parameters, pagination, and filtering, the description covers the main usage thoroughly. It mentions field limitations, filtering behavior, and pagination. An output schema exists, so return values are covered elsewhere. Minor gaps include error handling and rate limits, but overall it's adequate for a listing tool of this 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?
Schema description coverage is 0%, so the description compensates fully. It explains each parameter in the Args section, including valid values, examples, defaults, and the distinction between status and objective filters. This exceeds what the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Get campaigns for a Meta Ads account with optional filtering' with a clear verb and resource. The plural 'campaigns' and optional filters distinguish it from sibling tools like get_campaign_details (which targets a single 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 implies usage for listing campaigns with filters, but does not explicitly mention when to choose this over alternatives like get_campaign_details. The 'optional filtering' and parameter details suggest context, but there is no explicit exclusion or alternative naming.
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_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
Creative Assets: ad_format_asset, body_asset, call_to_action_asset, description_asset,
image_asset, link_url_asset, title_asset, video_asset, media_asset_url,
media_creator, media_destination_url, media_format, media_origin_url,
media_text_content, media_type, creative_relaxation_asset_type,
flexible_format_asset_type, gen_ai_asset_type
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.
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_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 carries the full burden and does so thoroughly. It discloses that the tool 'always returns a fixed set of fields' and cannot filter, warns about 1-2MB+ responses, explains the compact mode behavior, and clarifies how action_attribution_windows affects output. Access token caching and pagination are also 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?
The description is long but well-structured with an Args section and a Note section. The extensive breakdown list and preset enumeration are necessary because there are no enums in the schema. A slight trim could improve conciseness, but every component 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 13 parameters, no enums, no annotations, and a potentially huge response payload, the description is exceptionally complete. It covers all parameter semantics, provides examples, warns about response size, and points to an alternative tool. No critical information is missing.
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 compensates fully by explaining every parameter with detailed semantics. It provides alias relationships, the full list of time_range presets, all breakdown categories and values, level options, pagination cursor usage, and compact behavior. This far exceeds what the schema offers.
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 verb and resource: 'Get performance insights for a campaign, ad set, ad or account.' This clearly differentiates it from sibling tools that handle creation/updating/searching, and it explicitly covers all object levels.
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 gives explicit guidance on when to use this tool and when to prefer an alternative: 'For large result sets (50+ rows) ... consider using bulk_get_insights with compact=true and the fields parameter.' It also details pagination and response-size caveats, making the usage context unmistakable.
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 the burden of disclosure. It explains the optional access_token behavior ('will use cached token if not provided'), the default limit, and the exact return structure (JSON string with id, name, audience_size, description). This goes beyond basic expectations, though it omits details about error handling 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 clear Args and Returns sections, front-loaded with a one-sentence purpose. Every piece of information is useful and directly actionable, 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?
The description covers all three parameters, the return format, and operational nuances (token caching, default limit). Combined with the output schema, an agent has everything needed to select and invoke 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?
The schema has 0% coverage, but the description's Args section thoroughly explains each parameter, including examples for interest_list, the optional nature of access_token, and the default for limit. This fully compensates for the schema gap and adds practical guidance.
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 interest suggestions based on existing interests.' This uses a specific verb and resource, distinguishing it from siblings like 'search_interests' by emphasizing it operates on a provided list of interests rather than a free-form 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 ('based on existing interests') and implicitly differentiates it from search-like tools. However, it doesn't explicitly state situations to avoid or name alternative tools, so it falls short of full guidance.
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?
With no annotations provided, the description bears the full burden of behavioral disclosure. It discloses the optional access_token and cached token behavior, plus the return format. However, it does not explicitly state safety characteristics (e.g., read-only) and the phrase 'Get all' conflicts with the limit parameter, leaving some ambiguity.
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 summary, clear args list with descriptions, and a returns line. No unnecessary words or repetition.
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 essential aspects: purpose, both parameters, and return format. The 'Get all' vs limit conflict is a minor gap, and pagination behavior is not addressed, but for a simple tool with two optional parameters, it 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?
Schema description coverage is 0%, so the description fully compensates. It explains access_token as an optional Meta API token with cached fallback, and limit as the maximum number of results with a default of 50, adding meaningful context beyond the schema's type/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 'Get all available behavior targeting options,' using a specific verb ('get') and resource ('behavior targeting options'). This distinguishes it from sibling tools like search_interests, search_demographics, and search_geo_locations, which target different audience attributes.
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 explicit guidance on when to use this tool versus alternatives. Usage is only implied by the tool name and the description's focus on behavior targeting, but it does not mention alternatives or exclusion criteria.
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?
With no annotations, the description carries the burden. It discloses that the access token is optional and a cached token is used, and describes the return format with specific fields. It does not explicitly state whether the operation is read-only or mention error conditions, but the search verb implies non-destructive behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with Args and Returns sections, front-loads the core purpose in one sentence, and every line adds necessary information without fluff.
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 three parameters, the description covers the purpose, parameters, return format, and auth context. It lacks explicit pagination details but is otherwise complete enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema lacks parameter descriptions, but the tool description compensates fully: it defines the query with examples, explains the access_token optional behavior, and specifies the limit's default. This adds meaningful semantics 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 starts with a specific verb and resource: 'Search for interest targeting options by keyword.' This clearly distinguishes it from sibling tools like search_behaviors and search_demographics, which target different categories.
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 keyword-based interest searches but does not explicitly explain when to prefer this tool over alternatives like search_behaviors or search_geo_locations. It offers no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_pages_by_nameA
Search for pages by name within an account.
Args:
account_id: Meta Ads account ID (format: act_XXXXXXXXX)
access_token: Meta API access token (optional - will use cached token if not provided)
search_term: Search term to find pages by name (optional - returns all pages if not provided)
Returns:
JSON response with matching pages
| 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?
No annotations are provided, so the description carries the transparency burden. It discloses the Meta API limitation that content fields are not updatable and lists which parameters may be rejected. It could be more precise about actual rejection behavior but otherwise gives strong context 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?
The description is front-loaded with the core purpose and the critical limitation, then follows with a structured Args list. It is somewhat long, but the length is justified by 15 parameters and the need to warn about API restrictions.
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 15 parameters, no annotations, and low schema coverage, the description covers the purpose, limitations, parameter semantics, and alternative workflow. The presence of an output schema means return values do not need further description. This is comprehensive for the tool's 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?
Schema description coverage is 0%, yet the description details all 15 parameters with usage notes, including that name is 'most reliable', which fields 'may be rejected', and how to use optimization_type, ad_formats, and creative_features_spec. This significantly compensates for the empty 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?
Description clearly states 'Update an existing ad creative's name or optimization settings', specifying the exact action and scope. It distinguishes itself from sibling tools like create_ad_creative and update_ad by explicitly noting content changes require creating a new creative and updating the ad to reference it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: updating name or optimization settings only. It also states when NOT to use it (content updates) and names the alternative workflow: 'create a new creative ... and update the ad to reference the new creative via update_ad'.
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}
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_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 provided, the description carries full behavioral burden and excels: it discloses that is_dynamic_creative is immutable post-creation and silently ignored by the API, that attribution_spec is no longer supported (error 1504040), notes required fields per strategy, and warns about placement of multi_advertiser_ads. These are substantial behavioral disclosures.
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?
Though lengthy, the description is efficiently organized as an Args list with each parameter explained in one or two lines. Every sentence adds critical information (warnings, valid values, examples), and there is no redundant fluff. The length is justified by the complexity of 21 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?
Given the high parameter count and no annotation support, the description covers all necessary contextual aspects: parameter dependencies, invalid values, side effects, and compliance requirements. It even explains scheduling behavior with start_time and effective_status. The presence of an output schema means return values need not be explained, so completeness is high.
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 does: every parameter gets meaningful explanation, including valid values, examples (e.g., frequency_control_specs), units (cents), conditions (bid_constraints for MIN_ROAS), and lifecycle caveats. This goes far 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 uses a specific verb+resource construction: 'Update an ad set with new settings including frequency caps and budgets.' This clearly identifies the tool's function and distinguishes it from sibling tools like update_ad or update_campaign, which target different resources.
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 updating an ad set and includes parameter-specific recommendations (e.g., 'LOWEST_COST_WITHOUT_CAP (recommended)'), but it does not explicitly mention alternatives or when not to use this tool. It lacks explicit guidance like 'use create_adset for new ad sets' or 'prefer update_campaign for campaign-level changes.'
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.
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) as a string.
Set to empty string "" to remove the daily budget.
lifetime_budget: New lifetime budget in account currency (in cents) as a string.
Set to empty string "" to remove the lifetime budget.
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: If True, removes campaign-level budgets to switch to ad set level budgets
| 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 | ||
| 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?
With no annotations, the description carries the burden. It discloses important nuances: start_time not supported on campaigns, objective may not always be updatable, budgets can be removed by empty string, and use_adset_level_budgets removes campaign budgets. These are valuable behavioral insights beyond basic function.
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 front-loaded with the purpose, followed by a useful note and a compact argument list. Every line conveys needed information with no fluff.
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 13 parameters with semantic details and caveats, making it quite complete for a complex tool. It could mention mutual exclusivity of daily vs lifetime budgets, but the output schema presumably handles return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides meaning for all parameters, but several are described as 'as a string' (daily_budget, lifetime_budget, bid_cap, spend_cap) while the input schema declares them as integers. It also instructs setting them to empty string to remove, which contradicts the integer type. This could mislead the agent into incorrect invocation.
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' with a specific verb and resource, distinguishing it from sibling tools like update_adset and update_ad. The note about start_time further clarifies the tool's 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 makes it clear this is for updating campaigns, and the note 'Campaigns do not support start_time... set start_time on the ad set instead' provides an explicit when-not with a pointer to the correct level. It does not name alternative tools explicitly, but the context is clear.
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 response with image details including hash for creative creation
| 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?
With no annotations provided, the description carries the full burden. It discloses input formats (data URL/base64/file URL), optional token behavior with caching fallback, and the return format including the hash for creative creation. This goes beyond basic visibility, though it doesn't mention rate limits or conflicts when both file and image_url are provided.
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, using a clear Args/Returns format. The example data URL is valuable without being verbose. 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?
The description covers all parameters and the return's purpose, and an output schema exists. However, it doesn't specify the relationship between 'file' and 'image_url' (whether at least one is required, or what happens if both are provided). This is a notable gap for a tool whose sole purpose is uploading an image.
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 does so thoroughly: account_id format (act_XXXXXXXXX), access_token caching behavior, file data URL/base64 formats with example, image_url semantics, and name default. Each parameter gets meaningful guidance beyond the schema's bare 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 gives a specific verb (upload), resource (image), and purpose (use in Meta Ads creatives), distinguishing it from read-oriented sibling tools like get_ad_image and get_ad_video.
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 noting the return includes 'hash for creative creation,' situating it in the creative-creation workflow. However, it does not explicitly name alternatives or state when not to use it, so usage guidance is clear but not fully explicit.
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. Dates show when Glama detected each change.
36 tool updates
v1.0.77- First observed
compute_image_crops - First observed
create_ad - First observed
create_ad_creative - First observed
create_adset - First observed
create_budget_schedule - First observed
create_campaign - First observed
estimate_audience_size - First observed
fetch - First observed
get_account_info - First observed
get_account_pages - First observed
get_ad_accounts - First observed
get_ad_creatives - First observed
get_ad_details - First observed
get_ad_image - First observed
get_ad_video - First observed
get_ads - First observed
get_adset_details - First observed
get_adsets - First observed
get_campaign_details - First observed
get_campaigns - First observed
get_creative_details - First observed
get_insights - First observed
get_interest_suggestions - First observed
get_login_link - First observed
search - First observed
search_ads_archive - First observed
search_behaviors - First observed
search_demographics - First observed
search_geo_locations - First observed
search_interests - First observed
search_pages_by_name - First observed
update_ad - First observed
update_ad_creative - First observed
update_adset - First observed
update_campaign - First observed
upload_ad_image
TDQS
Most tools target distinct resources and actions (e.g., get_campaigns vs get_campaign_details), but a few pairs like get_ad_creatives vs get_creative_details (one takes ad_id, the other creative_id) and search vs search_ads_archive could cause misselection if not read carefully. The detailed descriptions largely clear up these boundaries.
The vast majority of tools follow a verb_noun snake_case pattern (get_campaigns, create_adset, update_ad), but there are minor deviations: bare verbs 'search' and 'fetch', 'get_login_link' with three components, and inconsistent use of 'details' vs 'info' (get_ad_details vs get_account_info). Overall the pattern is predictable.
With 36 tools, this server is well beyond the 25-tool threshold that the rubric considers too many. While the Meta Ads API is broad, this large surface would be heavy for an agent to navigate and many tools could potentially be consolidated.
The core lifecycle for campaigns, ad sets, ads, and creatives is covered (create/read/update with status archiving serving as the delete mechanism). Minor gaps include no direct listing of creatives by account and a reference to a non-existent bulk_get_insights tool in get_insights, but agents can work around these via existing tools.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Meta Ads MCP server with 47 tools for campaigns, creatives, audiences, and insights.
Google Ads, Meta Ads & GA4 MCP server - 250+ tools for campaigns, creatives, audiences & reports.
Google Ads MCP server — manage campaigns, keywords, and metrics.
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
Related MCP Servers
- 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.3984MIT
- AlicenseAqualityDmaintenanceMCP server to manage Meta Ads (Facebook/Instagram) campaigns, ad sets, insights, and audiences from Claude Code using natural language.913MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for Meta/Facebook Marketing API allowing you to view and manage ad accounts, campaigns, ad sets, ads, and creatives, as well as fetch insights and upload ad images.MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for Meta Ads providing 30 tools for account discovery, campaign management, targeting research, and insights. Designed with LLM-friendly outputs and productivity features like cloning and bulk operations.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/pralayasimha23/meta-ads-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server