Meta Ads MCP Server
Integrates with Facebook Pages and the Facebook Ads API to manage pages, ad campaigns, ad sets, ads, and more through the same Meta Graph API.
Provides tools to manage Meta advertising accounts, campaigns, ad sets, ads, creatives, media, insights, targeting catalog, budget schedules, and activity logs via the Meta Graph API v22.0.
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 MCP Servershow me my campaign insights for last month"
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
Disclaimer: This is an unofficial third-party tool and is not associated with, endorsed by, or affiliated with Meta in any way. This project is maintained independently and uses Meta's public APIs in accordance with their Terms of Service. Meta, Facebook, Instagram, and other Meta brand names are trademarks of their respective owners.
Table of Contents
Related MCP server: ArmaVita Meta Ads MCP
Features
Category | What it does |
Accounts | List ad accounts, get account details |
Campaigns | Get / list / create / update / pause / resume / delete |
Ad Sets | Get / list / batch-fetch / create / update / pause / resume / delete |
Ads | Get / list / create / update / pause / resume / delete |
Creatives | Get / list, create + update, compute image crops |
Media | List ad images, upload images, lookup by hash, get ad previews and videos |
Insights | Performance analytics at account, campaign, ad set, and ad level |
Targeting | Search interests / behaviors / demographics / geo, audience size estimation |
Pages | List Facebook Pages reachable from the token, search by name |
Budget Schedules | Schedule temporary budget bumps over a time window |
Activities | Change history log for ad accounts and ad sets |
Pagination | Utility tool to fetch subsequent pages of results |
All mutation tools (create / update / delete / pause / resume / upload / budget schedule) are off by default and only register when you opt in — see Enabling Write Tools.
Requirements
Node.js >= 18
A Meta User Access Token with the right permissions for what you plan to do — see below.
Installation
# From npm
npx meta-ads-mcp-server --access-token YOUR_META_ACCESS_TOKEN
# From source
git clone https://github.com/hashcott/meta-ads-mcp.git
cd meta-ads-mcp
npm install
npm run build
node dist/index.js --access-token YOUR_META_ACCESS_TOKENObtaining a Meta Access Token
This server uses the Meta Marketing API. You need an access token attached to a Meta App that has the right permissions.
Quick option — Graph API Explorer (read-only experiments)
Open the Graph API Explorer.
Pick your Meta App from the top-right dropdown (create one at developers.facebook.com/apps if you don't have any — choose type "Business").
Click Generate Access Token, then under Permissions add at minimum:
ads_read— for all the read tools.ads_management— required for any write tool (create / update / delete / pause / resume / upload / budget schedule).business_management— recommended if you operate via Business Manager.pages_show_list,pages_read_engagement— required for the Pages tools.
Copy the generated token. This is a short-lived token (~1 hour) — fine for testing.
Production option — long-lived User token
Short-lived tokens from the Explorer expire in about an hour. Exchange yours for a 60-day token:
curl -G "https://graph.facebook.com/v22.0/oauth/access_token" \
--data-urlencode "grant_type=fb_exchange_token" \
--data-urlencode "client_id=YOUR_APP_ID" \
--data-urlencode "client_secret=YOUR_APP_SECRET" \
--data-urlencode "fb_exchange_token=YOUR_SHORT_LIVED_TOKEN"Response contains "access_token": "..." — that token is valid for ~60 days. Refresh it the same way before it expires, or build a full OAuth flow if you need permanent access.
Production option — System User token (recommended for servers)
For unattended production use (no expiry), generate a System User token in Business Manager:
Go to Business Manager → Business Settings → Users → System Users.
Create a system user (or use an existing one), assign the relevant ad account, and grant
ads_read/ads_management.Click Generate New Token → pick your Meta App → select the same permissions → Never for expiration.
System User tokens don't expire and are ideal for backend deployments.
Verifying your token
curl "https://graph.facebook.com/v22.0/me?access_token=YOUR_TOKEN"Should return your user/system-user object. If it returns an error, double-check the permissions and that the token isn't expired.
Authentication
Pass your Meta access token using either method:
CLI argument (recommended for Cursor / Claude Desktop):
node dist/index.js --access-token YOUR_META_ACCESS_TOKENEnvironment variable:
export META_ADS_ACCESS_TOKEN=YOUR_META_ACCESS_TOKEN
node dist/index.jsThe token is held only in memory of the running process — it is never written to disk by this server.
Enabling Write Tools
By default the server registers only the 35 read tools — create / update / delete / pause / resume / upload / budget-schedule tools are not exposed. This is intentional: a mistakenly-issued meta_ads_delete_campaign can permanently remove campaigns and their ads.
To opt in, set:
META_ADS_ENABLE_WRITE_TOOLS=trueAccepted truthy values: true, 1, yes, on (case-insensitive). Anything else (or unset) keeps writes off.
When enabled, the server logs a one-line warning to stderr at startup:
[meta-ads-mcp] WARNING: META_ADS_ENABLE_WRITE_TOOLS is on — create/update/delete/pause/resume tools are EXPOSED. These can permanently delete campaigns/ad sets/ads or change live delivery.Your access token also needs the ads_management permission for the writes to succeed.
Example Cursor / Claude Desktop configuration with writes enabled:
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "meta-ads-mcp-server"],
"env": {
"META_ADS_ACCESS_TOKEN": "YOUR_META_ACCESS_TOKEN",
"META_ADS_ENABLE_WRITE_TOOLS": "true"
}
}
}
}Transport Modes
Mode | Use case | How to enable |
| Cursor, Claude Desktop, local tools | No configuration needed |
| Claude.ai remote connectors, multi-client setups | Set |
Cursor / Claude Desktop Setup
Add one of the following to your MCP client configuration file:
Via npx (recommended — no local install required):
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "meta-ads-mcp-server", "--access-token", "YOUR_META_ACCESS_TOKEN"]
}
}
}Via local build:
{
"mcpServers": {
"meta-ads": {
"command": "node",
"args": ["/path/to/meta-ads-mcp/dist/index.js", "--access-token", "YOUR_META_ACCESS_TOKEN"]
}
}
}Via environment variable (and opt-in writes):
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "meta-ads-mcp-server"],
"env": {
"META_ADS_ACCESS_TOKEN": "YOUR_META_ACCESS_TOKEN",
"META_ADS_ENABLE_WRITE_TOOLS": "true"
}
}
}
}Remote HTTP Server
Run as a persistent HTTP server for use with Claude.ai custom connectors or any remote MCP client.
# Start on default port 3000
TRANSPORT=http META_ADS_ACCESS_TOKEN=YOUR_TOKEN node dist/index.js
# Start on a custom port, writes enabled
TRANSPORT=http \
META_ADS_ACCESS_TOKEN=YOUR_TOKEN \
META_ADS_ENABLE_WRITE_TOOLS=true \
PORT=8080 \
node dist/index.jsEndpoints:
POST /mcp— MCP protocol endpointGET /health— Health check ({"status":"ok"})
Adding to Claude.ai
Go to Settings → Connectors → Add custom connector
Enter your server URL:
https://your-domain.com/mcpClick Add
Local testing with ngrok
# Terminal 1 — start the server
TRANSPORT=http META_ADS_ACCESS_TOKEN=YOUR_TOKEN PORT=8080 node dist/index.js
# Terminal 2 — expose publicly
ngrok http 8080Use the generated HTTPS URL (e.g. https://xxxx.ngrok-free.app/mcp) as your connector URL.
Deploying to cloud platforms
Set the following environment variables on your hosting provider (Railway, Render, Fly.io, etc.):
Variable | Value |
|
|
| Your Meta access token |
|
|
| Assigned automatically by the platform |
Available Tools
Legend: 🔍 read • ✏️ write (gated by META_ADS_ENABLE_WRITE_TOOLS) • 🛠️ pure utility (no API call).
Accounts
Tool | Type | Description |
| 🔍 | List all ad accounts accessible with your token |
| 🔍 | Get detailed information for a specific ad account |
Campaigns
Tool | Type | Description |
| 🔍 | Fetch a specific campaign by its ID |
| 🔍 | List campaigns within an ad account, with filters and pagination |
| ✏️ | Create a new ODAX campaign (CBO or ABO) |
| ✏️ | Update name/status/budget/bid; supports CBO → ABO migration via |
| ✏️ | Permanently delete a campaign and its ad sets/ads |
| ✏️ | Convenience: set status to |
| ✏️ | Convenience: set status to |
meta_ads_create_campaign inputs:
act_id(string) — Ad account ID, formatact_XXXXXXXXX.name(string) — Campaign name.objective(enum) — ODAX outcome-based objective:OUTCOME_AWARENESS,OUTCOME_TRAFFIC,OUTCOME_ENGAGEMENT,OUTCOME_LEADS,OUTCOME_SALES,OUTCOME_APP_PROMOTION.Legacy objectives (
BRAND_AWARENESS,LINK_CLICKS,CONVERSIONS,APP_INSTALLS, …) are not accepted by Meta v22+ and will return HTTP 400.
status(defaultPAUSED),special_ad_categories(default[])daily_budget/lifetime_budget(cents) — omit both whenuse_adset_level_budgets=true.bid_strategy—LOWEST_COST_WITHOUT_CAP(default),LOWEST_COST_WITH_BID_CAP,COST_CAP,LOWEST_COST_WITH_MIN_ROAS. Bid-cap strategies requirebid_amounton every child ad set.bid_cap,spend_cap,campaign_budget_optimization,use_adset_level_budgets,ab_test_control_setups,buying_type.
{
"act_id": "act_123456789012345",
"name": "2026 - Spring Sale - Awareness",
"objective": "OUTCOME_AWARENESS",
"special_ad_categories": [],
"status": "PAUSED",
"bid_strategy": "LOWEST_COST_WITHOUT_CAP",
"daily_budget": 10000
}Ad Sets
Tool | Type | Description |
| 🔍 | Fetch a single ad set by its ID |
| 🔍 | Batch fetch multiple ad sets |
| 🔍 | List ad sets in an ad account |
| 🔍 | List ad sets within a campaign |
| ✏️ | Create a new ad set under a campaign |
| ✏️ | Update an ad set's fields (note: |
| ✏️ | Permanently delete an ad set |
| ✏️ | Set status to |
| ✏️ | Set status to |
meta_ads_create_adset highlights:
Required:
act_id,campaign_id,name,optimization_goal,billing_event.targeting(object) — full targeting spec; remembertargeting_automation.advantage_audiencedefaults to0on Meta v24+ — set it explicitly if you want Advantage+ Audience.bid_amount— required forLOWEST_COST_WITH_BID_CAP/COST_CAP.bid_constraints— required forLOWEST_COST_WITH_MIN_ROAS, e.g.,{"roas_average_floor": 20000}for a 2.0× ROAS floor.dsa_beneficiary/dsa_payor— required for EU-targeted ad sets.promoted_object— required forAPP_INSTALLS.frequency_control_specs— MUST be set at creation; Meta makes it immutable afterward.regional_regulated_categories/regional_regulation_identities— Taiwan / Australia / Singapore / India regulated verticals.
Ads
Tool | Type | Description |
| 🔍 | Fetch a single ad by ID |
| 🔍 | List ads in an ad account |
| 🔍 | List ads within a campaign |
| 🔍 | List ads within an ad set |
| ✏️ | Create a new ad referencing an existing creative |
| ✏️ | Update name / status / bid / tracking specs / creative reference |
| ✏️ | Permanently delete an ad |
| ✏️ | Set status to |
| ✏️ | Set status to |
ℹ️ Swapping
creative_idon a FLEX ad can fail witherror_subcode 3858355if the new creative'sasset_feed_specimages don't match itsobject_story_spec. In that case, create a new ad with the new creative and pause the old one (you lose social proof but the ad runs).
Creatives
Tool | Type | Description |
| 🔍 | Fetch one creative |
| 🔍 | List creatives attached to an ad |
| 🔍 | List creatives in an ad account |
| 🛠️ | Compute centered crop boxes for the 6 Meta-accepted aspect ratios (no API call) |
| ✏️ | Create a creative — 3 simple modes plus full |
| ✏️ | Update |
meta_ads_create_ad_creative — three common modes:
Promote an existing post: pass only
object_story_idin the form{page_id}_{post_id}.Single-image link ad:
page_id+image_hash+link_url+message+ optionalheadline,description,call_to_action_type.Single-video ad:
page_id+video_id+link_url+message+ optionalheadline,call_to_action_type,thumbnail_url.
For advanced layouts (FLEX/DOF, Placement Asset Customization, Dynamic Creative, multi-headline, lead-gen forms, branded content, image crops), pass a fully composed object_story_spec and/or asset_feed_spec — those take precedence over the simple-mode auto-construction.
Media
Tool | Type | Description |
| 🔍 | List image assets in an ad account |
| 🔍 | Single-image lookup by hash (URL + dimensions) |
| 🔍 | Generate rendered previews of an ad across placements |
| 🔍 | Video details (source URL, thumbnails, length) by |
| ✏️ | Upload an image to an account's ad images library and get back its |
meta_ads_upload_ad_image accepts exactly one of:
file— a data URL (data:image/png;base64,iVBORw0KG...) or a raw base64 string.image_url— a public URL; the server downloads the bytes and uploads them.
Returns the image_hash you then pass to meta_ads_create_ad_creative.
Insights
Tool | Type | Description |
| 🔍 | Performance metrics at the account level |
| 🔍 | Performance metrics for a specific campaign |
| 🔍 | Performance metrics for a specific ad set |
| 🔍 | Performance metrics for a specific ad |
All four accept the same option surface: fields, date_preset, time_range, time_ranges, time_increment, level, action_attribution_windows, action_breakdowns, breakdowns, filtering, sort, pagination, and locale.
Time-range precedence: time_ranges > time_range > since/until > date_preset.
Targeting Catalog
Tool | Type | Description |
| 🔍 | Search Meta's interest catalog by keyword |
| 🔍 | Get related interests from a seed list |
| 🔍 | List available behavior targeting options |
| 🔍 | List demographic options (demographics / life_events / industries / income / family_statuses / user_device / user_os) |
| 🔍 | Search countries / regions / cities / zips / geo_markets / electoral_districts |
| 🔍 | Estimate reach for a targeting spec via |
Pages
Tool | Type | Description |
| 🔍 | List Facebook Pages reachable from the access token ( |
| 🔍 | Substring filter over the token's pages (client-side — Meta does not expose a server-side name filter) |
The returned page_id values are the ones you pass to meta_ads_create_ad_creative.
Budget Schedules
Tool | Type | Description |
| ✏️ | Schedule a temporary budget bump for a campaign over a Unix-timestamp window |
Inputs:
campaign_id(string)budget_value(int, positive)budget_value_type—ABSOLUTE(cents in account currency) orMULTIPLIER(e.g.,2doubles the budget)time_start,time_end(Unix timestamps in seconds) —time_end > time_start
Activities
Tool | Type | Description |
| 🔍 | Retrieve the change history log for an ad account |
| 🔍 | Retrieve the change history log for an ad set |
Pagination tool
Tool | Type | Description |
| 🛠️ | Follow |
End-to-End: Create an Ad from Scratch
A typical "build a new ad" workflow uses tools across several categories. With META_ADS_ENABLE_WRITE_TOOLS=true:
1. meta_ads_list_ad_accounts → pick an act_id
2. meta_ads_get_account_pages → pick a page_id
3. meta_ads_search_geo_locations(q="Vietnam") → grab the country/region keys
4. meta_ads_search_interests(q="cooking") → grab interest IDs
5. meta_ads_estimate_audience_size(act_id, targeting) → sanity-check reach
6. meta_ads_upload_ad_image(act_id, image_url) → returns image_hash
7. meta_ads_create_campaign(act_id, ...) → returns campaign_id
8. meta_ads_create_adset(act_id, campaign_id, targeting, ...) → returns adset_id
9. meta_ads_create_ad_creative(act_id, page_id, image_hash, link_url, message, ...) → returns creative_id
10. meta_ads_create_ad(act_id, name, adset_id, creative_id, status="PAUSED") → returns ad_id
11. (Optional) meta_ads_get_ad_previews(ad_id, ...) → render placements before going live
12. meta_ads_resume_ad(ad_id) → flip to ACTIVE when readyAll steps that mutate state default to status: "PAUSED" so nothing goes live until you explicitly call a resume tool.
Pagination
Many list tools return paginated results. When a response contains a paging.next URL, use meta_ads_fetch_pagination_url to retrieve subsequent pages:
1. Call meta_ads_get_campaigns_by_adaccount → receive first page
2. Check if response.paging.next exists
3. Call meta_ads_fetch_pagination_url(url=response.paging.next) → receive next page
4. Repeat until paging.next is absentDevelopment
npm run dev # Watch mode — auto-recompile on change
npm run build # Compile TypeScript to dist/
npm run clean # Remove dist/
npm run clean && npm run build # Full rebuild from scratchQuick smoke test:
# Default (read-only)
META_ADS_ACCESS_TOKEN=dummy node dist/index.js
# → "Meta Ads MCP server running via stdio"
# With writes enabled
META_ADS_ACCESS_TOKEN=dummy META_ADS_ENABLE_WRITE_TOOLS=true node dist/index.js
# → WARNING line + "Meta Ads MCP server running via stdio"Project Structure
meta-ads-mcp/
├── src/
│ ├── index.ts # Entry point, server setup, transport selection, write-tools warning
│ ├── constants.ts # API version, base URLs, isWriteToolsEnabled() flag
│ ├── types.ts # Shared TypeScript interfaces
│ ├── services/
│ │ └── graph-api.ts # HTTP client (GET/POST/DELETE), auth, error handling, param builders
│ ├── schemas/
│ │ ├── common.ts # Shared Zod schemas (pagination, date ranges, filters)
│ │ └── insights.ts # Insights-specific Zod schemas
│ └── tools/
│ ├── accounts.ts # Account tools
│ ├── insights.ts # Insights tools (account/campaign/adset/ad level)
│ ├── campaigns.ts # Campaign read + write/lifecycle tools
│ ├── adsets.ts # Ad set read + write/lifecycle tools
│ ├── ads.ts # Ad read + write/lifecycle tools
│ ├── creatives.ts # Creative read tools, image crops utility, create/update creative
│ ├── media.ts # Image list / upload / hash lookup / video / preview
│ ├── activities.ts # Activity log tools
│ ├── pagination.ts # Pagination utility tool
│ ├── targeting.ts # Interest/behavior/demographic/geo search + audience-size estimate
│ ├── pages.ts # Facebook Pages list and name search
│ └── budget-schedules.ts # Campaign budget schedule create
├── dist/ # Compiled JavaScript output (generated)
├── package.json
└── tsconfig.jsonLicense
Available Tools
35 toolsmeta_ads_compute_image_cropsCompute Meta Ad Image CropsARead-onlyIdempotent
Compute image_crops coordinates for a source image. For each requested key, returns the largest centered region that fits the source while matching that key's aspect ratio (equivalent to Meta's "Original" crop — no content cut beyond the ratio).
Valid keys (Meta accepts only these 6): 100x100 — 1:1 square (Feed, Marketplace) 100x72 — ~1.39:1 horizontal (Marketplace) 400x500 — 4:5 portrait (Feed mobile, Stories fallback) 400x150 — ~2.67:1 banner (Audience Network) 600x360 — ~1.67:1 horizontal (Right column) 90x160 — 9:16 portrait (Stories)
Pass the returned image_crops dict to meta_ads_create_ad_creative.
| Name | Required | Description | Default |
|---|---|---|---|
| image_width | Yes | ||
| image_height | Yes | ||
| crop_keys | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds detail that it returns the largest centered region fitting the source while matching aspect ratio, equivalent to Meta's "Original" crop with no content cut beyond the ratio. This enriches understanding beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (~150 words), well-structured with bullet points for valid keys, and front-loaded with the main purpose. Every sentence adds value, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (3 parameters, no output schema), the description covers the key aspects: what it computes, valid inputs, and downstream use. It could optionally detail the return dict structure, but the information provided is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must compensate. It provides a list of valid crop_keys with aspect ratios and placements, adding meaning beyond the schema. However, it does not explain the numeric parameters (image_width, image_height) beyond their role as source dimensions, leaving some ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it computes image_crops coordinates for a source image, identifies the specific resource (image crops), and uses a specific verb "compute". It distinguishes from sibling tools by focusing on coordinate computation rather than estimation, fetching, or listing.
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 directs the user to pass the returned image_crops dict to meta_ads_create_ad_creative, providing clear downstream usage. It does not explicitly state when not to use this tool, but the context is clear for this computational task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_estimate_audience_sizeEstimate Meta Ad Audience SizeARead-onlyIdempotent
Estimate audience size for a targeting spec using Meta's delivery_estimate / reachestimate endpoints.
Args:
act_id (string): Ad account ID prefixed with 'act_'.
targeting (object): Full targeting spec (geo_locations, age_min, age_max, interests, flexible_spec, etc.).
optimization_goal (string, optional): Default 'REACH'. Other common values: LINK_CLICKS, LANDING_PAGE_VIEWS, OFFSITE_CONVERSIONS, IMPRESSIONS.
Returns: Estimated audience size bounds plus the raw API response.
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | Yes | ||
| targeting | Yes | ||
| optimization_goal | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, non-destructive, idempotent, and openWorld. The description adds the specific API endpoints (delivery_estimate/reachestimate), confirming read-only behavior, and notes the return of 'estimated audience size bounds plus raw API response', providing useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph with a clear purpose first, then a list of args. It is relatively short and to the point, though slightly redundant by mentioning endpoints and then args. Could be more structured with bullet points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description compensates by stating return value. It covers key inputs and outputs but lacks details on error cases, rate limits, required permissions, or prerequisites (e.g., user authentication, valid ad account). For a tool with openWorldHint, basic completeness is adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description explains all three parameters: act_id (prefixed with 'act_'), targeting (specifying common fields like geo_locations, age_min, etc.), and optimization_goal (optional, default REACH, common values). It adds meaning beyond the raw schema, though could be more specific about targeting subfields.
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 action ('Estimate audience size'), the resource ('targeting spec'), and even references the underlying Meta API endpoints. Among sibling tools, this is the only one focused on estimation, making it distinct.
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 parameter context (e.g., optimization_goal defaults, targeting spec fields) but does not explicitly state when to use this tool versus alternatives like direct ad creation or insights. No usage scenarios or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_fetch_pagination_urlFetch Meta Ads Pagination URLARead-onlyIdempotent
Fetch the next or previous page of results from a Meta Graph API pagination URL.
Use this tool whenever a Meta Ads tool response contains a paging.next or paging.previous URL. The pagination URL already includes the access token and all necessary parameters.
Args:
url (string): The complete pagination URL from response.paging.next or response.paging.previous
Returns: The next/previous page of results in the same format as the original response.
Examples:
Use when: response.paging.next exists after calling meta_ads_get_adaccount_insights
Use when: response.paging.next exists after calling meta_ads_get_campaigns_by_adaccount
Use when: "Get all pages of results automatically"
Note: The pagination URL already contains the access token — do NOT add or modify it.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Complete pagination URL from response.paging.next or response.paging.previous |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey read-only, idempotent, and safe behavior. The description adds valuable context beyond annotations: the URL already contains the access token, and warns not to modify it. It also states the return format matches the original response.
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 highly concise and well-structured: a one-line summary, usage guideline, args/returns sections, examples, and a warning note. 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?
Given the tool's simplicity (1 param, no output schema), the description is complete: it explains the input, output (same format as original), and provides multiple usage examples and a critical security 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 coverage is 100% for the single parameter, providing baseline 3. The description adds meaningful context: the URL includes the access token and all necessary parameters, and explicitly advises not to add or modify the token, which is critical for safe usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool fetches the next or previous page from a Meta Graph API pagination URL, clearly distinguishing it from sibling tools that perform different operations (e.g., getting entities or insights).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance ('Use this tool whenever...') and concrete examples for specific preceding calls. It lacks an explicit when-not-to-use statement, but the sibling context makes it clear this is the only pagination tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_account_pagesGet Meta Account PagesARead-onlyIdempotent
List Facebook Pages reachable from the access token's user. These are the candidate page_id values for create_ad_creative.
Args:
act_id (string, optional): Reserved for parity with the Python reference; Meta returns pages bound to the user/token, not the ad account, so this is currently unused.
Returns: { data: [{ id, name, username, category, fan_count, link, verification_status, picture }] }
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, destructive=false, idempotent, and openWorldHint. The description adds important behavioral detail: the tool returns pages bound to the user/token, not the ad account, explaining why act_id is unused. This goes beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a brief purpose statement, parameter details, and return format. All sentences add value, though it could be slightly more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool, the description covers purpose, the one parameter's role, and the return format. With no output schema, this is reasonably complete. Slightly more context about alternative tools would enhance it.
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 thoroughly explains the act_id parameter: it is reserved for parity with the Python reference and currently unused because Meta returns pages by user/token. This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists Facebook pages reachable from the access token's user, and explicitly frames these as candidate page_id values for create_ad_creative. This verb+resource+usage combination distinguishes its purpose well.
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: it is used to get pages for ad creative creation. However, it does not explicitly state when not to use it or compare it to sibling tools like meta_ads_search_pages_by_name, which slightly limits guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_activities_by_adaccountGet Meta Ad Account Activity LogARead-onlyIdempotent
Retrieve the change history (activity log) for a Meta ad account.
Returns key updates to the account and associated ad objects, including status changes, budget updates, targeting changes, and more. By default returns one week of data.
Args:
act_id (string): Ad account ID prefixed with 'act_', e.g., 'act_1234567890'
fields (string[]): Fields to retrieve. Available: actor_id, actor_name, application_id, application_name, changed_data, date_time_in_timezone, event_time, event_type, extra_data, object_id, object_name, object_type, translated_event_type
limit (number): Maximum activities per page
after / before (string): Pagination cursors
time_range (object): Custom range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}. Overrides since/until
since (string): Start date in YYYY-MM-DD format (ignored if time_range is set)
until (string): End date in YYYY-MM-DD format (ignored if time_range is set)
Returns: Object with data (activity array) and paging. Each activity record contains who made the change, what was changed, when, and the specific details.
actor_name (string): Name of the user who made the change
object_type (string): Type of object: AD, ADSET, CAMPAIGN, ACCOUNT, IMAGE, REPORT, etc.
translated_event_type (string): Human-readable description, e.g., 'ad created', 'campaign budget updated'
event_time (string): Timestamp of the event
changed_data (string): JSON detailing what changed
Use meta_ads_fetch_pagination_url with paging.next to retrieve additional pages.
Examples:
Use when: "Show me all changes made to my ad account in the last week"
Use when: "Who changed the budget on this account in January 2024?"
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | Yes | Ad account ID prefixed with 'act_', e.g., 'act_1234567890' | |
| fields | No | Fields to retrieve. Available: actor_id, actor_name, application_id, application_name, changed_data, date_time_in_timezone, event_time, event_type, extra_data, object_id, object_name, object_type, translated_event_type | |
| time_range | No | Custom time range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}. Overrides since/until | |
| since | No | Start date in YYYY-MM-DD format. Ignored if time_range is set | |
| until | No | End date in YYYY-MM-DD format. Ignored if time_range is set | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and idempotent. The description adds valuable context: default time range, return fields, and pagination. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: purpose first, then args, returns, usage hint. Slightly verbose but maintains clarity. Front-loaded with 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?
Rich schema and annotations reduce burden. Description adds default time range, return field descriptions, and pagination hints. Missing output schema is compensated by return description. Complete for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds some extra context (e.g., time_range overrides since/until, lists available fields) but largely duplicates schema descriptions. Not significantly more informative.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves the change history (activity log) for a Meta ad account, with specific examples of changes (status, budget, targeting). It distinguishes from sibling tool meta_ads_get_activities_by_adset by focusing on ad account level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: defaults to one week of data, examples of use cases ('Show me all changes', 'Who changed the budget'), and hints for pagination. Does not explicitly exclude alternative tools, but the scope is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_activities_by_adsetGet Meta Ad Set Activity LogARead-onlyIdempotent
Retrieve the change history (activity log) for a specific Meta ad set.
Returns updates to the ad set including status changes, budget updates, targeting changes, and more. By default returns one week of data.
Args:
adset_id (string): Ad set ID, e.g., '23843211234567'
fields (string[]): Fields to retrieve. Available: actor_id, actor_name, application_id, application_name, changed_data, date_time_in_timezone, event_time, event_type, extra_data, object_id, object_name, object_type, translated_event_type
limit (number): Maximum activities per page
after / before (string): Pagination cursors
time_range (object): Custom range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}. Overrides since/until
since (string): Start date in YYYY-MM-DD format (ignored if time_range is set)
until (string): End date in YYYY-MM-DD format (ignored if time_range is set)
Returns: Object with data (activity array) and paging. Each activity record contains who made the change, what was changed, when, and the specific details.
actor_name (string): Name of the user who made the change
object_type (string): Type of object: AD, ADSET, CAMPAIGN, ACCOUNT, IMAGE, REPORT, etc.
translated_event_type (string): Human-readable description, e.g., 'ad created', 'campaign budget updated'
event_time (string): Timestamp of the event
changed_data (string): JSON detailing what changed
Use meta_ads_fetch_pagination_url with paging.next to retrieve additional pages.
Examples:
Use when: "What changes were made to ad set 23843211234567 this month?"
Use when: "Show me the targeting change history for this ad set"
| Name | Required | Description | Default |
|---|---|---|---|
| adset_id | Yes | Ad set ID, e.g., '23843211234567' | |
| fields | No | Fields to retrieve. Available: actor_id, actor_name, application_id, application_name, changed_data, date_time_in_timezone, event_time, event_type, extra_data, object_id, object_name, object_type, translated_event_type | |
| time_range | No | Custom time range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}. Overrides since/until | |
| since | No | Start date in YYYY-MM-DD format. Ignored if time_range is set | |
| until | No | End date in YYYY-MM-DD format. Ignored if time_range is set | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint. The description adds significant behavioral context: default time range, pagination details, and output structure, which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose, sections for Args and Returns, and examples. It is somewhat redundant with the schema but remains organized and front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters, nested objects, and no output schema, the description provides thorough details on return fields, pagination, and time range handling. It also directs to a sibling tool for pagination. Lacks error handling or permission notes, but overall completes the context well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by clarifying default time range, parameter interactions (time_range overrides since/until), and providing example values, which enhances understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves the change history for a specific ad set, with examples. It differentiates from the sibling meta_ads_get_activities_by_adaccount by specifying the resource as an ad set, and lists the types of updates returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'Use when' examples and mentions default behavior (one week of data). It does not explicitly state when not to use or compare to alternatives, but it gives clear context for common use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_ad_account_detailsGet Meta Ad Account DetailsARead-onlyIdempotent
Get detailed information about a specific Meta ad account.
Args:
act_id (string): The ad account ID prefixed with 'act_', e.g., 'act_1234567890'
fields (string[]): Optional. Fields to retrieve. If omitted, defaults to: name, business_name, age, account_status, balance, amount_spent, attribution_spec, account_id, business, business_city, brand_safety_content_filter_levels, currency, created_time, id.
Returns: Object with the requested ad account fields. Key fields:
id (string): Ad account ID
name (string): Account display name
account_status (number): Status code (1=ACTIVE, 2=DISABLED, 3=UNSETTLED, etc.)
currency (string): Account currency code (e.g., 'USD')
balance (string): Current account balance
amount_spent (string): Total lifetime spend
Examples:
Use when: "Get details for ad account act_123456"
Use when: "What is the currency and balance of my ad account?"
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | Yes | Ad account ID prefixed with 'act_', e.g., 'act_1234567890' | |
| fields | No | List of specific fields to retrieve. If omitted, default fields are returned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds valuable behavioral context: it explains the structure of the return object, the meaning of account_status codes (e.g., 1=ACTIVE), and that omitted 'fields' parameter defaults to a list of common fields. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concisely structured with a summary, Args, Returns, and Examples sections. Every sentence serves a purpose. It is not verbose, and the format makes it easy for an agent to parse quickly. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only tool without an output schema, the description provides complete context: purpose, parameters with format, return object explanation with key fields and status codes, and usage examples. It fully addresses the tool's complexity and leaves no gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, both parameters have descriptions. The description adds beyond the schema: it specifies the 'act_' prefix for act_id, lists the default fields for the optional 'fields' parameter, and provides the return object structure including key fields and their types. This significantly enhances understanding.
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 detailed information about a specific Meta ad account. It distinguishes from siblings like 'meta_ads_list_ad_accounts' (listing all accounts) and 'meta_ads_get_adaccount_insights' (insights). The verb 'Get' and resource 'detailed information about a specific Meta ad account' are precise.
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 two concrete 'Use when' examples, giving context for when to invoke the tool. However, it does not explicitly state when _not_ to use this tool or suggest alternative tools for listing all accounts or retrieving insights. This omission keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_adaccount_insightsGet Meta Ad Account InsightsBRead-onlyIdempotent
Retrieve performance insights for a Meta ad account.
Fetches metrics like impressions, reach, clicks, spend, conversions, and more for an entire ad account. Supports time range definitions, demographic breakdowns, and attribution settings.
Args:
act_id (string): Ad account ID prefixed with 'act_', e.g., 'act_1234567890'
fields (string[]): Metrics to retrieve. Common: impressions, reach, clicks, spend, ctr, cpc, cpm, cpp, frequency, actions, conversions, cost_per_action_type
date_preset (string): Relative time range preset (default: last_30d)
time_range (object): Custom range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}
level (string): Aggregation level: account, campaign, adset, ad (default: account)
breakdowns (string[]): Segment by: age, gender, country, impression_device, publisher_platform, etc.
See full parameter list in inputSchema
Returns: Object with:
data (array): List of insight records with requested metrics
paging (object): Pagination cursors. Use meta_ads_fetch_pagination_url with paging.next to get more results
Pagination note: When response contains paging.next, use meta_ads_fetch_pagination_url to retrieve additional pages automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Metrics and dimensions to retrieve. Common examples: impressions, reach, clicks, spend, ctr, cpc, cpm, cpp, frequency, actions, conversions, cost_per_action_type, date_start, date_stop | |
| date_preset | No | Predefined relative time range. Options: today, yesterday, this_month, last_month, this_quarter, 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. Default: last_30d. Ignored if time_range, time_ranges, since, or until is provided | last_30d |
| time_range | No | Specific time range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}. Overrides date_preset | |
| time_ranges | No | Array of time range objects for period comparison. Overrides time_range and date_preset | |
| time_increment | No | Time breakdown granularity: integer 1-90 (days per point), 'monthly', or 'all_days' (single summary). Default: all_days | all_days |
| level | No | Level of aggregation: account, campaign, adset, or ad | |
| action_attribution_windows | No | Attribution windows for actions. Examples: 1d_view, 7d_view, 28d_view, 1d_click, 7d_click, 28d_click, dda, default | |
| action_breakdowns | No | Segments the actions results. Examples: action_device, action_type, conversion_destination, action_destination. Default: [action_type] | |
| action_report_time | No | When actions are counted: impression (time of ad impression), conversion (time of conversion), mixed. Default: mixed | |
| breakdowns | No | Segment results by dimensions. Examples: age, gender, country, region, dma, impression_device, publisher_platform, platform_position, device_platform | |
| default_summary | No | If true, include an additional summary row in the response. Default: false | |
| use_account_attribution_setting | No | If true, use the attribution settings defined at the ad account level. Default: false | |
| use_unified_attribution_setting | No | If true, use unified attribution settings defined at the ad set level. Recommended for consistency with Ads Manager. Default: true | |
| filtering | No | List of filter objects. Each has 'field', 'operator', and 'value'. Example: [{field: 'spend', operator: 'GREATER_THAN', value: 50}] | |
| sort | No | Sort field and direction. Format: {field}_ascending or {field}_descending. Example: impressions_descending | |
| since | No | Start timestamp for time-based pagination (Unix or strtotime). Only used when time_range and time_ranges are not set | |
| until | No | End timestamp for time-based pagination (Unix or strtotime). Only used when time_range and time_ranges are not set | |
| locale | No | Locale for text responses (e.g., en_US). Controls language and formatting | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip | |
| act_id | Yes | Ad account ID prefixed with 'act_', e.g., 'act_1234567890' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond annotations by detailing the return structure (data array with metrics, paging object) and pagination behavior, including the need to use a sibling tool for fetching additional pages. This complements the readOnly and idempotent hints effectively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections and bullet points, but it is verbose. It repeats parameter information already present in the schema, which makes it longer than necessary. While organized, the redundancy hurts conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (23 parameters, nested objects, no output schema), the description adequately covers the main purpose, return format, and pagination. It mentions time ranges, breakdowns, and attribution settings. The pagination note and reference to a sibling tool enhance 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?
The input schema already provides detailed descriptions for all parameters (100% coverage). The description's 'Args' section adds common metric examples but does not significantly clarify meaning beyond the schema. The baseline of 3 is appropriate as the description does not compensate for any 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 clearly states the tool retrieves performance insights for a Meta ad account, specifying metrics and features. However, it does not explicitly distinguish this tool from sibling insight tools like meta_ads_get_ad_insights or meta_ads_get_campaign_insights, which slightly reduces clarity for an agent deciding which tool to use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lacks explicit guidance on when to use this tool versus its siblings. It does not mention when to prefer account-level insights over campaign, adset, or ad-level insights. The pagination note is useful but does not cover tool selection. This leaves the agent without clear decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_ad_by_idGet Meta Ad by IDARead-onlyIdempotent
Retrieve detailed information about a specific Meta ad.
Args:
ad_id (string): Ad ID, e.g., '23843211234567'
fields (string[]): Fields per ad. Common: id, name, account_id, adset_id, campaign_id, status, effective_status, configured_status, creative, bid_amount, bid_type, created_time, updated_time, targeting, conversion_specs, recommendations, preview_shareable_link
Returns: Object with the requested ad fields.
Examples:
Use when: "Get details for ad 23843211234567"
Use when: "What creative and status does this ad have?"
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | Ad ID, e.g., '23843211234567' | |
| fields | No | List of specific fields to retrieve. If omitted, default fields are returned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds that it returns an object with requested fields, which is minimal additional transparency. No contradictions, but it could mention authentication 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 main sentence, Args, Returns, and Examples. It is concise with no extraneous text, and each section serves a 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?
The tool is simple and the description covers the main functionality. However, it does not specify what default fields are returned if 'fields' is omitted, which would improve 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 100%, so baseline is 3. The description adds value by listing common field values (e.g., id, name, status) in the Args section, which goes beyond the schema's parameter 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 'Retrieve detailed information about a specific Meta ad' with the verb 'Retrieve' and resource 'specific Meta ad'. It distinguishes from sibling tools by focusing on a single ad by ID and provides examples like 'Get details for ad 23843211234567'.
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 'Use when' examples that indicate typical queries, such as 'What creative and status does this ad have?' This gives clear context, but it does not explicitly exclude alternative tools or specify when not to use it, so it's not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_ad_creative_by_idGet Meta Ad Creative by IDARead-onlyIdempotent
Retrieve detailed information about a specific Meta ad creative.
Args:
creative_id (string): Ad creative ID, e.g., '23842312323312'
fields (string[]): Fields to retrieve. Available: id, name, account_id, actor_id, adlabels, asset_feed_spec, authorization_category, body, call_to_action_type, effective_authorization_category, effective_instagram_media_id, effective_object_story_id, image_hash, image_url, instagram_permalink_url, instagram_story_id, instagram_user_id, link_url, object_id, object_story_id, object_story_spec, object_type, object_url, platform_customizations, product_set_id, status, template_url, thumbnail_url, title, url_tags, use_page_actor_override, video_id
thumbnail_width (number): Width of the thumbnail image in pixels (default: 64)
thumbnail_height (number): Height of the thumbnail image in pixels (default: 64)
Returns: Object with the requested creative fields.
Examples:
Use when: "Get the body text, title, and image URL for creative 23842312323312"
Use when: "What is the call-to-action type and status of this creative?"
Use when: "Get a larger thumbnail (300x200) for this creative"
| Name | Required | Description | Default |
|---|---|---|---|
| creative_id | Yes | Ad creative ID, e.g., '23842312323312' | |
| fields | No | Fields to retrieve. Available: id, name, account_id, actor_id, adlabels, asset_feed_spec, authorization_category, body, call_to_action_type, effective_authorization_category, effective_instagram_media_id, effective_object_story_id, image_hash, image_url, instagram_permalink_url, instagram_story_id, instagram_user_id, link_url, object_id, object_story_id, object_story_spec, object_type, object_url, platform_customizations, product_set_id, status, template_url, thumbnail_url, title, url_tags, use_page_actor_override, video_id | |
| thumbnail_width | No | Width of the thumbnail image in pixels (default: 64) | |
| thumbnail_height | No | Height of the thumbnail image in pixels (default: 64) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true, so the description's statement 'Retrieve detailed information' adds minimal behavioral context beyond the structured data. No additional traits like rate limits, auth needs, or return format beyond 'Object'.
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 for args, returns, and examples. It is front-loaded with the purpose. Each sentence adds value, though it could be slightly shortened while preserving clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters and no output schema, the description explains the return type as an object with requested fields, which is adequate. It covers the main usage patterns with examples. It lacks details on error handling but is sufficiently complete for a read-only tool with good annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description lists available fields and provides examples, but the schema already describes all parameters. The description does not add new meaning beyond what is in the schema for each param.
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 'Retrieve detailed information about a specific Meta ad creative,' which is a specific verb+resource. It distinguishes from sibling tools like meta_ads_get_adcreatives_by_adaccount (list) and meta_ads_get_ad_creatives_by_ad_id (different) by focusing on a single creative by ID.
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 concrete 'Use when' examples that illustrate typical scenarios (e.g., getting body text, call-to-action, thumbnail). It implies the tool is for retrieving a specific creative by ID but does not explicitly state when not to use it or what alternatives exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_adcreatives_by_adaccountGet Meta Ad Creatives by Ad AccountARead-onlyIdempotent
Retrieve all ad creatives belonging to a specific Meta ad account.
Useful for auditing all creative assets, finding creatives by status, or reviewing creative content across the account.
Args:
act_id (string): Ad account ID prefixed with 'act_', e.g., 'act_1234567890'
fields (string[]): Fields to retrieve. Available: id, name, account_id, actor_id, adlabels, asset_feed_spec, authorization_category, body, call_to_action_type, effective_authorization_category, effective_instagram_media_id, effective_object_story_id, image_hash, image_url, instagram_permalink_url, instagram_story_id, instagram_user_id, link_url, object_id, object_story_id, object_story_spec, object_type, object_url, platform_customizations, product_set_id, status, template_url, thumbnail_url, title, url_tags, use_page_actor_override, video_id
effective_status (string[]): Filter by status: ACTIVE, DELETED, IN_PROCESS, WITH_ISSUES
filtering (object[]): Additional filter objects with field, operator, value
limit (number): Results per page (1-100, default: 25)
after / before (string): Pagination cursors
Returns: Object with data (creative array) and paging. Use meta_ads_fetch_pagination_url with paging.next for more results.
Examples:
Use when: "List all active creatives in my ad account"
Use when: "Show all creatives with issues in act_123456"
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | Yes | Ad account ID prefixed with 'act_', e.g., 'act_1234567890' | |
| fields | No | Fields to retrieve. Available: id, name, account_id, actor_id, adlabels, asset_feed_spec, authorization_category, body, call_to_action_type, effective_authorization_category, effective_instagram_media_id, effective_object_story_id, image_hash, image_url, instagram_permalink_url, instagram_story_id, instagram_user_id, link_url, object_id, object_story_id, object_story_spec, object_type, object_url, platform_customizations, product_set_id, status, template_url, thumbnail_url, title, url_tags, use_page_actor_override, video_id | |
| effective_status | No | Filter by creative status: ACTIVE, DELETED, IN_PROCESS, WITH_ISSUES | |
| filtering | No | List of filter objects. Each has 'field', 'operator', and 'value'. Example: [{field: 'spend', operator: 'GREATER_THAN', value: 50}] | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds value by disclosing the pagination mechanism (after/before cursors), the use of meta_ads_fetch_pagination_url for next pages, and the return format (Object with data and paging). No contradictions.
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: general description, use contexts, Args with bullet points, Returns, and Examples. It is moderately sized but front-loads the purpose. Could be slightly more concise by not repeating the full field list already present in the 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?
Given the tool's complexity (8 parameters, no output schema), the description adequately covers the main retrieval purpose, filtering options, pagination details, and return structure (data array + paging). It references a sibling tool for pagination, providing sufficient context for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, providing a baseline of 3. The description adds meaning beyond the schema by grouping parameters (e.g., 'Fields to retrieve' list, 'Filter by status', 'Additional filter objects') and providing context like the example usage for filtering. It also gives a practical hint for pagination cursors.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Retrieve all ad creatives belonging to a specific Meta ad account', clearly identifying the verb (retrieve), resource (ad creatives), and scope (by ad account). This distinguishes it from siblings like meta_ads_get_ad_creative_by_id and meta_ads_get_ad_creatives_by_ad_id.
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 includes explicit contexts such as 'auditing all creative assets, finding creatives by status, or reviewing creative content across the account' and provides example queries. However, it does not explicitly state when to avoid this tool in favor of alternatives like meta_ads_get_ad_creative_by_id for single creative retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_ad_creatives_by_ad_idGet Meta Ad Creatives by Ad IDARead-onlyIdempotent
Retrieve the ad creatives associated with a specific Meta ad.
Args:
ad_id (string): Ad ID to retrieve creatives for, e.g., '23843211234567'
fields (string[]): Fields to retrieve. Available: id, name, account_id, actor_id, adlabels, asset_feed_spec, authorization_category, body, call_to_action_type, effective_authorization_category, effective_instagram_media_id, effective_object_story_id, image_hash, image_url, instagram_permalink_url, instagram_story_id, instagram_user_id, link_url, object_id, object_story_id, object_story_spec, object_type, object_url, platform_customizations, product_set_id, status, template_url, thumbnail_url, title, url_tags, use_page_actor_override, video_id
limit (number): Maximum creatives per page (default: 25)
after / before (string): Pagination cursors from response.paging.cursors
date_format (string): Date format: 'U' for Unix timestamp, 'Y-m-d H:i:s' for MySQL datetime
Returns: Object with data (creative array) and paging. Use meta_ads_fetch_pagination_url with paging.next for more results.
Examples:
Use when: "What creatives are used by ad 23843211234567?"
Use when: "Get the image URLs and titles for all creatives on this ad"
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | Ad ID to retrieve creatives for, e.g., '23843211234567' | |
| fields | No | Fields to retrieve. Available: id, name, account_id, actor_id, adlabels, asset_feed_spec, authorization_category, body, call_to_action_type, effective_authorization_category, effective_instagram_media_id, effective_object_story_id, image_hash, image_url, instagram_permalink_url, instagram_story_id, instagram_user_id, link_url, object_id, object_story_id, object_story_spec, object_type, object_url, platform_customizations, product_set_id, status, template_url, thumbnail_url, title, url_tags, use_page_actor_override, video_id | |
| date_format | No | Format for date fields in response. 'U' = Unix timestamp (seconds), 'Y-m-d H:i:s' = MySQL datetime. Default: ISO 8601 | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds behavioral details beyond these: it explains the return structure (object with data and paging), pagination cursors, and date format behavior. No contradictions.
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, Returns, and Examples sections, and the core purpose is front-loaded. However, the listing of available fields for the 'fields' parameter is lengthy but necessary. Overall, it's organized and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters and no output schema, the description adequately explains the return structure, pagination, and references a sibling tool for pagination. It covers date formats and provides a field list. The absence of output schema is compensated by clear return description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining how to use the parameters, including examples for date_format and pagination cursors, and referencing meta_ads_fetch_pagination_url for pagination. This goes beyond simply repeating schema info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Retrieve the ad creatives') and the specific resource ('associated with a specific Meta ad'). It distinguishes from siblings like meta_ads_get_ad_creative_by_id (single creative) and meta_ads_get_adcreatives_by_adaccount (by account) by specifying 'by ad ID'.
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 two usage examples ('What creatives are used by ad...' and 'Get the image URLs...') that clarify when to use the tool. However, it does not explicitly state when not to use it or list alternative tools, though the sibling list provides context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_ad_imagesGet Meta Ad ImagesARead-onlyIdempotent
Retrieve ad images belonging to a Meta ad account.
Useful for auditing image assets, finding images by hash or name, and checking image dimensions and status.
Args:
act_id (string): Ad account ID prefixed with 'act_', e.g., 'act_1234567890'
fields (string[]): Fields to retrieve. Available: id, account_id, created_time, creatives, hash, height, is_associated_creatives_in_adgroups, name, original_height, original_width, permalink_url, status, updated_time, url, url_128, width
hashes (string[]): Filter by specific image hashes
name (string): Filter images by name (partial match)
minwidth (number): Minimum image width in pixels
minheight (number): Minimum image height in pixels
limit (number): Results per page (1-100, default: 25)
after / before (string): Pagination cursors
Returns: Object with data (image array) and paging. Each image contains URL, dimensions, hash, and status. Use meta_ads_fetch_pagination_url with paging.next for more results.
Examples:
Use when: "List all images in my ad account"
Use when: "Find images with hashes abc123 and def456"
Use when: "Show images wider than 1000px"
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | Yes | Ad account ID prefixed with 'act_', e.g., 'act_1234567890' | |
| fields | No | Fields to retrieve. Available: id, account_id, created_time, creatives, hash, height, is_associated_creatives_in_adgroups, name, original_height, original_width, permalink_url, status, updated_time, url, url_128, width | |
| hashes | No | Filter by specific image hashes, e.g., ['abc123', 'def456'] | |
| name | No | Filter images by name (partial match) | |
| minwidth | No | Minimum image width in pixels | |
| minheight | No | Minimum image height in pixels | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description adds operational context like pagination, return structure, and filtering behavior. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for purpose, Args, Returns, and Examples. It is comprehensive but not overly verbose; each component serves a 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 10 parameters and no output schema, the description covers return structure, pagination, and usage examples. It also references a sibling tool for pagination, making it self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value by clarifying usage (e.g., 'partial match' for name, example for hashes) and providing a structured Args list with practical details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves ad images for a Meta ad account, with specific use cases like auditing and filtering by hash/name. It distinguishes from sibling tools like meta_ads_get_image_by_hash by being the general listing tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit examples of when to use, such as 'List all images' or 'Find images with hashes', and notes its utility for auditing. It does not explicitly mention when not to use or alternatives, but the context is clear given sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_ad_insightsGet Meta Ad InsightsARead-onlyIdempotent
Retrieve detailed performance insights for a specific Meta ad.
Fetches performance metrics for an individual ad, such as impressions, clicks, conversions, video views, etc.
Args:
ad_id (string): Ad ID, e.g., '6123456789012'
fields (string[]): Metrics to retrieve. Common: ad_name, adset_name, campaign_name, impressions, clicks, spend, ctr, cpc, cpm, reach, frequency, actions, conversions, cost_per_action_type, inline_link_clicks, video_p25_watched_actions
date_preset (string): Relative time range preset (default: last_30d)
time_range (object): Custom range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}
level (string): Aggregation level, should be 'ad' (default: ad)
breakdowns (string[]): Segment by: age, gender, country, publisher_platform, impression_device, platform_position, device_platform, etc.
See full parameter list in inputSchema
Returns: Object with:
data (array): List of insight records with requested metrics
paging (object): Pagination cursors. Use meta_ads_fetch_pagination_url with paging.next to get more results
Pagination note: When response contains paging.next, use meta_ads_fetch_pagination_url to retrieve additional pages automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Metrics and dimensions to retrieve. Common examples: impressions, reach, clicks, spend, ctr, cpc, cpm, cpp, frequency, actions, conversions, cost_per_action_type, date_start, date_stop | |
| date_preset | No | Predefined relative time range. Options: today, yesterday, this_month, last_month, this_quarter, 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. Default: last_30d. Ignored if time_range, time_ranges, since, or until is provided | last_30d |
| time_range | No | Specific time range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}. Overrides date_preset | |
| time_ranges | No | Array of time range objects for period comparison. Overrides time_range and date_preset | |
| time_increment | No | Time breakdown granularity: integer 1-90 (days per point), 'monthly', or 'all_days' (single summary). Default: all_days | all_days |
| level | No | Level of aggregation: account, campaign, adset, or ad | |
| action_attribution_windows | No | Attribution windows for actions. Examples: 1d_view, 7d_view, 28d_view, 1d_click, 7d_click, 28d_click, dda, default | |
| action_breakdowns | No | Segments the actions results. Examples: action_device, action_type, conversion_destination, action_destination. Default: [action_type] | |
| action_report_time | No | When actions are counted: impression (time of ad impression), conversion (time of conversion), mixed. Default: mixed | |
| breakdowns | No | Segment results by dimensions. Examples: age, gender, country, region, dma, impression_device, publisher_platform, platform_position, device_platform | |
| default_summary | No | If true, include an additional summary row in the response. Default: false | |
| use_account_attribution_setting | No | If true, use the attribution settings defined at the ad account level. Default: false | |
| use_unified_attribution_setting | No | If true, use unified attribution settings defined at the ad set level. Recommended for consistency with Ads Manager. Default: true | |
| filtering | No | List of filter objects. Each has 'field', 'operator', and 'value'. Example: [{field: 'spend', operator: 'GREATER_THAN', value: 50}] | |
| sort | No | Sort field and direction. Format: {field}_ascending or {field}_descending. Example: impressions_descending | |
| since | No | Start timestamp for time-based pagination (Unix or strtotime). Only used when time_range and time_ranges are not set | |
| until | No | End timestamp for time-based pagination (Unix or strtotime). Only used when time_range and time_ranges are not set | |
| locale | No | Locale for text responses (e.g., en_US). Controls language and formatting | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip | |
| ad_id | Yes | Ad ID, e.g., '6123456789012' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent. The description adds pagination details, return structure, and how to request fields. No contradictions. It provides significant behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-organized with clear sections (purpose, args, returns, pagination note). Each sentence is informative and necessary. No fluff, achieves conciseness without sacrificing completeness.
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 complex tool with 23 parameters, the description covers key aspects: how to use date presets vs custom range, pagination, and return format. It references a sibling tool for pagination. No output schema, but description compensates adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds value by listing common fields, breakdowns, and examples (e.g., 'comma-separated list e.g. impressions, clicks'). Clearly explains key parameters like date_preset and time_range.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves performance insights for a specific Meta ad. It distinguishes from sibling tools that operate at different levels (e.g., adaccount, adset) by specifying 'ad' level and naming the tool accordingly.
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: it fetches metrics for an individual ad and mentions pagination using a sibling tool. It defaults to last_30d and 'ad' level, indicating typical use. Lacks explicit when-not-to-use, but sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_ad_previewsGet Meta Ad PreviewsARead-onlyIdempotent
Generate preview links or embed HTML for a Meta ad in various ad formats and placements.
Allows you to see how an ad looks across different placements (Facebook feed, Instagram, Stories, etc.) before or after publishing.
Args:
ad_id (string): Ad ID to preview, e.g., '23843211234567'
ad_format (string): Preview format. Options: DESKTOP_FEED_STANDARD, MOBILE_FEED_STANDARD, MOBILE_FEED_BASIC, MOBILE_INTERSTITIAL, MOBILE_BANNER, MOBILE_MEDIUM_RECTANGLE, MOBILE_FULLWIDTH, RIGHT_COLUMN_STANDARD, INSTAGRAM_STANDARD, INSTAGRAM_STORY, AUDIENCE_NETWORK_OUTSTREAM_VIDEO, AUDIENCE_NETWORK_INSTREAM_VIDEO, FACEBOOK_STORY_MOBILE, MESSENGER_MOBILE_INBOX_MEDIA, SUGGESTED_VIDEO_MOBILE, WATCH_FEED_MOBILE, FACEBOOK_REELS_MOBILE, INSTAGRAM_REELS
locale (string): Locale for the preview, e.g., 'en_US'
start_date (string): Preview start date for scheduled ads (UNIX timestamp)
end_date (string): Preview end date for scheduled ads (UNIX timestamp)
Returns: Object with data array. Each item contains:
body (string): HTML iframe embed code for the preview
encoded_creative_id (string): Encoded creative ID
Examples:
Use when: "Show me how ad 23843211234567 looks on Instagram"
Use when: "Preview this ad in desktop feed format"
Use when: "Generate previews for all placements of this ad"
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | Ad ID to preview, e.g., '23843211234567' | |
| ad_format | No | Preview format/placement. Options: DESKTOP_FEED_STANDARD, MOBILE_FEED_STANDARD, INSTAGRAM_STANDARD, INSTAGRAM_STORY, FACEBOOK_STORY_MOBILE, FACEBOOK_REELS_MOBILE, INSTAGRAM_REELS, RIGHT_COLUMN_STANDARD, MESSENGER_MOBILE_INBOX_MEDIA, etc. | |
| locale | No | Locale for the preview, e.g., 'en_US', 'vi_VN' | |
| start_date | No | Preview start date as UNIX timestamp (for scheduled ads) | |
| end_date | No | Preview end date as UNIX timestamp (for scheduled ads) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds context that the tool returns an object with an HTML embed body and encoded creative ID, and mentions it can be used before or after publishing. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with separate sections for Args, Returns, and examples. It is somewhat lengthy due to the enum listing but remains readable and front-loaded with the main purpose. A slight trim could improve conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters, no output schema, but detailed annotations, the description covers the purpose, all parameters, return format, and provides usage examples. It lacks details on constraints like ad state or error conditions, but overall it is complete enough for effective use.
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 100% schema description coverage, the baseline is 3. The description repeats the parameter descriptions largely verbatim from the schema (e.g., ad_format enum list, locale format) without adding significant new meaning or usage nuances beyond the schema itself.
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 generates preview links or embed HTML for a Meta ad across various formats and placements. It uses specific verbs (generate, preview) and distinguishes it from sibling tools that fetch data or perform other operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes explicit usage examples (e.g., 'Use when: Show me how ad 23843211234567 looks on Instagram') that indicate when to use the tool. However, it does not provide explicit when-not-to-use guidance or mention alternatives, so it falls 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.
meta_ads_get_ads_by_adaccountGet Meta Ads by Ad AccountARead-onlyIdempotent
Retrieve all ads from a specific Meta ad account with filtering and pagination.
Args:
act_id (string): Ad account ID prefixed with 'act_', e.g., 'act_1234567890'
fields (string[]): Fields per ad. Common: id, name, account_id, adset_id, campaign_id, status, effective_status, configured_status, creative, bid_amount, bid_type, created_time, updated_time, targeting, conversion_specs, recommendations, preview_shareable_link
effective_status (string[]): Filter by status: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, CAMPAIGN_PAUSED, ARCHIVED, ADSET_PAUSED, IN_PROCESS, WITH_ISSUES
filtering (object[]): Additional filter objects with field, operator, value
limit (number): Results per page (1-100, default: 25)
after / before (string): Pagination cursors
date_preset / time_range: Date filter
updated_since (number): Unix timestamp — return ads updated since this time
Returns: Object with data (ad array) and paging. Use meta_ads_fetch_pagination_url with paging.next for more results.
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | Yes | Ad account ID prefixed with 'act_', e.g., 'act_1234567890' | |
| fields | No | List of specific fields to retrieve. If omitted, default fields are returned | |
| filtering | No | List of filter objects. Each has 'field', 'operator', and 'value'. Example: [{field: 'spend', operator: 'GREATER_THAN', value: 50}] | |
| date_preset | No | Predefined relative time range. Options: today, yesterday, this_month, last_month, this_quarter, 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. Default: last_30d. Ignored if time_range, time_ranges, since, or until is provided | |
| time_range | No | Custom time range with since/until dates in YYYY-MM-DD format | |
| updated_since | No | Return ads updated since this Unix timestamp | |
| effective_status | No | Filter by effective status. Options: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, CAMPAIGN_PAUSED, ARCHIVED, ADSET_PAUSED, IN_PROCESS, WITH_ISSUES | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description's job is to add beyond that. It does so by explaining that the tool returns an object with 'data' and 'paging', and explicitly instructs to use meta_ads_fetch_pagination_url for more results. This discloses pagination behavior and return structure.
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 into 'Args' and 'Returns' sections, with each parameter explained concisely. It is front-loaded with the main purpose. While slightly lengthy, every sentence adds value, making it efficient for a complex tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters, 100% schema coverage, and annotations present, the description adequately explains the return value and pagination. It does not cover error handling or rate limits, but for a read-only idempotent tool, this is acceptable. The explanation of how to fetch more pages is particularly helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant meaning: examples for act_id prefix, common fields list, effective_status options, default limit of 25, and how to use pagination cursors (after/before). It also explains that date_preset is ignored if time_range is provided, and describes the return object structure.
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 'Retrieve all ads from a specific Meta ad account with filtering and pagination', clearly stating the action (retrieve), resource (ads), and scope (by ad account). This distinguishes it from sibling tools like get_ads_by_adset or get_ads_by_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 mentions filtering and pagination but does not explicitly guide when to use this tool over alternatives like get_ads_by_campaign or get_ads_by_adset. Usage context is implied but not explicit with when-not or direct comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_ads_by_adsetGet Meta Ads by Ad SetARead-onlyIdempotent
Retrieve all ads belonging to a specific Meta ad set with filtering and pagination.
Args:
adset_id (string): Ad set ID, e.g., '23843211234567'
fields (string[]): Fields per ad. Common: id, name, account_id, adset_id, campaign_id, status, effective_status, configured_status, creative, bid_amount, bid_type, created_time, updated_time, targeting, conversion_specs, recommendations, preview_shareable_link
effective_status (string[]): Filter by status: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, CAMPAIGN_PAUSED, ARCHIVED, IN_PROCESS, WITH_ISSUES
filtering (object[]): Filter objects. Operators: EQUAL, NOT_EQUAL, GREATER_THAN, GREATER_THAN_OR_EQUAL, LESS_THAN, LESS_THAN_OR_EQUAL, IN_RANGE, NOT_IN_RANGE, CONTAIN, NOT_CONTAIN, IN, NOT_IN, EMPTY, NOT_EMPTY
limit (number): Results per page (1-100, default: 25, max: 100)
after / before (string): Pagination cursors
date_format (string): Date format for response
Returns: Object with data (ad array) and paging. Use meta_ads_fetch_pagination_url with paging.next for more results.
| Name | Required | Description | Default |
|---|---|---|---|
| adset_id | Yes | Ad set ID, e.g., '23843211234567' | |
| fields | No | List of specific fields to retrieve. If omitted, default fields are returned | |
| filtering | No | List of filter objects. Each has 'field', 'operator', and 'value'. Example: [{field: 'spend', operator: 'GREATER_THAN', value: 50}] | |
| effective_status | No | Filter by effective status. Options: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, CAMPAIGN_PAUSED, ARCHIVED, ADSET_PAUSED, IN_PROCESS, WITH_ISSUES | |
| date_format | No | Format for date fields in response. 'U' = Unix timestamp (seconds), 'Y-m-d H:i:s' = MySQL datetime. Default: ISO 8601 | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, providing safety context. The description adds behavioral details: pagination cursors, return structure (data array and paging), and mentions using meta_ads_fetch_pagination_url for more results. This adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a leading sentence, a bullet list of parameters, and a return section. For 9 parameters, it is appropriately sized without being verbose. Each parameter gets a concise line.
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 9 parameters (1 required), no output schema, and annotations covering safety, the description explains the return structure and pagination well. It mentions how to get more results using a sibling tool. It lacks error handling or rate limit info, but for a read-only tool this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description bullet list restates schema parameters with some additional examples (e.g., common fields for 'fields', operators for 'filtering'). However, it does not add significant new meaning beyond what the schema already 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 'Retrieve all ads belonging to a specific Meta ad set with filtering and pagination', which is a clear verb+resource+scope. It distinguishes from siblings like meta_ads_get_ads_by_adaccount and meta_ads_get_ads_by_campaign by specifying 'by adset'.
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 (when you have an ad set ID) but does not explicitly mention when to use this tool versus alternatives like meta_ads_get_ads_by_campaign or meta_ads_get_ads_by_adaccount. No exclusions or when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_ads_by_campaignGet Meta Ads by CampaignARead-onlyIdempotent
Retrieve all ads belonging to a specific Meta campaign with filtering and pagination.
Args:
campaign_id (string): Campaign ID, e.g., '23843xxxxx'
fields (string[]): Fields per ad. Common: id, name, account_id, adset_id, campaign_id, status, effective_status, configured_status, creative, bid_amount, bid_type, created_time, updated_time, targeting, conversion_specs, recommendations, preview_shareable_link
effective_status (string[]): Filter by status: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, ADSET_PAUSED, ARCHIVED, IN_PROCESS, WITH_ISSUES
filtering (object[]): Additional filter objects with field, operator, value
limit (number): Results per page (1-100, default: 25)
after / before (string): Pagination cursors
Returns: Object with data (ad array) and paging. Use meta_ads_fetch_pagination_url with paging.next for more results.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | Campaign ID, e.g., '23843xxxxx' | |
| fields | No | List of specific fields to retrieve. If omitted, default fields are returned | |
| filtering | No | List of filter objects. Each has 'field', 'operator', and 'value'. Example: [{field: 'spend', operator: 'GREATER_THAN', value: 50}] | |
| effective_status | No | Filter by effective status. Options: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, CAMPAIGN_PAUSED, ARCHIVED, ADSET_PAUSED, IN_PROCESS, WITH_ISSUES | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. Description adds behavioral context: filtering, pagination, return shape (data array + paging), and recommendation to use meta_ads_fetch_pagination_url. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with Args and Returns sections, uses clear bullet points. It is informative without being overly verbose. Could slightly reduce redundancy with schema but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters and no output schema, description covers essential aspects: parameter details, return shape, pagination, and cross-reference to pagination tool. Sufficient for most usage scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description provides additional practical details like example values for campaign_id, full list of effective_status options, filtering object structure with operator examples, and pagination cursor usage. Adds meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Retrieve all ads belonging to a specific Meta campaign' with specific verb and resource. Distinguishes from sibling tools that retrieve ads by ad account or adset.
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?
Description implies usage for retrieving ads per campaign but lacks explicit guidance on when to use this vs alternatives like meta_ads_get_ads_by_adaccount. No exclusion criteria or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_adset_by_idGet Meta Ad Set by IDARead-onlyIdempotent
Retrieve detailed information about a specific Meta ad set.
Args:
adset_id (string): Ad set ID, e.g., '23843211234567'
fields (string[]): Fields per ad set. Common: id, name, account_id, campaign_id, status, effective_status, daily_budget, lifetime_budget, budget_remaining, bid_amount, bid_strategy, billing_event, optimization_goal, targeting, start_time, end_time, created_time, updated_time, pacing_type, destination_type
Returns: Object with the requested ad set fields.
Examples:
Use when: "Get the targeting and budget for ad set 23843211234567"
Use when: "What is the optimization goal and status of this ad set?"
| Name | Required | Description | Default |
|---|---|---|---|
| adset_id | Yes | Ad set ID, e.g., '23843211234567' | |
| fields | No | List of specific fields to retrieve. If omitted, default fields are returned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds context about returning an object with requested fields and lists common fields, but does not disclose additional behavioral traits beyond what annotations imply. The bar is lower due to rich annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately sized and includes structured sections (Args, Returns, Examples). The 'Args' section largely duplicates the schema but adds practical examples. It is front-loaded with the main purpose, but could be slightly more concise by omitting redundant arg details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given low tool complexity, no output schema, and thorough annotations, the description adequately covers retrieval behavior. It specifies return format as an object with requested fields, and the examples cover common use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description enhances understanding by providing a list of common fields (e.g., id, name, budget) and examples of use, adding value beyond the schema's brief 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 the tool retrieves detailed information about a specific Meta ad set. The verb 'retrieve' is specific, and the resource 'ad set' is well-defined. Among sibling tools like meta_ads_get_ad_by_id, this tool is distinctly focused on ad sets, making its purpose 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 two concrete 'Use when' examples, such as retrieving targeting and budget for a specific ad set. However, it does not explicitly state when not to use this tool or mention alternative tools for different purposes, which would improve guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_adset_insightsGet Meta Ad Set InsightsARead-onlyIdempotent
Retrieve performance insights for a specific Meta ad set.
Provides advertising statistics for an ad set, useful for analyzing performance across its child ads.
Args:
adset_id (string): Ad set ID, e.g., '6123456789012'
fields (string[]): Metrics to retrieve. Common: adset_name, campaign_name, impressions, clicks, spend, ctr, reach, actions, cpc, cpm, cpp, cost_per_action_type
date_preset (string): Relative time range preset (default: last_30d)
time_range (object): Custom range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}
level (string): Aggregation level: adset, ad (default: adset)
breakdowns (string[]): Segment by: age, gender, country, publisher_platform, impression_device, platform_position, etc.
See full parameter list in inputSchema
Returns: Object with:
data (array): List of insight records with requested metrics
paging (object): Pagination cursors. Use meta_ads_fetch_pagination_url with paging.next to get more results
Pagination note: When response contains paging.next, use meta_ads_fetch_pagination_url to retrieve additional pages automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Metrics and dimensions to retrieve. Common examples: impressions, reach, clicks, spend, ctr, cpc, cpm, cpp, frequency, actions, conversions, cost_per_action_type, date_start, date_stop | |
| date_preset | No | Predefined relative time range. Options: today, yesterday, this_month, last_month, this_quarter, 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. Default: last_30d. Ignored if time_range, time_ranges, since, or until is provided | last_30d |
| time_range | No | Specific time range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}. Overrides date_preset | |
| time_ranges | No | Array of time range objects for period comparison. Overrides time_range and date_preset | |
| time_increment | No | Time breakdown granularity: integer 1-90 (days per point), 'monthly', or 'all_days' (single summary). Default: all_days | all_days |
| level | No | Level of aggregation: account, campaign, adset, or ad | |
| action_attribution_windows | No | Attribution windows for actions. Examples: 1d_view, 7d_view, 28d_view, 1d_click, 7d_click, 28d_click, dda, default | |
| action_breakdowns | No | Segments the actions results. Examples: action_device, action_type, conversion_destination, action_destination. Default: [action_type] | |
| action_report_time | No | When actions are counted: impression (time of ad impression), conversion (time of conversion), mixed. Default: mixed | |
| breakdowns | No | Segment results by dimensions. Examples: age, gender, country, region, dma, impression_device, publisher_platform, platform_position, device_platform | |
| default_summary | No | If true, include an additional summary row in the response. Default: false | |
| use_account_attribution_setting | No | If true, use the attribution settings defined at the ad account level. Default: false | |
| use_unified_attribution_setting | No | If true, use unified attribution settings defined at the ad set level. Recommended for consistency with Ads Manager. Default: true | |
| filtering | No | List of filter objects. Each has 'field', 'operator', and 'value'. Example: [{field: 'spend', operator: 'GREATER_THAN', value: 50}] | |
| sort | No | Sort field and direction. Format: {field}_ascending or {field}_descending. Example: impressions_descending | |
| since | No | Start timestamp for time-based pagination (Unix or strtotime). Only used when time_range and time_ranges are not set | |
| until | No | End timestamp for time-based pagination (Unix or strtotime). Only used when time_range and time_ranges are not set | |
| locale | No | Locale for text responses (e.g., en_US). Controls language and formatting | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip | |
| adset_id | Yes | Ad set ID, e.g., '6123456789012' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=true, destructiveHint=false) align with the description, which adds pagination behavior and return format details. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with Args and Returns sections, but could be slightly more concise; still clear and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers usage, pagination, return format, and parameter guidance thoroughly, despite no output schema and many parameters.
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 100% schema coverage, the description still adds value by listing common fields, providing examples, and explaining pagination, effectively complementing 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?
Clearly states it retrieves performance insights for a specific Meta ad set, which distinguishes it from sibling tools for ads, campaigns, and 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?
Implies usage for ad set analysis and includes a pagination note directing to meta_ads_fetch_pagination_url, but does not explicitly compare to alternative insight tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_adsets_by_adaccountGet Meta Ad Sets by Ad AccountARead-onlyIdempotent
Retrieve all ad sets from a specific Meta ad account with filtering and pagination.
Args:
act_id (string): Ad account ID prefixed with 'act_', e.g., 'act_1234567890'
fields (string[]): Fields per ad set. Common: id, name, account_id, campaign_id, status, effective_status, daily_budget, lifetime_budget, budget_remaining, bid_amount, bid_strategy, billing_event, optimization_goal, targeting, start_time, end_time, created_time, updated_time, pacing_type, destination_type
effective_status (string[]): Filter by status: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, CAMPAIGN_PAUSED, ARCHIVED, WITH_ISSUES
filtering (object[]): Additional filter objects, e.g., [{field: 'daily_budget', operator: 'GREATER_THAN', value: 1000}]
limit (number): Results per page (1-100, default: 25)
after / before (string): Pagination cursors
date_preset / time_range: Date filter
updated_since (number): Unix timestamp — return ad sets updated since this time
date_format (string): Date format for response
Returns: Object with data (ad set array) and paging. Use meta_ads_fetch_pagination_url with paging.next for more results.
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | Yes | Ad account ID prefixed with 'act_', e.g., 'act_1234567890' | |
| fields | No | List of specific fields to retrieve. If omitted, default fields are returned | |
| filtering | No | List of filter objects. Each has 'field', 'operator', and 'value'. Example: [{field: 'spend', operator: 'GREATER_THAN', value: 50}] | |
| date_preset | No | Predefined relative time range. Options: today, yesterday, this_month, last_month, this_quarter, 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. Default: last_30d. Ignored if time_range, time_ranges, since, or until is provided | |
| time_range | No | Custom time range with since/until dates in YYYY-MM-DD format | |
| updated_since | No | Return ad sets updated since this Unix timestamp | |
| effective_status | No | Filter by effective status. Options: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, CAMPAIGN_PAUSED, ARCHIVED, ADSET_PAUSED, IN_PROCESS, WITH_ISSUES | |
| date_format | No | Format for date fields in response. 'U' = Unix timestamp (seconds), 'Y-m-d H:i:s' = MySQL datetime. Default: ISO 8601 | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds significant behavioral context beyond annotations: it explains pagination (use meta_ads_fetch_pagination_url), lists filter operators and effective status options, mentions date presets and time ranges, and describes the return structure. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized for a tool with 12 parameters. It is structured with Args and Returns sections, keeping the main purpose upfront. Each sentence contributes information; however, some details (e.g., common fields list) could be slightly abbreviated without losing value. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (12 params, nested objects, no output schema), the description covers most aspects: required parameter (act_id), filtering, pagination, date handling, status filtering, and a link to a pagination sibling tool. It lacks explanation of the response data structure in more detail (e.g., how fields map to ad set properties) and doesn't mention rate limits or limits on results per call beyond the limit parameter. Overall, it is fairly 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 100%, so baseline is 3. The description adds value by providing common field examples (id, name, daily_budget, etc.), effective status enumeration details, a filtering example syntax (e.g., {field: 'daily_budget', operator: 'GREATER_THAN', value: 1000}), and explains pagination cursors. These go beyond the schema's parameter 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 the tool retrieves all ad sets from a specific Meta ad account with filtering and pagination. The verb 'retrieve' and resource 'ad sets' are specific. It distinguishes from siblings like meta_ads_get_adsets_by_campaign by specifying the scope is all ad sets from an ad account, not filtered by campaign.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool (when needing ad sets from an ad account). It implies when not to use it (e.g., for a single ad set use get_adset_by_id, or for campaign-specific use get_adsets_by_campaign) but does not explicitly name alternatives or exclusions. The inclusion of pagination guidance and filtering examples further aids usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_adsets_by_campaignGet Meta Ad Sets by CampaignARead-onlyIdempotent
Retrieve all ad sets belonging to a specific Meta campaign with filtering and pagination.
Args:
campaign_id (string): Campaign ID, e.g., '23843xxxxx'
fields (string[]): Fields per ad set. Common: id, name, account_id, campaign_id, status, effective_status, daily_budget, lifetime_budget, budget_remaining, bid_amount, bid_strategy, billing_event, optimization_goal, targeting, start_time, end_time, created_time, updated_time, pacing_type, destination_type
effective_status (string[]): Filter by status: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, ARCHIVED, WITH_ISSUES
filtering (object[]): Additional filter objects, e.g., [{field: 'optimization_goal', operator: 'IN', value: ['OFFSITE_CONVERSIONS', 'VALUE']}]
limit (number): Results per page (1-100, default: 25)
after / before (string): Pagination cursors
date_format (string): Date format for response
Returns: Object with data (ad set array) and paging. Use meta_ads_fetch_pagination_url with paging.next for more results.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | Campaign ID, e.g., '23843xxxxx' | |
| fields | No | List of specific fields to retrieve. If omitted, default fields are returned | |
| filtering | No | List of filter objects. Each has 'field', 'operator', and 'value'. Example: [{field: 'spend', operator: 'GREATER_THAN', value: 50}] | |
| effective_status | No | Filter by effective status. Options: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, CAMPAIGN_PAUSED, ARCHIVED, ADSET_PAUSED, IN_PROCESS, WITH_ISSUES | |
| date_format | No | Format for date fields in response. 'U' = Unix timestamp (seconds), 'Y-m-d H:i:s' = MySQL datetime. Default: ISO 8601 | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds transparency about pagination behavior and the return structure (data array and paging object), which is helpful beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it starts with a clear one-sentence summary, then lists parameters in a readable block. While the parameter list is long, it is necessary given the tool's complexity (9 parameters). No unnecessary sentences.
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 the absence of an output schema, the description explains the return format and pagination mechanism. It provides enough context for an agent to select and invoke the tool correctly, including how to get more results using a sibling tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents parameters. However, the description adds value by providing common field examples, default values (e.g., limit default 25), and example filtering objects, which aids in understanding parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool retrieves all ad sets belonging to a specific campaign, with filtering and pagination. This distinguishes it from sibling tools like meta_ads_get_adsets_by_adaccount and meta_ads_get_adsets_by_ids.
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 how to use pagination (referencing meta_ads_fetch_pagination_url) and provides parameter details, but it does not explicitly mention when to use this tool versus alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_adsets_by_idsGet Multiple Meta Ad Sets by IDsARead-onlyIdempotent
Retrieve information for multiple Meta ad sets in a single API call (batch lookup).
Efficient when you need data for several ad sets at once.
Args:
adset_ids (string[]): List of ad set IDs to retrieve, e.g., ['23843211234567', '23843211234568']
fields (string[]): Fields per ad set. Common: id, name, account_id, campaign_id, status, effective_status, daily_budget, lifetime_budget, budget_remaining, bid_amount, bid_strategy, billing_event, optimization_goal, targeting, start_time, end_time, created_time, updated_time, pacing_type, destination_type
date_format (string): Date format: 'U' for Unix timestamp, 'Y-m-d H:i:s' for MySQL datetime
Returns: Object where keys are ad set IDs and values are the corresponding ad set details.
Examples:
Use when: "Get details for ad sets 23843211234567, 23843211234568, and 23843211234569"
| Name | Required | Description | Default |
|---|---|---|---|
| adset_ids | Yes | List of ad set IDs, e.g., ['23843211234567', '23843211234568'] | |
| fields | No | List of specific fields to retrieve. If omitted, default fields are returned | |
| date_format | No | Format for date fields in response. 'U' = Unix timestamp (seconds), 'Y-m-d H:i:s' = MySQL datetime. Default: ISO 8601 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, nondestructive. The description adds that it returns an object keyed by ad set IDs, which is useful. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise, front-loaded with primary purpose, and structured with Args and Returns sections. Every sentence provides value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains the return format. It covers inputs and usage examples. It does not address error handling or edge cases, but for a simple read tool this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions. The description adds concrete examples for adset_ids and fields list, plus explains date_format values. This adds significant clarity beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves multiple Meta ad sets in a single call (batch lookup). It uses specific verb and resource, and distinguishes from sibling tools like meta_ads_get_adset_by_id (single) and meta_ads_get_adsets_by_adaccount (account-filtered).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says 'Efficient when you need data for several ad sets at once' and provides an example. It implicitly tells when to use it but does not explicitly exclude cases like needing a single ad set, though sibling tool names provide context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_ad_videoGet Meta Ad VideoARead-onlyIdempotent
Get video details (source URL, thumbnail, title, duration) for a Meta ad video. Provide either ad_id (server resolves the video_id from the ad's creative) or video_id directly. Pass act_id when available — the /act_X/advideos edge avoids permission errors (#10 / #33) that hit the bare /{video_id} node for BM-shared or page-owned videos.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | No | ||
| video_id | No | ||
| act_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true, etc. Description adds valuable behavioral context: how ad_id resolves to video_id via the creative, and that using act_id avoids permission errors #10/#33. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with return values, then usage notes. Every sentence earns its place; no redundancy or 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?
Given the tool's simplicity and rich annotations, the description covers purpose, parameters, usage behavior, and error avoidance. No output schema needed as return fields are listed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, but description explains the meaning of each parameter: ad_id as alternative to video_id, and act_id to avoid errors. Fully compensates for lack of 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 'Get video details (source URL, thumbnail, title, duration) for a Meta ad video', with specific verb and resource. No sibling tool retrieves video details, so it is well-distinguished.
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 on when to use ad_id vs video_id, and recommends passing act_id to avoid permission errors. Provides actionable context for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_campaign_by_idGet Meta Campaign by IDARead-onlyIdempotent
Retrieve detailed information about a specific Meta ad campaign.
Args:
campaign_id (string): Campaign ID, e.g., '23843xxxxx'
fields (string[]): Fields to retrieve. Available: id, name, account_id, objective, status, effective_status, configured_status, daily_budget, lifetime_budget, budget_remaining, spend_cap, bid_strategy, buying_type, created_time, updated_time, start_time, stop_time, special_ad_categories, pacing_type, promoted_object, issues_info, recommendations
date_format (string): Date format: 'U' for Unix timestamp, 'Y-m-d H:i:s' for MySQL datetime, default: ISO 8601
Returns: Object with the requested campaign fields.
Examples:
Use when: "Get details for campaign 23843xxxxx"
Use when: "What is the objective and status of my campaign?"
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | Campaign ID, e.g., '23843xxxxx' | |
| fields | No | List of specific fields to retrieve. If omitted, default fields are returned | |
| date_format | No | Format for date fields in response. 'U' = Unix timestamp (seconds), 'Y-m-d H:i:s' = MySQL datetime. Default: ISO 8601 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, which the description respects. The description adds context by listing available fields and describing return format, but does not go beyond what annotations already indicate about safety.
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 (summary, Args, Returns, Examples) and front-loaded purpose. Every sentence adds value, though slightly verbose with redundant examples.
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 no output schema, the description explains the return format and lists available fields and date format options. It covers sufficient detail for a simple retrieval tool, leaving little ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description's parameter details largely duplicate the schema. It adds minor value by listing example values and default date format, but does not compensate significantly beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Retrieve detailed information about a specific Meta ad campaign,' specifying the verb and resource. It includes examples and distinguishes itself from siblings that retrieve campaigns by other criteria.
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 'Use when' examples, indicating clear usage context. However, it does not explicitly mention when not to use or suggest alternatives among the many sibling tools, though the sibling list implies differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_campaign_insightsGet Meta Campaign InsightsARead-onlyIdempotent
Retrieve performance insights for a specific Meta ad campaign.
Fetches advertising statistics for a campaign, allowing analysis of metrics like impressions, clicks, conversions, spend, etc.
Args:
campaign_id (string): Campaign ID, e.g., '23843xxxxx'
fields (string[]): Metrics to retrieve. Common: campaign_name, impressions, clicks, spend, ctr, reach, actions, objective, cpc, cpm, date_start, date_stop
date_preset (string): Relative time range preset (default: last_30d)
time_range (object): Custom range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}
level (string): Aggregation level: campaign, adset, ad (default: campaign)
breakdowns (string[]): Segment by: age, gender, country, publisher_platform, impression_device, etc.
See full parameter list in inputSchema
Returns: Object with:
data (array): List of insight records with requested metrics
paging (object): Pagination cursors. Use meta_ads_fetch_pagination_url with paging.next to get more results
Pagination note: When response contains paging.next, use meta_ads_fetch_pagination_url to retrieve additional pages automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Metrics and dimensions to retrieve. Common examples: impressions, reach, clicks, spend, ctr, cpc, cpm, cpp, frequency, actions, conversions, cost_per_action_type, date_start, date_stop | |
| date_preset | No | Predefined relative time range. Options: today, yesterday, this_month, last_month, this_quarter, 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. Default: last_30d. Ignored if time_range, time_ranges, since, or until is provided | last_30d |
| time_range | No | Specific time range {'since':'YYYY-MM-DD','until':'YYYY-MM-DD'}. Overrides date_preset | |
| time_ranges | No | Array of time range objects for period comparison. Overrides time_range and date_preset | |
| time_increment | No | Time breakdown granularity: integer 1-90 (days per point), 'monthly', or 'all_days' (single summary). Default: all_days | all_days |
| level | No | Level of aggregation: account, campaign, adset, or ad | |
| action_attribution_windows | No | Attribution windows for actions. Examples: 1d_view, 7d_view, 28d_view, 1d_click, 7d_click, 28d_click, dda, default | |
| action_breakdowns | No | Segments the actions results. Examples: action_device, action_type, conversion_destination, action_destination. Default: [action_type] | |
| action_report_time | No | When actions are counted: impression (time of ad impression), conversion (time of conversion), mixed. Default: mixed | |
| breakdowns | No | Segment results by dimensions. Examples: age, gender, country, region, dma, impression_device, publisher_platform, platform_position, device_platform | |
| default_summary | No | If true, include an additional summary row in the response. Default: false | |
| use_account_attribution_setting | No | If true, use the attribution settings defined at the ad account level. Default: false | |
| use_unified_attribution_setting | No | If true, use unified attribution settings defined at the ad set level. Recommended for consistency with Ads Manager. Default: true | |
| filtering | No | List of filter objects. Each has 'field', 'operator', and 'value'. Example: [{field: 'spend', operator: 'GREATER_THAN', value: 50}] | |
| sort | No | Sort field and direction. Format: {field}_ascending or {field}_descending. Example: impressions_descending | |
| since | No | Start timestamp for time-based pagination (Unix or strtotime). Only used when time_range and time_ranges are not set | |
| until | No | End timestamp for time-based pagination (Unix or strtotime). Only used when time_range and time_ranges are not set | |
| locale | No | Locale for text responses (e.g., en_US). Controls language and formatting | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip | |
| campaign_id | Yes | Campaign ID, e.g., '23843xxxxx' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint. The description adds valuable behavioral context: it explains the return structure (data, paging), pagination (use meta_ads_fetch_pagination_url), and typical metrics. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (overview, args, returns, note). It is moderately lengthy but each part serves a purpose. A minor reduction in redundant details could improve conciseness, but overall it's efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (23 parameters, no output schema), the description covers essential aspects: purpose, common metrics, pagination handling, and basic return structure. It does not explain all parameter interactions or edge cases, but provides sufficient context for an AI agent to use the tool effectively.
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 100% description coverage for all 23 parameters. The description lists some common fields but does not add substantial meaning beyond the schema. The docstring-style args repeat schema info without deeper insight, so baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves performance insights for a specific Meta ad campaign. It specifies the resource (campaign) and the action (retrieve insights). However, it does not explicitly differentiate from sibling tools like meta_ads_get_ad_insights or meta_ads_get_adset_insights, relying on the tool name for distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives (e.g., meta_ads_get_ad_insights, meta_ads_get_adaccount_insights). It implies campaign-level focus but doesn't state exclusions or prerequisites, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_campaigns_by_adaccountGet Meta Campaigns by Ad AccountARead-onlyIdempotent
Retrieve all campaigns from a specific Meta ad account with filtering and pagination.
Args:
act_id (string): Ad account ID prefixed with 'act_', e.g., 'act_1234567890'
fields (string[]): Fields per campaign. Common: id, name, objective, effective_status, created_time, daily_budget, lifetime_budget, budget_remaining
effective_status (string[]): Filter by status: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, ARCHIVED, WITH_ISSUES
objective (string[]): Filter by objective: APP_INSTALLS, BRAND_AWARENESS, CONVERSIONS, EVENT_RESPONSES, LEAD_GENERATION, LINK_CLICKS, MESSAGES, PAGE_LIKES, POST_ENGAGEMENT, PRODUCT_CATALOG_SALES, REACH, VIDEO_VIEWS
filtering (object[]): Additional filter objects with field, operator, value
limit (number): Results per page (1-100, default: 25)
after / before (string): Pagination cursors
date_preset / time_range: Date filter for campaigns
updated_since (number): Return campaigns updated since this Unix timestamp
is_completed (boolean): True = only completed, False = only active, null = both
special_ad_categories (string[]): Filter by: EMPLOYMENT, HOUSING, CREDIT, ISSUES_ELECTIONS_POLITICS, NONE
include_drafts (boolean): Include draft campaigns if true
date_format (string): Date format for response
Returns: Object with data (campaign array) and paging. Use meta_ads_fetch_pagination_url with paging.next for more results.
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | Yes | Ad account ID prefixed with 'act_', e.g., 'act_1234567890' | |
| fields | No | List of specific fields to retrieve. If omitted, default fields are returned | |
| filtering | No | List of filter objects. Each has 'field', 'operator', and 'value'. Example: [{field: 'spend', operator: 'GREATER_THAN', value: 50}] | |
| date_preset | No | Predefined relative time range. Options: today, yesterday, this_month, last_month, this_quarter, 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. Default: last_30d. Ignored if time_range, time_ranges, since, or until is provided | |
| time_range | No | Custom time range with since/until dates in YYYY-MM-DD format | |
| updated_since | No | Return campaigns updated since this Unix timestamp | |
| effective_status | No | Filter by effective status. Options: ACTIVE, PAUSED, DELETED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, PENDING_BILLING_INFO, CAMPAIGN_PAUSED, ARCHIVED, ADSET_PAUSED, IN_PROCESS, WITH_ISSUES | |
| is_completed | No | True = only completed, False = only active, null = both | |
| special_ad_categories | No | Filter by special ad categories: EMPLOYMENT, HOUSING, CREDIT, ISSUES_ELECTIONS_POLITICS, NONE | |
| objective | No | Filter by objective: APP_INSTALLS, BRAND_AWARENESS, CONVERSIONS, EVENT_RESPONSES, LEAD_GENERATION, LINK_CLICKS, MESSAGES, PAGE_LIKES, POST_ENGAGEMENT, PRODUCT_CATALOG_SALES, REACH, VIDEO_VIEWS | |
| buyer_guarantee_agreement_status | No | Filter by buyer guarantee agreement status: APPROVED, NOT_APPROVED | |
| date_format | No | Format for date fields in response. 'U' = Unix timestamp (seconds), 'Y-m-d H:i:s' = MySQL datetime. Default: ISO 8601 | |
| include_drafts | No | Include draft campaigns in results if true | |
| limit | No | Maximum number of results to return per page (1-100, default: 25) | |
| after | No | Cursor for the next page of results, from response.paging.cursors.after | |
| before | No | Cursor for the previous page of results, from response.paging.cursors.before | |
| offset | No | Alternative pagination: number of results to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior. The description aligns and adds value by detailing pagination via meta_ads_fetch_pagination_url and parameter options. No contradictions.
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 bullet points and sections, but it is relatively long. However, every section adds value (parameter details, return info). It could be slightly more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 17 parameters, nested objects, pagination, and no output schema, the description covers all parameters, return format, and references the pagination tool. It is fully adequate for agent understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaning beyond schemas by listing common fields, enumerating filter values, and explaining pagination cursors. This compensates for the high coverage baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'retrieve', the resource 'campaigns', and the context 'from a specific Meta ad account'. It mentions filtering and pagination, distinguishing it from siblings like get_campaign_by_id (single campaign) or get_campaign_insights (insights).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing campaigns but provides no explicit guidance on when to use this tool versus siblings (e.g., get_campaign_by_id for a single campaign). No when-not-to-use or alternative comparisons are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_image_by_hashGet Meta Ad Image by HashARead-onlyIdempotent
Look up a single image in an ad account's image library by hash. Returns the CDN url, dimensions, name, and status — useful when you only have the hash (e.g., from upload_ad_image or a creative's object_story_spec.link_data.image_hash) and need the URL.
| Name | Required | Description | Default |
|---|---|---|---|
| act_id | Yes | Ad account ID prefixed with 'act_' (bare numeric also accepted) | |
| image_hash | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly and idempotent; description adds value by detailing returned fields (CDN url, dimensions, name, status) and contextualizing hash origin. No contradiction.
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?
Short, front-loaded with main action, every sentence informative. 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?
Covers purpose, usage, and key return values. Lacks error handling or edge cases, but sufficient for a simple lookup tool given annotations and 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 50% (only act_id described). Description adds context for image_hash (where it comes from) but not for act_id. Partially compensates for missing schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Look up a single image... by hash,' specifying verb, resource, and key parameter. It distinguishes from siblings by focusing on single hash-based retrieval, contrasting with batch or other retrieval 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?
Description provides explicit use case when you have a hash and need the URL, referencing related functions like upload_ad_image. However, it doesn't explicitly state when not to use or mention alternatives like meta_ads_get_ad_images for multiple hashes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_get_interest_suggestionsGet Meta Ad Interest SuggestionsARead-onlyIdempotent
Given a seed list of interest names, return related/suggested interests.
Args:
interest_list (string[]): Seed interest names, e.g., ["Basketball", "Soccer"]
limit (number, optional): Max suggestions (default 25)
| Name | Required | Description | Default |
|---|---|---|---|
| interest_list | Yes | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds that it returns suggestions and takes a seed list, but does not elaborate on request limits or data behavior beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the core action. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description implies the return type (related suggestions). It is sufficient for a simple tool, though could mention if output is an array or other structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description explains interest_list as 'Seed interest names' with an example and limit as 'Max suggestions'. This adds meaning beyond the schema's type and 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 returns related/suggested interests from a seed list. It distinguishes from siblings like 'meta_ads_search_interests' by specifying it takes a seed list for suggestions rather than searching by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., meta_ads_search_interests). The description does not specify context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_list_ad_accountsList Meta Ad AccountsARead-onlyIdempotent
List all ad accounts associated with the authenticated Facebook user.
Returns account names and IDs. When the response contains a paging.next URL, use meta_ads_fetch_pagination_url to retrieve additional pages.
Returns: Object with adaccounts.data array, each containing:
id (string): Ad account ID prefixed with 'act_' (e.g., 'act_1234567890')
name (string): Display name of the ad account
Examples:
Use when: "Show me all my ad accounts"
Use when: "What ad accounts do I have access to?"
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds context about pagination and return format, enhancing transparency without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with separate sections for purpose, returns, and examples. 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 simple, parameterless, read-only tool, the description fully covers what it does, the return structure, and pagination. No gaps given the existing annotations and 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 tool has no parameters, so schema coverage is 100%. The description does not add parameter information, but none is needed. Baseline for zero params is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all ad accounts for the authenticated user, with specific verb and resource. It is well-distinguished from sibling tools which focus on other entities like campaigns, ads, or insights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage examples and mentions pagination handling. However, it does not explicitly state when not to use this tool or compare with alternatives, though the sibling context implicitly differentiates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_search_behaviorsSearch Meta Ad BehaviorsARead-onlyIdempotent
List available behavior targeting options.
Args:
limit (number, optional): Max results (default 50)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, reducing the burden on the description. The description adds no further behavioral details beyond the limit parameter, which is acceptable but not enriched.
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 two sentences, no filler, and the most important information (what the tool does) is front-loaded. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description does not explain the format or structure of the returned behavior options. For a list tool, this lack of return value details leaves some ambiguity, though the sibling tools similarly lack such details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero description coverage, but the description adds meaningful context for the limit parameter: 'Max results (default 50)'. This clarifies the parameter's purpose and default value beyond the schema definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List') and the resource ('behavior targeting options'). It distinguishes from sibling search tools like meta_ads_search_interests and meta_ads_search_demographics.
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 such as interest or demographic search tools. The description lacks contextual usage advice or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_search_demographicsSearch Meta Ad DemographicsARead-onlyIdempotent
List demographic targeting options. Pass demographic_class to scope the results (default: 'demographics'). Other valid classes: 'life_events', 'industries', 'income', 'family_statuses', 'user_device', 'user_os'.
| Name | Required | Description | Default |
|---|---|---|---|
| demographic_class | No | Targeting category class (default: demographics) | |
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint. The description adds that the tool lists options and defaults to 'demographics', but does not detail return format or pagination. Acceptable given annotations cover safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main action, no redundant words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, description does not explain return values or pagination. For a simple list tool, the description is adequate but not fully complete given the lack of output details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 50% of parameters with descriptions; demographic_class is described with default and enum, limit lacks description. The description repeats the default and enum but adds no new info for limit, failing to compensate for the missing parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists demographic targeting options, with a specific verb and resource. It distinguishes from siblings by mentioning the demographic_class parameter that scopes results to 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 explicitly instructs to pass demographic_class to scope results and lists valid class values. It provides clear context but does not mention when not to use this tool or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_search_geo_locationsSearch Meta Ad Geo LocationsARead-onlyIdempotent
Search Meta's geographic targeting catalog by query string. Returns location keys to use in targeting.geo_locations.
Args:
q (string): Search term (e.g., "New York", "Japan")
location_types (string[], optional): Filter by types: 'country', 'region', 'city', 'zip', 'geo_market', 'electoral_district'.
limit (number, optional): Max results (default 25)
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | ||
| location_types | No | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, nondestructive, idempotent, and open world hints. The description adds purpose and parameter details but does not elaborate on behavior beyond what annotations imply. It discloses that it returns location keys, which is useful but not extensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences and a parameter list. The purpose is front-loaded, and every sentence adds value without redundancy or 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 search tool with no output schema, the description adequately states what is returned (location keys) and how to use them. It could mention the response structure (e.g., each location has key, name, type) but is sufficient for basic use.
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 explains all three parameters: q with examples, location_types with full enum list, and limit with default value. This adds significant meaning beyond the schema's type-only 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 searches Meta's geographic targeting catalog by query string and returns location keys. The verb 'Search' is specific to the resource 'geographic targeting catalog', and it distinguishes from sibling tools like search_interests and search_behaviors by focusing on geographic locations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for finding geo locations to use in targeting, and the parameter details clarify how to use it. However, it does not explicitly state when not to use it or suggest alternatives, though the sibling tools provide natural alternatives for other targeting types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_search_interestsSearch Meta Ad InterestsARead-onlyIdempotent
Search Meta's interest targeting catalog by keyword. Returns interest IDs suitable for use in an ad set's targeting.flexible_spec.
Args:
q (string): Search term (e.g., "baseball", "cooking", "travel")
limit (number, optional): Max results (default 25)
Returns: { data: [{ id, name, audience_size_lower_bound, audience_size_upper_bound, path, topic }] }
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Search keyword for interests | |
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, so the safety profile is clear. The description adds context on how the results are used (in targeting.flexible_spec) and provides the return structure, including fields like id, name, audience_size. This adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences plus a parameter list and return structure. It is front-loaded with the main purpose. Every sentence adds value, with no redundant or extraneous text.
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 annotations and schema, the description is quite complete. It explains the output format and usage. However, it does not mention pagination or error handling, which could be useful but are not critical for a simple search tool. Overall, it provides sufficient context for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds significant meaning beyond the input schema: it provides examples for the 'q' parameter ('baseball', 'cooking', 'travel') and specifies the default value for 'limit' (25). The schema only provides type and constraints; the description enriches understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches Meta's interest targeting catalog by keyword. It specifies the exact resource (interest catalog) and action (search). The tool name and description differentiate it from sibling tools like meta_ads_search_behaviors and meta_ads_search_demographics, which search other targeting catalogs.
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 the output is suitable for use in an ad set's targeting.flexible_spec, indicating context. However, it does not provide explicit guidance on when not to use this tool versus alternatives, though the sibling tools' names imply differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_ads_search_pages_by_nameSearch Meta Pages by NameARead-onlyIdempotent
Search the user's pages by a case-insensitive substring of name or username.
Internally fetches /me/accounts then filters client-side. Meta's Graph API does not expose a server-side name filter on /me/accounts.
Args:
search_term (string): Substring to match against page name or username.
| Name | Required | Description | Default |
|---|---|---|---|
| search_term | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, non-destructive, and idempotent behavior. The description adds crucial details about client-side filtering and the lack of server-side name filter, going beyond annotations. It doesn't mention performance implications or output structure, but the added context is valuable.
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 (three sentences plus Args line) and front-loaded with the action. Every sentence adds value: what it does, how it works, and a key limitation. No unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only search tool, the description covers the main behavior and parameter. It could mention the return format (e.g., list of page objects) or potential performance concerns for large accounts, but it is generally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description carries full burden. It clearly explains that search_term is a substring to match against page name or username, adding essential meaning beyond the type and minLength constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches user's pages by case-insensitive substring of name or username, using an active verb and specific resource, and distinguishes from siblings like meta_ads_get_account_pages which retrieves all pages without filtering.
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 internal mechanism (client-side filtering after fetching all pages) and the Graph API limitation, implying when this tool is appropriate. However, it does not explicitly state alternatives or when not to use it, though context from siblings is available.
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.
35 tool updates
v1.5.1- First observed
meta_ads_compute_image_crops - First observed
meta_ads_estimate_audience_size - First observed
meta_ads_fetch_pagination_url - First observed
meta_ads_get_account_pages - First observed
meta_ads_get_activities_by_adaccount - First observed
meta_ads_get_activities_by_adset - First observed
meta_ads_get_ad_account_details - First observed
meta_ads_get_ad_by_id - First observed
meta_ads_get_ad_creative_by_id - First observed
meta_ads_get_ad_creatives_by_ad_id - First observed
meta_ads_get_ad_images - First observed
meta_ads_get_ad_insights - First observed
meta_ads_get_ad_previews - First observed
meta_ads_get_ad_video - First observed
meta_ads_get_adaccount_insights - First observed
meta_ads_get_adcreatives_by_adaccount - First observed
meta_ads_get_ads_by_adaccount - First observed
meta_ads_get_ads_by_adset - First observed
meta_ads_get_ads_by_campaign - First observed
meta_ads_get_adset_by_id - First observed
meta_ads_get_adset_insights - First observed
meta_ads_get_adsets_by_adaccount - First observed
meta_ads_get_adsets_by_campaign - First observed
meta_ads_get_adsets_by_ids - First observed
meta_ads_get_campaign_by_id - First observed
meta_ads_get_campaign_insights - First observed
meta_ads_get_campaigns_by_adaccount - First observed
meta_ads_get_image_by_hash - First observed
meta_ads_get_interest_suggestions - First observed
meta_ads_list_ad_accounts - First observed
meta_ads_search_behaviors - First observed
meta_ads_search_demographics - First observed
meta_ads_search_geo_locations - First observed
meta_ads_search_interests - First observed
meta_ads_search_pages_by_name
TDQS
Each tool targets a distinct resource and action, such as retrieving ads by account, adset, or campaign, and separate search tools for interests, behaviors, demographics, etc. There is minimal overlap or ambiguity.
All tool names follow a consistent `meta_ads_<verb>_<object>` pattern, using lowercase and underscores. Variations like `meta_ads_get_ads_by_adaccount` and `meta_ads_search_interests` are predictable and uniform.
With 35 tools, the count is well above the typical 15-25 range considered reasonable. While the domain is complex, the number feels excessive and could be streamlined.
The tool set is heavily read-oriented, covering listing, retrieving, and searching for various objects. However, it lacks essential write operations like create, update, or delete for campaigns, ad sets, ads, and creatives, which is a significant gap for typical advertising workflows.
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
60+ Meta Ads tools for AI agents: audits, campaign management, audiences and CAPI tracking.
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.
Query Meta Ads performance data — accounts, campaigns, ad sets, ads, metrics & settings.
Related MCP Servers
- AlicenseAqualityBmaintenanceA Model Context Protocol server that allows AI models to access, analyze, and manage Meta advertising campaigns, enabling LLMs to retrieve performance data, visualize ad creatives, and provide strategic insights for Facebook and Instagram platforms.371,234Business Source 1.1
- AlicenseCqualityCmaintenanceA local Model Context Protocol server that enables interaction with the Meta Marketing API to manage ad accounts, campaigns, and creatives. It provides tools for targeting research, insight reporting, and campaign management through local MCP clients like Claude Code and Cursor.4051AGPL 3.0
- AlicenseAqualityDmaintenanceMeta Ads MCP by ScaleForge — a Model Context Protocol server that exposes Meta (Facebook/Instagram) Ads management directly through the Graph API v24.032239MIT
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol server that lets AI assistants run your Meta Ads end to end — launch campaigns, upload creatives, update budgets, and dig into performance through natural conversation. Works across Facebook, Instagram, and other Meta surfaces.Business Source 1.1
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/hashcott/meta-ads-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server