Skip to main content
Glama
get-mcp-ads

Meta Ads by Get MCP Ads

Meta Ads MCP server

Ask better questions about your Meta campaigns.

Compare campaign performance, inspect delivery and prepare changes from your MCP client.

Release CI Smithery License: Apache 2.0 Node

Watch the film · What's new · Install · Tool reference · Try hosted getmcpads

Watch the getmcpads film: every ad account in one conversation with your AI assistant

Play the 45-second film

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 zod to 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=dev reports 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.json is 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 server.json and mcpName for the official MCP Registry, under com.getmcpads/meta-ads.

1.0.0

August 29, 2026

First open-source release

Full changelog · All releases

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 build

Configure 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

meta_get_node_fields, meta_list_edge_raw, meta_get_insights_raw reach Graph fields this server doesn't model yet

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.

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.

  1. Go to Business Settings → Users → System Users

  2. Add a system user. Give it the Employee role unless you need more.

  3. Assign Assets → select your ad accounts → grant View performance (add Manage campaigns only if you plan to enable writes).

  4. Generate New Token → pick your app → select scope ads_read (add ads_management only for writes).

  5. Set the expiry to Never.

  6. 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

ads_read

Always. Campaigns, insights, everything read-only

ads_management

Only if you set META_ENABLE_WRITES=1

business_management

Optional. Business Manager asset discovery

pages_show_list, pages_read_engagement

Optional. Page posts and organic enrichment

instagram_basic

Optional. Linked Instagram accounts

catalog_management

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-server

Cursor

.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 start

Configuration

Variable

Default

Meaning

META_ACCESS_TOKEN

none

Required. Your Meta access token

META_ENABLE_WRITES

unset

Set to 1 to register the 24 write tools

META_API_VERSION

v26.0

Graph API version. Override to pin another

LOG_LEVEL

info

debug, info, warn, error

Check your setup at any time:

npm run doctor

Writes, 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_campaign always creates the campaign PAUSED. 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

meta_update_campaign_status / _adset_status / _ad_status

Pause or reactivate

meta_update_campaign_budget / _adset_budget

Daily or lifetime budget

meta_update_adset_schedule

Start and end time

meta_rename_campaign / _adset / _ad / _ad_account

Name only

meta_create_campaign

Creates a campaign, always PAUSED


Tools

Every tool is listed below. See server-card.json for complete parameter and output schemas.

Tool

Purpose

meta_health_check

Read-only connection diagnostic: inspects token identity and granted permissions, and lists accessible ad accounts without exposing the access token.

meta_get_business_assets

Discover accessible Meta Business assets read-only: businesses, pages, Instagram accounts, pixels, and datasets when permissions allow.

meta_get_pages

List accessible Facebook Pages with id, name, category, tasks, picture, and linked Instagram account references when available.

meta_get_instagram_accounts

List Instagram accounts linked to accessible Pages, Business Manager assets, or an ad account when permissions allow.

meta_get_pixels

List pixels and datasets from an ad account or Business Manager when accessible, returning actionable warnings for permission-limited edges.

meta_get_ad_activity

Read ad account activity logs from /{ad_account_id}/activities with object, event, actor, timestamp, and extra_data fields.

meta_get_delivery_diagnostics

Aggregate read-only delivery diagnostics across campaigns, ad sets, and ads using status/effective_status/issues_info where available plus simple delivery insights.

meta_get_creative_assets

Return ad-linked creative media with actual ad names, collection covers, all carousel/flexible components, resolved image hashes and video URLs.

meta_get_audience_details

Read detailed custom, saved, and lookalike audiences with pagination and rich fields where permissions allow.

meta_get_catalog_products

Read Product Catalogs and Product Items when catalog access is available.

meta_join_product_insights

Query product-breakdown insights and enrich rows with Product Catalog metadata when catalog access is available.

meta_get_brand_safety_controls

Read brand safety, suitability, placement, and context-control signals from ad account/ad set targeting and optional block-list edges.

meta_interpret_experiment_results

Read and interpret A/B test or conversion lift study results with confidence guardrails, cells, objectives, and optional cell entities.

meta_get_organic_content_enrichment

Read Facebook Page posts and Instagram media with URLs, native periods and optional insights.

meta_list_ad_accounts

List all Meta ad accounts accessible with the current token.

meta_get_account_details

Get detailed information for a specific Meta ad account: name, currency, timezone, spend cap, status, business info.

meta_get_campaigns

List campaigns for a Meta ad account.

meta_get_adsets

List ad sets for a Meta ad account, optionally filtered by campaign.

meta_get_ads

List ads for a Meta ad account, optionally filtered by ad set.

meta_get_insights

Query Meta Ads performance insights.

meta_get_campaign_structure

Get hierarchical campaign structure: campaigns -> ad sets -> ads.

meta_get_creatives

Get ad creative content: text, images, videos, links, call-to-action.

meta_get_audiences

List custom, saved, and lookalike audiences for a Meta ad account.

meta_get_ad_studies

List conversion lift studies and A/B tests (Ad Studies) for an ad account.

meta_get_study_results

Get detailed results for a conversion lift or A/B test study.

meta_validate_query

Validate a metric/breakdown combination BEFORE executing.

meta_get_page_posts

Read published Facebook Page posts using a Page token resolved from the connected user.

meta_debug_token

Inspect token identity, validity, expiry and scopes.

meta_search_entities

Search campaigns, ad sets, or ads by name within an ad account.

meta_get_node_fields

Read arbitrary flat fields from one Meta Graph node.

meta_list_edge_raw

List an allowlisted read-only Meta Graph edge with caller-selected flat fields, filters, and cursor pagination.

meta_get_insights_raw

Query the Meta Insights edge with validated native field names, breakdowns, action breakdowns, attribution windows, filters, sort, summary, and pagination.

meta_search_targeting_options

Search Meta's read-only targeting metadata for interests, validated interests, geographies, locales, countries, cities, regions, markets, or postal codes.

meta_get_ad_preview

Get the read-only preview markup for an existing Meta ad in a requested placement format.

meta_list_ad_images

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.

meta_list_ad_videos

List the ad account video library (/advideos): title, duration, processing status, and publicly served thumbnails (preferred and largest sizes).

meta_get_video_sources

Resolve fresh download URLs (source) and thumbnails for specific ad videos.

meta_get_entity_configuration

Read a specific entity in its ad account for reconciliation.

meta_get_uploaded_video

Check video processing and membership in the selected account library.

meta_get_adset_configuration

Read an existing ad set, its parent campaign budget/objective and account currency before preparing an edit or adding ads.

meta_get_promotable_apps

List the apps this ad account can advertise, with their store URLs, to set up a website and app (cross-channel) ad set.

meta_get_catalog_batch_status

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

meta_create_campaign

Create a PAUSED Meta campaign with either ad set budgets (omit campaign budget), a daily campaign budget, or a lifetime campaign budget.

meta_update_adset_budget

Change an ad set daily or lifetime budget after checking its parent budget and existing schedule.

meta_update_adset_schedule

Change start and/or end time using ISO 8601 with an explicit offset.

meta_update_campaign_budget

Change an existing campaign-owned budget after verifying currency and ownership.

meta_create_adset

Create a PAUSED Meta ad set with explicit targeting, optimization, placements, attribution, bidding and schedule.

meta_update_adset_configuration

Update targeting, optimization, placements, attribution, bidding, budget or schedule.

meta_duplicate_adset

Duplicate a known-good ad set within the selected account, preserving complex native configuration.

meta_create_adcreative

Create an ad creative from an existing post or an explicit object_story_spec and optional asset_feed_spec.

meta_create_ad

Create a PAUSED ad using an existing ad set and creative from the selected account.

meta_update_ad_creative

Replace an ad’s creative with another existing creative from the same account.

meta_upload_ad_image

Upload an image into the selected ad account using base64 bytes (up to 5 MiB decoded).

meta_upload_ad_video

Import a video from a publicly reachable HTTPS URL or base64 MP4 bytes (up to 5 MiB decoded).

meta_create_custom_audience

Create a website, engagement, customer-list container or lookalike audience.

meta_update_custom_audience

Update an existing custom audience name, description, retention or complete rule.

meta_create_product_set

Create a filtered product set in a catalog owned by the same Business as the selected ad account.

meta_update_product_set

Replace a product set filter or rename it.

meta_batch_catalog_items

Create or update up to 50 catalog products by retailer_id.

meta_update_campaign_status

Pause or reactivate a Meta campaign.

meta_update_adset_status

Pause or reactivate a Meta ad set.

meta_update_ad_status

Pause or reactivate a Meta ad.

meta_rename_campaign

Rename a Meta campaign.

meta_rename_adset

Rename a Meta ad set.

meta_rename_ad

Rename a Meta ad.

meta_rename_ad_account

Rename a Meta ad account.

URI

Contents

meta://manifest

What this server exposes, and which tool to run first

meta://metrics

All 190 metrics with categories and formats

meta://breakdowns

All 56 breakdowns and where they are valid

meta://compatibility

The compatibility matrix, 90 dimensions

meta://recipes

11 step-by-step workflows

meta://p2-readonly

Read-only scope guidance

meta://app-review

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.com on 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.

  1. Follow the Meta Ads connection guide.

  2. Select the account or property your assistant may read.

  3. Connect Claude, ChatGPT or Codex.

  4. 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 tools
meta_debug_tokenmeta debug tokenA
Read-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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYesOriginal 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

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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

With an output schema present, return values need not be 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 detailsA
Read-onlyIdempotent

Get detailed information for a specific Meta ad account: name, currency, timezone, spend cap, status, business info.

NameRequiredDescriptionDefault
adAccountIdYesAd account ID (e.g., act_123456789)

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 activityA
Read-onlyIdempotent

Read ad account activity logs from /{ad_account_id}/activities with object, event, actor, timestamp, and extra_data fields.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
sinceNoOptional start time accepted by Graph API, usually YYYY-MM-DD or Unix seconds.
untilNoOptional end time accepted by Graph API, usually YYYY-MM-DD or Unix seconds.
cursorNoPagination cursor from previous response
adAccountIdYesAd account ID (e.g., act_123456789)

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 previewA
Read-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.

NameRequiredDescriptionDefault
adIdYesExact ad ID in the selected advertising account.
adFormatNoNative Meta ad preview format; must be compatible with this ad's creative.DESKTOP_FEED_STANDARD

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 adsB
Read-onlyIdempotent

List ads for a Meta ad account, optionally filtered by ad set. Returns ad ID, name, status, and creative reference.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
adSetIdNoAlias for adsetId. If both are supplied, they must match.
adsetIdNoFilter by ad set ID; adSetId is also accepted.
adAccountIdYesAd account ID (e.g., act_123456789)
statusFilterNoFilter 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

NameRequiredDescription
resultYesOriginal 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

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 configurationA
Read-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.

NameRequiredDescriptionDefault
adSetIdYesExact Meta ad set ID in the selected advertising account.
adAccountIdYesOwning advertising account ID. Use the exact ID returned by account discovery; do not substitute a campaign or business ID.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 adsetsA
Read-onlyIdempotent

List ad sets for a Meta ad account, optionally filtered by campaign. Returns targeting, budget, optimization, and schedule info.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
campaignIdNoFilter by campaign ID
adAccountIdYesAd account ID (e.g., act_123456789)
statusFilterNoFilter 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

NameRequiredDescription
resultYesOriginal 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 studiesA
Read-onlyIdempotent

List conversion lift studies and A/B tests (Ad Studies) for an ad account. Includes study type, status, and cells.

NameRequiredDescriptionDefault
adAccountIdYesAd account ID (e.g., act_123456789)

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 detailsB
Read-onlyIdempotent

Read detailed custom, saved, and lookalike audiences with pagination and rich fields where permissions allow.

NameRequiredDescriptionDefault
typeNoProvider object or operation type selected from this schema's allowed values.all
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
adAccountIdNoAd account ID used when listing audiences.
audienceIdsNoSpecific audience IDs to fetch via batch IDs lookup.

Output Schema

NameRequiredDescription
resultYesOriginal 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

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 audiencesA
Read-onlyIdempotent

List custom, saved, and lookalike audiences for a Meta ad account.

NameRequiredDescriptionDefault
typeNoFilter by audience type
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
adAccountIdYesAd account ID (e.g., act_123456789)

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 controlsA
Read-onlyIdempotent

Read brand safety, suitability, placement, and context-control signals from ad account/ad set targeting and optional block-list edges.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
adsetIdsNoSpecific ad set IDs to inspect. If omitted, reads ad sets from the ad account.
businessIdNoOptional Business Manager ID for block-list discovery.
adAccountIdYesAd account ID (e.g., act_123456789)
includeAdsetsNoInclude ad set configuration when checking brand safety.
includeBlockListsNoInclude accessible brand-safety block-list metadata.
includeRawTargetingNoInclude the native targeting specification for diagnostics.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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

With an output schema present 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 assetsA
Read-onlyIdempotent

Discover accessible Meta Business assets read-only: businesses, pages, Instagram accounts, pixels, and datasets when permissions allow.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoLegacy cursor for /me/businesses only. Use cursors for asset edges.
cursorsNoPer-edge cursors from paging/nextActions. Never reuse a cursor for another edge.
maxPagesNoMaximum pages per edge; remaining pages are reported explicitly.
businessIdNoBusiness Manager ID. With adAccountId, discover only its owning Business; otherwise list /me/businesses when this is omitted.
adAccountIdNoOptional ad account ID to discover its owner Business and assigned pixels; datasets are read from that Business when permitted.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 campaignsA
Read-onlyIdempotent

List campaigns for a Meta ad account. Returns campaign ID, name, status, objective, budget, and bid strategy.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
adAccountIdYesAd account ID (e.g., act_123456789)
statusFilterNoFilter 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

NameRequiredDescription
resultYesOriginal 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

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 structureA
Read-onlyIdempotent

Get hierarchical campaign structure: campaigns -> ad sets -> ads. Useful for understanding account organization.

NameRequiredDescriptionDefault
campaignIdNoGet structure for a specific campaign only
adAccountIdYesAd account ID (e.g., act_123456789)

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 statusA
Read-onlyIdempotent

Read the completion and per-item errors for a catalog batch handle. Acceptance of a batch is not proof that every product succeeded.

NameRequiredDescriptionDefault
handleYesAsynchronous catalog batch handle returned by the submission to inspect.
catalogIdYesExact product catalog ID accessible to the selected account.
adAccountIdYesOwning advertising account ID. Use the exact ID returned by account discovery; do not substitute a campaign or business ID.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 productsA
Read-onlyIdempotent

Read Product Catalogs and Product Items when catalog access is available. Returns join-ready product metadata without creating or updating catalog assets.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
searchNoClient-side substring filter across product id, retailer_id, name, brand, category, type, and custom labels.
catalogIdNoProduct Catalog ID to read directly.
businessIdNoBusiness Manager ID used to discover owned/client product catalogs.
productIdsNoSpecific Product Item IDs to fetch via the batch IDs endpoint.
includeProductsNoFetch product items for discovered/provided catalogs.
includeProductSetsNoAlso attempt product_sets edges for catalog context.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 assetsA
Read-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.

NameRequiredDescriptionDefault
adIdsNoSpecific ad IDs to enrich.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
adAccountIdNoAd account ID. Used when adIds/creativeIds are omitted.
creativeIdsNoSpecific creative IDs to enrich.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 creativesB
Read-onlyIdempotent

Get ad creative content: text, images, videos, links, call-to-action. Returns creative details for specified ads.

NameRequiredDescriptionDefault
adIdsNoSpecific ad IDs to get creatives for
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
adAccountIdYesAd account ID (e.g., act_123456789)

Output Schema

NameRequiredDescription
resultYesOriginal 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

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 diagnosticsB
Read-onlyIdempotent

Aggregate read-only delivery diagnostics across campaigns, ad sets, and ads using status/effective_status/issues_info where available plus simple delivery insights.

NameRequiredDescriptionDefault
levelNoEntity or aggregation level for the requested report.all
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
timeRangeNoOptional custom insights date range.
datePresetNoInsights date preset for simple delivery metrics. Defaults to last_7d.
adAccountIdYesAd account ID (e.g., act_123456789)
effectiveStatusFilterNoOptional effective_status filter values such as ACTIVE, PAUSED, WITH_ISSUES, DISAPPROVED.

Output Schema

NameRequiredDescription
resultYesOriginal 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

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 configurationA
Read-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.

NameRequiredDescriptionDefault
fieldsYesExact fields to re-read from the reviewed native creation payload. IDs and account ownership are always checked.
entityIdYesExact entity ID saved in the acknowledged creation receipt.
adAccountIdYesOwning advertising account ID. Use the exact ID returned by account discovery; do not substitute a campaign or business ID.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 insightsA
Read-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.

NameRequiredDescriptionDefault
adIdsNoRestrict ad-level insights to these ad IDs.
levelYesAggregation level: account, campaign, adset, or ad
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
metricsYesMetric keys from meta://metrics (e.g., impressions, spend, ctr)
adsetIdsNoRestrict adset- or ad-level insights to these ad set IDs.
timeRangeNoCustom date range with since/until in YYYY-MM-DD format
breakdownsNoBreakdown keys from meta://breakdowns (e.g., age, gender, country)
datePresetNoPredefined date range (e.g., last_7d, last_30d)
dimensionsNoDimension keys listed in meta://compatibility. Entity metadata, such as names, statuses and budgets, is read at its current value.
adAccountIdYesAd account ID (e.g., act_123456789)
campaignIdsNoRestrict campaign-, adset- or ad-level insights to these campaign IDs.
timeIncrementNoTime granularity: 1 (daily), 7 (weekly), 'monthly', or 'all_days'
attributionModeNoUse Meta account settings, ad-set settings, or explicitly supplied windows. No setting is inferred from returned numbers.account
effectiveStatusNoKeep only entities with this native effective status at the selected level.
actionBreakdownsNoNative action breakdowns such as action_type. Only for action metrics.
actionReportTimeNoDate basis for actions, sent explicitly to Meta.impression
attributionWindowsNoOnly with attributionMode explicit. These windows are sent identically to every split query and account total.
includeAccountTotalsNoAlso read native account-level totals with the same dates, metrics and attribution. Requires no entity filter, dimension or breakdown.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 rawA
Read-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.

NameRequiredDescriptionDefault
sortNoNative provider ordering expressions.
afterNoOpaque cursor for the next page returned by Meta.
levelNoEntity or aggregation level for the requested report.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
fieldsYesNative Meta Insights API fields; calculated aliases are not accepted here
objectIdYesAd account (act_...), campaign, ad set, or ad ID whose /insights edge should be queried
filteringNoNative provider filter expressions; credentials and account overrides are not allowed.
timeRangeNoExplicit provider reporting period with since and until dates.
breakdownsNoNative reporting breakdowns. Check compatibility before combining them.
datePresetNoNamed reporting period. Use the custom date range when you need exact start and end dates.
timeIncrementNoProvider time-bucket size or supported aggregate value.
includeSummaryNoRequest the provider's available summary or total-count metadata.
actionBreakdownsNoMeta action-level breakdowns, subject to Insights compatibility rules.
actionAttributionWindowsNoMeta attribution windows used to attribute action metrics.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

With an output schema present 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 accountsA
Read-onlyIdempotent

List Instagram accounts linked to accessible Pages, Business Manager assets, or an ad account when permissions allow.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
pageIdNoOptional Page ID to read linked instagram_business_account/connected_instagram_account.
businessIdNoOptional Business Manager ID for owned/client Instagram account edges.
adAccountIdNoOptional ad account ID for /instagram_accounts.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 fieldsA
Read-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.

NameRequiredDescriptionDefault
fieldsYesFlat Graph field names; nested field expansion is intentionally disabled
nodeIdYesGraph node ID, for example a campaign, ad set, ad, creative, Page, IG account, pixel, audience, or catalog ID
includeMetadataNoAsk Graph for field metadata when supported

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 enrichmentA
Read-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.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
sinceNoOptional Graph time filter. For IG media this should be Unix seconds or strtotime-compatible text.
untilNoOptional Graph time filter. For IG media this should be Unix seconds or strtotime-compatible text.
cursorNoPagination cursor from previous response
pageIdNoFacebook Page ID for /posts and linked IG discovery.
postIdsNoSpecific Facebook post IDs to enrich.
mediaIdsNoSpecific Instagram media IDs to enrich.
includeInsightsNoInclude available insight metrics; additional provider permissions may be required.
includePagePostsNoRead related Facebook Page posts when the token has permission.
instagramAccountIdNoInstagram professional account ID for /media.
includeInstagramMediaNoRead related Instagram media when the token has permission.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 postsA
Read-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.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
pageIdYesFacebook Page ID
postIdNoExact PageID_PostID to read instead of the recent-post list; must belong to pageId.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 pagesA
Read-onlyIdempotent

List accessible Facebook Pages with id, name, category, tasks, picture, and linked Instagram account references when available.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
businessIdNoOptional Business Manager ID to list owned/client pages. Omit to use /me/accounts.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 pixelsA
Read-onlyIdempotent

List pixels and datasets from an ad account or Business Manager when accessible, returning actionable warnings for permission-limited edges.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
businessIdNoBusiness Manager ID for owned/client pixels and datasets.
adAccountIdNoAd account ID for /adspixels and offline conversion datasets.
includeDatasetsNoAlso attempt dataset/offline conversion dataset edges.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 appsA
Read-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.

NameRequiredDescriptionDefault
adAccountIdYesOwning advertising account ID. Use the exact ID returned by account discovery; do not substitute a campaign or business ID.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 resultsA
Read-onlyIdempotent

Get detailed results for a conversion lift or A/B test study. Returns objectives, cells, and lift results.

NameRequiredDescriptionDefault
studyIdYesThe Ad Study ID

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 videoB
Read-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.

NameRequiredDescriptionDefault
videoIdYesExact uploaded video ID returned by Meta in this account.
adAccountIdYesOwning advertising account ID. Use the exact ID returned by account discovery; do not substitute a campaign or business ID.

Output Schema

NameRequiredDescription
resultYesOriginal 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

B3.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose3/5

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.

Usage Guidelines3/5

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 sourcesA
Read-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.

NameRequiredDescriptionDefault
pageIdNoOwning Page ID from the ad creative. Allows Page-token fallback even when the user token cannot read the video node.
videoIdsYesVideo IDs to resolve (at most 10 per call, one Graph request each)
adAccountIdYesAd account that owns the videos, used for scoping and rate limits

Output Schema

NameRequiredDescription
resultYesOriginal 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

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 checkA
Read-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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYesOriginal 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

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 resultsB
Read-onlyIdempotent

Read and interpret A/B test or conversion lift study results with confidence guardrails, cells, objectives, and optional cell entities.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
studyIdNoSpecific Ad Study ID to interpret.
adAccountIdNoAd account ID used to discover ad_studies when studyId is omitted.
cellEntityTypeNoEntity type represented by experiment cells.campaigns
includeCellEntitiesNoAlso read campaigns/adsets/adaccounts attached to each study cell.

Output Schema

NameRequiredDescription
resultYesOriginal 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

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 insightsA
Read-onlyIdempotent

Query product-breakdown insights and enrich rows with Product Catalog metadata when catalog access is available.

NameRequiredDescriptionDefault
levelNoEntity or aggregation level for the requested report.ad
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
metricsNoNative or documented calculated metric names to request. Check compatibility with the selected dimensions.
catalogIdNoProduct Catalog ID used to load product metadata for joins.
timeRangeNoOptional custom insights date range.
datePresetNoInsights date preset. Defaults to last_30d.
adAccountIdYesAd account ID (e.g., act_123456789)
productBreakdownNoNative product grouping used to join catalog items with reported insights.product_id
catalogProductLimitNoMaximum catalog product records read for the join.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 accountsA
Read-onlyIdempotent

List all Meta ad accounts accessible with the current token. Returns account ID, name, currency, timezone, and status.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 imagesA
Read-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.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
hashesNoOnly these image hashes (exact match)
minWidthNoOnly images at least this wide, in pixels
minHeightNoOnly images at least this tall, in pixels
nameFilterNoOnly images whose file name matches this value
adAccountIdYesAd account ID (e.g., act_123456789)
includeUsageNoAlso return the creative IDs using each image

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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

With an output schema present, 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 videosA
Read-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.

NameRequiredDescriptionDefault
limitNoVideos per page (thumbnail payloads are heavy, keep this modest)
cursorNoPagination cursor from previous response
adAccountIdYesAd account ID (e.g., act_123456789)
titleFilterNoOnly videos whose title contains this value
includeSourceNoAlso return the short-lived raw video file URL for each video
maxLengthSecondsNoOnly videos at most this many seconds long
minLengthSecondsNoOnly videos at least this many seconds long

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 rawA
Read-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.

NameRequiredDescriptionDefault
edgeYesAllowlisted Meta Graph edge to read on the selected node.
afterNoOpaque cursor for the next page returned by Meta.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
sinceNoBeginning of the requested reporting period; use the format accepted by the provider.
untilNoEnd of the requested reporting period; use the format accepted by the provider.
beforeNoOpaque cursor for the previous page returned by Meta.
fieldsNoNative provider fields to return. Select only fields supported by the chosen object or report.
parentIdYesParent Graph node ID, such as act_123, a Business, Page, catalog, campaign, or ad set ID
filteringNoNative provider filter expressions; credentials and account overrides are not allowed.
parametersNoAdditional documented GET parameters, for example targeting_spec or optimization_goal; auth and HTTP method override parameters are blocked
includeSummaryNoRequest the provider's available summary or total-count metadata.

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 entitiesA
Read-onlyIdempotent

Search campaigns, ad sets, or ads by name within an ad account. Useful for finding specific entities.

NameRequiredDescriptionDefault
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
cursorNoPagination cursor from previous response
entityTypeYesType of entity to search
nameFilterYesName substring to search for
adAccountIdYesAd account ID (e.g., act_123456789)
statusFilterNoFilter 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

NameRequiredDescription
resultYesOriginal 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

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 optionsC
Read-onlyIdempotent

Search Meta's read-only targeting metadata for interests, validated interests, geographies, locales, countries, cities, regions, markets, or postal codes.

NameRequiredDescriptionDefault
typeYesProvider object or operation type selected from this schema's allowed values.
limitNoMaximum number of returned items or rows. The declared bounds and default apply; use pagination for additional results.
queryNoSearch text; required by most interest and geography searches
countryCodeNoCountry code used to localize keyword or targeting results.
locationTypesNoLocation dictionary categories to include in targeting search.

Output Schema

NameRequiredDescription
resultYesOriginal 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

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 queryA
Read-onlyIdempotent

Validate a metric/breakdown combination BEFORE executing. Returns errors and warnings. Use this to check if your query will work.

NameRequiredDescriptionDefault
levelNoAggregation level
metricsYesMetric keys to validate
breakdownsNoBreakdown keys to validate

Output Schema

NameRequiredDescription
resultYesOriginal 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

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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

With an output schema present 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 42 tool updatesv2.1.1
    • Changedmeta_debug_token1 field changed
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_account_details2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_ad_activity2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_ad_preview2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_ad_studies2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_ads2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_adset_configuration2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_adsets2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_audience_details2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_audiences2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_brand_safety_controls2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_business_assets3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / cursors / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_campaign_structure2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_campaigns2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_catalog_batch_status2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_catalog_products2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_creative_assets2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_creatives2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_delivery_diagnostics3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / timeRange / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_entity_configuration3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / fields / items / enum
        Previous 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"
        +]
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_insights9 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / actionBreakdowns
        Added value: +{
        +  "description": "Native action breakdowns such as action_type. Only for action metrics.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / adsetIds
        Added value: +{
        +  "description": "Restrict adset- or ad-level insights to these ad set IDs.",
        +  "items": {
        +    "pattern": "^\\d+$",
        +    "type": "string"
        +  },
        +  "maxItems": 100,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / campaignIds
        Added value: +{
        +  "description": "Restrict campaign-, adset- or ad-level insights to these campaign IDs.",
        +  "items": {
        +    "pattern": "^\\d+$",
        +    "type": "string"
        +  },
        +  "maxItems": 100,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / dimensions
        Added 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"
        +}
      • addedInput schema / properties / effectiveStatus
        Added value: +{
        +  "description": "Keep only entities with this native effective status at the selected level.",
        +  "enum": [
        +    "ACTIVE",
        +    "PAUSED"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / includeAccountTotals / description
        Previous 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."
      • removedInput schema / properties / timeRange / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_insights_raw17 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / actionBreakdowns / items / $ref
        Removed value: -"#/properties/fields/items"
      • addedInput schema / properties / actionBreakdowns / items / maxLength
        Added value: +100
      • addedInput schema / properties / actionBreakdowns / items / minLength
        Added value: +1
      • addedInput schema / properties / actionBreakdowns / items / pattern
        Added value: +"^[A-Za-z][A-Za-z0-9_]*$"
      • addedInput schema / properties / actionBreakdowns / items / type
        Added value: +"string"
      • removedInput schema / properties / breakdowns / items / $ref
        Removed value: -"#/properties/fields/items"
      • addedInput schema / properties / breakdowns / items / maxLength
        Added value: +100
      • addedInput schema / properties / breakdowns / items / minLength
        Added value: +1
      • addedInput schema / properties / breakdowns / items / pattern
        Added value: +"^[A-Za-z][A-Za-z0-9_]*$"
      • addedInput schema / properties / breakdowns / items / type
        Added value: +"string"
      • removedInput schema / properties / filtering / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / timeRange / additionalProperties
        Removed value: -false
      • removedInput schema / properties / timeRange / properties / until / $ref
        Removed value: -"#/properties/timeRange/properties/since"
      • addedInput schema / properties / timeRange / properties / until / pattern
        Added value: +"^\\d{4}-\\d{2}-\\d{2}$"
      • addedInput schema / properties / timeRange / properties / until / type
        Added value: +"string"
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_instagram_accounts2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_node_fields2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_organic_content_enrichment2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_page_posts2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_pages2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_pixels2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Addedmeta_get_promotable_apps
    • Changedmeta_get_study_results2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_uploaded_video2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_get_video_sources2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_health_check1 field changed
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_interpret_experiment_results2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_join_product_insights3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / timeRange / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_list_ad_accounts1 field changed
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_list_ad_images4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / minHeight / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / minWidth / maximum
        Added value: +9007199254740991
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_list_ad_videos2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_list_edge_raw7 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / filtering / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / parameters / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / until / $ref
        Removed value: -"#/properties/since"
      • addedInput schema / properties / until / pattern
        Added value: +"^\\d{4}-\\d{2}-\\d{2}$"
      • addedInput schema / properties / until / type
        Added value: +"string"
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_search_entities2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_search_targeting_options2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
    • Changedmeta_validate_query2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / result / anyOf
        Previous 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"
        +  }
        +]
  2. 41 tool updatesv2.0.1
    • First observedmeta_debug_token
    • First observedmeta_get_account_details
    • First observedmeta_get_ad_activity
    • First observedmeta_get_ad_preview
    • First observedmeta_get_ad_studies
    • First observedmeta_get_ads
    • First observedmeta_get_adset_configuration
    • First observedmeta_get_adsets
    • First observedmeta_get_audience_details
    • First observedmeta_get_audiences
    • First observedmeta_get_brand_safety_controls
    • First observedmeta_get_business_assets
    • First observedmeta_get_campaign_structure
    • First observedmeta_get_campaigns
    • First observedmeta_get_catalog_batch_status
    • First observedmeta_get_catalog_products
    • First observedmeta_get_creative_assets
    • First observedmeta_get_creatives
    • First observedmeta_get_delivery_diagnostics
    • First observedmeta_get_entity_configuration
    • First observedmeta_get_insights
    • First observedmeta_get_insights_raw
    • First observedmeta_get_instagram_accounts
    • First observedmeta_get_node_fields
    • First observedmeta_get_organic_content_enrichment
    • First observedmeta_get_page_posts
    • First observedmeta_get_pages
    • First observedmeta_get_pixels
    • First observedmeta_get_study_results
    • First observedmeta_get_uploaded_video
    • First observedmeta_get_video_sources
    • First observedmeta_health_check
    • First observedmeta_interpret_experiment_results
    • First observedmeta_join_product_insights
    • First observedmeta_list_ad_accounts
    • First observedmeta_list_ad_images
    • First observedmeta_list_ad_videos
    • First observedmeta_list_edge_raw
    • First observedmeta_search_entities
    • First observedmeta_search_targeting_options
    • First observedmeta_validate_query

TDQS

B3.2/5.0

Scored across 42 tools

Disambiguation2/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness3/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Self-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.
    35
    593 npm
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Self-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 npm
    Apache 2.0
  • A
    license
    B
    quality
    A
    maintenance
    Self-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.
    27
    530 npm
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    Self-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.
    20
    621 npm
    Apache 2.0