Meta Ads by Get MCP Ads
A read-only Meta Ads MCP server for inspecting accounts, campaigns, creatives, audiences, catalogs, insights, and delivery diagnostics from an MCP client.
List and inspect ad accounts, campaigns, ad sets, ads, hierarchy, statuses, budgets, and schedules.
Query Ads Insights with metrics, breakdowns, date ranges, attribution settings, query validation, and raw Insights access.
Inspect creatives, creative assets, ad images/videos, ad previews, video sources, and uploaded video status.
Explore audiences, pixels/datasets, product catalogs/products, product insights, and brand safety controls.
Read A/B tests/conversion lift studies and interpret study results.
Discover Business assets, Pages, Instagram accounts, Page posts, organic content, and targeting options.
Diagnose delivery issues, activity logs, token health/scopes, entity configuration, and catalog batch status.
Use forward-compatible raw Graph reads via node fields, allowlisted edges, and raw Insights.
Access MCP resources such as metrics, breakdowns, compatibility rules, and workflow recipes.
Per README, 24 write tools exist but are disabled by default and require preview/confirmation; the supplied schema lists read-only tools only.
Enables reading Facebook Pages, posts, and organic engagement data through the Facebook/Meta Graph API.
Provides access to linked Instagram accounts and basic Instagram profile data.
Provides read and write access to Meta Ads, including campaigns, ad sets, ads, creatives, audiences, pixels, catalogs, insights, budgets, schedules, and campaign creation.
Meta Ads MCP server
Ask better questions about your Meta campaigns.
Compare campaign performance, inspect delivery and prepare changes from your MCP client.
Watch the film · What's new · Install · Tool reference · Try hosted getmcpads

The film shows hosted getmcpads with sample data. Its MCP Apps, from creative galleries and alerts to Google Sheets exports and bulk launches, belong to the hosted product. This repository provides the standalone native API tools.
42 read tools · 24 write tools, disabled by default.
Run locally with your own platform credentials and a client that supports stdio MCP, such as Claude Desktop, Claude Code or Cursor. Your requests go directly to the platform. For managed connections, including supported ChatGPT setups, use the hosted option.
What's new
v2.1.1: Zod 4 security update · October 26, 2026
Update
zodto 4.6.7. Every Zod release before 4.6.6 is covered by the high-severity advisory GHSA-mrhx-c7xc-m3w5: validating an oversized constrained collection can exhaust memory, and no Zod 3 release carries the fix.npm audit --omit=devreports no vulnerability again.Keep the Zod 3 validation behaviour. A parameter default is still validated and completed before use, so an omitted object must still supply its required fields.
Keep each parameter's own description when the parameter is optional or has a default. Zod 4 stores a description on the wrapped schema only, so the shared fallback description could otherwise replace it.
Tool names, parameters and descriptions published over MCP are unchanged.
server-card.jsonis regenerated with Zod 4's JSON Schema output, which spells some constraints differently.
Earlier releases
Version | Date | Highlights |
2.1.0 | October 23, 2026 | Gateway sync and runtime security update |
2.0.1 | September 23, 2026 | Public repository restored |
2.0.0 | September 20, 2026 | Gateway sync and security fixes |
1.1.0 | September 13, 2026 | Platform capability sync and quality contracts |
1.0.2 | August 30, 2026 | Announce the package version over MCP. |
1.0.1 | August 30, 2026 | Add |
1.0.0 | August 29, 2026 | First open-source release |
Source synchronization: SOURCE_SYNC.md.
Upgrade notes
Requires Node.js 22.23.4 or newer on the 22 line, 24.22.1 or newer on the 24 line, or 26.12.1 or newer. These releases carry the October 2026 security fixes. On an older runtime the server still starts and writes a warning to stderr. CI covers Node 22, 24 and 26. meta_health_check now reports a check it could not run as unknown, not as missing. Read the current tool schemas before reusing saved arguments. Writes remain optional and require explicit confirmation. Hosted creative integrations and MCP Apps UI are outside this release.
Related MCP server: Pinterest Ads by Get MCP Ads
Install this release
This is a GitHub source release. npm and MCP Registry versions are published separately. The commands below select this exact version; unpinned npx examples later in this document select the version currently available on npm.
git clone --branch v2.1.1 --depth 1 https://github.com/get-mcp-ads/meta-ads-mcp-server.git
cd meta-ads-mcp-server
npm ci
npm run buildConfigure your MCP client to run node with the absolute path to dist/cli.js and the platform credentials documented below.
Prefer a managed connection? Use Meta Ads with hosted getmcpads. Connect your account, select the data your assistant may access and use the hosted MCP connection. See the site for current features and plans.
What you get
42 read tools | Campaigns, ad sets, ads, creatives, audiences, pixels, catalogs, Pages, Instagram, activity logs, A/B tests and lift studies |
24 write tools | Off by default. Status, budgets, schedules, renames, campaign creation. Each one previews before it applies |
190 metrics | Including derived ones computed client-side (ROAS, CPA, frequency, hook rate, attribution-window views) |
56 breakdowns · 90 dimensions | With a compatibility matrix that catches invalid combinations before they hit the API |
7 resources | Live catalogues the model can read: metrics, breakdowns, compatibility rules, 11 workflow recipes |
Forward-compatible reads |
|
The query planner
Meta rejects many metric/breakdown combinations, and the error messages rarely say why. This server encodes the compatibility matrix, so it splits an impossible request into several valid API calls and merges the results instead of failing.
meta_validate_query lets the model check a combination before spending a call on it.
That is the difference between an assistant that reports "the API returned error 100" and
one that returns your numbers.
Getting a token
This is the one step that takes real effort, and it's worth doing properly.
You need a Meta access token with ads_read. There are three ways to get one; the
second is the one we recommend.
Recommended: System User token (does not expire)
A System User belongs to your Business, not to a person. Its token survives password changes and staff departures, and needs no App Review to access ad accounts your Business already owns.
Go to Business Settings → Users → System Users
Add a system user. Give it the Employee role unless you need more.
Assign Assets → select your ad accounts → grant View performance (add Manage campaigns only if you plan to enable writes).
Generate New Token → pick your app → select scope
ads_read(addads_managementonly for writes).Set the expiry to Never.
Copy the token. Meta shows it once.
📖 Meta's System User documentation
Quick test: Graph API Explorer (expires in ~1 hour)
Fine for trying the server out, useless for daily work.
Graph API Explorer → select your app →
add ads_read → Generate Access Token.
Long-lived user token (~60 days)
Exchange a short-lived token for a 60-day one. You will have to redo this every two months. 📖 Long-lived tokens
Which permissions?
Permission | When you need it |
| Always. Campaigns, insights, everything read-only |
| Only if you set |
| Optional. Business Manager asset discovery |
| Optional. Page posts and organic enrichment |
| Optional. Linked Instagram accounts |
| Optional. Product catalog reads |
Run meta_health_check as your first call: it reports which scopes you actually have
and which ones are missing for the tools you tried to use, without printing your token.
Setup
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS)
or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "@getmcpads/meta-ads-mcp-server"],
"env": {
"META_ACCESS_TOKEN": "your-token-here"
}
}
}
}Restart Claude Desktop. Ask it: "list my Meta ad accounts".
Claude Code
claude mcp add meta-ads --env META_ACCESS_TOKEN=your-token-here -- npx -y @getmcpads/meta-ads-mcp-serverCursor
.cursor/mcp.json in your project, same shape as the Claude Desktop config above.
From source
git clone https://github.com/get-mcp-ads/meta-ads-mcp-server.git
cd meta-ads-mcp-server
npm install && npm run build
cp .env.example .env # then fill in META_ACCESS_TOKEN
npm startConfiguration
Variable | Default | Meaning |
| none | Required. Your Meta access token |
| unset | Set to |
|
| Graph API version. Override to pin another |
|
|
|
Check your setup at any time:
npm run doctorWrites, and why they preview first
Write tools are disabled by default. Enable them with META_ENABLE_WRITES=1.
When enabled, every write tool returns a preview and changes nothing:
// meta_update_adset_budget { adSetId: "123", currency: "EUR", dailyBudget: 50 }
{
"applied": false,
"action": "meta_update_adset_budget",
"change": { "adSet": "123", "field": "daily_budget", "amount": 50,
"currency": "EUR", "inMinorUnits": 5000 },
"message": "Preview only, nothing was changed. Repeat the same call with confirm: true to apply this change to the live account."
}Only a second call carrying confirm: true touches the live account.
This is deliberate. An assistant composes these calls, and it can pick the wrong account, the wrong campaign, or the wrong order of magnitude on a budget. A mandatory preview makes the mistake visible before it costs money, and gives a human the stopping point the protocol does not guarantee on its own.
Two further guardrails:
meta_create_campaignalways creates the campaignPAUSED. There is no option to create it active.Budgets are converted to minor units per currency. The yen, the won and the CFA franc have no subunit, so sending 1250 for ¥12.50 would multiply the spend by a hundred. The server knows the zero-decimal currencies.
Tool | What it changes |
| Pause or reactivate |
| Daily or lifetime budget |
| Start and end time |
| Name only |
| Creates a campaign, always |
Tools
Every tool is listed below. See server-card.json for complete parameter and output schemas.
Tool | Purpose |
| Read-only connection diagnostic: inspects token identity and granted permissions, and lists accessible ad accounts without exposing the access token. |
| Discover accessible Meta Business assets read-only: businesses, pages, Instagram accounts, pixels, and datasets when permissions allow. |
| List accessible Facebook Pages with id, name, category, tasks, picture, and linked Instagram account references when available. |
| List Instagram accounts linked to accessible Pages, Business Manager assets, or an ad account when permissions allow. |
| List pixels and datasets from an ad account or Business Manager when accessible, returning actionable warnings for permission-limited edges. |
| Read ad account activity logs from /{ad_account_id}/activities with object, event, actor, timestamp, and extra_data fields. |
| Aggregate read-only delivery diagnostics across campaigns, ad sets, and ads using status/effective_status/issues_info where available plus simple delivery insights. |
| Return ad-linked creative media with actual ad names, collection covers, all carousel/flexible components, resolved image hashes and video URLs. |
| Read detailed custom, saved, and lookalike audiences with pagination and rich fields where permissions allow. |
| Read Product Catalogs and Product Items when catalog access is available. |
| Query product-breakdown insights and enrich rows with Product Catalog metadata when catalog access is available. |
| Read brand safety, suitability, placement, and context-control signals from ad account/ad set targeting and optional block-list edges. |
| Read and interpret A/B test or conversion lift study results with confidence guardrails, cells, objectives, and optional cell entities. |
| Read Facebook Page posts and Instagram media with URLs, native periods and optional insights. |
| List all Meta ad accounts accessible with the current token. |
| Get detailed information for a specific Meta ad account: name, currency, timezone, spend cap, status, business info. |
| List campaigns for a Meta ad account. |
| List ad sets for a Meta ad account, optionally filtered by campaign. |
| List ads for a Meta ad account, optionally filtered by ad set. |
| Query Meta Ads performance insights. |
| Get hierarchical campaign structure: campaigns -> ad sets -> ads. |
| Get ad creative content: text, images, videos, links, call-to-action. |
| List custom, saved, and lookalike audiences for a Meta ad account. |
| List conversion lift studies and A/B tests (Ad Studies) for an ad account. |
| Get detailed results for a conversion lift or A/B test study. |
| Validate a metric/breakdown combination BEFORE executing. |
| Read published Facebook Page posts using a Page token resolved from the connected user. |
| Inspect token identity, validity, expiry and scopes. |
| Search campaigns, ad sets, or ads by name within an ad account. |
| Read arbitrary flat fields from one Meta Graph node. |
| List an allowlisted read-only Meta Graph edge with caller-selected flat fields, filters, and cursor pagination. |
| Query the Meta Insights edge with validated native field names, breakdowns, action breakdowns, attribution windows, filters, sort, summary, and pagination. |
| Search Meta's read-only targeting metadata for interests, validated interests, geographies, locales, countries, cities, regions, markets, or postal codes. |
| Get the read-only preview markup for an existing Meta ad in a requested placement format. |
| List the ad account image library (/adimages): hash, name, dimensions, status, a permanent publicly served display URL (permalink_url), short-lived CDN URLs, and optionally the creatives using each image. |
| List the ad account video library (/advideos): title, duration, processing status, and publicly served thumbnails (preferred and largest sizes). |
| Resolve fresh download URLs (source) and thumbnails for specific ad videos. |
| Read a specific entity in its ad account for reconciliation. |
| Check video processing and membership in the selected account library. |
| Read an existing ad set, its parent campaign budget/objective and account currency before preparing an edit or adding ads. |
| List the apps this ad account can advertise, with their store URLs, to set up a website and app (cross-channel) ad set. |
| Read the completion and per-item errors for a catalog batch handle. |
Disabled by default. Calls preview unless explicitly confirmed. Check the configuration and exact schema before use.
Tool | Purpose |
| Create a PAUSED Meta campaign with either ad set budgets (omit campaign budget), a daily campaign budget, or a lifetime campaign budget. |
| Change an ad set daily or lifetime budget after checking its parent budget and existing schedule. |
| Change start and/or end time using ISO 8601 with an explicit offset. |
| Change an existing campaign-owned budget after verifying currency and ownership. |
| Create a PAUSED Meta ad set with explicit targeting, optimization, placements, attribution, bidding and schedule. |
| Update targeting, optimization, placements, attribution, bidding, budget or schedule. |
| Duplicate a known-good ad set within the selected account, preserving complex native configuration. |
| Create an ad creative from an existing post or an explicit object_story_spec and optional asset_feed_spec. |
| Create a PAUSED ad using an existing ad set and creative from the selected account. |
| Replace an ad’s creative with another existing creative from the same account. |
| Upload an image into the selected ad account using base64 bytes (up to 5 MiB decoded). |
| Import a video from a publicly reachable HTTPS URL or base64 MP4 bytes (up to 5 MiB decoded). |
| Create a website, engagement, customer-list container or lookalike audience. |
| Update an existing custom audience name, description, retention or complete rule. |
| Create a filtered product set in a catalog owned by the same Business as the selected ad account. |
| Replace a product set filter or rename it. |
| Create or update up to 50 catalog products by retailer_id. |
| Pause or reactivate a Meta campaign. |
| Pause or reactivate a Meta ad set. |
| Pause or reactivate a Meta ad. |
| Rename a Meta campaign. |
| Rename a Meta ad set. |
| Rename a Meta ad. |
| Rename a Meta ad account. |
URI | Contents |
| What this server exposes, and which tool to run first |
| All 190 metrics with categories and formats |
| All 56 breakdowns and where they are valid |
| The compatibility matrix, 90 dimensions |
| 11 step-by-step workflows |
| Read-only scope guidance |
| Scope positioning for a Meta App Review submission |
Security
The server holds a credential that can read live ad accounts, and modify them when writes are enabled. Concretely:
The token is never logged, at any log level, and never written to disk.
Requests go only to
graph.facebook.comon the pinned version. Any other host is refused rather than called. Covered by tests.Redirects are refused once a token is attached, so a redirect cannot forward your credential elsewhere. Covered by tests.
No telemetry. The server makes no network call other than to the Graph API. There is no analytics, no phone-home, and no usage reporting. You can verify this by grepping the source for
fetch.
Full policy and reporting instructions: SECURITY.md.
Looking for a managed, multi-platform version?
Try hosted Meta Ads if you want to use this source without operating a local server. getmcpads also connects advertising, Search Console and GA4 through one MCP URL. Source availability and plan limits are listed on the site; connecting an account is still required.
Follow the Meta Ads connection guide.
Select the account or property your assistant may read.
Try a read-only review: “Compare campaign results and investigate frequency alongside CTR. State missing data and do not change anything.”
See the current hosted tool catalogue and pricing before choosing a paid plan. This Apache 2.0 adapter remains independently useful with your own credentials.
Contributing
Issues and pull requests are welcome. See CONTRIBUTING.md. Please read SECURITY.md before reporting anything security-related.
Licence
Apache License 2.0. See also NOTICE.
Facebook, Meta, Instagram and the Meta Marketing API are trademarks of Meta Platforms, Inc. This project is not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc. It is an independent client of a public API.
MCP contracts and desktop bundle
Every tool declares read/write annotations, parameter descriptions and a structured output schema. Successful calls expose the payload as structuredContent.result; errors retain isError: true. The generated server card contains definitions only.
Run npm run bundle -- /path/to/output to build a .mcpb desktop bundle from the current catalog. Credentials are entered locally during installation. Write tools remain disabled unless explicitly enabled.
More from getmcpads
Google Ads · Google Analytics 4 · Google Search Console · TikTok Ads · Pinterest Ads · X Ads
Maintained by Emmanuel at getmcpads. Questions: hello@getmcpads.com.
Available Tools
42 toolsmeta_debug_tokenmeta debug tokenARead-onlyIdempotent
Inspect token identity, validity, expiry and scopes. When Meta refuses to inspect this token with itself, independently check the connecting user and granted permissions; token and app metadata then remain unknown.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds real value beyond them: a disclosed failure mode where self-inspection is refused and the result degrades to user/permission checks, with token and app metadata explicitly reported as unknown. The phrasing of the refusal condition is somewhat oblique, keeping it short of a 5.
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, both load-bearing, with the primary capability front-loaded and the caveat second. The fallback clause is dense and slightly tangled ('with itself'), costing a point on readability rather than length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and annotations cover safety. The description supplies the one thing structured fields cannot: what happens when the token cannot inspect itself and which fields become unknown. That is sufficient for a zero-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters and the schema is empty, so there is nothing for the description to disambiguate. Baseline for a zero-parameter tool 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?
States a specific verb ('Inspect') and resource ('token') and enumerates exactly what is returned: identity, validity, expiry and scopes. None of the ~40 sibling tools do token introspection, so the agent can route here without comparison.
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 second sentence gives a clear triggering condition ('When Meta refuses to inspect this token with itself') and names the fallback behavior (independently check connecting user and granted permissions). It does not state when not to use it, but the diagnostic use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_account_detailsmeta get account detailsARead-onlyIdempotent
Get detailed information for a specific Meta ad account: name, currency, timezone, spend cap, status, business info.
| Name | Required | Description | Default |
|---|---|---|---|
| adAccountId | Yes | Ad account ID (e.g., act_123456789) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds useful context by enumerating the returned field categories, but says nothing about behavior on invalid/suspended accounts, rate limits, or the implications of openWorldHint (a live external call).
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?
One front-loaded sentence with the verb and resource first and the payload described after the colon. No filler, no repetition of the title.
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?
An output schema exists and annotations cover safety and idempotency, so return-value and safety detail are not the description's burden. For a one-parameter read, the description is nearly complete; only the relationship to sibling account-level tools is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter with 100% schema description coverage including an 'act_123456789' format example, so the schema carries the load. The description adds nothing about the ID format (e.g., that the act_ prefix is expected) or validation, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get detailed information') and a specific resource ('a specific Meta ad account'), then enumerates the fields returned. It is clearly distinct from meta_list_ad_accounts by being single-account scoped, but it never names that sibling to make the contrast explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for a specific' implies you must already have an ad account ID, which is reasonable implicit guidance. However, there is no statement of when to prefer this over meta_list_ad_accounts or meta_get_business_assets, and no prerequisites or error conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_ad_activitymeta get ad activityARead-onlyIdempotent
Read ad account activity logs from /{ad_account_id}/activities with object, event, actor, timestamp, and extra_data fields.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| since | No | Optional start time accepted by Graph API, usually YYYY-MM-DD or Unix seconds. | |
| until | No | Optional end time accepted by Graph API, usually YYYY-MM-DD or Unix seconds. | |
| cursor | No | Pagination cursor from previous response | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description adds the endpoint path and lists the returned fields, which is useful context beyond annotations, though the field list is partially redundant with the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the action, endpoint, and key return fields with zero wasted words. It is appropriately sized for a simple read 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 that the tool has rich annotations, full schema description coverage, and an output schema, the description is complete enough for an agent to call it correctly. It only lacks minor details such as pagination behavior, which is already covered by the schema's limit/cursor descriptions.
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 every parameter (adAccountId, limit, since, until, cursor) is already documented in the schema. The description adds no additional meaning about parameter formats, defaults, or interactions beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Read), a specific resource (ad account activity logs), and the exact endpoint path (/{ad_account_id}/activities), along with the fields returned. This clearly distinguishes it from all sibling tools, none of which deal with activity logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating that it reads activity logs, but it does not explicitly say when to use this tool versus alternatives, nor does it mention any exclusions or prerequisites. The context is clear enough that an agent can infer this is for audit/activity purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_ad_previewmeta get ad previewARead-onlyIdempotent
Get the read-only preview markup for an existing Meta ad in a requested placement format. The response may contain an iframe body but never creates or edits a creative.
| Name | Required | Description | Default |
|---|---|---|---|
| adId | Yes | Exact ad ID in the selected advertising account. | |
| adFormat | No | Native Meta ad preview format; must be compatible with this ad's creative. | DESKTOP_FEED_STANDARD |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, and the description reinforces rather than contradicts them. It earns credit for disclosing something not in the structured fields: that the response payload may include an iframe body, and that no creative is created or edited. It does not cover rate limits or placement-compatibility failure modes.
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 short sentences, front-loaded with the core action and payload, then the safety clarification. Nothing is redundant or padded.
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?
A low-complexity, two-parameter read tool with rich annotations, full schema coverage, and an output schema that already defines return values. The description covers the one thing structured fields cannot: that the preview markup may embed an iframe and performs no writes.
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 both adId and adFormat are already documented in the input schema. The description only gestures at the adFormat concept via 'requested placement format' and adds no new detail about format compatibility or ID sourcing beyond what the schema states.
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?
Uses a specific verb ('Get') on a specific resource ('read-only preview markup for an existing Meta ad in a requested placement format'), which clearly separates it from retrieval tools like meta_get_ads or meta_get_creatives. It does not explicitly name or contrast with any sibling, so it stops short of a 5.
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 intent (fetch a rendered preview for an existing ad) is implied by 'existing Meta ad' and 'requested placement format', but there is no explicit when-to-use statement, no prerequisite such as needing an ad ID from a prior call, and no named alternative to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_adsmeta get adsBRead-onlyIdempotent
List ads for a Meta ad account, optionally filtered by ad set. Returns ad ID, name, status, and creative reference.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| adSetId | No | Alias for adsetId. If both are supplied, they must match. | |
| adsetId | No | Filter by ad set ID; adSetId is also accepted. | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) | |
| statusFilter | No | Filter by native effective_status, not configured status. PAUSED excludes IN_PROCESS, CAMPAIGN_PAUSED and ADSET_PAUSED. Omit for post-creation verification and inspect both returned status fields. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds the returned field set (ad ID, name, status, creative reference), which is helpful, but says nothing about pagination behavior, limits, or the openWorldHint=true implication that results reflect live external state.
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, zero filler, with purpose and scope front-loaded before the return-value clause. Nothing could be removed without losing 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?
An output schema exists, so the return clause is redundant but harmless; parameters are fully covered by the schema. For a filtered-list tool this is essentially complete, with only pagination/limit behavior left implicit (though the limit schema description does cover 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?
Schema coverage is 100%, so each parameter (including the adSetId/adsetId alias rule and the statusFilter enum semantics) is already fully documented in the schema. The description only echoes the ad-set filter, adding no syntax or edge-case detail beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List ads for a Meta ad account") plus the primary scoping option (ad set filter). An agent can distinguish it from siblings like meta_get_adsets or meta_get_creatives, though the description never explicitly names those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to choose this tool over meta_get_adsets, meta_get_creatives, or meta_get_insights, nor any prerequisites. The only hint is the parenthetical 'optionally filtered by ad set', which is usage-adjacent but not conditional guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_adset_configurationmeta get adset configurationARead-onlyIdempotent
Read an existing ad set, its parent campaign budget/objective and account currency before preparing an edit or adding ads. For a web and app (cross-channel) ad set, creativeRequirements gives the applink_treatment (and omnichannel_link_spec) used by its own ads. Returns native settings; no mutation.
| Name | Required | Description | Default |
|---|---|---|---|
| adSetId | Yes | Exact Meta ad set ID in the selected advertising account. | |
| adAccountId | Yes | Owning advertising account ID. Use the exact ID returned by account discovery; do not substitute a campaign or business ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so 'no mutation' is largely redundant, but 'returns native settings' adds genuinely new context (values are raw platform values, not normalized) and the creativeRequirements/applink_treatment note discloses a non-obvious field for cross-channel ad sets. That goes beyond what the annotations convey.
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 short sentences, front-loaded with the action and use case, then the cross-channel caveat. The closing 'Returns native settings; no mutation' partially repeats the readOnly annotation, which is the only wasted clause.
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?
An output schema exists and annotations cover safety, so the description needn't explain return format. It supplies the pre-edit use case and the cross-channel creativeRequirements nuance, leaving only minor gaps such as what 'native settings' excludes or how errors surface.
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% with both adSetId and adAccountId fully documented, including the warning not to substitute campaign or business IDs. The description adds no parameter-level detail of its own, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (an existing ad set) and broadens scope to parent campaign budget/objective and account currency, which tells the agent exactly what payload to expect. It does not name a sibling such as meta_get_adsets or meta_get_entity_configuration to sharpen the distinction, so it falls short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'before preparing an edit or adding ads' gives a concrete trigger condition, which is real usage guidance rather than a restatement of the name. It stops at positive guidance and never says when to prefer a sibling or when this read is unnecessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_adsetsmeta get adsetsARead-onlyIdempotent
List ad sets for a Meta ad account, optionally filtered by campaign. Returns targeting, budget, optimization, and schedule info.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| campaignId | No | Filter by campaign ID | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) | |
| statusFilter | No | Filter by native effective_status, not configured status. PAUSED excludes IN_PROCESS, CAMPAIGN_PAUSED and ADSET_PAUSED. Omit for post-creation verification and inspect both returned status fields. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is known. The description adds useful context about returned data categories (targeting, budget, optimization, schedule), but does not mention pagination behavior or any rate limits beyond what the schema says.
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 short sentences with no filler, front-loading the core purpose and following with return categories. It is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, rich annotations, and fully documented parameters, so it does not need to explain return values in detail. The description covers the main operation and filter, though it could mention pagination constraints explicitly for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already well documented. The description only adds the high-level fact that results can be filtered by campaign, which maps directly to the already-documented campaignId parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List ad sets'), scopes it to a Meta ad account, and notes the optional campaign filter. It is clearly distinct from siblings like meta_get_campaigns or meta_get_ads, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'optionally filtered by campaign' implies a common usage pattern, but there is no guidance on when to prefer this tool over siblings such as meta_get_campaign_structure or meta_get_ads, nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_ad_studiesmeta get ad studiesARead-onlyIdempotent
List conversion lift studies and A/B tests (Ad Studies) for an ad account. Includes study type, status, and cells.
| Name | Required | Description | Default |
|---|---|---|---|
| adAccountId | Yes | Ad account ID (e.g., act_123456789) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered structurally. The description adds which study categories are returned (conversion lift, A/B) and that cells are included, which is modest added context but nothing on pagination, permissions, or result limits for an openWorld endpoint.
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 short sentences with zero filler, and the resource definition is front-loaded before the field inventory. Every sentence carries 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?
With one fully documented parameter and an output schema present, the definition need not explain return values, and it correctly limits itself to stating scope and included fields. It could be slightly more complete by noting pagination or the relationship to meta_get_study_results for drilling into results.
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?
There is a single parameter with 100% schema description coverage ('Ad account ID (e.g., act_123456789)'), so the schema fully documents it. The description adds no format or constraint detail beyond that, making baseline 3 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 names a specific verb ('List') and resource ('conversion lift studies and A/B tests (Ad Studies)') scoped to an ad account, which is more precise than the tool name alone. It does not explicitly differentiate itself from the closely related sibling meta_get_study_results, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the phrase 'for an ad account'; there is no statement of when to use this versus meta_get_study_results or meta_interpret_experiment_results, which occupy adjacent territory. No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_audience_detailsmeta get audience detailsBRead-onlyIdempotent
Read detailed custom, saved, and lookalike audiences with pagination and rich fields where permissions allow.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Provider object or operation type selected from this schema's allowed values. | all |
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| adAccountId | No | Ad account ID used when listing audiences. | |
| audienceIds | No | Specific audience IDs to fetch via batch IDs lookup. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior, so the safety profile is covered. The description adds only two behavioral facts beyond that: results are paginated and fields are permission-gated. It says nothing about result volume, permission failure behavior, or whether an ad account scope is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, which is efficient. It is arguably too terse given the sibling ambiguity, but 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?
The tool is read-only, has an output schema covering return values, and full schema coverage on all parameters, so much of the burden is already carried. What is missing is the one thing the description alone can supply: how this differs from meta_get_audiences and what the 'rich fields' actually add.
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 all five parameters (type, limit, cursor, adAccountId, audienceIds) are already documented in the schema, making 3 the baseline. The description adds no parameter-level meaning beyond what the schema states, but it does not need to.
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 names a specific verb (Read) and resource (custom, saved, and lookalike audiences) with modifiers for pagination and field richness, so the operation is unambiguous. However, it never distinguishes itself from the sibling tool meta_get_audiences, leaving an agent to guess which of the two audience readers to call.
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?
'where permissions allow' is a caveat rather than usage guidance; it does not tell the agent when to prefer this over meta_get_audiences or when to fall back. There are no exclusions, no prerequisites, and no scenario descriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_audiencesmeta get audiencesARead-onlyIdempotent
List custom, saved, and lookalike audiences for a Meta ad account.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by audience type | |
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so safety and mutability are fully covered. The description adds only the enumeration of audience subtypes; it says nothing about pagination behavior or result scoping beyond what the schema's limit parameter already conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste, and the resource scope appears first. It is arguably too terse given the tool's role, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich annotation set, full schema coverage, and an output schema handling return values, the description does not need to explain much more. The only real gap is the lack of routing guidance against meta_get_audience_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 description coverage is 100%, with the type enum and limit bounds/default fully documented in the schema. The description mirrors the type enum values but adds no syntax, format, or constraint detail beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (audiences) and enumerates the subtypes covered (custom, saved, lookalike), which distinguishes it from the sibling meta_get_audience_details. It does not explicitly name that sibling, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'List ... for a Meta ad account', but there is no explicit when-to-use guidance and no mention of when to prefer meta_get_audience_details over this bulk listing tool. The agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_brand_safety_controlsmeta get brand safety controlsARead-onlyIdempotent
Read brand safety, suitability, placement, and context-control signals from ad account/ad set targeting and optional block-list edges.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| adsetIds | No | Specific ad set IDs to inspect. If omitted, reads ad sets from the ad account. | |
| businessId | No | Optional Business Manager ID for block-list discovery. | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) | |
| includeAdsets | No | Include ad set configuration when checking brand safety. | |
| includeBlockLists | No | Include accessible brand-safety block-list metadata. | |
| includeRawTargeting | No | Include the native targeting specification for diagnostics. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and destructiveHint=false, lowering the burden. The description adds that output spans targeting-derived signals plus optional block-list edges, but says nothing about permission requirements for Business Manager block lists (openWorldHint=true implies external dependency), rate limits, or pagination behavior beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence listing the signal categories and their source, with no filler. It is dense but every clause carries scope information; only mild ambiguity from packing four signal types into one list keeps it off a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and fully documented parameters, the description only needs to frame what class of data comes back, which it does ('brand safety, suitability, placement, and context-control signals'). What remains thin is the block-list/Business Manager dependency, which is only gestured at via the optional businessId parameter.
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 every parameter including limit, cursor, adsetIds, businessId, and the three include* flags is already documented in structured data. The description only loosely maps its wording onto adAccountId/adsetIds/businessId and adds no format or interaction details beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and a specific resource class (brand safety, suitability, placement, context-control signals), plus the source (ad account/ad set targeting and block-list edges). It is clearly distinguishable from the sibling list, which contains no other brand-safety tool, though it does not explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'read ... from ad account/ad set targeting' implies an inspection/audit use case, and the optional block-list edge mention hints at a secondary mode. But there is no explicit when-to-use, when-not-to-use, or routing to a sibling such as meta_get_adset_configuration or meta_search_targeting_options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_business_assetsmeta get business assetsARead-onlyIdempotent
Discover accessible Meta Business assets read-only: businesses, pages, Instagram accounts, pixels, and datasets when permissions allow.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Legacy cursor for /me/businesses only. Use cursors for asset edges. | |
| cursors | No | Per-edge cursors from paging/nextActions. Never reuse a cursor for another edge. | |
| maxPages | No | Maximum pages per edge; remaining pages are reported explicitly. | |
| businessId | No | Business Manager ID. With adAccountId, discover only its owning Business; otherwise list /me/businesses when this is omitted. | |
| adAccountId | No | Optional ad account ID to discover its owner Business and assigned pixels; datasets are read from that Business when permitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/openWorld, and the description adds a genuinely non-structured fact: that each asset class is returned only 'when permissions allow', warning the agent not to treat an empty section as proof of absence. It does not explain what happens on permission failure (error vs. omission) or describe paging behavior, but the safety profile is already carried by 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?
A single front-loaded sentence that packs the verb, the resource, the enumerated asset types, the read-only guarantee and the permission caveat with zero filler. Nothing is restated or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema and an output schema present, the description need not explain parameters or return shape; it covers scope and the permission caveat, which is what's missing from structured fields. The only shortfall is that it does not hint that passing businessId/adAccountId switches the tool into a narrower owner-discovery mode.
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 limit, cursor, cursors, maxPages, businessId and adAccountId are all fully documented in the schema, which sets the baseline at 3. The description mentions no parameter at all — not even the businessId/adAccountId scoping that materially changes what is discovered — so it adds nothing 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 uses a specific verb ('Discover') plus a named resource class ('Meta Business assets') and enumerates the concrete asset types returned: businesses, pages, Instagram accounts, pixels, datasets. This lets an agent understand it is a broad cross-asset discovery tool, though it never names the narrower siblings (meta_get_pages, meta_get_pixels, meta_get_instagram_accounts) it overlaps with.
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 clause 'when permissions allow' signals that results are conditional, which implies usage context, but there is no explicit statement of when to prefer this tool over the per-asset siblings like meta_get_pages or meta_get_pixels. An agent must infer that this is the umbrella discovery tool versus the targeted listing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_campaignsmeta get campaignsARead-onlyIdempotent
List campaigns for a Meta ad account. Returns campaign ID, name, status, objective, budget, and bid strategy.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) | |
| statusFilter | No | Filter by native effective_status, not configured status. PAUSED excludes IN_PROCESS, CAMPAIGN_PAUSED and ADSET_PAUSED. Omit for post-creation verification and inspect both returned status fields. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, destructive=false, openWorld=true, so the safety profile is fully covered structurally. The description adds no behavioral context beyond that — nothing about rate limits, permission requirements, or the pagination ceiling — and its field list is redundant given an output schema exists.
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, correctly front-loaded with purpose before output detail, and no filler. Nothing to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich annotations, a fully documented 4-parameter schema, and an output schema, the definition is sufficient to call the tool correctly. The only real gap is routing guidance against the many similarly named campaign/asset siblings.
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% and the statusFilter in particular carries unusually good semantics (native effective_status vs configured status, PAUSED implications, the advice to omit for post-creation verification). The description contributes nothing beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List campaigns for a Meta ad account") plus returned fields, so the agent knows exactly what it gets. It does not, however, differentiate from plausible siblings such as meta_get_campaign_structure or meta_get_ads, leaving the agent to infer the boundary.
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 scope (a single ad account, campaigns only) implies when to use it, but there is no explicit when-to-use, when-not, or named alternative. The nearest ambiguous siblings (structure, adsets, ads) are never addressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_campaign_structuremeta get campaign structureARead-onlyIdempotent
Get hierarchical campaign structure: campaigns -> ad sets -> ads. Useful for understanding account organization.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | No | Get structure for a specific campaign only | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world, so the safety profile is covered. The description adds the hierarchy depth (three levels) as real context, but says nothing about pagination, result size, or whether lower levels are always nested.
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 short sentences, front-loaded with the hierarchy shape. The second sentence is mildly redundant filler but still signals intent, so no trimming penalty beyond that.
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 an output schema exists and annotations cover safety, the description is nearly complete for this 2-param read tool. The only omission is any hint about depth-limit or ordering behavior of the returned tree.
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% and both parameters are documented inline, including the campaignId scoping note. The description adds no syntax, format, or behavior information beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get hierarchical campaign structure') and specifies the exact shape returned: campaigns -> ad sets -> ads. This differentiates it implicitly from flat list siblings like meta_get_campaigns and meta_get_adsets, though those siblings are never named.
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?
Only a vague steer is given ('Useful for understanding account organization'); no explicit when-to-use, when-not-to-use, or named alternative such as meta_get_campaigns/meta_get_adsets for flat retrieval. An agent must infer the choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_catalog_batch_statusmeta get catalog batch statusARead-onlyIdempotent
Read the completion and per-item errors for a catalog batch handle. Acceptance of a batch is not proof that every product succeeded.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | Asynchronous catalog batch handle returned by the submission to inspect. | |
| catalogId | Yes | Exact product catalog ID accessible to the selected account. | |
| adAccountId | Yes | Owning advertising account ID. Use the exact ID returned by account discovery; do not substitute a campaign or business ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-destructive operation. The description adds useful behavioral context by noting that per-item errors can exist even when the batch was accepted, which is more than the annotations provide.
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 with no wasted language. The key action is front-loaded and the important caveat follows immediately.
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 read-only status tool with three fully documented parameters, annotations, and an output schema, the description gives enough context to use it correctly. The per-item error caveat is the main behavioral nuance an agent needs.
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 input schema already fully documents all three parameters. The description reinforces that the handle is a catalog batch handle, but adds no additional parameter syntax or constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reading completion and per-item errors for a catalog batch handle. It is clearly distinct from catalog product listing, but it does not explicitly differentiate itself from any sibling tool 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?
The tool's usage is clearly implied: inspect a batch handle after submission, especially because batch acceptance does not guarantee every product succeeded. It does not name alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_catalog_productsmeta get catalog productsARead-onlyIdempotent
Read Product Catalogs and Product Items when catalog access is available. Returns join-ready product metadata without creating or updating catalog assets.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| search | No | Client-side substring filter across product id, retailer_id, name, brand, category, type, and custom labels. | |
| catalogId | No | Product Catalog ID to read directly. | |
| businessId | No | Business Manager ID used to discover owned/client product catalogs. | |
| productIds | No | Specific Product Item IDs to fetch via the batch IDs endpoint. | |
| includeProducts | No | Fetch product items for discovered/provided catalogs. | |
| includeProductSets | No | Also attempt product_sets edges for catalog context. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
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 reinforces the non-mutating behavior by saying it returns metadata 'without creating or updating catalog assets' and mentions a catalog-access prerequisite, but adds little beyond the annotation safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences, front-loaded with the core read operation and scoped by the non-mutating guarantee. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully described, so the description need not explain return values or parameters in depth. It gives the essential read-only catalog context, but could better clarify how this tool relates to adjacent catalog and product-insight tools.
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 all eight parameters are already well documented in the input schema. The description does not add parameter-level semantics such as how catalogId, businessId, and productIds interact, so it meets the baseline for high schema coverage rather than exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Read Product Catalogs and Product Items', and adds that it returns 'join-ready product metadata'. It clearly states what the tool does, though it does not explicitly distinguish itself from siblings such as meta_join_product_insights or meta_get_catalog_batch_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a prerequisite context ('when catalog access is available') but does not explain when to choose this tool over alternatives like meta_get_business_assets for catalog discovery or meta_join_product_insights for joining product data. Usage is implied rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_creative_assetsmeta get creative assetsARead-onlyIdempotent
Return ad-linked creative media with actual ad names, collection covers, all carousel/flexible components, resolved image hashes and video URLs. Catalog-only ads are classified separately; use the hosted GetMCPAds service for an interactive visual gallery. Raw creative metadata remains available for diagnostics.
| Name | Required | Description | Default |
|---|---|---|---|
| adIds | No | Specific ad IDs to enrich. | |
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| adAccountId | No | Ad account ID. Used when adIds/creativeIds are omitted. | |
| creativeIds | No | Specific creative IDs to enrich. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so safety behavior is largely covered. The description adds useful context about returned media components, separate catalog-only classification, and availability of raw creative metadata for diagnostics, though it does not discuss permissions or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and front-loads the core return content. Each sentence provides useful context, though the hosted gallery mention is somewhat tangential and could be trimmed if space were at a premium.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With complete schema descriptions, rich annotations, and an output schema, the description provides enough behavioral and output context for an agent to call the tool correctly. It does not need to explain return values in detail because the output schema exists.
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 and clearly documents all five parameters, including adIds, creativeIds, adAccountId, limit, and cursor. The description does not add meaning beyond the schema for these parameters, so the 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 uses a specific verb and resource: it returns ad-linked creative media and enumerates the included asset types such as collection covers, carousel components, image hashes, and video URLs. It separates catalog-only ads and mentions the hosted gallery alternative, though it does not explicitly distinguish itself from the sibling meta_get_creatives 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?
It gives clear context for using the hosted GetMCPAds service for an interactive visual gallery and implies this tool is for raw diagnostic metadata, but it does not state when to choose this over sibling tools such as meta_get_creatives, meta_list_ad_images, or meta_list_ad_videos. Usage is therefore implied rather than fully guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_creativesmeta get creativesBRead-onlyIdempotent
Get ad creative content: text, images, videos, links, call-to-action. Returns creative details for specified ads.
| Name | Required | Description | Default |
|---|---|---|---|
| adIds | No | Specific ad IDs to get creatives for | |
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds the shape of returned content (creative asset types), but says nothing about pagination behavior, rate limits, or what happens when adIds is omitted (the required adAccountId fallback).
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 short sentences, front-loaded with the verb and returned content types, with zero filler. It is efficient, though the trailing sentence ("Returns creative details for specified ads") partially restates the first.
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?
An output schema exists, so return values needn't be spelled out, and annotations carry the safety semantics. What remains missing for a crowded 40-sibling namespace is sibling disambiguation and a note on the adIds-optional listing behavior, which the description does not supply.
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 adIds, limit, and adAccountId are all documented in the schema itself, establishing a baseline of 3. The description adds no meaning beyond the schema — notably it never explains the behavior when adIds is empty, which is the one semantic gap the schema leaves open.
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?
Uses a specific verb+resource ("Get ad creative content") and enumerates the fields returned (text, images, videos, links, CTA), which tells an agent exactly what data this yields. It does not, however, differentiate itself from near-siblings like meta_get_creative_assets, meta_list_ad_images, or meta_list_ad_videos, which overlap in scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool returns but never says when to reach for it versus meta_get_creative_assets or the image/video listing tools. There are no exclusions, prerequisites, or alternative routing hints, leaving the agent to guess among several plausible siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_delivery_diagnosticsmeta get delivery diagnosticsBRead-onlyIdempotent
Aggregate read-only delivery diagnostics across campaigns, ad sets, and ads using status/effective_status/issues_info where available plus simple delivery insights.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Entity or aggregation level for the requested report. | all |
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| timeRange | No | Optional custom insights date range. | |
| datePreset | No | Insights date preset for simple delivery metrics. Defaults to last_7d. | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) | |
| effectiveStatusFilter | No | Optional effective_status filter values such as ACTIVE, PAUSED, WITH_ISSUES, DISAPPROVED. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the description repeating 'read-only' adds nothing. It does add modest value by flagging that status/issue fields are only present 'where available' and that the insights returned are 'simple', but it says nothing about pagination behavior or partial-failure handling for a multi-level aggregation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the aggregation intent front-loaded and no wasted words. It is efficient, though the compressed phrasing ('issues_info where available') assumes familiarity with Meta field names.
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?
An output schema exists and annotations cover the safety profile, so return values need not be explained. However, for a 7-parameter, multi-level aggregation tool sitting among many insight/hierarchy siblings, the description leaves level semantics and pagination contract unaddressed, so it is adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so level, limit, cursor, timeRange, datePreset, adAccountId, and effectiveStatusFilter are all documented in the schema itself. The description maps loosely onto the status/issue filters and the lightweight insights, but adds no format, default, or interaction guidance beyond that, making baseline 3 correct.
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?
States a specific verb (aggregate) and resource (delivery diagnostics) with explicit scope across campaigns, ad sets, and ads, and names the fields it draws on (status/effective_status/issues_info). It does not explicitly distinguish itself from close siblings like meta_get_insights or meta_get_ad_activity, so it stops short of a 5.
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 word 'diagnostics' implies troubleshooting rather than performance measurement, which implicitly separates it from insights tools, but there is no explicit when-to-use, when-not-to-use, or named alternative. With 40 siblings, an agent must infer the routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_entity_configurationmeta get entity configurationARead-onlyIdempotent
Read a specific entity in its ad account for reconciliation. Read-only; never creates, changes or retries the entity. Missing or normalized fields must be inspected before claiming an exact match.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | Exact fields to re-read from the reviewed native creation payload. IDs and account ownership are always checked. | |
| entityId | Yes | Exact entity ID saved in the acknowledged creation receipt. | |
| adAccountId | Yes | Owning advertising account ID. Use the exact ID returned by account discovery; do not substitute a campaign or business ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, but the description adds useful behavioral context: it never creates, changes, or retries the entity, and it warns that missing or normalized fields must be inspected before claiming an exact match. This goes beyond restating 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 three short sentences, front-loads the core purpose, and includes only directly relevant caveats. Every sentence contributes to understanding or safe use.
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?
An output schema exists and annotations are rich, so the description need not explain return values or safety guarantees in depth. It adds a reconciliation caveat and normalization warning, though it still leaves some ambiguity about which entity types this covers relative to sibling tools.
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 already documents all three required parameters, including the fields enum and ID formats. The description does not add parameter-specific meaning beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reading a specific entity in its ad account for reconciliation. It is clear enough to understand the operation, but it does not distinguish this generic entity read from specific sibling tools such as meta_get_adset_configuration or meta_get_campaign_structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "for reconciliation" implies the intended use case, and the note about missing or normalized fields provides a workflow caveat. However, it does not explicitly say when to use this tool versus sibling configuration readers 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_get_insightsmeta get insightsARead-onlyIdempotent
Query Meta Ads performance insights. Supports 170+ metrics, 43+ breakdowns with intelligent query planning. Use meta://metrics resource to see available metrics. Use meta://breakdowns for available breakdowns. The query planner automatically splits incompatible metric/breakdown combinations into multiple API requests and merges results. For purchases, leads or conversion analysis, request actions (and action_values for revenue) or explicit metrics such as purchases, omni_purchases or leads. The native conversions field is not a universal conversion total, and its absence does not mean purchases or leads are unavailable. Label the exact action_type and never sum overlapping purchase types.
| Name | Required | Description | Default |
|---|---|---|---|
| adIds | No | Restrict ad-level insights to these ad IDs. | |
| level | Yes | Aggregation level: account, campaign, adset, or ad | |
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| metrics | Yes | Metric keys from meta://metrics (e.g., impressions, spend, ctr) | |
| adsetIds | No | Restrict adset- or ad-level insights to these ad set IDs. | |
| timeRange | No | Custom date range with since/until in YYYY-MM-DD format | |
| breakdowns | No | Breakdown keys from meta://breakdowns (e.g., age, gender, country) | |
| datePreset | No | Predefined date range (e.g., last_7d, last_30d) | |
| dimensions | No | Dimension keys listed in meta://compatibility. Entity metadata, such as names, statuses and budgets, is read at its current value. | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) | |
| campaignIds | No | Restrict campaign-, adset- or ad-level insights to these campaign IDs. | |
| timeIncrement | No | Time granularity: 1 (daily), 7 (weekly), 'monthly', or 'all_days' | |
| attributionMode | No | Use Meta account settings, ad-set settings, or explicitly supplied windows. No setting is inferred from returned numbers. | account |
| effectiveStatus | No | Keep only entities with this native effective status at the selected level. | |
| actionBreakdowns | No | Native action breakdowns such as action_type. Only for action metrics. | |
| actionReportTime | No | Date basis for actions, sent explicitly to Meta. | impression |
| attributionWindows | No | Only with attributionMode explicit. These windows are sent identically to every split query and account total. | |
| includeAccountTotals | No | Also read native account-level totals with the same dates, metrics and attribution. Requires no entity filter, dimension or breakdown. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotations, the description discloses important behavior: the query planner splits incompatible metric/breakdown combinations into multiple API requests and merges results. It also warns about conversion semantics and overlapping purchase types, though it does not cover rate limits or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and resource pointers, and every sentence provides useful context. It is slightly dense and repeats the query-planning idea, but it avoids unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter insights tool with annotations and an output schema, the description covers the most important behavioral and query-semantic context. It is not fully complete because it omits explicit sibling routing and some operational caveats.
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 schema documents parameters well. The description adds meaningful semantics beyond the schema by explaining metric/breakdown resources, conversion analysis behavior, action_type labeling, and the pitfalls of the native conversions field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: query Meta Ads performance insights, including metrics/breakdown support. It is clear about what the tool does, but it does not explicitly distinguish itself from the sibling meta_get_insights_raw.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives implied usage guidance by pointing to meta://metrics and meta://breakdowns and by explaining how to handle purchases/leads/conversion analysis. However, it does not state when to use this tool versus alternatives such as meta_get_insights_raw or meta_validate_query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_insights_rawmeta get insights rawARead-onlyIdempotent
Query the Meta Insights edge with validated native field names, breakdowns, action breakdowns, attribution windows, filters, sort, summary, and pagination. This complements meta_get_insights when Meta adds fields before the curated metric catalog is updated.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Native provider ordering expressions. | |
| after | No | Opaque cursor for the next page returned by Meta. | |
| level | No | Entity or aggregation level for the requested report. | |
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| fields | Yes | Native Meta Insights API fields; calculated aliases are not accepted here | |
| objectId | Yes | Ad account (act_...), campaign, ad set, or ad ID whose /insights edge should be queried | |
| filtering | No | Native provider filter expressions; credentials and account overrides are not allowed. | |
| timeRange | No | Explicit provider reporting period with since and until dates. | |
| breakdowns | No | Native reporting breakdowns. Check compatibility before combining them. | |
| datePreset | No | Named reporting period. Use the custom date range when you need exact start and end dates. | |
| timeIncrement | No | Provider time-bucket size or supported aggregate value. | |
| includeSummary | No | Request the provider's available summary or total-count metadata. | |
| actionBreakdowns | No | Meta action-level breakdowns, subject to Insights compatibility rules. | |
| actionAttributionWindows | No | Meta attribution windows used to attribute action metrics. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, non-destructive, so the safety profile is covered. The description adds meaningful context beyond that: fields must be validated native names and calculated aliases are rejected, and this tool exists as a forward-compatibility escape hatch. It does not mention rate limits or Meta's async report behavior, keeping it from a 5.
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 tight sentences, with the core action and scope front-loaded and the sibling differentiation immediately after. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema coverage, the description only needs to convey intent and when to reach for it, which it does. It could add a note about compatibility constraints when combining breakdowns or the timeRange vs datePreset choice, but those are mitigated by schema descriptions.
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 already documents all 14 parameters including enums, patterns, and defaults. The description only echoes the capability list (breakdowns, attribution windows, filters, sort, summary, pagination) without adding syntax or constraint detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Query) and resource (the Meta Insights edge) and enumerates the capabilities it exposes, then explicitly contrasts itself with meta_get_insights as the raw/early-field path. An agent can distinguish it from the curated sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the selecting condition clearly: use this when Meta adds fields before the curated metric catalog is updated. The alternative (meta_get_insights) is named, though the inverse guidance ('prefer meta_get_insights for standard curated metrics') is only implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_instagram_accountsmeta get instagram accountsARead-onlyIdempotent
List Instagram accounts linked to accessible Pages, Business Manager assets, or an ad account when permissions allow.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| pageId | No | Optional Page ID to read linked instagram_business_account/connected_instagram_account. | |
| businessId | No | Optional Business Manager ID for owned/client Instagram account edges. | |
| adAccountId | No | Optional ad account ID for /instagram_accounts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so safety is covered. The description adds a permission-gating caveat, which is genuinely useful, but says nothing about behavior when no scoping ID is supplied or about result completeness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and its scoping sources come first and the caveat trails.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema and fully described parameters, the definition covers most of what an agent needs. The remaining gap is what happens when no filter is passed — whether it fans out across all accessible assets — which affects call strategy.
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 each parameter is already documented, including bounds and pagination semantics. The description corroborates that pageId, businessId, and adAccountId are alternative scoping paths, but adds no syntax or format detail 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?
Uses a specific verb (List) plus a concrete resource (Instagram accounts) and names the three linking sources. It is clearly distinguishable from siblings like meta_get_pages or meta_list_ad_accounts, though it does not explicitly state the 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 three optional ID parameters imply which lookup path to take, and 'when permissions allow' hints at a prerequisite, but there is no explicit when-to-use/when-not-to-use guidance or named alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_node_fieldsmeta get node fieldsARead-onlyIdempotent
Read arbitrary flat fields from one Meta Graph node. This GET-only escape hatch covers newly released campaign, ad set, ad, creative, audience, catalog, Page, Instagram, pixel, and other accessible node fields without waiting for a fixed MCP schema update.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | Flat Graph field names; nested field expansion is intentionally disabled | |
| nodeId | Yes | Graph node ID, for example a campaign, ad set, ad, creative, Page, IG account, pixel, audience, or catalog ID | |
| includeMetadata | No | Ask Graph for field metadata when supported |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint, idempotentHint, and destructiveHint already declared, the safety profile is covered by annotations. The description's 'GET-only' largely restates readOnlyHint and 'nested field expansion is intentionally disabled' is already in the schema, so it adds limited behavioral context. No mention of token/permission requirements per node type or Graph rate-limit implications for an openWorld endpoint.
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 action and resource. The list of node types is long but earns its place by telling the agent the reach of the tool across campaign, ad set, creative, audience, catalog, Page, Instagram, and pixel nodes.
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?
An output schema exists, so return-value explanation is unnecessary, and annotations carry the safety profile. What remains is scope: which node types are reachable and the flat-only constraint, both stated. Auth/permission coverage for arbitrary node types is the one gap worth noting.
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%: nodeId, fields, and includeMetadata all carry their own descriptions and validation patterns. The description adds nothing beyond that, so the baseline 3 for schema-covered params applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read arbitrary flat fields from one Meta Graph node.' The 'escape hatch ... without waiting for a fixed MCP schema update' framing implicitly separates it from the fixed-schema siblings (meta_get_campaigns, meta_get_ads, etc.), but no sibling is named explicitly, so an agent must infer the boundary rather than read it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Escape hatch' plus 'newly released ... fields without waiting for a fixed MCP schema update' gives a clear condition for reaching for this tool: when the field you want isn't in a fixed-schema tool. It stops short of an explicit preference order (e.g. 'prefer meta_get_campaigns for standard campaign fields') and names no when-not cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_organic_content_enrichmentmeta get organic content enrichmentARead-onlyIdempotent
Read Facebook Page posts and Instagram media with URLs, native periods and optional insights. These are content insights, not Ads Insights; do not infer an organic-only breakdown.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| since | No | Optional Graph time filter. For IG media this should be Unix seconds or strtotime-compatible text. | |
| until | No | Optional Graph time filter. For IG media this should be Unix seconds or strtotime-compatible text. | |
| cursor | No | Pagination cursor from previous response | |
| pageId | No | Facebook Page ID for /posts and linked IG discovery. | |
| postIds | No | Specific Facebook post IDs to enrich. | |
| mediaIds | No | Specific Instagram media IDs to enrich. | |
| includeInsights | No | Include available insight metrics; additional provider permissions may be required. | |
| includePagePosts | No | Read related Facebook Page posts when the token has permission. | |
| instagramAccountId | No | Instagram professional account ID for /media. | |
| includeInstagramMedia | No | Read related Instagram media when the token has permission. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and non-destructive behavior, so the safety profile is covered. The description adds scope context about content versus ads insights, but does not add permission details, rate-limit behavior, or pagination context beyond what the schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no wasted wording. The primary purpose is front-loaded, and the second sentence adds a targeted disambiguation warning.
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 full schema coverage and an output schema, the description is nearly complete for selection and invocation. Its main remaining gap is sibling routing: it distinguishes Ads Insights but not the adjacent organic-content or page-post tools.
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 all 11 parameters are already documented in the schema. The description only adds high-level meaning around URLs, native periods, and optional insights, without explaining parameter relationships or selection logic.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resources: reading Facebook Page posts and Instagram media enriched with URLs, native periods, and optional insights. It clearly distinguishes this from Ads Insights, though it does not name or disambiguate against the close sibling meta_get_page_posts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a useful exclusion: these are content insights, not Ads Insights, and warns not to infer an organic-only breakdown. However, it does not say when to use this tool instead of siblings such as meta_get_page_posts or meta_get_insights.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_page_postsmeta get page postsARead-onlyIdempotent
Read published Facebook Page posts using a Page token resolved from the connected user. Returns exact PageID_PostID, message, permalink and media attachments. Use postId for an exact existing-post ad preflight. No Instagram media, comments, likes or insights are requested; this read alone does not establish advertising eligibility.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| pageId | Yes | Facebook Page ID | |
| postId | No | Exact PageID_PostID to read instead of the recent-post list; must belong to pageId. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real context: the token is resolved from the connected user and the returned fields (PageID_PostID, message, permalink, media) are enumerated. The caveat that this read alone does not establish advertising eligibility is a meaningful behavioral limit that no annotation conveys.
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 tight sentences: purpose and return shape first, then the postId path, then the exclusions. Every clause carries information; nothing is padded or restated from 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?
Read-only list tool with full parameter documentation, an output schema, and rich safety annotations. The description covers auth source, return contents, scope exclusions and a key limitation, leaving nothing an agent needs before calling 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?
Schema description coverage is 100%, so pageId, limit, cursor and postId are already documented with patterns and bounds. The description only adds the preflight use case for postId and does not clarify cursor/limit interaction or what happens when postId is supplied alongside pagination; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Read published Facebook Page posts') with an explicit scope boundary: no Instagram media, comments, likes or insights, and no ad-eligibility determination. An agent can distinguish this from meta_get_organic_content_enrichment or meta_get_instagram_accounts without opening the schema.
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?
'Use postId for an exact existing-post ad preflight' gives a concrete use case, and the negative scoping sentence rules out using this read to establish advertising eligibility. It stops short of naming a sibling to use instead for Instagram content or insights, so it is clear context rather than a full when/when-not/alternative map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_pagesmeta get pagesARead-onlyIdempotent
List accessible Facebook Pages with id, name, category, tasks, picture, and linked Instagram account references when available.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| businessId | No | Optional Business Manager ID to list owned/client pages. Omit to use /me/accounts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is free. The description still adds real value beyond that by disclosing that results are limited to pages the caller can access and that linked Instagram references appear only 'when available' — a conditional-field behavior not visible in 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?
One sentence, front-loaded with the action and resource, followed by the returned fields. Nothing is repeated from annotations and nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and pagination is covered by the cursor/limit schema descriptions. The remaining gap is small: the description doesn't state that results may be empty when the token manages no pages, nor how the permission scope is determined.
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 limit, cursor and businessId are already fully documented in the schema, including the businessId vs /me/accounts distinction. The description adds no parameter guidance of its own, which is the expected baseline when the schema carries the burden.
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?
Specific verb (List) plus specific resource (Facebook Pages) plus an enumeration of returned fields, which separates it from siblings like meta_get_page_posts or meta_get_instagram_accounts. It stops short of naming a sibling or scope boundary explicitly, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the word 'accessible' signals that results are permission-scoped to the token's pages, and the fields hint at discovery/selection use. There is no explicit when-to-use statement, no mention of when to prefer meta_get_instagram_accounts or meta_get_business_assets, and no note about when to supply businessId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_pixelsmeta get pixelsARead-onlyIdempotent
List pixels and datasets from an ad account or Business Manager when accessible, returning actionable warnings for permission-limited edges.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| businessId | No | Business Manager ID for owned/client pixels and datasets. | |
| adAccountId | No | Ad account ID for /adspixels and offline conversion datasets. | |
| includeDatasets | No | Also attempt dataset/offline conversion dataset edges. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, so the description's real contribution is the disclosure that permission-limited edges yield actionable warnings rather than failing outright — a genuinely useful non-obvious trait. It stops short of covering pagination limits or empty-result behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the scope constraint and behavioral caveat both earn their place. Minor awkwardness in the trailing 'when accessible' clause keeps it off a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full annotation coverage, and 100% schema descriptions, the description only needs to add routing and permission nuance, which it does. An agent could call it correctly from this definition.
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 all five parameters are already documented, and the description only lightly implies that businessId targets Business Manager pixels/datasets while adAccountId targets /adspixels. Baseline 3 applies since the schema does the heavy lifting.
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?
States a specific verb ('List') and resources ('pixels and datasets') and scopes them to an ad account or Business Manager. It is clearly distinguishable from the sibling tools, none of which deal with pixels, though it does not explicitly name a sibling.
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?
'When accessible' hints at a permission precondition but gives no explicit when-to-use/when-not guidance, and nothing tells the agent how to choose between businessId and adAccountId. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_promotable_appsmeta get promotable appsARead-onlyIdempotent
List the apps this ad account can advertise, with their store URLs, to set up a website and app (cross-channel) ad set: promoted_object.omnichannel_object.app[] takes application_id and object_store_urls. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| adAccountId | Yes | Owning advertising account ID. Use the exact ID returned by account discovery; do not substitute a campaign or business ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the trailing 'Read-only' is redundant. The description adds no behavioral context beyond safety (no pagination, no scoping caveats, no behavior when no promotable apps exist), so it earns partial credit only for framing this as a discovery/prep step.
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?
One densely packed sentence front-loads purpose and then supplies the consuming field path. No filler, though the embedded Graph API field syntax makes it heavier to parse than necessary for an agent skimming it.
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?
An output schema exists, so return values needn't be explained, and the description covers purpose, downstream consumption, and read-only nature. Minor gaps remain around result volume/pagination and empty-result handling for a simple single-parameter listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the adAccountId description already warns against substituting campaign or business IDs. The description adds nothing about the single parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the apps this ad account can advertise') plus a distinguishing payload ('with their store URLs'). This clearly separates it from asset-listing siblings like meta_get_pages, meta_get_pixels, and meta_get_instagram_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?
Explicitly ties the tool to a concrete downstream use case: setting up a website and app (cross-channel) ad set via promoted_object.omnichannel_object.app[]. It does not name any alternative tool or a when-not-to-use condition, which keeps it 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_get_study_resultsmeta get study resultsARead-onlyIdempotent
Get detailed results for a conversion lift or A/B test study. Returns objectives, cells, and lift results.
| Name | Required | Description | Default |
|---|---|---|---|
| studyId | Yes | The Ad Study ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered and the description does not contradict it. The description adds only a partial view of what is returned (objectives, cells, lift results), with no mention of permissions, scoping to an ad account, data freshness, or error behavior for an invalid study ID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the capability stated first and the return contents second; no filler. The second sentence slightly overlaps the existing output schema, so it earns only partial credit, but the description is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single well-documented parameter, full annotation coverage and an output schema, the description needs only to say what the tool fetches, which it does. The remaining gap is sibling differentiation in a crowded namespace containing meta_get_ad_studies and meta_interpret_experiment_results, which could lead an agent to pick the wrong 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?
There is a single parameter, studyId, at 100% schema description coverage ('The Ad Study ID'), so the schema already carries its meaning. The description adds nothing about ID format, provenance (where to obtain the ID), or whether the study must belong to the current ad account. Baseline 3 applies when the schema does the work.
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?
States a specific verb ('Get') plus resource ('detailed results') and narrows scope to conversion lift or A/B test studies, and lists the result sections (objectives, cells, lift results). An agent can tell it retrieves results rather than study metadata. However, it never names the closely related siblings meta_get_ad_studies (list studies) or meta_interpret_experiment_results, leaving the boundary implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it applies to conversion lift and A/B test studies, so an agent can infer it needs a studyId from an existing study. There is no explicit when-to-use, no prerequisite (e.g. must first call meta_get_ad_studies to obtain an ID), and no guidance on when to prefer meta_interpret_experiment_results instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_uploaded_videometa get uploaded videoBRead-onlyIdempotent
Check video processing and membership in the selected account library. If the first page misses the ID, use the video title to narrow the account-scoped lookup. A direct video read alone never proves membership or readiness. Bounded pagination; not_found is not success.
| Name | Required | Description | Default |
|---|---|---|---|
| videoId | Yes | Exact uploaded video ID returned by Meta in this account. | |
| adAccountId | Yes | Owning advertising account ID. Use the exact ID returned by account discovery; do not substitute a campaign or business ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description still adds real behavioral context beyond that: lookups are 'bounded pagination', the scope is the account library, and 'not_found is not success' warns that a negative result is not proof of absence. Only the fallback mechanism is left opaque.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, no filler, and the verification intent plus the failure-semantics warning are front-loaded. The only wasted content is the title-based lookup advice, which does not correspond to any input the tool accepts.
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?
An output schema exists, so return values need not be explained, and the description covers membership/readiness semantics and pagination bound. The gap is the instructed fallback: an agent told to 'use the video title to narrow the account-scoped lookup' has only videoId and adAccountId available, leaving the recovery path unexplained and potentially unexecutable.
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 both parameters are already documented and the baseline is 3. The description reinforces account scoping ('the selected account library', 'account-scoped lookup'), but it also references a 'video title' narrowing path for which no parameter exists, which muddies rather than clarifies 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 frames the tool as a verification step ('Check video processing and membership in the selected account library') rather than plainly stating it fetches an uploaded video record by ID, so the primary action must be inferred. It does distinguish itself from list-oriented siblings like meta_list_ad_videos by emphasizing per-ID membership/readiness checks, but the framing is oblique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives situational cues ('If the first page misses the ID...', 'A direct video read alone never proves membership or readiness') that imply when this verification is needed, which is more than nothing. However, it never names the sibling tools an agent should consider instead (meta_list_ad_videos, meta_get_video_sources), and the advised fallback path is not actionable given the parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_get_video_sourcesmeta get video sourcesARead-onlyIdempotent
Resolve fresh download URLs (source) and thumbnails for specific ad videos. Call this at download time: the returned URLs are signed and expire quickly.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | No | Owning Page ID from the ad creative. Allows Page-token fallback even when the user token cannot read the video node. | |
| videoIds | Yes | Video IDs to resolve (at most 10 per call, one Graph request each) | |
| adAccountId | Yes | Ad account that owns the videos, used for scoping and rate limits |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior. The description adds important context beyond annotations by explaining that returned URLs are signed and short-lived, which directly affects how the agent should sequence the call.
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 tightly written sentences front-load the core action and follow with the critical operational constraint. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich annotations, full schema coverage, and an output schema, the description supplies the key missing behavioral context: these URLs are signed and expire quickly. Nothing essential for correct invocation is absent.
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 input schema already documents adAccountId, videoIds, and pageId thoroughly. The description reinforces the video-specific download use case but does not add parameter-level semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: resolve fresh download URLs (source) and thumbnails for specific ad videos. It is clear enough to distinguish from listing or uploading videos, though it does not explicitly name a sibling tool as the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear timing guidance: call this at download time because the returned URLs are signed and expire quickly. This is strong contextual usage guidance, though it does not explicitly say when not to use it or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_health_checkmeta health checkARead-onlyIdempotent
Read-only connection diagnostic: inspects token identity and granted permissions, and lists accessible ad accounts without exposing the access token. Unavailable checks remain unknown; granted scopes do not prove app access level or clearance of Meta security checkpoints.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds genuine context beyond that: it never exposes the access token, unresolved checks stay 'unknown', and granted scopes do not prove app access level or Meta security clearance — a meaningful reliability caveat an agent would not infer from annotations alone.
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 front-loaded sentences, with the read-only diagnostic purpose stated first and the caveats second. Dense but every clause carries signal; the caveat sentence is slightly packed but not padded.
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?
An output schema exists, so return structure needn't be explained. For a parameterless diagnostic, the description supplies the only genuinely needed extras — the non-exposure guarantee and the limits of what a passing check proves — leaving nothing an agent must guess.
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 takes zero parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate at the argument level.
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?
States a specific verb and resource ('Read-only connection diagnostic') and enumerates exactly what it inspects: token identity, granted permissions, and accessible ad accounts. This cleanly distinguishes it from data-fetching siblings like meta_get_business_assets and from the seeming overlap with meta_debug_token by framing it as a connection health probe.
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 framing as a 'connection diagnostic' implies usage (verify a connection before running other calls), but it never explicitly says when to choose this over meta_debug_token or meta_list_ad_accounts, which overlap functionally. The caveats about unknown checks imply a pre-flight role without stating it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_interpret_experiment_resultsmeta interpret experiment resultsBRead-onlyIdempotent
Read and interpret A/B test or conversion lift study results with confidence guardrails, cells, objectives, and optional cell entities.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| studyId | No | Specific Ad Study ID to interpret. | |
| adAccountId | No | Ad account ID used to discover ad_studies when studyId is omitted. | |
| cellEntityType | No | Entity type represented by experiment cells. | campaigns |
| includeCellEntities | No | Also read campaigns/adsets/adaccounts attached to each study cell. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is covered. The description adds that interpretation includes confidence guardrails and cell/objective breakdowns, but it doesn't explain what 'confidence guardrails' means operationally, what happens if a study lacks significance, or how discovery via adAccountId differs from a direct studyId read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that packs the verb, resource, and scope without filler. It is slightly dense ('confidence guardrails, cells, objectives, and optional cell entities') but nothing is redundant.
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?
An output schema exists so return values needn't be described, and annotations cover safety. What remains missing is routing guidance against the closely related meta_get_study_results and any note on study-state prerequisites, which matters for a tool that must interpret rather than merely fetch.
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 parameter meaning is already fully documented, and no param is described in more depth here. The description's mention of 'cells' and 'optional cell entities' loosely echoes cellEntityType/includeCellEntities but adds no new semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb pair ('read and interpret') on a specific resource ('A/B test or conversion lift study results') and names the dimensions covered (confidence guardrails, cells, objectives, cell entities). It is clear what the tool does, though it does not explicitly distinguish itself from the very similar sibling meta_get_study_results ('interpret' vs 'get' is only implied).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'interpret' suggests this is the analytical layer over raw study results, but the description never says when to call this versus meta_get_study_results or meta_get_ad_studies, nor when to prefer one over the other. No exclusions or prerequisites (e.g., that a study must have run to completion) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_join_product_insightsmeta join product insightsARead-onlyIdempotent
Query product-breakdown insights and enrich rows with Product Catalog metadata when catalog access is available.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Entity or aggregation level for the requested report. | ad |
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| metrics | No | Native or documented calculated metric names to request. Check compatibility with the selected dimensions. | |
| catalogId | No | Product Catalog ID used to load product metadata for joins. | |
| timeRange | No | Optional custom insights date range. | |
| datePreset | No | Insights date preset. Defaults to last_30d. | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) | |
| productBreakdown | No | Native product grouping used to join catalog items with reported insights. | product_id |
| catalogProductLimit | No | Maximum catalog product records read for the join. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds real behavioral context beyond that: the catalog join is opportunistic and degrades gracefully when catalog access is unavailable, which tells the agent rows may come back unenriched. It does not mention rate limits or pagination, but those live in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the primary verb and resource, then the conditional enrichment clause. No filler, no restatement of the title.
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?
An output schema exists, so return values need no explanation, and nine parameters are fully documented in the schema. The description covers the one thing the schema cannot convey — that catalog enrichment is conditional — leaving only minor gaps such as default date-preset behavior and metric/dimension compatibility.
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%, with enums, defaults, bounds and nested timeRange all documented inline, so the baseline is 3. The description adds no syntax or format guidance for catalogId, productBreakdown, or catalogProductLimit beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('query product-breakdown insights') plus a secondary behavior ('enrich rows with Product Catalog metadata'), which clearly separates it from the generic meta_get_insights sibling. It stops short of naming an alternative tool, but the 'product-breakdown' scoping makes the domain unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the product-breakdown framing and the conditional 'when catalog access is available', which signals a prerequisite. However, it never explicitly says to prefer this over meta_get_insights for product-level reporting, nor does it name meta_get_catalog_products as the catalog-side alternative, so routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_list_ad_accountsmeta list ad accountsARead-onlyIdempotent
List all Meta ad accounts accessible with the current token. Returns account ID, name, currency, timezone, and status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context about token scope and returned fields, but does not discuss pagination, rate limits, empty results, or permission failures beyond the token reference.
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 core action and followed by the return fields. Every sentence earns its place and there is no redundant or filler language.
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: zero parameters, an output schema exists, and annotations cover the safety profile. The description provides enough context for an agent to know what it does and what it returns, without needing to restate schema or 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?
The tool has zero parameters, so there are no parameter semantics to explain. The baseline for a zero-parameter schema is 4, and the description does not need to compensate for missing parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: list all Meta ad accounts accessible with the current token. It also names the fields returned, which makes the tool's output concrete. Sibling differentiation is limited: it does not explicitly distinguish itself from tools like meta_get_business_assets or meta_get_account_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the phrase 'accessible with the current token,' suggesting this is the entry point for discovering accounts. However, there is no explicit when-to-use guidance, no exclusions, and no mention of alternatives among the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_list_ad_imagesmeta list ad imagesARead-onlyIdempotent
List the ad account image library (/adimages): hash, name, dimensions, status, a permanent publicly served display URL (permalink_url), short-lived CDN URLs, and optionally the creatives using each image.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| hashes | No | Only these image hashes (exact match) | |
| minWidth | No | Only images at least this wide, in pixels | |
| minHeight | No | Only images at least this tall, in pixels | |
| nameFilter | No | Only images whose file name matches this value | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) | |
| includeUsage | No | Also return the creative IDs using each image |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety bar is met; the description adds genuine operational context beyond that by labeling permalink_url as permanent and publicly served while the CDN URLs are short-lived — a behavioral detail an agent needs for caching decisions. It stops short of mentioning pagination limits, permissions, or rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, leading with the verb, the resource, and the API path. The trailing field enumeration partly duplicates the output schema, which is minor waste but also the most scannable part of the 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?
With an output schema present, the description need not enumerate return fields, yet it still surfaces the one return detail an agent must act on (permalink stability vs. expiring CDN URLs). Gaps remain around pagination behavior and whether adAccountId must be the act_-prefixed form for this endpoint, though the schema covers the latter.
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 schema already documents all eight parameters including hashes, minWidth/minHeight, nameFilter, cursor, and limit. The description only restates includeUsage in prose ("optionally the creatives using each image") and adds no filtering syntax or matching semantics beyond what the schema provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List the ad account image library (/adimages)") and enumerates the returned fields, so an agent knows exactly what it gets back. It is distinguishable from meta_get_creative_assets and meta_list_ad_videos by resource, but it never names those siblings to confirm the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use or when-not-to-use guidance and never routes the agent between this tool and the many sibling listing tools (meta_get_creative_assets, meta_list_ad_videos, meta_get_creatives). The optional includeUsage flag is the only hint about a usage decision, and its trade-off is not explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_list_ad_videosmeta list ad videosARead-onlyIdempotent
List the ad account video library (/advideos): title, duration, processing status, and publicly served thumbnails (preferred and largest sizes). Source file URLs are returned only on request because they expire quickly.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Videos per page (thumbnail payloads are heavy, keep this modest) | |
| cursor | No | Pagination cursor from previous response | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) | |
| titleFilter | No | Only videos whose title contains this value | |
| includeSource | No | Also return the short-lived raw video file URL for each video | |
| maxLengthSeconds | No | Only videos at most this many seconds long | |
| minLengthSeconds | No | Only videos at least this many seconds long |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and open-world behavior. The description adds useful context beyond the annotations: thumbnails are publicly served in preferred and largest sizes, and source file URLs are returned only on request because they expire quickly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences with no wasted language. The core identity is front-loaded, and the thumbnail and source-URL details are appropriately secondary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich annotations, 100% schema coverage, and an output schema, the description covers the essential behavior an agent needs to call the tool correctly. It could still be slightly more complete by mentioning pagination or when to prefer sibling video-source tools, but it is adequate for this list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters, including limit, cursor, filters, and includeSource. The description adds behavioral meaning for includeSource by explaining why source URLs are opt-in, but it does not deepen semantics for the remaining parameters beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: listing the ad account video library (/advideos), and it enumerates the returned fields. It is distinguishable from image-list siblings by its explicit video focus, but it does not directly name or contrast with likely alternatives such as meta_get_video_sources or meta_get_uploaded_video.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by describing what the tool lists, but it gives no explicit when-to-use guidance, no exclusions, and no alternatives. It does not tell the agent when to choose this tool over sibling tools such as meta_get_video_sources or meta_list_ad_images.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_list_edge_rawmeta list edge rawARead-onlyIdempotent
List an allowlisted read-only Meta Graph edge with caller-selected flat fields, filters, and cursor pagination. Use this for broad metadata/entity discovery when a specialized tool does not expose a newly added field.
| Name | Required | Description | Default |
|---|---|---|---|
| edge | Yes | Allowlisted Meta Graph edge to read on the selected node. | |
| after | No | Opaque cursor for the next page returned by Meta. | |
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| since | No | Beginning of the requested reporting period; use the format accepted by the provider. | |
| until | No | End of the requested reporting period; use the format accepted by the provider. | |
| before | No | Opaque cursor for the previous page returned by Meta. | |
| fields | No | Native provider fields to return. Select only fields supported by the chosen object or report. | |
| parentId | Yes | Parent Graph node ID, such as act_123, a Business, Page, catalog, campaign, or ad set ID | |
| filtering | No | Native provider filter expressions; credentials and account overrides are not allowed. | |
| parameters | No | Additional documented GET parameters, for example targeting_spec or optimization_goal; auth and HTTP method override parameters are blocked | |
| includeSummary | No | Request the provider's available summary or total-count metadata. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, destructive=false, openWorld=true, so the safety profile is covered. The description adds useful traits: the edge allowlist and 'flat fields' (i.e., no nested expansion), plus cursor pagination. It does not mention rate limits, error modes, or what the allowlist rejects.
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, zero filler, with the capability statement first and the routing guidance second. Nothing to trim.
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?
Output schema exists, so return values need no explanation, and the schema fully covers the 11 parameters including the blocked-parameter constraints. For a generic escape-hatch tool this is nearly complete; only guidance on which edges pair with which parentId types is absent.
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% and every parameter (edge, parentId, fields, filtering, parameters, cursors, since/until) is documented in the schema. The description only restates the categories of input without adding format details, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'List an allowlisted read-only Meta Graph edge' paired with the field/filter/pagination capabilities. It distinguishes itself from the specialized siblings by framing itself as the generic discovery path, though the term 'edge' remains jargon that only the schema enum fully disambiguates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('broad metadata/entity discovery when a specialized tool does not expose a newly added field'), which implicitly tells the agent to prefer specialized tools first. No explicit when-not or named alternative, so it falls short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_search_entitiesmeta search entitiesARead-onlyIdempotent
Search campaigns, ad sets, or ads by name within an ad account. Useful for finding specific entities.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| cursor | No | Pagination cursor from previous response | |
| entityType | Yes | Type of entity to search | |
| nameFilter | Yes | Name substring to search for | |
| adAccountId | Yes | Ad account ID (e.g., act_123456789) | |
| statusFilter | No | Filter by native effective_status, not configured status. PAUSED excludes IN_PROCESS, CAMPAIGN_PAUSED and ADSET_PAUSED. Omit for post-creation verification and inspect both returned status fields. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, covering the safety profile. The description adds account scoping and name-based search context but does not disclose rate limits, result behavior, pagination implications, or status-filter semantics beyond what structured fields provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with the purpose front-loaded and a brief usage note. There is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema richly documents pagination, limits, enums, and status-filter nuances, so the description need not repeat those. It gives the core scope and search intent, though it omits routing guidance versus the sibling get/list tools.
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%, with all six parameters documented, including enum values and the statusFilter caveat about native effective_status. The description only restates that entities are searched by name and type, adding no extra parameter meaning such as case sensitivity or exact-match behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search') and resources (campaigns, ad sets, ads), scoped to an ad account and by name. It does not explicitly distinguish this search behavior from sibling list/get tools such as meta_get_campaigns or meta_get_ads, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an implied usage context with 'Useful for finding specific entities,' suggesting use when a name is known. It provides no explicit when-not guidance, alternatives, or notes about pagination versus list-style sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_search_targeting_optionsmeta search targeting optionsCRead-onlyIdempotent
Search Meta's read-only targeting metadata for interests, validated interests, geographies, locales, countries, cities, regions, markets, or postal codes.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Provider object or operation type selected from this schema's allowed values. | |
| limit | No | Maximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results. | |
| query | No | Search text; required by most interest and geography searches | |
| countryCode | No | Country code used to localize keyword or targeting results. | |
| locationTypes | No | Location dictionary categories to include in targeting search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description mostly repeats the read-only nature and lists resource categories rather than adding behavioral context such as pagination limits, rate limits, or empty-result behavior. With annotations carrying the behavioral burden, this is a limited contribution.
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 front-loaded sentence that begins with the action and resource. It is efficient and avoids low-value filler, though the enumerated list is somewhat long and could have been structured as use-case guidance instead.
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?
An output schema exists and schema coverage is 100%, so return values and parameters need not be fully explained in prose. However, the description does not help an agent choose among the 17 type enum values or between this and sibling search tools, leaving a meaningful gap for a tool with such a large enum.
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 all five parameters are already documented in the input schema. The description hints at categories that map to the type enum, but it does not explain how to use query, countryCode, locationTypes, or limit beyond what the schema already states. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Search Meta's read-only targeting metadata') and enumerates several domains such as interests, geographies, locales, and postal codes. It is clear what the tool returns in broad terms, though it does not explicitly distinguish itself from the closely named sibling meta_search_entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by listing targeting categories, but it never says when to choose this tool over meta_search_entities or other search siblings, nor when not to use it. There is no explicit guidance on prerequisites, required query text, or which targeting type to select for a given task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meta_validate_querymeta validate queryARead-onlyIdempotent
Validate a metric/breakdown combination BEFORE executing. Returns errors and warnings. Use this to check if your query will work.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Aggregation level | |
| metrics | Yes | Metric keys to validate | |
| breakdowns | No | Breakdown keys to validate |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Original tool result: parsed JSON when the text is JSON, otherwise the text or multiple MCP content blocks. Provider fields depend on the selected query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds that it returns errors and warnings and is a pre-flight check, but doesn't explain what distinguishes errors from warnings or whether validation is exhaustive. With annotations carrying the burden, this is adequate but thin.
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 short sentences with the pre-execution constraint front-loaded; every sentence is relevant. The final sentence is slightly redundant with the first, but there is no bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and rich annotations, the description needn't explain return values. It covers what the tool validates and when to use it, which is enough for a simple three-parameter dry-run validator; only a hint about the level parameter or error/warning semantics is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents metrics, breakdowns and level. The description only echoes the metric/breakdown combination and says nothing about the level parameter or value formats, so it adds little beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Validate a metric/breakdown combination') and makes the pre-execution scope explicit, which separates it from the execution-oriented sibling tools like meta_get_insights. It stops short of naming the sibling it complements, so it's clear but not fully differentiated.
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?
'BEFORE executing' gives a clear usage context and 'Use this to check if your query will work' reinforces the intent. It doesn't state exclusions or name the alternative execution tool, but the when-to-use signal is unambiguous.
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.
42 tool updates
v2.1.1- Changed
meta_debug_token1 field changed- changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_account_details2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_ad_activity2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_ad_preview2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_ad_studies2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_ads2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_adset_configuration2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_adsets2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_audience_details2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_audiences2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_brand_safety_controls2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_business_assets3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / cursors / propertyNamesAdded value: +{ + "type": "string" +} - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_campaign_structure2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_campaigns2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_catalog_batch_status2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_catalog_products2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_creative_assets2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_creatives2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_delivery_diagnostics3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / timeRange / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_entity_configuration3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / fields / items / enumPrevious value: -[ - "name", - "status", - "objective", - "daily_budget", - "lifetime_budget", - "special_ad_categories", - "special_ad_category_country", - "bid_strategy", - "campaign_id", - "optimization_goal", - "billing_event", - "targeting", - "promoted_object", - "bid_amount", - "bid_constraints", - "start_time", - "end_time", - "attribution_spec", - "destination_type", - "is_dynamic_creative", - "dsa_beneficiary", - "dsa_payor", - "adset_id", - "creative", - "tracking_specs", - "conversion_domain", - "object_story_spec", - "asset_feed_spec", - "object_story_id", - "instagram_actor_id", - "instagram_user_id", - "url_tags", - "degrees_of_freedom_spec", - "is_adset_budget_sharing_enabled" -]New value: +[ + "name", + "status", + "objective", + "daily_budget", + "lifetime_budget", + "special_ad_categories", + "special_ad_category_country", + "bid_strategy", + "campaign_id", + "optimization_goal", + "billing_event", + "targeting", + "promoted_object", + "bid_amount", + "bid_constraints", + "start_time", + "end_time", + "attribution_spec", + "destination_type", + "is_dynamic_creative", + "dsa_beneficiary", + "dsa_payor", + "adset_id", + "creative", + "tracking_specs", + "conversion_domain", + "object_story_spec", + "asset_feed_spec", + "object_story_id", + "instagram_actor_id", + "instagram_user_id", + "url_tags", + "degrees_of_freedom_spec", + "is_adset_budget_sharing_enabled", + "applink_treatment", + "omnichannel_link_spec" +] - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_insights9 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / actionBreakdownsAdded value: +{ + "description": "Native action breakdowns such as action_type. Only for action metrics.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / adsetIdsAdded value: +{ + "description": "Restrict adset- or ad-level insights to these ad set IDs.", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / campaignIdsAdded value: +{ + "description": "Restrict campaign-, adset- or ad-level insights to these campaign IDs.", + "items": { + "pattern": "^\\d+$", + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / dimensionsAdded value: +{ + "description": "Dimension keys listed in meta://compatibility. Entity metadata, such as names, statuses and budgets, is read at its current value.", + "items": { + "type": "string" + }, + "maxItems": 100, + "type": "array" +} - added
Input schema / properties / effectiveStatusAdded value: +{ + "description": "Keep only entities with this native effective status at the selected level.", + "enum": [ + "ACTIVE", + "PAUSED" + ], + "type": "string" +} - changed
Input schema / properties / includeAccountTotals / descriptionPrevious value: -"Also read native account-level totals with the same dates, metrics and attribution. Requires no adIds or breakdowns."New value: +"Also read native account-level totals with the same dates, metrics and attribution. Requires no entity filter, dimension or breakdown." - removed
Input schema / properties / timeRange / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_insights_raw17 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / actionBreakdowns / items / $refRemoved value: -"#/properties/fields/items" - added
Input schema / properties / actionBreakdowns / items / maxLengthAdded value: +100 - added
Input schema / properties / actionBreakdowns / items / minLengthAdded value: +1 - added
Input schema / properties / actionBreakdowns / items / patternAdded value: +"^[A-Za-z][A-Za-z0-9_]*$" - added
Input schema / properties / actionBreakdowns / items / typeAdded value: +"string" - removed
Input schema / properties / breakdowns / items / $refRemoved value: -"#/properties/fields/items" - added
Input schema / properties / breakdowns / items / maxLengthAdded value: +100 - added
Input schema / properties / breakdowns / items / minLengthAdded value: +1 - added
Input schema / properties / breakdowns / items / patternAdded value: +"^[A-Za-z][A-Za-z0-9_]*$" - added
Input schema / properties / breakdowns / items / typeAdded value: +"string" - removed
Input schema / properties / filtering / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / timeRange / additionalPropertiesRemoved value: -false - removed
Input schema / properties / timeRange / properties / until / $refRemoved value: -"#/properties/timeRange/properties/since" - added
Input schema / properties / timeRange / properties / until / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - added
Input schema / properties / timeRange / properties / until / typeAdded value: +"string" - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_instagram_accounts2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_node_fields2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_organic_content_enrichment2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_page_posts2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_pages2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_pixels2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Added
meta_get_promotable_apps - Changed
meta_get_study_results2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_uploaded_video2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_get_video_sources2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_health_check1 field changed- changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_interpret_experiment_results2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_join_product_insights3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / timeRange / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_list_ad_accounts1 field changed- changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_list_ad_images4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / minHeight / maximumAdded value: +9007199254740991 - added
Input schema / properties / minWidth / maximumAdded value: +9007199254740991 - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_list_ad_videos2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_list_edge_raw7 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / filtering / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / parameters / propertyNamesAdded value: +{ + "type": "string" +} - removed
Input schema / properties / until / $refRemoved value: -"#/properties/since" - added
Input schema / properties / until / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - added
Input schema / properties / until / typeAdded value: +"string" - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_search_entities2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_search_targeting_options2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
- Changed
meta_validate_query2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": {}, - "type": "object" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +]
41 tool updates
v2.0.1- First observed
meta_debug_token - First observed
meta_get_account_details - First observed
meta_get_ad_activity - First observed
meta_get_ad_preview - First observed
meta_get_ad_studies - First observed
meta_get_ads - First observed
meta_get_adset_configuration - First observed
meta_get_adsets - First observed
meta_get_audience_details - First observed
meta_get_audiences - First observed
meta_get_brand_safety_controls - First observed
meta_get_business_assets - First observed
meta_get_campaign_structure - First observed
meta_get_campaigns - First observed
meta_get_catalog_batch_status - First observed
meta_get_catalog_products - First observed
meta_get_creative_assets - First observed
meta_get_creatives - First observed
meta_get_delivery_diagnostics - First observed
meta_get_entity_configuration - First observed
meta_get_insights - First observed
meta_get_insights_raw - First observed
meta_get_instagram_accounts - First observed
meta_get_node_fields - First observed
meta_get_organic_content_enrichment - First observed
meta_get_page_posts - First observed
meta_get_pages - First observed
meta_get_pixels - First observed
meta_get_study_results - First observed
meta_get_uploaded_video - First observed
meta_get_video_sources - First observed
meta_health_check - First observed
meta_interpret_experiment_results - First observed
meta_join_product_insights - First observed
meta_list_ad_accounts - First observed
meta_list_ad_images - First observed
meta_list_ad_videos - First observed
meta_list_edge_raw - First observed
meta_search_entities - First observed
meta_search_targeting_options - First observed
meta_validate_query
TDQS
Scored across 42 tools
Several near-duplicate pairs force an agent to guess: meta_get_insights vs meta_get_insights_raw, meta_get_creatives vs meta_get_creative_assets, meta_get_audiences vs meta_get_audience_details, meta_get_ad_studies vs meta_get_study_results vs meta_interpret_experiment_results, and meta_get_node_fields vs meta_list_edge_raw vs meta_get_entity_configuration all overlap heavily. The long descriptions try to carve out niches (curated vs escape hatch), but the boundaries remain blurry at selection time, especially among the raw/generic graph readers.
Almost everything follows a stable meta_verb_noun pattern (get_, list_, search_, validate_, join_, interpret_) with a uniform prefix. A few outliers like meta_health_check, meta_debug_token, and meta_get_uploaded_video deviate slightly but remain readable and predictable.
42 tools is heavy for an ad account surface, and much of the bloat comes from generic escape hatches and one-off field readers (node fields, edge raw, batch status, uploaded video) rather than distinct workflows. The broad domain justifies more than a dozen tools, but not this many near-redundant entries.
Read coverage is genuinely broad across accounts, campaigns, ad sets, ads, creatives, audiences, catalogs, targeting, previews, media library, business assets, and experiments. However, the surface is entirely read-only — no create, update, pause, budget, or delete operations — which is a notable gap if the server is meant to cover the Meta Ads lifecycle rather than serve as a diagnostic/analytics layer.
Maintenance
Related MCP Connectors
Hosted Meta Ads MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Reddit Ads MCP server: 9 tools for subreddit reports, targeting, diagnosis. Read-only by default.
Hosted Ads Libraries MCP server, with each action switched on or off per account.
Microsoft Ads MCP server: 11 tools for search, PMax, Google Ads imports. Read-only by default.
Related MCP Servers
- AlicenseAqualityAmaintenanceSelf-hosted Google Ads MCP server: 35 read tools and 10 opt-in, preview-first write tools. Maintained source relocated from getmcpads-com/google-ads-mcp-server; npm package remains @getmcpads/google-ads-mcp-server.35593 npm1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceSelf-hosted Pinterest Ads MCP server with 28 read tools and 25 opt-in, preview-first write tools. Maintained source relocated to get-mcp-ads/pinterest-ads-mcp-server; npm package remains @getmcpads/pinterest-ads-mcp-server.535 npmApache 2.0
- AlicenseBqualityAmaintenanceSelf-hosted Google Analytics 4 MCP server with 27 read-only tools for the Google Analytics Data and Admin APIs. Maintained source relocated to get-mcp-ads/google-analytics-mcp-server; npm package remains @getmcpads/google-analytics-mcp-server.27530 npmApache 2.0
- AlicenseAqualityAmaintenanceSelf-hosted Google Search Console MCP server with 20 read-only tools for Google Search Console. Maintained source relocated to get-mcp-ads/google-search-console-mcp-server; npm package remains @getmcpads/google-search-console-mcp-server.20621 npmApache 2.0