GrowthMCP
Provides tools for interacting with Meta Ads through the Meta Graph API, enabling account discovery, campaign/ad set/ad operations, creative insights, audience research, budget scheduling, and campaign duplication.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GrowthMCPShow ROAS and CPA for my September campaigns"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GrowthMCP
AI-powered marketing intelligence and Meta Ads MCP.
GrowthMCP is a derivative project built from the Meta Ads MCP server by ARTELL SOLUÇÕES TECNOLÓGICAS LTDA. The upstream work is licensed under Business Source License 1.1; the required license text is retained in LICENSE.
What is included
Meta Ads account discovery and account information
Campaign, ad set, and ad operations
Creative operations and performance insights
Audience and targeting research
Budget scheduling
Native campaign duplication through Meta Graph API
Growth analytics: ROAS, CPA, CPL, CTR, CPC, conversion rate, and anomaly detection
Deterministic AI Growth Analyst query engine with filters, calculations, and evidence metadata
Canonical cross-platform marketing schema
Campaign investigation and creative diagnostics
Cohort and retention analytics
Auditable evidence packets
Local OAuth authentication with your own Meta developer application
Bearer-token authentication for Streamable HTTP
stdio and Streamable HTTP MCP transports
Docker support
Related MCP server: Meta Ads MCP Server
Quick start
Create a Meta developer application and use your own credentials.
export META_APP_ID="your-app-id"
export META_APP_SECRET="your-app-secret"
export META_ACCESS_TOKEN="your-access-token"Install:
pip install -e .Run with stdio:
python -m growthmcpRun Streamable HTTP:
python -m growthmcp --transport streamable-http --host 127.0.0.1 --port 8080Authenticate through the local OAuth flow:
python -m growthmcp --loginBranding
GrowthMCP uses its own product name and original visual identity. It does not use Pipeboard-hosted authentication or service infrastructure.
License and attribution
This repository contains derivative code from the upstream Meta Ads MCP server and therefore retains the upstream Business Source License 1.1.
Upstream project: https://github.com/pipeboard-co/meta-ads-mcp
The upstream license text and attribution are intentionally retained. GrowthMCP branding does not transfer or imply ownership of the upstream work.
Growth analytics layer
The analytics tools are intentionally platform-neutral. They accept metric records from Meta insights or other systems and calculate common acquisition metrics without requiring a hosted analytics service.
Available tools include:
calculate_growth_metrics
compare_campaign_metrics
detect_metric_anomalies
analyze_growth_query
get_metric_definition
normalize_growth_records
investigate_campaign
analyze_creatives
analyze_cohorts
build_evidence_packet
duplicate_campaign
Example analyst queries:
Show ROAS and CPL for Launch AGive campaign performance from 2026-09-01 to 2026-09-30What is our conversion rate and spend?
The analyst is deterministic: it calculates only from records supplied to the tool, and its response includes the filtered record count, filters, calculation method, and evidence rows. It does not claim live data or call an external LLM.
The workflow layer provides a canonical schema so Meta, Google, TikTok, CRM, and product-event records can be normalized into common fields. Campaign investigations expose platform/ad-set/creative breakdowns, creative analysis exposes delivery metrics, cohort analysis calculates month-level retention, and evidence packets preserve source rows and calculation limitations.
See examples/mcp-client-config.json for a local MCP client configuration example.
MCP protocol smoke test
The repository includes a credential-free end-to-end smoke test that starts the real stdio server, initializes an MCP client session, and verifies that the expected growth and Meta Ads tools are registered. It does not call Meta APIs.
Run it locally with:
pytest -m e2e tests/test_mcp_smoke.pyCI runs this smoke test separately from the unit-test matrix.
Docker
The Docker image runs GrowthMCP as a non-root user and exposes Streamable HTTP on port 8080. Credentials are supplied at runtime rather than baked into the image.
docker build -t growthmcp .
docker run --rm -p 8080:8080 \
-e META_ACCESS_TOKEN="$META_ACCESS_TOKEN" \
growthmcpFor anything beyond localhost or a trusted private network, put the service behind your own TLS and authentication layer.
Security notes
Keep Meta access tokens and app secrets outside source control.
The local OAuth flow uses a localhost callback and state validation.
Streamable HTTP can accept an operator-provided Bearer token; deploy it behind your own authentication and TLS when exposed beyond localhost.
GrowthMCP does not require or call the upstream hosted MCP service.
Available Tools
47 toolsanalyze_cohortsA
Calculate cohort sizes and month-level retention from user event records.
Expected fields: user_id, event_date/date, and event_name. The earliest valid event month for each user is treated as that user's acquisition cohort.
| Name | Required | Description | Default |
|---|---|---|---|
| user_events | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose one meaningful trait: the earliest valid event month per user becomes the acquisition cohort, plus the expected input fields. However, it omits what 'valid' means, how invalid/missing dates are handled, and timezone/aggregation behavior, leaving notable gaps for a computation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the outcome followed by input requirements and the cohort rule. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers input shape and the core cohort semantics. It is close to complete, missing only edge-case handling for malformed or missing event fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single parameter is an opaque array with additionalProperties, so the schema alone conveys nothing. The description compensates well by naming the required field names (user_id, event_date/date, event_name) and the accepted date-field aliases, though it doesn't state required vs optional per field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: it calculates cohort sizes and month-level retention, with a clear input domain (user event records). No sibling in the list performs cohort analysis, but the description never explicitly distinguishes itself from adjacent analytics tools like calculate_growth_metrics or analyze_growth_query, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no alternatives are named among the many analytics siblings. The only contextual help is the cohort definition, which is behavioral rather than selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_creativesC
Analyze creative-level delivery and acquisition metrics without ranking creatives.
| Name | Required | Description | Default |
|---|---|---|---|
| records | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses one trait (no ranking of creatives), but omits whether this is read-only, what permissions are needed, and how it handles the input. One behavioral hint is insufficient for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. It is efficient, though arguably too sparse for a tool with an opaque required parameter, which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, but the description is otherwise thin: no annotations, no usage guidance, and a fully undocumented required array parameter. For a tool of this complexity the definition is not complete enough for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single required parameter 'records' is an array of untyped objects with additionalProperties=true and 0% schema description coverage. The description never mentions records or its expected shape, so it fails to compensate for the schema gap that the agent needs to construct a valid call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (analyze) and resource (creatives) plus the metric scope (delivery and acquisition). The clause 'without ranking creatives' narrows it, but it does not name or contrast with any sibling such as compare_campaign_metrics or analyze_cohorts, so an agent still has to infer where this fits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no named alternative among the many analysis siblings. 'Without ranking creatives' is a scope constraint, not a usage rule, and it does not tell the agent when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_growth_queryB
Answer a natural-language growth analytics question over supplied records.
Supported filters include campaign names, common platforms, and explicit ISO date ranges such as 2026-09-01 to 2026-09-30. Supported metrics include ROAS, revenue, spend, CTR, CPC, CPA, CPL, leads, conversions and conversion rate. Queries mentioning campaigns can return a campaign-level breakdown.
The response includes the exact filtered record count and calculation metadata so an analyst can audit the answer.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| source | No | client-supplied | |
| records | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose something valuable and non-obvious: the response includes the exact filtered record count and calculation metadata for auditing, implying a deterministic, inspectable read operation. It does not state that records are left unmodified, whether the tool requires auth, or any cost/latency characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose in the first sentence, followed by scannable lists of filters and metrics. The enumeration of metrics is long but earns its place by telling the agent what questions are answerable. Minor redundancy between the filter list and the general capability statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be re-explained, and the description adds useful scope on filters, metrics, and audit metadata. However, with 0% schema coverage on three parameters, an unclear `source` input, and no sibling routing guidance, an agent is left guessing on several call-critical details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for three parameters, so the description is the only source of parameter meaning. 'Natural-language ... question' loosely maps to `query` and 'over supplied records' loosely maps to `records`, but the `source` parameter (default 'client-supplied') is entirely unexplained, as is the expected shape of `records` objects. The description only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Answer a natural-language growth analytics question over supplied records.' An agent can distinguish this from siblings like calculate_growth_metrics or compare_campaign_metrics because the input is free-text plus analyst-supplied records. It does not, however, name the sibling it competes with, so routing still requires inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description scopes the tool usefully by listing supported filters (campaign names, platforms, ISO date ranges) and supported metrics (ROAS, revenue, CTR, etc.), which lets an agent judge whether a given question fits. But it gives no explicit when-to-use vs. when-not guidance and never points at the alternative sibling tools for non-natural-language or non-supplied-record cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_evidence_packetC
Create a compact audit packet tying a business question to source rows and calculations.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | client-supplied | |
| records | Yes | ||
| question | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not say whether the tool persists anything, requires specific permissions, is idempotent, or how 'source' defaults are applied. It only conveys that output is a 'compact audit packet,' leaving key behavioral traits undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence that front-loads the verb and resource with no wasted words. It is well-sized, though the brevity leaves the tool under-explained given its complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, but with three parameters at 0% schema coverage and no annotations, the description omits too much. An agent lacks the input format and behavioral context needed to invoke it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate but largely does not. It loosely maps 'business question' to the question param and hints at records via 'source rows,' but gives no format, structure, or meaning for records, question, or the source parameter's default value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb (create) with a concrete resource (a compact audit packet) and notes its content (tying a business question to source rows and calculations). This differentiates it from siblings like analyze_growth_query or investigate_campaign without naming them. It is clear, though 'audit packet' remains somewhat abstract.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as build-adjacent analysis tools (analyze_growth_query, investigate_campaign, normalize_growth_records) or when it should not be used. The audit/packet framing implies a context, but no explicit conditions or alternatives are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_growth_metricsC
Calculate CTR, CPC, CPA, CPL, conversion rate, and ROAS for records.
| Name | Required | Description | Default |
|---|---|---|---|
| records | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it only says what is computed, not that the operation is a side-effect-free read, what happens with malformed or partial records, or how missing fields are treated. Minimal disclosure for a tool with zero structured behavioral hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the verb and outputs front-loaded and no filler. It is tight, though the brevity contributes to the documentation gaps rather than being purely a virtue.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values do not need explaining, and the metrics list tells the agent what comes back. The gap is the input: with no record-field guidance anywhere, an agent cannot reliably construct the 'records' payload, which is a meaningful omission for a computation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage and the single 'records' parameter is untyped in spirit (array of free-form objects). The description says metrics are computed 'for records' but never explains which fields each record must contain (impressions, clicks, spend, conversions) to produce CTR/CPC/ROAS, leaving the critical input contract undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (calculate) and enumerates the specific metrics produced (CTR, CPC, CPA, CPL, conversion rate, ROAS), so the resource is unambiguous. However, it offers no differentiation from siblings that also touch metrics, such as compare_campaign_metrics, normalize_growth_records, or analyze_growth_query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to use this tool versus compare_campaign_metrics, analyze_growth_query, or normalize_growth_records, nor any prerequisite about state or inputs. The agent is left to infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_campaign_metricsB
Compare campaign metric values without ranking or recommending a campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| metric | No | roas | |
| campaigns | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses one behavioral trait — that output is neither ranked nor accompanied by a recommendation — and 'compare' implies a non-mutating read. However, it says nothing about permissions, whether metric values are normalized across campaigns, or error behavior when a campaign lacks the metric.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the constraining clause comes after the core action, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. That leaves a two-parameter read tool with 0% parameter coverage and no usage routing, which is roughly the minimum viable level of completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for both parameters, and it largely does not. It hints at a 'metric' dimension but never names the default (roas) or explains the required 'campaigns' array element shape (additionalProperties: true, so its structure is entirely undocumented elsewhere).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('compare') and resource ('campaign metric values'), and scopes the operation by excluding ranking/recommendation, which cleanly separates it from investigation-oriented siblings like investigate_campaign or analyze_growth_query. It does not name a sibling directly, so 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'without ranking or recommending' implicitly tells the agent when this tool is the right fit (raw side-by-side comparison rather than advice), but there is no explicit when-to-use statement, no prerequisites, and no named alternative for the ranking/recommendation case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compute_image_cropsA
Compute image_crops coordinates for a source image of the given dimensions.
Returns the image_crops dict ready to pass directly to create_ad_creative or bulk_create_ad_creatives. For each crop key the result is the largest centered region that fits within the source image while matching the key's aspect ratio — equivalent to "Original" crop (no content is cut off beyond what the ratio requires).
Args: image_width: Width of the source image in pixels (e.g. 1080). image_height: Height of the source image in pixels (e.g. 1080). crop_keys: Optional list of specific crop keys to compute. Defaults to all 6 keys accepted by Meta's API: "100x100" — 1:1 square (Feed, Marketplace, Search) "100x72" — ~1.39:1 horizontal (Marketplace, some placements) "400x500" — 4:5 portrait (Feed on mobile, Stories fallback) "400x150" — ~2.67:1 wide banner (Audience Network) "600x360" — ~1.67:1 horizontal (Right column, some placements) "90x160" — 9:16 tall portrait (Stories)
Returns: JSON with the image_crops dict (ready for copy-paste into create_ad_creative), plus validation notes for any invalid keys requested.
| Name | Required | Description | Default |
|---|---|---|---|
| crop_keys | No | ||
| image_width | Yes | ||
| image_height | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the algorithm (largest centered region, equivalent to 'Original' crop) and validation notes for invalid keys. It does not explicitly state read-only nature or absence of API calls, but 'compute' implies a pure function with no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args and Returns sections, front-loading the purpose. It is appropriately sized for the complexity, and every line, including the crop key list, adds necessary value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking annotations, the description fully covers purpose, usage, parameter details, output format, and validation behavior. It is complete enough for an agent to select and invoke the tool correctly, even with the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by explaining each parameter with examples and enumerating all crop_keys options, including aspect ratios and placements. This goes well beyond the schema's simple field titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it computes image_crops coordinates for a source image of given dimensions, with a specific verb and resource. It also explains the output's direct use in create_ad_creative, distinguishing it from sibling tools focused on account, campaign, and creative management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context by stating the result is ready to pass directly to create_ad_creative or bulk_create_ad_creatives, indicating when to use it. It does not explicitly list exclusions or alternatives, but the unique purpose among siblings makes the use case clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_adA
Create a new ad with an existing creative.
Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) name: Ad name adset_id: Ad set ID where this ad will be placed creative_id: ID of an existing creative to use status: Initial ad status (default: PAUSED) bid_amount: Optional bid amount in account currency (in cents) tracking_specs: Optional tracking specifications (e.g., for pixel events). Example: [{"action.type":"offsite_conversion","fb_pixel":["YOUR_PIXEL_ID"]}] access_token: Meta API access token (optional - will use cached token if not provided)
Note:
Dynamic Creative creatives require the parent ad set to have is_dynamic_creative=true.
Otherwise, ad creation will fail with error_subcode 1885998.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| status | No | PAUSED | |
| adset_id | Yes | ||
| account_id | Yes | ||
| bid_amount | No | ||
| creative_id | Yes | ||
| access_token | No | ||
| tracking_specs | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses the Dynamic Creative prerequisite and error_subcode 1885998, and mentions cached token behavior for access_token. It lacks details on return values, but the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-sentence purpose, an Args list, and a Note. Each line provides necessary information without fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 8 parameters and no schema descriptions, the description covers all parameters, specifies a failure condition, and explains token fallback. It lacks explicit usage comparisons, but the purpose is clear and the output schema exists for return details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the tool description provides detailed, helpful descriptions for every parameter, including the account_id format, an example for tracking_specs, and the default for status. This fully compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Create a new ad with an existing creative,' which clearly states the verb (create), resource (ad), and a key constraint (existing creative). This distinguishes it from sibling tools like create_ad_creative and create_campaign.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when an existing creative is available, and the Dynamic Creative note adds a prerequisite. However, it does not explicitly compare against 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.
create_ad_creativeA
Create a new ad creative using an uploaded image hash, video ID, or an existing post.
Supports six creative modes:
Existing post: Provide object_story_id (format: {page_id}_{post_id}) to promote an existing organic or published post. No image_hash or video_id required. Optionally combine with asset_customization_rules to attach a 9:16 video for Story/Reels placements.
Simple image/video: Single image_hash or video_id with object_story_spec
Multi-variant copy: Use plural text params (messages[], headlines[], descriptions[]) to test multiple text variants with a single image/video. No optimization_type or is_dynamic_creative needed.
Placement Asset Customization (dual-aspect, non-DC): Serve different aspect ratios per placement on a STANDARD ad set without is_dynamic_creative and without the one-ad-per-ad-set cap. Set optimization_type="PLACEMENT" and pass videos=[{video_id, label}, ...] (or images=[{image_hash, label}, ...]) together with asset_customization_rules whose customization_spec references those labels via video_label/image_label. Every label in the rules MUST appear on a videos[]/images[] entry, or Meta returns error_subcode=1487390 ("Adcreative Create Failed").
Dynamic Creative: Multiple variants with dynamic_creative_spec (requires is_dynamic_creative on ad set)
FLEX/DOF (Advantage+): Set optimization_type="DEGREES_OF_FREEDOM" for Meta to auto-optimize across all asset combinations without requiring is_dynamic_creative on the ad set
Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) image_hash: Hash of a single uploaded image (cannot be used with image_hashes or video_id) access_token: Meta API access token (optional - will use cached token if not provided) name: Creative name page_id: Facebook Page ID (string or int; coerced to string) link_url: Destination URL for the ad. Required unless using lead_gen_form_id or reminder_data — with one exception: if asset_customization_rules is also set, link_url is required even for Lead ads. Meta accepts the creative without link_urls but rejects the ad at create_ad time with error 1885800 ("Asset Customization Ads require a link"). The URL is never shown to the user when lead_gen_form_id is set (the CTA opens the form), but Meta still demands one be present on the creative. Pass any valid URL in that case (e.g. the Facebook page URL or your site root). message: Single ad copy/text (cannot be used with messages) messages: List of primary text variants for multi-variant copy testing (cannot be used with message). Each entry can be a plain string, OR a dict {"text": "...", "adlabels": [{"name": "..."}]} when used with asset_customization_rules that reference body_label. headline: Single headline for simple ads (cannot be used with headlines) headlines: List of headline variants for multi-variant copy testing (cannot be used with headline). Each entry can be a plain string, OR a dict {"text": "...", "adlabels": [{"name": "..."}]} when used with asset_customization_rules that reference title_label. Meta enforces the actual length limit; do not pre-truncate. description: Single description for simple ads (cannot be used with descriptions) descriptions: List of description variants for multi-variant copy testing (cannot be used with description). Each entry can be a plain string, OR a dict {"text": "...", "adlabels": [{"name": "..."}]} when used with asset_customization_rules that reference description_label. image_hashes: List of image hashes for FLEX creatives (up to 10, cannot be used with image_hash or video_id). IMPORTANT: When optimization_type="DEGREES_OF_FREEDOM" (FLEX/Advantage+ mode), only ONE image is served at delivery time regardless of how many hashes you provide. The Meta API accepts multiple hashes without error and they all appear in asset_feed_spec, but Meta silently collapses to a single image at serving time. Use image_hashes with multiple entries only in non-DOF (regular dynamic creative) mode. In DOF mode, pass a single hash. video_id: Meta video ID for video creatives (cannot be used with image_hash or image_hashes). Upload a video first via the Meta API, then use the returned video ID here. IMPORTANT: When also providing instagram_actor_id, both instagram_actor_id AND ad_formats=["SINGLE_VIDEO"] must be present — otherwise Meta returns error 1443048 ("object_story_spec ill formed"). This is handled automatically: video creatives that include instagram_actor_id are routed through asset_feed_spec so that ad_formats=["SINGLE_VIDEO"] is always included in the API request. thumbnail_url: Thumbnail image URL for video creatives. Recommended when using video_id. Meta will auto-generate a thumbnail if not provided — GrowthMCP will fetch the best available frame from the uploaded video. IMPORTANT: when the video was just uploaded via bulk_upload_ad_videos, Meta needs a few seconds to transcode it. If create_ad_creative is called before transcoding completes, the only thumbnail Meta returns is a generic processing-state placeholder, which would be permanently stored on the creative. In that case create_ad_creative returns an error with video_status: "processing" — wait a few seconds (poll with get_ad_video until video_status is "ready") and retry, or pass thumbnail_url explicitly (any public image URL works). optimization_type: Optional. Valid values: - "DEGREES_OF_FREEDOM": FLEX (Advantage+) creatives where Meta auto-optimizes across all asset combinations. At least one multi-variant asset field required. NOTE: Meta ignores asset_customization_rules for DOF creatives. NOTE: When using DEGREES_OF_FREEDOM with image_hashes, providing multiple hashes is accepted by the API without error, but Meta silently serves only ONE image at delivery time. A warning is included in the response if multiple hashes are detected. To serve multiple images, omit optimization_type and enable is_dynamic_creative on the ad set instead. - "PLACEMENT": Placement Asset Customization. Use with videos[]/images[] (with labels) and asset_customization_rules (with video_label/image_label references) to serve different aspect ratios per placement (e.g., 1:1 Feed + 9:16 Reels). Other values are passed through to Meta as-is. dynamic_creative_spec: Dynamic creative optimization settings call_to_action_type: Call to action button type. Meta enum — free-form values (e.g. 'MAKE_RESERVATION', 'RESERVE', 'BOOK_TABLE') are rejected with code 100. Pick from the documented list. Common values: BOOK_NOW — restaurants, salons, clinics, appointments (use this for reservations — there is no MAKE_RESERVATION enum) LEARN_MORE, SHOP_NOW, SIGN_UP, SUBSCRIBE, GET_QUOTE, CONTACT_US, DOWNLOAD, WATCH_MORE, GET_OFFER, APPLY_NOW, CALL_NOW, MESSAGE_PAGE, SEE_MENU, ORDER_NOW, BUY_NOW, WHATSAPP_MESSAGE, GET_DIRECTIONS, BUY_TICKETS, EVENT_RSVP, BOOK_TRAVEL. When using CALL_NOW, also provide phone_number. lead_gen_form_id: Lead generation form ID for lead generation campaigns. Required when using lead generation CTAs like 'SIGN_UP', 'GET_OFFER', 'SUBSCRIBE', etc. instagram_actor_id: Instagram account ID for Instagram placements (must be a string to avoid JavaScript integer precision loss for IDs exceeding Number.MAX_SAFE_INTEGER). Sent as instagram_user_id inside object_story_spec (Meta deprecated instagram_actor_id in Jan 2026). IMPORTANT for video creatives: Meta requires ad_formats=["SINGLE_VIDEO"] in asset_feed_spec alongside instagram_user_id in object_story_spec — omitting either causes error 1443048 ("object_story_spec ill formed"). This is auto-handled: video_id + instagram_actor_id always routes through asset_feed_spec so ad_formats=["SINGLE_VIDEO"] is included automatically. ad_formats: List of ad format strings for asset_feed_spec (e.g., ["AUTOMATIC_FORMAT"] for Flexible ads, ["SINGLE_IMAGE"] for single image, ["SINGLE_VIDEO"] for video). When optimization_type is "DEGREES_OF_FREEDOM" with image_hashes, defaults to ["AUTOMATIC_FORMAT"] (Flexible format). For video creatives, defaults to ["SINGLE_VIDEO"]. Otherwise defaults to ["SINGLE_IMAGE"]. asset_customization_rules: List of placement-specific asset overrides for asset_feed_spec. phone_number: Phone number for CALL_NOW call-to-action ads (click-to-call). Required when call_to_action_type is CALL_NOW. Use E.164 format (e.g., "+18005551234"). The number is sent to Meta as call_to_action.value.link = "tel:" (Meta v24 rejects a literal "phone_number" key with code 100). Common use case: geo-routed call ads with different phone numbers per ad set. creative_features_spec: Advantage+ Creative feature opt-ins/opt-outs. Controls individual creative enhancements like image_touchups, text_optimizations, inline_comment, add_text_overlay, music, 3d_animation, etc. Each feature is a dict with "enroll_status" set to "OPT_IN" or "OPT_OUT". Example: {"image_touchups": {"enroll_status": "OPT_IN"}, "inline_comment": {"enroll_status": "OPT_IN"}} Sent to Meta as degrees_of_freedom_spec.creative_features_spec. url_tags: URL tracking parameters appended to the destination URL (e.g., "utm_source=facebook&utm_medium=cpc&utm_campaign=spring_sale"). Sets the url_tags field on the creative. caption: Display URL shown in the ad (e.g., "example.com/shoes"). Sets the caption field in link_data. If not provided, Meta auto-generates it from the destination URL. Only applies to image (link_data) creatives. image_crops: Crop coordinates for different aspect ratios. Applied in link_data for image creatives.
Use the compute_image_crops tool first to get the correct coordinates
for your specific image dimensions — it computes centered crop boxes
for any source size automatically.
Valid crop keys (only these 6 are accepted by Meta's API):
"100x100" — 1:1 square (Feed, Marketplace, Search)
"100x72" — ~1.39:1 horizontal (Marketplace, some placements)
"400x500" — 4:5 portrait (Feed on mobile, Stories fallback)
"400x150" — ~2.67:1 wide banner (Audience Network)
"600x360" — ~1.67:1 horizontal (Right column, some placements)
"90x160" — 9:16 tall portrait (Stories)
Format: {"100x100": [[x1,y1],[x2,y2]], "400x500": [[x1,y1],[x2,y2]]}
Coordinates are pixel-based (top-left and bottom-right corners).
The bounding box aspect ratio must match the key ratio as closely as possible.
Image origin (0,0) is the upper-left corner.
Omit to let Meta auto-crop (default for horizontal is 1.91:1 recommended).
object_story_id: ID of an existing organic or published Facebook/Instagram post to promote
as an ad. Format: "{page_id}_{post_id}" (e.g., "124965744226834_3888007311337206").
When provided, image_hash and video_id are not required. page_id is also not
required (it is encoded in the story ID). Combine with asset_customization_rules
to attach a 9:16 video for Story/Reels placements while the organic post
serves as the feed creative — a common "Use Existing Post" workflow.
Example: object_story_id="124965744226834_3888007311337206",
asset_customization_rules=[{"placement_groups": ["STORY"],
"customization_spec": {"video_ids": ["890310874031162"]}}]
disable_all_enhancements: When True, opts out of all Advantage+ Creative enhancements by
setting every known creative_features_spec key (image_touchups,
text_optimizations, video_auto_crop, etc.) to OPT_OUT and also
disabling contextual_multi_ads. Use when you want full creative
control without Meta's auto-modifications.
event_id: Facebook Event ID for EVENT_RESPONSES campaigns. Required for
event RSVP/ticket ads so the event card renders properly. Placed
inside link_data.event_id, and also inside call_to_action.value
when call_to_action_type is EVENT_RSVP or BUY_TICKETS. Use with
link_url set to the Facebook event URL
(https://www.facebook.com/events/EVENT_ID).
asset_customization_rules: Lets you assign different images or videos to specific placement groups
(e.g., feed vs. stories). Only valid with image_hashes or plural asset params.
Each rule uses a user-friendly format that is automatically translated to
Meta's API format (adlabels + customization_spec positions):
- placement_groups: list of placement group names
Valid values: FEED, STORY, MESSENGER, INSTREAM_VIDEO, SEARCH, SHOP,
AUDIENCE_NETWORK
- customization_spec: dict specifying the asset to use for those placements
Supported keys: image_hashes (list), video_ids (list),
bodies, titles, descriptions (text overrides)
All image hashes referenced in rules must also be in image_hashes.
Example (feed gets one image, stories gets another):
[
{"placement_groups": ["FEED"],
"customization_spec": {"image_hashes": ["<feed_hash>"]}},
{"placement_groups": ["STORY"],
"customization_spec": {"image_hashes": ["<story_hash>"]}}
]
videos: List of video objects for placement asset customization (multiple videos with
different aspect ratios). Each entry: {"video_id": "...", "thumbnail_url": "...",
"label": "my_label"}. The "label" field is converted to adlabels for use with
asset_customization_rules video_label references. Cannot be used with video_id.
Use with optimization_type="PLACEMENT" and asset_customization_rules.
images: List of image objects for placement asset customization (multiple images with
different aspect ratios). Each entry: {"image_hash": "...", "label": "my_label"}.
The "label" field is converted to adlabels for use with asset_customization_rules
image_label references. Cannot be used with image_hash or image_hashes.
Use with optimization_type="PLACEMENT" and asset_customization_rules.
reminder_data: Inline reminder event data for Instagram Reminder Ads
(REMINDERS_SET optimization goal). Placed in
object_story_spec.link_data.reminder_data. Use this instead of
upcoming_events (which requires an existing ig_upcoming_event_id).
Required fields:
- event_name (str): Display title of the reminder event
- start_time (int): Event start as a Unix timestamp (seconds)
- end_time (int): Event end as a Unix timestamp (seconds)
Example:
{"event_name": "Summer Sale", "start_time": 1745596800, "end_time": 1745611200}
The ad set must use optimization_goal=REMINDERS_SET and the placement
must be restricted to Instagram feeds/stories. link_url is still
recommended (the URL users visit after the reminder fires).
facebook_branded_content: Branded content settings for Facebook partnership ads.
Used when a brand sponsors a creator's content on Facebook.
Format: {"sponsor_page_id": "<page_id>"} where sponsor_page_id is the
Facebook Page ID of the sponsoring brand. Passed as a top-level field
on the ad creative. The creator's page should be set as page_id.
instagram_branded_content: Branded content settings for Instagram partnership ads.
Used when a brand sponsors a creator's content on Instagram.
Format: {"sponsor_id": "<instagram_user_id>"} where sponsor_id is the
Instagram account ID of the sponsoring brand. Passed as a top-level
field on the ad creative.Returns: JSON response with created creative details
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| images | No | ||
| videos | No | ||
| caption | No | ||
| message | No | ||
| page_id | No | ||
| event_id | No | ||
| headline | No | ||
| link_url | No | ||
| messages | No | ||
| url_tags | No | ||
| video_id | No | ||
| headlines | No | ||
| account_id | Yes | ||
| ad_formats | No | ||
| image_hash | No | ||
| description | No | ||
| image_crops | No | ||
| access_token | No | ||
| descriptions | No | ||
| image_hashes | No | ||
| phone_number | No | ||
| reminder_data | No | ||
| thumbnail_url | No | ||
| object_story_id | No | ||
| lead_gen_form_id | No | ||
| optimization_type | No | ||
| instagram_actor_id | No | ||
| call_to_action_type | No | ||
| dynamic_creative_spec | No | ||
| creative_features_spec | No | ||
| disable_all_enhancements | No | ||
| facebook_branded_content | No | ||
| asset_customization_rules | No | ||
| instagram_branded_content | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to lean on, the description over-delivers on behavior: it discloses Meta error codes (1487390, 1885800, 1443048), silent multi-hash collapse in DOF mode, automatic routing through asset_feed_spec, the thumbnail transcode race with video_status 'processing', and enum-rejection behavior for free-form CTA values. This is exactly the operational knowledge an agent cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with a mode overview before the long Args block, and the length is largely justified by the 35-parameter surface. There is minor redundancy — asset_customization_rules is effectively defined twice (once inside the PLACEMENT mode bullet and again in the Args list) — which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is correctly omitted ('JSON response with created creative details'). Given 35 parameters, zero schema descriptions, no enums, and no annotations, the description supplies essentially everything needed to assemble a correct request.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full semantic burden, and it does so for nearly every parameter: mutual-exclusivity rules (image_hash vs image_hashes vs video_id), required/format constraints (account_id as act_XXXXXXXXX, E.164 phone, object_story_id format), example payloads, and default-value logic for ad_formats. This is far above the compensation threshold the low coverage demands.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource ('Create a new ad creative') plus the three input families it accepts (image hash, video ID, existing post). It is immediately distinguishable from siblings like update_ad_creative, get_ad_creatives, and create_ad, and the six enumerated modes make the tool's scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives exhaustive condition-based guidance for selecting among six creative modes, including when is_dynamic_creative or optimization_type is and is not required. It does not, however, route the agent against sibling tools (e.g., when to use update_ad_creative instead), so it stops short of full when/when-not/alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_adsetA
Create a new ad set in a Meta Ads account.
Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) campaign_id: Meta Ads campaign ID this ad set belongs to name: Ad set name optimization_goal: Conversion optimization goal. Valid values depend on the campaign objective and destination_type. OUTCOME_ENGAGEMENT + destination_type=WEBSITE: OFFSITE_CONVERSIONS, LANDING_PAGE_VIEWS, LINK_CLICKS, IMPRESSIONS, REACH. OUTCOME_ENGAGEMENT + On Post (destination_type=ON_POST): POST_ENGAGEMENT, IMPRESSIONS, REACH. Also set promoted_object={page_id} at creation (immutable; without it create_ad fails with subcode 1885154). Do NOT use ON_AD here — ON_AD is the OUTCOME_LEADS instant-form destination and Meta rejects it for OUTCOME_ENGAGEMENT (subcode 1815715). OUTCOME_ENGAGEMENT + On Video (destination_type=ON_VIDEO): THRUPLAY, TWO_SECOND_CONTINUOUS_VIDEO_VIEWS. OUTCOME_ENGAGEMENT + On Event (destination_type=ON_EVENT): EVENT_RESPONSES, IMPRESSIONS, POST_ENGAGEMENT, REACH. OUTCOME_ENGAGEMENT + On Page (destination_type=ON_PAGE): PAGE_LIKES. OUTCOME_ENGAGEMENT + Messaging (MESSENGER/WHATSAPP/INSTAGRAM_DIRECT): CONVERSATIONS, LINK_CLICKS. OUTCOME_ENGAGEMENT "Profile and Page visits" (PROFILE_AND_PAGE_ENGAGEMENT with destination_type INSTAGRAM_PROFILE / FACEBOOK_PAGE / INSTAGRAM_PROFILE_AND_FACEBOOK_PAGE) is shown in Ads Manager but NOT supported via the Marketing API — Meta rejects every variant (code 100). Closest API-supported option is POST_ENGAGEMENT + ON_POST. OUTCOME_TRAFFIC + WEBSITE: LANDING_PAGE_VIEWS, LINK_CLICKS, IMPRESSIONS, REACH. OUTCOME_AWARENESS: REACH, IMPRESSIONS, AD_RECALL_LIFT, THRUPLAY. OUTCOME_LEADS: LEAD_GENERATION, QUALITY_LEAD (forms), QUALITY_CALL (calls), OFFSITE_CONVERSIONS, LINK_CLICKS (website). OUTCOME_SALES: OFFSITE_CONVERSIONS, VALUE, CONVERSATIONS, LINK_CLICKS, IMPRESSIONS, REACH. OUTCOME_APP_PROMOTION: APP_INSTALLS, APP_INSTALLS_AND_OFFSITE_CONVERSIONS, VALUE. billing_event: How you're charged (e.g., 'IMPRESSIONS', 'LINK_CLICKS') status: Initial ad set status (default: PAUSED) daily_budget: Daily budget in account currency (in cents) as a string. CBO NOTE: Do NOT set this if the parent campaign already has a budget (Campaign Budget Optimization / CBO mode). Meta only allows budgets at one level: either the campaign OR the ad set, not both. If the campaign has a daily_budget or lifetime_budget, omit this field — the ad set will automatically use the campaign budget. lifetime_budget: Lifetime budget in account currency (in cents) as a string. CBO NOTE: Do NOT set this if the parent campaign already has a budget (Campaign Budget Optimization / CBO mode). Omit this field when the campaign uses CBO — the ad set inherits the campaign budget automatically. targeting: Targeting specs (age, location, interests, etc). targeting_automation.advantage_audience defaults to 0 if not set (Meta API v24+ requirement). Set to 1 to enable Advantage+ Audience (requires age_max>=65). Use search_interests for interest IDs. bid_amount: Bid amount in account currency (in cents). REQUIRED for: LOWEST_COST_WITH_BID_CAP, COST_CAP, TARGET_COST. NOT USED by: LOWEST_COST_WITH_MIN_ROAS (uses bid_constraints instead). May also be required if the parent campaign's bid strategy requires it. bid_strategy: Bid strategy. Valid values: - 'LOWEST_COST_WITHOUT_CAP' (recommended) - no bid_amount required - 'LOWEST_COST_WITH_BID_CAP' - REQUIRES bid_amount - 'COST_CAP' - REQUIRES bid_amount - 'LOWEST_COST_WITH_MIN_ROAS' - REQUIRES bid_constraints with roas_average_floor, and optimization_goal='VALUE'. Does NOT use bid_amount. Note: 'LOWEST_COST' is NOT valid - use 'LOWEST_COST_WITHOUT_CAP'. Campaign-level bid strategy may constrain ad set choices. bid_constraints: Bid constraints dict. Required for LOWEST_COST_WITH_MIN_ROAS. Use {"roas_average_floor": } where value = target ROAS * 10000. Example: 2.0x ROAS -> {"roas_average_floor": 20000} bid_adjustments: Bid multipliers per targeting dimension. Pass-through to Meta. Shape: {"user_groups": {"": {"": , "default": }}} Dims: age, gender, user_os, device_platform, position_type, publisher_platform, user_bucket, home_location, locale, etc. Multipliers are floats, typically 0.0-1.0. Example: {"user_groups": {"user_os": {"iOS": 0.9, "Android": 0.7, "default": 1.0}}} NOTE: Writing bid_adjustments requires a Meta app capability that must be allowlisted. Apps without it get OAuthException (#3). start_time: Start time in ISO 8601 format (e.g., '2023-12-01T12:00:00-0800'). To schedule future delivery: set start_time to a future date and status=ACTIVE. Meta will show effective_status as SCHEDULED and automatically begin delivery at start_time. NOTE: Only ad set start_time controls delivery scheduling. Campaigns do not support start_time. end_time: End time in ISO 8601 format. Required when lifetime_budget is specified. dsa_beneficiary: DSA beneficiary for European compliance (person/org that benefits from ads). Required for EU-targeted ad sets along with dsa_payor. dsa_payor: DSA payor for European compliance (person/org paying for the ads). Required for EU-targeted ad sets along with dsa_beneficiary. promoted_object: For APP_INSTALLS: app config, required application_id + object_store_url. For OUTCOME_ENGAGEMENT On-Post (destination_type=ON_POST): set {"page_id": ""} at creation — required for ads (else create_ad fails with subcode 1885154) and immutable afterward (cannot be added via update_adset). destination_type: Conversion location / where users go. Pass-through to Meta (no client-side validation). Common values: 'WEBSITE', 'WHATSAPP', 'MESSENGER', 'INSTAGRAM_DIRECT', 'APP', 'FACEBOOK', 'SHOP_AUTOMATIC'. OUTCOME_ENGAGEMENT on-asset locations: 'ON_POST' (post engagement; needs promoted_object={page_id}), 'ON_PAGE' (PAGE_LIKES), 'ON_EVENT', 'ON_VIDEO'. 'ON_AD' is the OUTCOME_LEADS instant-form destination — do NOT use it for OUTCOME_ENGAGEMENT (Meta rejects it with subcode 1815715). Also supports multi-channel combos like 'MESSAGING_MESSENGER_WHATSAPP'. is_dynamic_creative: Enable Dynamic Creative for this ad set. frequency_control_specs: Frequency cap specs. MUST be set at creation time — Meta makes this field immutable after the ad set is created (error 1815198). Only works with OUTCOME_AWARENESS campaigns + optimization_goal REACH or THRUPLAY. Example: [{"event": "IMPRESSIONS", "interval_days": 7, "max_frequency": 1}] multi_advertiser_ads: Set to 0 to opt out of Multi-Advertiser Ads, 1 to opt in. This is a TOP-LEVEL ad set parameter — do NOT put it inside the targeting object. regional_regulated_categories: List of regional regulated categories for the ad set. Required for ads targeting regulated regions (Taiwan, Australia, etc.). Valid values: TAIWAN_FINSERV, TAIWAN_UNIVERSAL, AUSTRALIA_FINSERV, INDIA_FINSERV, SINGAPORE_UNIVERSAL, THAILAND_UNIVERSAL. Example: ["TAIWAN_UNIVERSAL"] or ["TAIWAN_FINSERV", "TAIWAN_UNIVERSAL"] regional_regulation_identities: Dict of verified identity IDs for regional transparency compliance. Required when regional_regulated_categories is set. The identity IDs come from completing advertiser verification in Meta Business Settings. Keys depend on the categories declared: - TAIWAN_UNIVERSAL: taiwan_universal_beneficiary, taiwan_universal_payer - TAIWAN_FINSERV: taiwan_finserv_beneficiary, taiwan_finserv_payer - AUSTRALIA_FINSERV: australia_finserv_beneficiary, australia_finserv_payer - SINGAPORE_UNIVERSAL: singapore_universal_beneficiary, singapore_universal_payer Example: {"taiwan_universal_beneficiary": "", "taiwan_universal_payer": ""} attribution_spec: Attribution window specification for the ad set. Controls how conversions are attributed to ads. Default is 7-day click if not specified. Example for 1-day click: [{"event_type": "CLICK_THROUGH", "window_days": 1}] Example for 1-day click + 1-day view: [{"event_type": "CLICK_THROUGH", "window_days": 1}, {"event_type": "VIEW_THROUGH", "window_days": 1}] Valid event_type values: CLICK_THROUGH, VIEW_THROUGH. Valid window_days values: 1, 7, 28 (depends on event_type and optimization_goal). access_token: Meta API access token (optional - will use cached token if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| status | No | PAUSED | |
| end_time | No | ||
| dsa_payor | No | ||
| targeting | No | ||
| account_id | Yes | ||
| bid_amount | No | ||
| start_time | No | ||
| campaign_id | Yes | ||
| access_token | No | ||
| bid_strategy | No | ||
| daily_budget | No | ||
| billing_event | Yes | ||
| bid_adjustments | No | ||
| bid_constraints | No | ||
| dsa_beneficiary | No | ||
| lifetime_budget | No | ||
| promoted_object | No | ||
| attribution_spec | No | ||
| destination_type | No | ||
| optimization_goal | Yes | ||
| is_dynamic_creative | No | ||
| multi_advertiser_ads | No | ||
| frequency_control_specs | No | ||
| regional_regulated_categories | No | ||
| regional_regulation_identities | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral disclosure. It reveals defaults (status=PAUSED, advantage_audience=0), immutability (promoted_object, frequency_control_specs), error subcodes (1885154, 1815715, 1815198), API limitations (ON_AD rejection, profile/page visits not supported), and CBO inheritance behavior. This goes far beyond basic description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but appropriately sized for 26 parameters. It is front-loaded with a clear purpose, then organized into per-parameter blocks. Minor redundancy exists (CBO note repeated for daily_budget and lifetime_budget), but overall each sentence adds essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 26 parameters and no schema descriptions, the description comprehensively covers all parameter semantics, valid values, required combinations, error cases, and practical examples. It even addresses edge cases like EU DSA compliance and regional regulations, leaving no major gaps for an agent to fall into.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate — and it does exceptionally. Every parameter gets format, units (cents), valid values, dependencies, and often concrete examples. It explains precise semantics like lowcost minimization for bid_strategy, budget inheritance, and targeting automation defaults, making parameter usage unambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create a new ad set in a Meta Ads account' — a specific verb and resource that clearly distinguishes it from sibling tools like update_adset or create_campaign. The extensive parameter details reinforce the exact purpose without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool and when to avoid certain settings (e.g., CBO budget notes, bid strategy requirements, optimization_goal constraints). It doesn't explicitly name alternatives like update_adset, but the creation-specific guidance is strong enough to guide correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_budget_scheduleA
Create a budget schedule for a Meta Ads campaign.
Allows scheduling budget increases based on anticipated high-demand periods. The times should be provided as Unix timestamps.
Args: campaign_id: Meta Ads campaign ID. budget_value: Amount of budget increase. Interpreted based on budget_value_type. budget_value_type: Type of budget value - "ABSOLUTE" or "MULTIPLIER". time_start: Unix timestamp for when the high demand period should start. time_end: Unix timestamp for when the high demand period should end. access_token: Meta API access token (optional - will use cached token if not provided).
Returns: A JSON string containing the ID of the created budget schedule or an error message.
| Name | Required | Description | Default |
|---|---|---|---|
| time_end | Yes | ||
| time_start | Yes | ||
| campaign_id | Yes | ||
| access_token | No | ||
| budget_value | Yes | ||
| budget_value_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must fully disclose behavioral traits. It states the operation ('Create') and return format (JSON string with ID or error), but does not mention permissions, idempotency, reversibility, or effects on existing schedules. For a mutation tool, this is a significant gap in behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It front-loads the purpose, then lists arguments in a clear Args block, and ends with the return value. Every sentence serves a purpose, with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all parameters and the return value, and an output schema is present. However, for a create-type tool with no annotations, it lacks guidance on prerequisites, permissions, or edge cases (e.g., overlapping schedules, budget limits). It is adequate but leaves gaps that an agent would need to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does explain each parameter: campaign_id, budget_value, budget_value_type (with 'ABSOLUTE' or 'MULTIPLIER' values), time_start/end (Unix timestamps), and access_token (optional, cached token). However, it leaves ambiguity around what MULTIPLIER means exactly and how budget_value is interpreted for each type, so it is helpful but not complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb+resource: 'Create a budget schedule for a Meta Ads campaign.' It clearly states the tool's function and distinguishes it from sibling tools, none of which mention budget scheduling. The second sentence adds the specific purpose of scheduling increases for high-demand periods.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear context for when to use the tool: 'Allows scheduling budget increases based on anticipated high-demand periods.' It does not explicitly mention alternatives or exclusions, but the context is sufficiently distinct from the other tools in the list. The optional access_token behavior is also stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_campaignA
Create a new Facebook or Instagram ad campaign in a Meta Ads account. Use this to start a new campaign with an ODAX objective (OUTCOME_LEADS, OUTCOME_SALES, OUTCOME_AWARENESS, OUTCOME_TRAFFIC, OUTCOME_ENGAGEMENT, OUTCOME_APP_PROMOTION), pick CBO (campaign budget optimization) or ABO (ad-set-level budgets), and set bid strategy, spend cap, and special ad categories. This is the first step of the campaign group → ad set → ad hierarchy on Meta. Returns the new campaign id. Also known as: create campaign, new campaign, make campaign, campaign group, ABO campaign, CBO campaign.
Note: Campaigns do not support start_time for scheduling — set start_time on the ad set instead.
Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) name: Campaign name objective: Campaign objective (ODAX, outcome-based). Must be one of: OUTCOME_AWARENESS, OUTCOME_TRAFFIC, OUTCOME_ENGAGEMENT, OUTCOME_LEADS, OUTCOME_SALES, OUTCOME_APP_PROMOTION. Note: Legacy objectives like BRAND_AWARENESS, LINK_CLICKS, CONVERSIONS, APP_INSTALLS, etc. are not valid for new campaigns and will cause a 400 error. Use the outcome-based values above (e.g., BRAND_AWARENESS → OUTCOME_AWARENESS). access_token: Meta API access token (optional - will use cached token if not provided) status: Initial campaign status (default: PAUSED) special_ad_categories: List of special ad categories if applicable daily_budget: Daily budget in account currency (in cents) as a string (only used if use_adset_level_budgets=False) lifetime_budget: Lifetime budget in account currency (in cents) as a string (only used if use_adset_level_budgets=False) buying_type: Buying type (e.g., 'AUCTION') bid_strategy: Bid strategy (default: LOWEST_COST_WITHOUT_CAP). Must be one of: 'LOWEST_COST_WITHOUT_CAP', 'LOWEST_COST_WITH_BID_CAP', 'COST_CAP', 'LOWEST_COST_WITH_MIN_ROAS'. WARNING: If you use LOWEST_COST_WITH_BID_CAP or COST_CAP, all child ad sets will require bid_amount to be set. bid_cap: Bid cap in account currency (in cents) as a string spend_cap: Spending limit for the campaign in account currency (in cents) as a string campaign_budget_optimization: Whether to enable campaign budget optimization (only used if use_adset_level_budgets=False) ab_test_control_setups: Settings for A/B testing (e.g., [{"name":"Creative A", "ad_format":"SINGLE_IMAGE"}]) use_adset_level_budgets: If True, budgets will be set at the ad set level instead of campaign level (default: False)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| status | No | PAUSED | |
| bid_cap | No | ||
| objective | Yes | ||
| spend_cap | No | ||
| account_id | Yes | ||
| buying_type | No | ||
| access_token | No | ||
| bid_strategy | No | LOWEST_COST_WITHOUT_CAP | |
| daily_budget | No | ||
| lifetime_budget | No | ||
| special_ad_categories | No | ||
| ab_test_control_setups | No | ||
| use_adset_level_budgets | No | ||
| campaign_budget_optimization | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden and excels. It discloses the return value (new campaign id), a critical constraint (start_time not supported on campaigns), error conditions (legacy objectives cause 400 errors), and interdependencies (certain bid strategies require bid_amount on child ad sets). It also explains budget semantics (cents, ABO vs CBO) and defaults.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but appropriately structured for a tool with 15 parameters. It front-loads the core purpose, then provides a note and a well-organized Args section. Some redundancy exists (e.g., 'Also known as' list and repeated mention of campaign group), but it does not detract from usability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (15 parameters, no annotations, no schema descriptions), the description is remarkably complete. It covers all parameter semantics, return value, error behaviors, the broader campaign hierarchy, and special considerations like A/B testing and special ad categories. The output schema further reduces the need to describe return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate—and it does. Every parameter is explained with type, format, valid values, defaults, or usage context. For example, objective lists valid ODAX values and warns against legacy values, bid_strategy enumerates options and flags child ad set requirements, and budgets clarify they are in cents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb and resource: 'Create a new Facebook or Instagram ad campaign in a Meta Ads account.' It also distinguishes itself from sibling tools by noting it is 'the first step of the campaign group → ad set → ad hierarchy,' which separates it from create_adset and create_ad.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool ('Use this to start a new campaign') and includes practical guidance like setting start_time on the ad set instead. However, it does not explicitly name alternative tools for different operations (e.g., update_campaign for modifications), so exclusions are 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.
detect_metric_anomaliesB
Flag unusually high/low observations using a z-score threshold.
| Name | Required | Description | Default |
|---|---|---|---|
| values | Yes | ||
| z_threshold | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the algorithmic approach (z-score threshold) but remains silent on side effects, read-only nature, authentication needs, and output shape (though an output schema exists). It adds some behavioral context but leaves notable gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. Every word contributes to conveying the tool's purpose and method.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, return values needn't be explained, and the tool is simple (two params). However, the description omits usage context, parameter detail, and any behavioral traits, leaving it merely adequate for an agent to invoke correctly without deeper understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only indirectly references 'observations' (values) and 'z-score threshold' (z_threshold) without explaining formats, defaults (2 is only in the schema), or what the array should contain. This is minimal compensation for fully undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Flag') and resource ('observations') plus the method ('z-score threshold'), making the function clear. It does not explicitly distinguish itself from sibling analysis tools like calculate_growth_metrics or investigate_growth_issue, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus its siblings, nor any exclusions or prerequisites. The phrase 'using a z-score threshold' implies a statistical context but does not tell an agent when this tool is the right choice over alternatives like analyze_growth_query or investigate_campaign.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_campaignB
Duplicate a Meta campaign directly through the Graph API.
The duplicate is created paused by default. This makes the operation safer for automation: the caller can inspect the returned object before enabling delivery.
| Name | Required | Description | Default |
|---|---|---|---|
| new_name | No | ||
| deep_copy | No | ||
| campaign_id | Yes | ||
| access_token | No | ||
| status_option | No | PAUSED |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden: it does disclose a real behavioral trait (the copy is created PAUSED by default, with the automation rationale), which is non-obvious and valuable. However, it omits auth requirements (the access_token param), the write/create nature of the operation, and what deep_copy's default of true actually causes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the verb and resource before the caveat. No filler, no restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, but the five undocumented parameters (notably deep_copy's default of true) leave an agent without enough to call the tool confidently. The definition is thin for a tool that mutates state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across five parameters, and the description names none of them. 'Created paused by default' gestures at status_option but never ties it to the parameter, and new_name, deep_copy, and access_token are entirely unexplained in both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (duplicate) and resource (Meta campaign) plus the mechanism (Graph API), which is enough to separate it from create_campaign and update_campaign. It stops short of explicitly contrasting itself with those siblings or clarifying that it copies an existing campaign's configuration rather than authoring a new one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the automation use case (safe duplication the caller can verify before enabling delivery) but never states when to pick this over create_campaign or when duplication is inappropriate. The rationale for rounding is left for the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_audience_sizeA
Estimate audience size for targeting specifications using Meta's delivery_estimate API.
This function provides comprehensive audience estimation for complex targeting combinations including demographics, geography, interests, and behaviors. It also maintains backwards compatibility for simple interest validation.
Args: access_token: Meta API access token (optional - will use cached token if not provided) account_id: Meta Ads account ID (format: act_XXXXXXXXX) - required for comprehensive estimation targeting: Complete targeting specification including demographics, geography, interests, etc. Example: { "age_min": 25, "age_max": 65, "geo_locations": {"countries": ["PL"]}, "flexible_spec": [ {"interests": [{"id": "6003371567474"}]}, {"interests": [{"id": "6003462346642"}]} ] } optimization_goal: Optimization goal for estimation (default: "REACH"). Options: "REACH", "LINK_CLICKS", "IMPRESSIONS", "CONVERSIONS", etc. interest_list: [DEPRECATED - for backwards compatibility] List of interest names to validate interest_fbid_list: [DEPRECATED - for backwards compatibility] List of interest IDs to validate
Returns: JSON string with audience estimation results including estimated_audience_size, reach_estimate, and targeting validation
| Name | Required | Description | Default |
|---|---|---|---|
| targeting | No | ||
| account_id | No | ||
| access_token | No | ||
| interest_list | No | ||
| optimization_goal | No | REACH | |
| interest_fbid_list | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden. It discloses behavioral traits such as optional access_token with cached token fallback, account_id being required for comprehensive estimation, and deprecated parameters. It does not explicitly state side effects or rate limits, but the 'estimate' action implies read-only behavior. The disclosure is reasonably thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized with an intro, Args block, and Returns section. It is somewhat long but each sentence serves a purpose. The example for targeting is illustrative, and deprecated notes are clearly marked. A minor redundancy is the 'This function provides...' sentence which could be implicit, but overall structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the six-parameter complexity, zero annotations, and no schema descriptions, the description covers every parameter, provides an example, notes defaults, explains the return value, and flags deprecated fields. It even mentions the API name. This is sufficient for an agent to select and invoke the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain all parameters. It does so thoroughly: access_token (cached fallback), account_id (format and requirement), targeting (with a full example), optimization_goal (default and options), and interest_list/interest_fbid_list (deprecated). This adds substantial meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Estimate audience size for targeting specifications using Meta's delivery_estimate API.' This clearly states what the tool does and distinguishes it from sibling tools like search_interests or search_behaviors, which are search utilities rather than estimation endpoints.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: the tool is for comprehensive audience estimation for complex targeting combinations, and also maintains backwards compatibility for simple interest validation. This implies when it should be used (complex targeting) and notes the deprecated fallback usage. However, it does not explicitly name alternatives or state 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.
get_account_infoA
Get detailed information about a specific ad account.
Args:
account_id: Meta Ads account ID (format: act_XXXXXXXXX)
access_token: Meta API access token (optional - will use cached token if not provided)
fields: Optional comma-separated Graph API fields to return. When provided,
replaces the default field set. Useful for fetching extras like
funding_source_details, spend_cap, is_prepay_account, min_daily_budget,
disable_reason, capabilities. Default fields:
id, name, account_id, account_status, amount_spent, balance, currency,
age, business_city, business_country_code, timezone_name.
For prepaid accounts (is_prepay_account=true, common in Brazil), the
Business Manager "available balance" is the sum of funding_source_details
STORED_BALANCE entries plus coupons — the balance field alone is the
amount due to be billed, not the available pre-paid funds.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| account_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that access_token is optional and uses a cached token if omitted, that fields replace the default set, and it explains the precise meaning of 'balance' for prepaid accounts (common in Brazil). This goes well beyond basic read-only behavior and provides critical financial semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a concise opening and structured Args breakdown. Every sentence adds valuable detail—especially the prepaid account note about Brazilian accounts—without excessive padding or repetition. It is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 params, output schema present), the description is exceedingly complete. It covers parameter formats, defaults, field replacement semantics, and a geographic edge case. The output schema handles return values, so the description's job is to provide usage context, which it does exceptionally.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all parameters. It does so thoroughly: account_id includes the required format, access_token explains its optionality, and fields not only lists examples but explains that they replace the defaults and describes the default field set. It even clarifies edge-case behavior for prepaid accounts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Get detailed information about a specific ad account,' which clearly states the verb, resource, and scope. The use of 'specific' distinguishes it from sibling tools like get_ad_accounts (which lists accounts), making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for fetching a single account's details, including the optional access_token and customizable fields. It never explicitly names alternative tools for listing accounts or says when not to use this tool, but the 'specific' wording strongly implies its appropriate use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_pagesA
Get pages associated with a Meta Ads account.
Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided)
Returns: JSON response with pages associated with the account
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It adds useful context by specifying the account_id format (act_XXXXXXXXX) and disclosing access_token is optional and will use a cached token when not provided. However, it lacks details on permissions, error cases, or pagination, leaving some behavioral aspects undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line purpose, an Args section with clear parameter explanations, and a Returns line. No fluff, and the main purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter read tool with no annotations and an assumed output schema, the description covers the essential information: what it does, parameter formats, and return type. It lacks only extended usage guidance and behavioral depth, which are minor for this tool. The presence of an output schema alleviates the need to detail the return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions (0% coverage), and the description compensates fully. It explains account_id format and the optional/fallback behavior of access_token, adding meaning beyond the raw schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb and resource: 'Get pages associated with a Meta Ads account.' It distinguishes from siblings like get_account_info (account info) and get_page_posts (posts on a page) by focusing on pages tied to an ad account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the clear purpose: an agent would invoke this when needing pages linked to a Meta Ads account. However, there is no explicit comparison to alternatives or when-not-to-use guidance, so it stops at implied usage without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_accountsA
Get ad accounts accessible by a user.
amount_spent and balance are returned in currency units (e.g. USD dollars), not cents.
Args: access_token: Meta API access token (optional - will use cached token if not provided) user_id: Meta user ID or "me" for the current user limit: Maximum number of accounts to return (default: 200)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| user_id | No | me | |
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description must carry the full burden. It provides useful behavioral details: currency units (not cents), optional access_token with caching, and default limit. However, it doesn't explicitly state read-only behavior, rate limits, error cases, or other side effects. Given the lack of annotations, this is incomplete but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concisely structured with a main line, a units note, and an Args list. Every section earns its place, though the Args list format could be slightly tightened. It avoids redundant filler and is well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with an output schema present, the description covers the essential aspects: parameters, defaults, token caching, and units for specific returned fields. It does not delve into pagination or error handling, but given the existence of an output schema and the simplicity of a get, it is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates by explaining each parameter: access_token (optional, cached), user_id (Meta user ID or 'me'), and limit (default 200). This adds meaning significantly beyond the schema's type/default definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear verb+resource: 'Get ad accounts accessible by a user.' This specifically identifies the tool's function and distinguishes it from sibling tools like get_account_pages (pages) and get_account_info (likely a single account). The resource and scope are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. While the purpose is clear, there is no mention of alternatives, exclusions, or specific scenarios (e.g., 'use this when you need a list of all accounts'). The description relies solely on the name and first line to convey usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_creativesA
Get creative details for a specific ad. Requires an ad_id (not account_id). Use get_ads first to find ad IDs.
Args: ad_id: Meta Ads ad ID (required) access_token: Meta API access token (optional - will use cached token if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses that access_token is optional and will use a cached token if not provided, which is useful. It also notes the ad_id requirement. However, it does not explicitly state whether the operation is read-only, nor does it mention error cases or rate limits, leaving some behavioral traits undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (two lines plus an args list) with the purpose stated upfront. Every sentence adds value, including the workflow hint and parameter details. No redundant information is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple getter with an output schema, the description covers purpose, usage, and parameters adequately. It includes a helpful pointer to get_ads and clarifies the required input. It does not mention error handling or edge cases, but given the tool's simplicity and existing output schema, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining each parameter: ad_id is 'Meta Ads ad ID (required)' and access_token is 'Meta API access token (optional - will use cached token if not provided)'. This adds meaningful context beyond the schema's type/required fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get creative details for a specific ad' with a specific verb and resource. It also distinguishes from siblings by specifying 'Requires an ad_id (not account_id)' and pointing to get_ads for finding IDs, which differentiates it from tools like get_creative_details or get_ad_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use get_ads first to find ad IDs', giving a clear workflow. It also clarifies the input constraint 'not account_id'. However, it does not mention alternative tools like get_creative_details when only a creative ID is available, but this is not a significant omission.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_detailsA
Get detailed information about a specific ad.
Args: ad_id: Meta Ads ad ID access_token: Meta API access token (optional - will use cached token if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses a useful behavioral detail: the access_token is optional and a cached token will be used if not provided. However, it does not mention other traits like error behavior, rate limits, or read-only nature, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: one clear sentence plus an args list. Every part adds value, and the structure is front-loaded with the main purpose. No waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, output schema present), the description is complete enough. It states purpose, parameters, and token behavior. The presence of an output schema means detailed return values are already defined, so the description need not explain them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates by explaining ad_id as 'Meta Ads ad ID' and access_token as 'Meta API access token (optional - will use cached token if not provided)', adding meaning beyond the schema's bare field titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get detailed information about a specific ad.' It uses a specific verb and resource, and the singular 'specific ad' distinguishes it from sibling tools like get_ads (which likely lists ads).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: when you need details for a single ad. However, it does not explicitly mention when not to use it or recommend alternatives like get_ads for listing. The guidance 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.
get_ad_imageA
Get, download, and visualize the image attached to an existing Meta ad.
Takes a Meta ad ID and returns the image the ad is currently serving. If all you have is an image hash (no ad), use get_image_by_hash instead.
Args: ad_id: Meta Ads ad ID access_token: Meta API access token (optional - will use cached token if not provided)
Returns: The ad image ready for direct visual analysis
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| access_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool returns 'the image the ad is currently serving,' indicating the image may change over time, and mentions the optional access_token behavior ('will use cached token if not provided'). It implies a read-only operation and return format ('ready for direct visual analysis'). However, it doesn't explicitly state error handling or side effects, though for a get operation this is less critical.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It starts with a clear summary sentence, then provides usage context, an alternative tool reference, and a structured Args/Returns section. No redundant information; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema and no annotations, the description is complete for this simple tool. It explains the input parameters, the return behavior ('The ad image ready for direct visual analysis'), and provides contextual guidance on when to use an alternative tool. There are no significant gaps for the agent to make correct usage decisions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains both parameters in the Args section: ad_id ('Meta Ads ad ID') and access_token ('Meta API access token (optional - will use cached token if not provided)'). This adds meaningful context beyond the bare schema, especially for the token behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's function: 'Get, download, and visualize the image attached to an existing Meta ad.' It uses a specific verb (get/download/visualize) and resource (existing Meta ad image). It also distinguishes itself from the sibling tool get_image_by_hash, explicitly stating 'If all you have is an image hash (no ad), use get_image_by_hash instead.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance, including when to use this tool (when you have a Meta ad ID) and when not to (when you only have an image hash). It names the alternative tool (get_image_by_hash), making the decision process clear for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adsA
Get ads for a Meta Ads account with optional filtering.
Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of ads to return (default: 10) campaign_id: Optional campaign ID to filter by adset_id: Optional ad set ID to filter by
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| adset_id | No | ||
| account_id | Yes | ||
| campaign_id | No | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It adds useful behavioral context: optional access_token falls back to cached token, limit defaults to 10, and filtering by campaign/adset is supported. However, it does not disclose pagination behavior, rate limits, or the exact scope of returned ads, leaving gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with a one-sentence purpose followed by an argument list. Each line is informative and earns its place, though the arg list could be seen as slightly redundant with the schema. Overall efficient and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained. The description covers purpose, all parameters, and some behavioral details (caching, defaults). It lacks explicit usage guidelines and deeper behavioral disclosure, but for a simple list tool it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates by explaining every parameter: account_id format, access_token optionality with fallback, limit default, and campaign/adset filter purposes. This goes well beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get ads for a Meta Ads account with optional filtering,' which identifies the verb (get), resource (ads), and scope (Meta Ads account). This distinguishes it from siblings like get_ad_details (specific ad) and get_campaigns (campaigns).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as get_ad_details or search_ads_archive. The description mentions optional filtering but does not explain when this listing tool is preferred over other ad-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adset_detailsA
Get detailed information about a specific ad set.
Args: adset_id: Meta Ads ad set ID access_token: Meta API access token (optional - will use cached token if not provided)
Example: To call this function through MCP, pass the adset_id as the first argument: { "args": "YOUR_ADSET_ID" }
| Name | Required | Description | Default |
|---|---|---|---|
| adset_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It states that access_token is optional and a cached token will be used if not provided, which is useful. However, it does not disclose return format, possible errors, or side effects, though the presence of an output schema mitigates this.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, starting with a clear one-sentence purpose, followed by a structured Args block and a brief example. No wasted words, though the example is somewhat redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description covers the essential parameters and provides an example. The existence of an output schema covers return values. However, it lacks usage guidelines and prerequisites, making it minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains adset_id as 'Meta Ads ad set ID' and access_token as optional with cached fallback, adding meaning beyond the schema. However, it lacks format or source details for the ID.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets detailed information about a specific ad set, using a specific verb (get) and resource (ad set). It distinguishes from siblings like get_adsets (list) and get_ad_details (ad-level details).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when you need details for a single ad set, but does not explicitly mention alternatives or exclusions. Sibling tool names like get_adsets suggest listing, but no direct guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adsetsA
Get ad sets for a Meta Ads account with optional filtering by campaign.
Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of ad sets to return (default: 10) campaign_id: Optional campaign ID to filter by
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| account_id | Yes | ||
| campaign_id | No | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description provides some behavioral context by explaining the access_token caching behavior ('will use cached token if not provided') and the default limit. However, it does not discuss error behavior, pagination, or explicitly confirm it is a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact docstring with a one-sentence purpose followed by a numbered Args list. Every line provides necessary information; there is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 4 parameters and no schema descriptions, but the description covers all parameters and the core behavior. Missing pieces are usage guidance relative to sibling tools and explicit handling of edge cases or errors, though the output schema covers return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides only titles and types with no descriptions, so the description is the sole source of parameter meaning. It explains the account_id format ('act_XXXXXXXXX'), the optional access_token with caching, the limit default (10), and the campaign_id filter, adding significant value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear statement: 'Get ad sets for a Meta Ads account with optional filtering by campaign.' This specifies the verb (Get), resource (ad sets), and scope (account, optional campaign filter), distinguishing it from sibling tools like get_campaigns or get_ads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus get_adset_details (likely for a single ad set) or other sibling tools. The description does not mention exclusions or alternative scenarios, leaving the agent to infer from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_videoA
Get video details and source URL for a Meta ad video creative. Returns the video source URL (direct download link), thumbnail URL, processing status, and metadata (title, description, duration).
Also useful for polling after bulk_upload_ad_videos: video_status is
"processing" while Meta is still transcoding and "ready" when the
real video frames (and a usable thumbnail) are available. Calling
create_ad_creative before status is "ready" returns an error because the
only thumbnail Meta returns during processing is a generic placeholder
that would be permanently stored on the creative.
Provide either ad_id (to auto-extract the video from the ad creative) or video_id directly. Providing account_id is strongly recommended — it enables the advideos edge which works with Business Manager tokens (avoids error 100/33 and error #10 on account-uploaded videos).
Args: ad_id: Meta Ads ad ID (will extract video_id from the ad creative) video_id: Meta video ID (use this if you already have it from get_ad_creatives) account_id: Ad account ID (e.g. "act_123" or "123"). Enables advideos edge lookup. access_token: Meta API access token (optional - will use cached token if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | No | ||
| video_id | No | ||
| account_id | No | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the processing status lifecycle ('processing' vs 'ready'), the error consequence for premature creative creation, and the rationale for using the advideos edge with account_id. This goes well beyond a simple read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a purpose statement, usage context, and parameter details. Every sentence adds value—the polling explanation, the account_id recommendation, and the Args list are all necessary. It is front-loaded with the core purpose and avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a tool with an output schema. It covers the return values, the critical polling behavior, error scenarios, and parameter selection. The guidance on when to use versus when not to use create_ad_creative provides essential context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates by detailing each parameter in the Args section: ad_id extracts video, video_id for direct use, account_id enables edge lookup, and access_token defaults to cached token. This adds substantial meaning beyond raw schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get video details and source URL for a Meta ad video creative' and lists specific return values (video source URL, thumbnail URL, processing status, metadata). It distinguishes itself from siblings like get_ad_image and create_ad_creative by focusing on video retrieval and polling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'useful for polling after bulk_upload_ad_videos' and a clear when-not-to-use warning: 'Calling create_ad_creative before status is "ready" returns an error'. It also explains when to provide which ID and recommends account_id for avoiding specific errors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaign_detailsA
Get detailed information about a specific campaign.
Note: This function requests a specific set of fields ('id,name,objective,status,...'). The Meta API offers many other fields for campaigns (e.g., 'effective_status', 'source_campaign_id', etc.) that could be added to the 'fields' parameter in the code if needed.
Args: campaign_id: Meta Ads campaign ID access_token: Meta API access token (optional - will use cached token if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that only a predefined set of fields is requested and that access_token is optional with a cached-token fallback. However, it doesn't mention error handling, rate limits, or what happens for invalid IDs. Some behavioral context is added, but it's not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a clear main purpose, a useful note about field selection, and formatted argument explanations. Every sentence adds value, though the note could be seen as slightly tangential to basic usage. Overall efficient and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given it's a simple read operation with an output schema present, the description covers purpose, parameter semantics, and some behavioral nuances. It doesn't explain return values (covered by output schema) but lacks explicit guidance on when to use it vs alternatives. Good enough for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clearly explains campaign_id as a Meta Ads campaign ID and access_token as optional with cached-token behavior. This adds meaningful context beyond the bare schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get detailed information about a specific campaign' clearly states the action and resource. It distinguishes from the sibling get_campaigns (which presumably lists campaigns) by focusing on a single campaign's details, though it doesn't explicitly mention when to use it over alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and description ('a specific campaign'), but no explicit when-to-use or when-not-to-use guidance is provided. The note about requesting only a specific set of fields is more implementation detail than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaignsA
Get campaigns for a Meta Ads account with optional filtering.
Note: By default, the Meta API returns a subset of available fields. Other fields like 'effective_status', 'spend_cap', 'budget_remaining', 'promoted_object', 'source_campaign_id', etc., might be available but require specifying them in the API call (currently not exposed by this tool's parameters).
Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of campaigns to return (default: 10) status_filter: Filter by effective status (e.g., 'ACTIVE', 'PAUSED', 'ARCHIVED'). Maps to the 'effective_status' API parameter, which expects an array (this function handles the required JSON formatting). Leave empty for all statuses. objective_filter: Filter by campaign objective(s). Can be a single objective string or a list of objectives. Valid objectives: 'OUTCOME_AWARENESS', 'OUTCOME_TRAFFIC', 'OUTCOME_ENGAGEMENT', 'OUTCOME_LEADS', 'OUTCOME_SALES', 'OUTCOME_APP_PROMOTION'. Examples: 'OUTCOME_LEADS' or ['OUTCOME_LEADS', 'OUTCOME_SALES']. Leave empty for all objectives. after: Pagination cursor to get the next set of results
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| limit | No | ||
| account_id | Yes | ||
| access_token | No | ||
| status_filter | No | ||
| objective_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses that Meta API returns a subset of fields by default, that other fields may require explicit specification (not exposed), and explains how status_filter maps to effective_status. It also mentions token caching. This adds genuine behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening sentence, a note about API field limitations, and an organized Args list. While somewhat long, every section adds value and the front-loading makes it scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 params, pagination, API quirks) and the presence of an output schema, the description covers the essential operational details. It explains filters, pagination, token handling, and field limitations. It omits error handling or permission requirements, but these are not critical for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no parameter descriptions (0% coverage), but the description provides detailed explanations for all six parameters, including formats, defaults, valid values, mapping to API parameters, and pagination. This fully compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get campaigns for a Meta Ads account' which specifies the verb, resource, and scope. It also mentions optional filtering, which distinguishes it from siblings like get_campaign_details (singular detail) and create_campaign/update_campaign.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (retrieve campaigns for an account) and lists optional filters. It does not explicitly name alternatives or exclusions, but the context is strong enough for an agent to select it over sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_creative_detailsA
Get detailed information about a specific ad creative by its ID.
Args: creative_id: Meta Ads creative ID (required) access_token: Meta API access token (optional)
| Name | Required | Description | Default |
|---|---|---|---|
| creative_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose any behavioral aspects beyond the basic 'get' operation. It doesn't mention required permissions, potential errors, rate limits, or what fields are returned (though an output schema exists). The description adds little beyond what is obvious from the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct, front-loaded with the core purpose, and uses a well-structured Args list for parameters. Every sentence adds value; there is no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, output schema present), the description adequately covers its purpose and parameters. It doesn't describe return values, but the output schema handles that. The only missing context is broader usage guidance, which is scored separately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% coverage, but the description's Args section explains both parameters: creative_id as a Meta Ads creative ID (required) and access_token as an optional Meta API access token. This adds meaningful semantics beyond the bare type/title in the schema, though it doesn't elaborate on value formats or edge cases.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets detailed information about a specific ad creative by ID, using a specific verb and resource. It distinguishes from sibling tools like get_ad_creatives (which likely lists) and get_ad_details (which targets ads rather than creatives).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use when you have a specific creative ID and need its details. It doesn't explicitly exclude alternatives or mention when not to use it, but the 'by its ID' phrasing implies single-item retrieval rather than listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_image_by_hashA
Get, download, and visualize a Meta ad image by its hash.
Use this when you have an image_hash without an ad — e.g. the hash returned by upload_ad_image / bulk_upload_ad_images, or one referenced in a creative (object_story_spec.link_data.image_hash, asset_feed_spec images[].hash, etc.). To view the image of an existing ad, prefer get_ad_image(ad_id).
Args: account_id: Meta Ads account ID (act_XXXXXXXXX or bare numeric — both accepted) image_hash: Meta image hash access_token: Meta API access token (optional - will use cached token if not provided)
Returns: The image ready for direct visual analysis
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | ||
| image_hash | Yes | ||
| access_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries full burden. It adds behavioral context like optional access_token with 'will use cached token if not provided' and implies read-only via 'get, download, visualize.' However, it does not explicitly state that it is read-only, nor does it disclose potential failure modes, rate limits, or required permissions. This is a moderate omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured in three sections: purpose, usage guidance, and args/returns. Every sentence earns its place—there is no fluff, and the key information is front-loaded. The clear organization makes it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with no annotations and no output schema, the description covers purpose, usage, parameters, and return value. The return statement 'The image ready for direct visual analysis' gives a general idea but could be more explicit about the format (e.g., URL, binary data). Still, given the tool's simplicity, this is near-complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only titles and types, with 0% description coverage. The description's Args section compensates well: it explains the accepted formats for account_id ('act_XXXXXXXXX or bare numeric'), the purpose of image_hash, and the optionality of access_token with caching behavior. This adds meaningful semantics beyond the schema, though the image_hash description could be more detailed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb+resource: 'Get, download, and visualize a Meta ad image by its hash.' It also explicitly distinguishes from the sibling tool by stating 'To view the image of an existing ad, prefer get_ad_image(ad_id),' which removes ambiguity about when this tool is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage context: 'Use this when you have an image_hash without an ad' and provides concrete examples of how such hashes arise. It also clearly states an alternative tool for a different scenario, satisfying both 'when to use' and 'when not to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_insightsA
Get performance insights for a campaign, ad set, ad or account.
Args: object_id: ID of the campaign, ad set, ad or account. You can also use the alias parameters below. account_id: Alias for object_id when querying account-level insights campaign_id: Alias for object_id when querying campaign-level insights adset_id: Alias for object_id when querying ad-set-level insights ad_id: Alias for object_id when querying ad-level insights access_token: Meta API access token (optional - will use cached token if not provided) time_range: Either a preset time range string or a dictionary with "since" and "until" dates in YYYY-MM-DD format Preset options: today, yesterday, this_month, last_month, this_quarter, maximum, data_maximum, last_3d, last_7d, last_14d, last_28d, last_30d, last_90d, last_week_mon_sun, last_week_sun_sat, last_quarter, last_year, this_week_mon_today, this_week_sun_today, this_year Dictionary example: {"since":"2023-01-01","until":"2023-01-31"} breakdown: Optional breakdown dimension. Valid values include: Demographic: age, gender, country, region, dma Platform/Device: device_platform, platform_position, publisher_platform, impression_device NOTE: platform_position is a Meta-restricted breakdown — Meta requires it to be paired with publisher_platform (otherwise "(#100) ... (action_type, platform_position) is invalid"). When you pass platform_position, this tool auto-adds publisher_platform, and the action-typed fields (actions, action_values, conversions, cost_per_action_type) are returned per placement, so you get leads/CPL/conversions broken down by placement. Creative Assets: ad_format_asset, body_asset, call_to_action_asset, description_asset, image_asset, link_url_asset, title_asset, video_asset, media_type, creative_relaxation_asset_type, flexible_format_asset_type, gen_ai_asset_type NOTE: Asset breakdowns (image_asset, video_asset, etc.) only return data for ads running with Dynamic Creative; for non-DCO ads, expect empty rows. NOTE: media_type collides with the default action_breakdowns=[action_type], so this tool auto-overrides action_breakdowns to [] when you pass media_type. Action-typed metrics (actions, action_values, conversions) are still returned but are no longer sliced by action_type alongside media_type. media_asset_url, media_creator, media_destination_url, media_format, media_origin_url, and media_text_content are NOT supported by Meta's Insights API (Meta returns "(#100) Tried accessing nonexisting field"). Use the asset breakdowns above instead. Campaign/Ad Attributes: breakdown_ad_objective, breakdown_reporting_ad_id, app_id, product_id Conversion Tracking: coarse_conversion_value, conversion_destination, standard_event_content_type, signal_source_bucket, is_conversion_id_modeled, fidelity_type, redownload Time-based: hourly_stats_aggregated_by_advertiser_time_zone, hourly_stats_aggregated_by_audience_time_zone, frequency_value Extensions/Landing: ad_extension_domain, ad_extension_url, landing_destination, mdsa_landing_destination Attribution: sot_attribution_model_type, sot_attribution_window, sot_channel, sot_event_type, sot_source Mobile/SKAN: skan_campaign_id, skan_conversion_id, skan_version, postback_sequence_index CRM/Business: crm_advertiser_l12_territory_ids, crm_advertiser_subvertical_id, crm_advertiser_vertical_id, crm_ult_advertiser_id, user_persona_id, user_persona_name Advanced: hsid, is_auto_advance, is_rendered_as_delayed_skip_ad, mmm, place_page_id, marketing_messages_btn_name, impression_view_time_advertiser_hour_v2, comscore_market, comscore_market_code level: Level of aggregation (ad, adset, campaign, account) limit: Maximum number of results to return per page (default: 25, Meta API allows much higher values) after: Pagination cursor to get the next set of results. Use the 'after' cursor from previous response's paging.next field. action_attribution_windows: Optional list of attribution windows (e.g., ["1d_click", "7d_click", "1d_view"]). When specified, actions include additional fields for each window. The 'value' field always shows 7d_click. action_breakdowns: Optional list of action_breakdowns to apply to action-typed metrics. Pass [] to disable the default action_type slicing (required when combining action data with breakdowns that collide with action_type, e.g. media_type — auto-applied for media_type when not set). Meta supports values like action_type, action_target_id, action_destination, etc. compact: When True, strips redundant action-type duplicates from the response (omni_*, onsite_web_*, offsite_conversion.fb_pixel_*, etc.) to reduce payload size by ~60%. The canonical action types (purchase, add_to_cart, view_content, etc.) are always preserved. Default: False.
Note on response size: This tool always returns a fixed set of fields (impressions, clicks, spend, cpc, cpm, ctr, reach, actions, action_values, etc.) and cannot filter to a subset. For large result sets (50+ rows), the actions/action_values arrays can make responses very large (1–2MB+). If you only need specific metrics like spend or impressions, consider using bulk_get_insights with compact=true and the fields parameter: bulk_get_insights(level="ad", account_ids=[...], compact=true, fields=["spend", "impressions"]) bulk_get_insights supports level="ad", "adset", "campaign", and "account".
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | No | ||
| after | No | ||
| level | No | ad | |
| limit | No | ||
| compact | No | ||
| adset_id | No | ||
| breakdown | No | ||
| object_id | No | ||
| account_id | No | ||
| time_range | No | maximum | |
| campaign_id | No | ||
| access_token | No | ||
| action_breakdowns | No | ||
| action_attribution_windows | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral disclosure burden, and it excels. It reveals important behavioral quirks: auto-adding publisher_platform when platform_position is passed, auto-overriding action_breakdowns for media_type, unsupported breakdown fields that cause Meta errors, response size implications, and the compact mode behavior. This goes well beyond minimal disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and detailed, but every sentence contributes useful information for correct usage. It is well-structured with an Args section and note blocks, and it front-loads the main purpose. It loses one point for verbosity—the breakdown list could be trimmed or moved to schema enums—but overall, it is appropriately sized for a 14-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is exceptionally complete for the tool's complexity. It covers all 14 parameters, enumerates valid breakdown values, explains restrictions, describes response size behavior, and provides an alternative tool. Even with an output schema present, the description adds critical context about return fields and aggregates, making it self-sufficient for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so comprehensively: each parameter is explained with its purpose, accepted values, presets, aliases, and special rules (e.g., time_range presets, breakdown valid values, pagination cursor). The description adds extensive meaning beyond the schema's bare titles and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Get performance insights for a campaign, ad set, ad or account,' which combines a specific verb, resource scope, and clear output type. This immediately distinguishes it from sibling tools like get_campaign_details or get_ads, which focus on configuration details rather than performance metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'If you only need specific metrics like spend or impressions, consider using bulk_get_insights with compact=true and the fields parameter,' naming the alternative and the conditions under which it should be used. It also notes that this tool always returns a fixed set of fields, implying when not to use it. This satisfies the when-to-use vs. alternatives requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_interest_suggestionsA
Get interest suggestions based on existing interests.
Args: interest_list: List of interest names to get suggestions for (e.g., ["Basketball", "Soccer"]) access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of suggestions to return (default: 25)
Returns: JSON string containing suggested interests with id, name, audience_size, and description fields
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| access_token | No | ||
| interest_list | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral transparency burden. It discloses useful traits: access_token is optional and a cached token is used if not provided, and the return is a JSON string with specific fields. This goes beyond the basic 'get' semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening sentence, followed by a concise Args section and a Returns line. Every line earns its place, with no redundant or verbose content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all core aspects: purpose, parameters, token handling, and return format. It does not mention error cases or network calls, but for a straightforward suggestion tool with an output schema, it is sufficiently complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully explain parameters. It does so effectively: interest_list with an example, access_token with caching note, and limit with default value. This adds significant meaning beyond the schema's raw type definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get interest suggestions based on existing interests.' This specifies a verb ('get') and resource ('interest suggestions') and distinguishes it from sibling tools like search_interests by emphasizing the suggestion generation from existing interests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage is implied from the description: provide an interest_list to receive related suggestions. However, there is no explicit guidance on when to use this tool versus alternatives like search_interests or estimate_audience_size, and no exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_login_linkD
| Name | Required | Description | Default |
|---|---|---|---|
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Tool has no description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tool has no description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Tool has no description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tool has no description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metric_definitionC
Return a concise definition and calculation formula for a growth metric.
| Name | Required | Description | Default |
|---|---|---|---|
| metric | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It hints at the return content (definition + formula) but discloses nothing about permissions, valid metric identifiers, or failure behavior. For a read-only lookup this is low-risk, but no behavioral context is added.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It communicates the action and the returned artifact compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not required, and the tool has only one simple parameter. However, for a definition-lookup tool the description never tells the agent what metric identifiers are valid or when to reach for it over calculating tools, leaving a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the single 'metric' parameter. It only implies the parameter is a growth metric name; it gives no format, no valid-value examples, and no indication of what identifiers are accepted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Return a concise definition and calculation formula for a growth metric.' An agent can tell this is a lookup/reference tool, distinct from calculation siblings like calculate_growth_metrics or compare_campaign_metrics. It stops short of explicitly naming any sibling for differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of how this differs from the many sibling metrics tools. The agent must infer that this is for looking up a definition rather than computing values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
investigate_campaignC
Build an auditable campaign investigation packet with metrics, drivers, and evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| records | Yes | ||
| campaign_name | Yes | ||
| compare_period_records | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. "Auditable" hints that output is meant to be evidence-grade, but nothing is said about whether the tool is read-only or writes anything, how it handles the supplied records, or any limits/determinism concerns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is efficient, though the terseness is arguably under-specification rather than disciplined concision for a 3-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but with no annotations, 0% parameter coverage, and no routing guidance relative to near-identical siblings, an agent lacks the information needed to call this confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description never mentions campaign_name, records, or compare_period_records. It gives no clue what shape "records" should take or how the optional comparison period changes results, so an agent cannot construct a correct call from the description alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a verb ("Build") and a product ("auditable campaign investigation packet") with a hint of contents ("metrics, drivers, and evidence"). It does not, however, distinguish this from the sibling build_evidence_packet, which sounds like the same artifact, so the purpose remains fuzzy at the level an agent needs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus build_evidence_packet, investigate_growth_issue, compare_campaign_metrics, or analyze_growth_query, and no mention of prerequisites or expected input conditions. The agent is left to guess from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
investigate_growth_issueC
Investigate a growth-metric change with formula drivers and auditable dimensional evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | ||
| user_events | No | ||
| current_records | Yes | ||
| previous_records | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it does not say whether the tool is read-only, what it does with the supplied record sets, whether previous_records is needed for comparison, or any cost/rate characteristics. 'Auditable dimensional evidence' gestures at output but adds no actionable behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or repetition. It is efficient, though the brevity reflects under-specification rather than disciplined concision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but for a 4-parameter analytical tool with zero schema coverage and no annotations the description omits too much: it never indicates the required question/current_records pairing or how previous_records and user_events change the analysis. An agent could not assemble a correct call from this text alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 4 parameters, and the description supplies no meaning for question, current_records, previous_records, or user_events. Parameter names are somewhat self-explanatory, which keeps this above 1, but nothing explains expected record shapes or the role of the optional event/previous-record inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Investigate a growth-metric change') and hints at method ('formula drivers', 'auditable dimensional evidence'). However, it does nothing to separate this tool from close siblings such as analyze_growth_query, detect_metric_anomalies, or calculate_growth_metrics, so an agent cannot confidently pick it from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus the many overlapping growth/analysis siblings, no prerequisites (e.g., that records must be supplied), and no exclusions. The single sentence describes output flavor rather than invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
normalize_growth_recordsC
Normalize heterogeneous marketing records into the canonical GrowthMCP schema.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | unknown | |
| records | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the entire behavioral burden, and it discloses nothing about whether the operation is read-only or mutating, whether original records are modified, how unknown source types are handled, or whether unrecognized fields are dropped or preserved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with zero filler, so it reads cleanly; the only reservation is that such brevity leaves no room for the behavioral detail an unannotated tool needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but for a tool with two fully undocumented parameters and no annotations the description omits the input-format expectations and normalization-selection semantics that an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters. The description implies what "records" holds but never states the accepted input shapes, required keys, or what "source" (defaulting to "unknown") changes in the normalization behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ("Normalize"), a clear input class ("heterogeneous marketing records"), and a named target ("the canonical GrowthMCP schema"), which is enough for an agent to distinguish it from the CRUD/analytics siblings in the toolset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus alternatives, no preconditions, and no mention of what upstream step should produce the records being normalized. Usage is only faintly implied by the word "heterogeneous".
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_ads_archiveA
Search the Facebook Ads Library archive.
Args: search_terms: The search query for ads. ad_reached_countries: List of country codes (e.g., ["US", "GB"]). access_token: Meta API access token (optional - will use cached token if not provided). ad_type: Type of ads to search for (e.g., POLITICAL_AND_ISSUE_ADS, HOUSING_ADS, ALL). limit: Maximum number of ads to return. fields: Comma-separated string of fields to retrieve for each ad.
Example Usage via curl equivalent:
curl -G
-d "search_terms='california'"
-d "ad_type=POLITICAL_AND_ISSUE_ADS"
-d "ad_reached_countries=['US']"
-d "fields=ad_snapshot_url,spend"
-d "access_token="
"https://graph.facebook.com//ads_archive"
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| fields | No | ad_creation_time,ad_creative_body,ad_creative_link_caption,ad_creative_link_description,ad_creative_link_title,ad_delivery_start_time,ad_delivery_stop_time,ad_snapshot_url,currency,demographic_distribution,funding_entity,impressions,page_id,page_name,publisher_platform,region_distribution,spend | |
| ad_type | No | ALL | |
| access_token | No | ||
| search_terms | Yes | ||
| ad_reached_countries | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It does disclose that access_token is optional and falls back to a cached token, and the curl example reveals it's a GET request, but it omits pagination, rate limits, and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a concise purpose statement, an Args list, and a practical example. It is slightly long, but each section serves a clear function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with an output schema, this description covers the core purpose, all parameters, and usage context. It lacks explicit guidance on pagination and alternative tools, but is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining every parameter in the Args section and providing a concrete curl example. It adds meaning beyond the schema by clarifying optionality and example values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Search' and names the resource 'Facebook Ads Library archive', clearly defining the tool's functionality. This resource scoping distinguishes it from sibling search tools like search_pages_by_name or search_interests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through a curl example, but it never explicitly states when to use this tool over alternatives like search_pages_by_name or search_interests. No exclusion or alternative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_behaviorsA
Get all available behavior targeting options.
Args: access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of results to return (default: 50)
Returns: JSON string containing behavior targeting options with id, name, audience_size bounds, path, and description
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the transparency burden. It discloses that access_token is optional and a cached token is used if not provided, and it describes the return format (JSON string with id, name, audience_size bounds, etc.). This adds meaningful context beyond the schema, though it does not mention rate limits or max limit constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured with separate Args and Returns sections. Every sentence provides useful information without redundancy, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description covers the purpose, parameters, and return format effectively. It is self-contained and sufficient for an agent to invoke correctly, even without an output schema (which is present anyway).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explicitly explains both parameters: access_token (Meta API token, optional) and limit (maximum results, default 50). This adds meaning beyond the schema's types and defaults, compensating for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('behavior targeting options'), clearly distinguishing it from sibling tools like search_interests or search_demographics. The scope is well-defined and immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving behavior targeting options but does not explicitly state when to use it versus alternatives such as search_interests or search_demographics. No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_demographicsA
Get demographic targeting options.
Args: access_token: Meta API access token (optional - will use cached token if not provided) demographic_class: Type of demographics to retrieve. Options: 'demographics', 'life_events', 'industries', 'income', 'family_statuses', 'user_device', 'user_os' (default: 'demographics') limit: Maximum number of results to return (default: 50)
Returns: JSON string containing demographic targeting options with id, name, audience_size bounds, path, and description
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| access_token | No | ||
| demographic_class | No | demographics |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that access_token is optional and falls back to a cached token, lists all accepted demographic_class values, and explains the return JSON format with specific fields. Since no annotations are provided, the description carries the full burden and does so effectively, though it omits details like rate limits or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-sentence purpose, then follows a clear Args/Returns structure. Every line serves a purpose, with no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and a relatively simple read-only tool, the description covers purpose, parameters, defaults, allowed values, and return format. This is fully sufficient for an agent to select and invoke the tool correctly, especially given the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description provides essential meaning for all three parameters: access_token behavior, demographic_class allowed values with default, and limit default. This goes well beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves demographic targeting options, with a specific verb and resource. The list of demographic_class values (e.g., 'life_events', 'income') differentiates it from sibling search tools like search_interests and search_behaviors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the demographic_class parameter and the tool's name, but the description does not explicitly state when to use this tool versus alternatives like search_interests or search_geo_locations. There are no direct comparisons or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_geo_locationsA
Search for geographic targeting locations.
Args: query: Search term for locations (e.g., "New York", "California", "Japan") access_token: Meta API access token (optional - will use cached token if not provided) location_types: Types of locations to search. Options: ['country', 'region', 'city', 'zip', 'geo_market', 'electoral_district']. If not specified, searches all types. limit: Maximum number of results to return (default: 25)
Returns: JSON string containing location data with key, name, type, and geographic hierarchy information
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| access_token | No | ||
| location_types | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discloses important behaviors: access_token is optional with cached fallback, location_types defaults to all, limit defaults to 25, and the return format is a JSON string. However, it does not mention rate limits, permissions, or error handling, so it's not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with Args and Returns, leading with a clear purpose sentence. It is somewhat list-heavy but appropriately sized given the need to document four parameters with no schema descriptions. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all parameters, defaults, and return format. With an output schema present, it does not need to fully explain return fields, but it does mention key fields. It lacks pagination or no-result behavior, but for a search tool this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates by explaining every parameter: query with examples, access_token behavior, location_types options, and limit default. This adds substantial meaning beyond the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search for geographic targeting locations,' which is a specific verb + resource. It distinguishes this from sibling tools like search_interests and search_behaviors by explicitly focusing on geographic locations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its use for geographic targeting but does not explicitly state when to use it over alternatives like search_interests or search_behaviors. No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_interestsA
Search for interest targeting options by keyword.
Args: query: Search term for interests (e.g., "baseball", "cooking", "travel") access_token: Meta API access token (optional - will use cached token if not provided) limit: Maximum number of results to return (default: 25)
Returns: JSON string containing interest data with id, name, audience_size, and path fields
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It adds value by specifying the return format as a JSON string with fields (id, name, audience_size, path) and by disclosing that access_token is optional and will use a cached token if not provided. This goes beyond the schema's basic parameter types.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly structured with a one-sentence purpose followed by a concise Args/Returns list. Every line serves a clear informational purpose with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool definition covers purpose, all parameters, and return format. While it lacks explicit error handling or limitations, the presence of an output schema and the detailed parameter/return descriptions make it sufficiently complete for a straightforward search operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite the input schema having 0% description coverage, the tool description fully compensates by explaining all three parameters: query with concrete examples, access_token with caching behavior, and limit with its default value. This provides semantic meaning well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Search' and clearly identifies the resource as 'interest targeting options'. This distinguishes it from sibling tools like search_behaviors and search_demographics, which target different entity types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by defining the tool as a keyword search for interests, but it does not explicitly state when to use it over alternatives like search_behaviors or get_interest_suggestions, nor does it provide any exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_pages_by_nameA
Search for pages by name within an account.
Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided) search_term: Search term to find pages by name (optional - returns all pages if not provided)
Returns: JSON response with matching pages
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | ||
| search_term | No | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It discloses two important behavioral traits: access_token is optional and falls back to a cached token, and search_term is optional and returns all pages when omitted. It also specifies the return type as JSON. This goes beyond basic schema info, though it doesn't cover pagination or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a single purpose sentence followed by an Args section and a Returns line. No wasted words. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter tool with an output schema, the description covers the essential context: what the tool does, parameter meanings, and return type. It omits potential pagination or rate-limit details, but given the tool's simplicity and the presence of an output schema, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions for its parameters (0% coverage). The description compensates fully with an Args section that explains each parameter: account_id format, access_token optionality with cached token behavior, and search_term optionality with 'return all pages' behavior. This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Search for pages by name within an account.' It specifies the resource (pages), the action (search), and the scope (by name within an account). While it doesn't explicitly compare to sibling tools like get_account_pages, the 'by name' qualifier implies a distinction from listing all pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use this tool when you need to find pages by name. It does not explicitly state when _not_ to use it or mention alternatives, but the purpose sentence is enough to infer when it is appropriate. No exclusions or alternatives are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_adA
Update an ad with new settings.
Args: ad_id: Meta Ads ad ID name: New ad name status: Update ad status (ACTIVE, PAUSED, etc.) bid_amount: Bid amount in account currency (in cents for USD) tracking_specs: Optional tracking specifications (e.g., for pixel events). creative_id: ID of the creative to associate with this ad (changes the ad's image/content) access_token: Meta API access token (optional - will use cached token if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| ad_id | Yes | ||
| status | No | ||
| bid_amount | No | ||
| creative_id | No | ||
| access_token | No | ||
| tracking_specs | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. It does add useful context: access_token is optional and 'will use cached token if not provided,' and creative_id 'changes the ad's image/content.' However, it does not disclose whether unspecified fields are reset, rate limits, or other side effects, leaving some ambiguity for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured with a purpose line followed by a compact Args list. Each parameter gets a single line with no wasted words, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 7 parameters and no annotations, the description covers all parameters and includes some behavioral notes. The presence of an output schema reduces the need to describe return values. However, it lacks discussion of partial vs. full update behavior or error conditions, which is a notable gap for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description fully compensates by explaining every parameter. It adds crucial semantics like bid_amount being 'in cents for USD' and tracking_specs being 'optional tracking specifications (e.g., for pixel events).' This provides meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Update an ad with new settings', a specific verb+resource that clearly identifies the tool's function. It distinguishes from sibling tools like update_campaign and update_adset by focusing on 'ad'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like create_ad or update_ad_creative. It does not mention any exclusions or prerequisites, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ad_creativeA
Update an existing ad creative's name or optimization settings.
IMPORTANT — Meta API limitation: The Meta API does NOT allow updating content
fields (message, headline, description, CTA, image, video, URL) on existing
creatives. Only the creative name and optimization settings (asset_feed_spec)
can be changed. To change ad content, create a new creative with the desired
content and update the ad to reference the new creative via update_ad.
Args: creative_id: Meta Ads creative ID to update access_token: Meta API access token (optional - will use cached token if not provided) name: New creative name (this is the most reliable update) message: New ad copy/text — NOTE: Meta API may reject this on existing creatives messages: List of primary text variants — NOTE: Meta API may reject this on existing creatives headline: Single headline — NOTE: Meta API may reject this on existing creatives headlines: New list of headlines — NOTE: Meta API may reject this on existing creatives description: Single description — NOTE: Meta API may reject this on existing creatives descriptions: New list of descriptions — NOTE: Meta API may reject this on existing creatives optimization_type: Set to "DEGREES_OF_FREEDOM" for FLEX (Advantage+) creatives dynamic_creative_spec: New dynamic creative optimization settings call_to_action_type: New call to action button type — NOTE: Meta API may reject this on existing creatives lead_gen_form_id: Lead generation form ID for lead generation campaigns ad_formats: List of ad format strings for asset_feed_spec (e.g., ["AUTOMATIC_FORMAT"] for Flexible ads, ["SINGLE_IMAGE"] for single image) creative_features_spec: Dict of Advantage+ Creative feature opt-ins/opt-outs. Each key is a feature name, value is {"enroll_status": "OPT_IN"|"OPT_OUT"}. Sent as a top-level field (not inside degrees_of_freedom_spec).
Returns: JSON response with updated creative details
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| message | No | ||
| headline | No | ||
| messages | No | ||
| headlines | No | ||
| ad_formats | No | ||
| creative_id | Yes | ||
| description | No | ||
| access_token | No | ||
| descriptions | No | ||
| lead_gen_form_id | No | ||
| optimization_type | No | ||
| call_to_action_type | No | ||
| dynamic_creative_spec | No | ||
| creative_features_spec | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full transparency burden. It discloses the key limitation that content fields will likely be rejected, notes the reliability of the name field, explains the access_token fallback behavior, and provides field-specific caveats. It also clarifies how creative_features_spec should be sent (top-level field).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than ideal, with the 'NOTE: Meta API may reject this' repeated for six separate fields. However, it is well-structured with an Args list and Returns section, and the length is justified by the need to document 15 parameters and a critical API constraint. Every section earns its place, though some repetition could be consolidated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (15 params, no annotations, presence of output schema), the description is complete. It covers purpose, usage boundaries, parameter semantics, and expected returns. It also references the related update_ad tool, providing necessary cross-tool context. The output schema handles return details, so the brief Returns line is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description documents all 15 parameters, including type guidance (e.g., 'DEGREES_OF_FREEDOM' for flex creatives, ['AUTOMATIC_FORMAT'] for flexible ads) and explicit notes on which will likely be rejected. This fully compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Update an existing ad creative's name or optimization settings' and explicitly contrasts with content updates. It names the resource (ad creative) and the specific allowed changes, distinguishing it from siblings like create_ad_creative and update_ad.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use this tool (for name/optimization settings) and when not to (for content fields), and it names the alternative workflow: create a new creative and reference it via update_ad. The 'IMPORTANT — Meta API limitation' note provides clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_adsetA
Update an ad set with new settings including frequency caps and budgets.
Args: adset_id: Meta Ads ad set ID name: New ad set name frequency_control_specs: Frequency control specs (e.g. [{"event": "IMPRESSIONS", "interval_days": 7, "max_frequency": 3}]) bid_strategy: Bid strategy. Valid values: - 'LOWEST_COST_WITHOUT_CAP' (recommended) - no bid_amount required - 'LOWEST_COST_WITH_BID_CAP' - REQUIRES bid_amount - 'COST_CAP' - REQUIRES bid_amount - 'LOWEST_COST_WITH_MIN_ROAS' - REQUIRES bid_constraints with roas_average_floor Note: 'LOWEST_COST' is NOT valid - use 'LOWEST_COST_WITHOUT_CAP'. bid_amount: Bid amount in cents. Required for LOWEST_COST_WITH_BID_CAP, COST_CAP, TARGET_COST. NOT USED by LOWEST_COST_WITH_MIN_ROAS (uses bid_constraints instead). bid_constraints: Bid constraints dict. Required for LOWEST_COST_WITH_MIN_ROAS. Use {"roas_average_floor": } where value = target ROAS * 10000. Example: 2.0x ROAS -> {"roas_average_floor": 20000} bid_adjustments: Bid multipliers per targeting dimension. Pass-through to Meta. Shape: {"user_groups": {"": {"": , "default": }}} See create_adset for full docs and dim list. NOTE: Writing requires a Meta app capability that must be allowlisted. status: Update ad set status (ACTIVE, PAUSED, etc.) targeting: Complete targeting specifications (replaces existing targeting) optimization_goal: Conversion optimization goal (e.g., 'LINK_CLICKS', 'CONVERSIONS', 'VALUE') daily_budget: Daily budget in account currency (in cents) lifetime_budget: Lifetime budget in account currency (in cents) is_dynamic_creative: Enable/disable Dynamic Creative for this ad set. WARNING: This field is immutable after ad set creation. Meta's API will return success but silently ignore the change. To change this, create a new ad set. start_time: Start time in ISO 8601 format (e.g., '2023-12-01T12:00:00-0800'). Use with status=ACTIVE to schedule the ad set for future delivery (effective_status will be SCHEDULED until start_time). end_time: End time in ISO 8601 format. Required when lifetime_budget is specified. dsa_beneficiary: DSA beneficiary for European compliance (person/org that benefits from ads). Required for EU-targeted ad sets along with dsa_payor. dsa_payor: DSA payor for European compliance (person/org paying for the ads). Required for EU-targeted ad sets along with dsa_beneficiary. multi_advertiser_ads: Set to 0 to opt out of Multi-Advertiser Ads, 1 to opt in. This is a TOP-LEVEL ad set parameter — do NOT put it inside the targeting object. regional_regulated_categories: List of regional regulated categories for the ad set. Required for ads targeting regulated regions (Taiwan, Australia, etc.). Valid values: TAIWAN_FINSERV, TAIWAN_UNIVERSAL, AUSTRALIA_FINSERV, INDIA_FINSERV, SINGAPORE_UNIVERSAL, THAILAND_UNIVERSAL. Set to null/empty to remove existing categories. regional_regulation_identities: Dict of verified identity IDs for regional transparency compliance. Required when regional_regulated_categories is set. Set individual keys to null to remove them. attribution_spec: Attribution window specification for the ad set. WARNING: Meta no longer supports updating attribution_spec after ad set creation (error 1504040). To change attribution windows, create a new ad set instead. This parameter is kept for compatibility but will be rejected by Meta's API. Valid event_type values: CLICK_THROUGH, VIEW_THROUGH. Valid window_days values: 1, 7, 28 (depends on event_type and optimization_goal). access_token: Meta API access token (optional - will use cached token if not provided)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| status | No | ||
| adset_id | Yes | ||
| end_time | No | ||
| dsa_payor | No | ||
| targeting | No | ||
| bid_amount | No | ||
| start_time | No | ||
| access_token | No | ||
| bid_strategy | No | ||
| daily_budget | No | ||
| bid_adjustments | No | ||
| bid_constraints | No | ||
| dsa_beneficiary | No | ||
| lifetime_budget | No | ||
| attribution_spec | No | ||
| optimization_goal | No | ||
| is_dynamic_creative | No | ||
| multi_advertiser_ads | No | ||
| frequency_control_specs | No | ||
| regional_regulated_categories | No | ||
| regional_regulation_identities | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and excels. It discloses critical behavioral traits: silent ignore for is_dynamic_creative ('Meta's API will return success but silently ignore the change'), API rejection for attribution_spec ('will be rejected by Meta's API'), invalid bid_strategy values, allowlisting requirement for bid_adjustments, token caching, and that targeting 'replaces existing targeting.' These are genuine behavioral disclosures beyond mere parameter definitions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but appropriately so for a 22-parameter tool. It follows a clean Args list structure with a one-line summary at the top. Each parameter description is terse and information-dense; warnings are italicized and clearly marked. While some might argue it is verbose, every sentence adds value and there is minimal redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an update operation with 22 optional parameters and no annotations, the description is exceptionally complete. It covers all parameters, including niche ones like DSA compliance, regional regulated categories, and multi_advertiser_ads. It notes dependencies, warns about immutable fields, references create_adset for shared documentation, and an output schema exists so return values need not be described. The description equips an agent to make correct calls with confidence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate fully—and it does. It provides concrete examples (frequency_control_specs, bid_constraints), unit clarifications (currency in cents, ISO 8601 format), valid values for bid_strategy, cross-field dependencies (bid_amount required for certain strategies, end_time required with lifetime_budget), and instructions for clearing fields (set to null). This vastly enriches the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update an ad set with new settings including frequency caps and budgets.' The verb 'Update' identifies a mutation operation on a specific resource, and the mention of frequency caps and budgets adds specificity. It distinguishes from sibling tools like create_adset and get_adsets by focusing on modifying an existing entity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-not-to-use guidance for certain fields: it warns that is_dynamic_creative is immutable after creation and directs, 'To change this, create a new ad set,' and for attribution_spec it similarly advises creating a new ad set instead. However, it lacks a general statement like 'Use this to modify an existing ad set; for creation use create_adset,' so it does not fully earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_campaignA
Update an existing campaign in a Meta Ads account.
Note: Campaigns do not support start_time for scheduling — set start_time on the ad set instead.
Migrating CBO (Advantage Campaign Budget) → ABO (ad set level budgets):
Pass adset_budgets with one entry per ad set in the campaign. Meta atomically
removes the campaign-level budget and assigns budgets at the ad set level in a
single call. This is Meta's documented mechanism — the legacy
use_adset_level_budgets=true flag attempts to clear daily_budget/lifetime_budget
but Meta silently ignores the empty values, so the migration does not persist.
Args:
campaign_id: Meta Ads campaign ID
access_token: Meta API access token (optional - will use cached token if not provided)
name: New campaign name
status: New campaign status (e.g., 'ACTIVE', 'PAUSED')
special_ad_categories: List of special ad categories if applicable
daily_budget: New daily budget in account currency (in cents).
lifetime_budget: New lifetime budget in account currency (in cents).
bid_strategy: New bid strategy
bid_cap: New bid cap in account currency (in cents) as a string
spend_cap: New spending limit for the campaign in account currency (in cents) as a string
campaign_budget_optimization: Enable/disable campaign budget optimization
objective: New campaign objective (Note: May not always be updatable)
use_adset_level_budgets: Deprecated for CBO → ABO migration — use adset_budgets
instead. Kept for backwards compatibility; sends empty daily_budget/
lifetime_budget which Meta silently ignores in most cases.
adset_budgets: List of {"adset_id": "...", "daily_budget": <cents>} objects.
Use to migrate from CBO to ABO: Meta removes the campaign-level Advantage
budget and assigns the provided daily budgets at the ad set level in one
atomic call. Example:
[{"adset_id": "1234", "daily_budget": 5000},
{"adset_id": "5678", "daily_budget": 7000}]
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| status | No | ||
| bid_cap | No | ||
| objective | No | ||
| spend_cap | No | ||
| campaign_id | Yes | ||
| access_token | No | ||
| bid_strategy | No | ||
| daily_budget | No | ||
| adset_budgets | No | ||
| lifetime_budget | No | ||
| special_ad_categories | No | ||
| use_adset_level_budgets | No | ||
| campaign_budget_optimization | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral disclosure. It reveals that Meta silently ignores empty daily_budget/lifetime_budget for the deprecated flag, that adset_budgets performs an atomic migration, and that objective may not always be updatable. This goes well beyond a bare 'update' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a main statement, a note, a migration section, and an Args list. It is slightly long, but the length is justified by the 14 parameters and the complex migration behavior. Every section serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (14 params, no annotations, no schema descriptions), the description covers all critical aspects: parameter semantics, migration mechanism, deprecated flag behavior, and a caveat about start_time. The presence of an output schema handles return values, so the description is complete for an agent to select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must fully explain parameters. It does so thoroughly: each param has a clear meaning, units (cents), optionality, and examples for adset_budgets. It also flags deprecation for use_adset_level_budgets and explains the recommended alternative.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Update an existing campaign in a Meta Ads account', a clear verb+resource statement. It implicitly distinguishes from create_campaign and update_adset by specifying the target object (campaign) and the action (update).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use adset_budgets instead of the deprecated use_adset_level_budgets for CBO→ABO migration, and notes that start_time should be set on the ad set rather than the campaign. It clearly implies this tool is for updating existing campaigns, though it doesn't explicitly contrast with create_campaign or update_adset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_ad_imageA
Upload an image to use in Meta Ads creatives.
Args: account_id: Meta Ads account ID (format: act_XXXXXXXXX) access_token: Meta API access token (optional - will use cached token if not provided) file: Data URL or raw base64 string of the image (e.g., "data:image/png;base64,iVBORw0KG...") image_url: Direct URL to an image to fetch and upload name: Optional name for the image (default: filename)
Returns: JSON object with: - image_hash: Pass this to create_ad_creative when building the ad, or to get_image_by_hash to view the image later. - images: List of {hash, url, width, height, name}. The url is a Meta CDN link you can fetch directly to view the image — no need to call any other tool right after upload.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | ||
| name | No | ||
| image_url | No | ||
| account_id | Yes | ||
| access_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It explains that access_token is optional due to a cached token, describes the return format (image_hash and images list with CDN URL), and states that the URL can be fetched directly. It omits permissions, error conditions, or rate limits, but covers the key operational aspects beyond the tool's name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a one-sentence purpose, an Args list, and a Returns list. Every sentence provides essential information—no filler or redundancy. The length is appropriate for the number of parameters and return fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is fully self-sufficient: it explains all parameters, return values, and how to use the result (e.g., with create_ad_creative or get_image_by_hash). The output schema is already present, and the description adds the necessary context for an agent to invoke the tool correctly and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, and the description fully compensates by documenting every parameter in the Args section. It provides format examples (e.g., 'data:image/png;base64,...'), clarifies the relationship between file and image_url, and notes defaults for name. This goes well beyond the schema's bare property definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Upload an image to use in Meta Ads creatives' with a specific verb, resource, and intended purpose. It clearly distinguishes itself from sibling tools like upload_ad_video by focusing on images and their use in ad creatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: it explains what to do with the returned image_hash ('Pass this to create_ad_creative...') and notes that the CDN URL can be fetched directly, eliminating the need for immediate follow-up calls. It does not explicitly name alternatives or exclusion scenarios, but the context effectively conveys when and how to use the tool.
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.
47 tool updates
v0.1.0- First observed
analyze_cohorts - First observed
analyze_creatives - First observed
analyze_growth_query - First observed
build_evidence_packet - First observed
calculate_growth_metrics - First observed
compare_campaign_metrics - First observed
compute_image_crops - First observed
create_ad - First observed
create_ad_creative - First observed
create_adset - First observed
create_budget_schedule - First observed
create_campaign - First observed
detect_metric_anomalies - First observed
duplicate_campaign - First observed
estimate_audience_size - First observed
get_account_info - First observed
get_account_pages - First observed
get_ad_accounts - First observed
get_ad_creatives - First observed
get_ad_details - First observed
get_ad_image - First observed
get_ad_video - First observed
get_ads - First observed
get_adset_details - First observed
get_adsets - First observed
get_campaign_details - First observed
get_campaigns - First observed
get_creative_details - First observed
get_image_by_hash - First observed
get_insights - First observed
get_interest_suggestions - First observed
get_login_link - First observed
get_metric_definition - First observed
investigate_campaign - First observed
investigate_growth_issue - First observed
normalize_growth_records - First observed
search_ads_archive - First observed
search_behaviors - First observed
search_demographics - First observed
search_geo_locations - First observed
search_interests - First observed
search_pages_by_name - First observed
update_ad - First observed
update_ad_creative - First observed
update_adset - First observed
update_campaign - First observed
upload_ad_image
TDQS
Scored across 47 tools
The Meta Ads CRUD tools are mostly distinct by resource and action, but the analytics/investigation cluster (calculate_growth_metrics, compare_campaign_metrics, analyze_growth_query, investigate_campaign, investigate_growth_issue, build_evidence_packet) has overlapping purposes that an agent could easily confuse. Some boundaries are clarified by descriptions, but misselection risk remains.
Tool names consistently use snake_case verb_noun patterns such as get_campaigns, create_adset, update_ad, search_interests, and analyze_creatives. Minor outliers like get_login_link still fit the verb_noun convention, and there is no chaotic mixing of camelCase or vague verb styles.
At 47 tools, the server is well above the typical 3-15 well-scoped range and exceeds the 25+ threshold for 'too many' in this rubric. While Meta Ads is a complex domain, many analytics helpers could likely be consolidated without losing coverage.
The surface covers core create/read/update operations for campaigns, ad sets, ads, and creatives, plus insights and targeting research. However, delete/archive lifecycle operations are missing for major resources, and budget schedules only support creation, leaving notable gaps for full lifecycle management.
Maintenance
Related MCP Connectors
Hosted Meta ads MCP with OAuth, bounded reads, and prepare/confirm writes.
Query Meta Ads performance data — accounts, campaigns, ad sets, ads, metrics & settings.
Read and manage Meta Ads campaigns, ad sets, ads, audiences, pages and Business Manager. You provide
Meta Ads MCP: Facebook and Instagram reports, campaigns, creatives, audiences. Approval on writes.
Related MCP Servers
- AlicenseAqualityNot gradedmaintenanceEnables AI-powered analysis, management, and optimization of Meta advertising campaigns across Facebook and Instagram, including performance insights, budget optimization, and creative testing.33Business Source 1.1
- AlicenseNot gradedqualityDmaintenanceEnables comprehensive management of Facebook and Instagram advertising campaigns via the Meta Marketing API, supporting campaign creation, targeting optimization, and budget management. It provides tools for detailed performance reporting and creative analysis, including insights into spend, ROI, and audience breakdowns.MIT
- AlicenseNot gradedqualityDmaintenanceProvides access to Meta Marketing API for comprehensive ad analytics and AI-powered video creative analysis.2,200 npm1MIT
- FlicenseCqualityDmaintenanceEnables managing Facebook ads campaigns, ad sets, ads, creatives, insights, and audience targeting via Meta's Marketing API.39-