Skip to main content
Glama
pauloFroes

mcp-meta-marketing

by pauloFroes

mcp-meta-marketing

MCP server that wraps the Meta Marketing API (Graph API v25.0) as semantic tools for LLM agents.

Works with Claude Code, Codex, Claude Desktop, Cursor, VS Code, Windsurf, and any MCP-compatible client.


Quick Start

Install in one command — just replace your-token and your-account-id:

claude mcp add meta-marketing -s user \
  -e META_ACCESS_TOKEN=your-token \
  -e META_AD_ACCOUNT_ID=your-account-id \
  -- npx -y github:pauloFroes/mcp-meta-marketing

Then just ask in natural language:

Don't have a token yet? See How to get your Access Token below.

Related MCP server: meta-ads-mcp

What you can do

Analyze performance:

"How much did I spend in the last 7 days?"
"Compare CPC and CTR across all active campaigns this month"
"Which ad set has the lowest cost per conversion?"
"Break down last week's results by age and gender"
"What's my overall ROAS this month?"
"Give me a full performance summary of my account for February"

Manage campaigns:

"Create a new traffic campaign called 'Summer Sale' with R$50/day budget"
"Pause all campaigns with CPC above R$2.00"
"Duplicate ad set 12345 with a new targeting for ages 18-24"
"Create an ad using creative 67890 in my best performing ad set"
"Archive all campaigns that ended last month"

Available Tools

Insights

Tool

Description

get_account_insights

Get ad account insights with optional level breakdown (campaign/adset/ad)

get_campaign_insights

Get insights for a specific campaign

get_adset_insights

Get insights for a specific ad set

get_ad_insights

Get insights for a specific ad

Listing

Tool

Description

list_campaigns

List campaigns with status filter and auto-pagination

list_adsets

List ad sets, optionally filtered by campaign

list_ads

List ads, optionally filtered by ad set

get_ad_account

Get ad account details (name, currency, timezone, balance)

Management

Tool

Description

create_campaign

Create a new campaign with objective, budget, and bid strategy

update_campaign

Update campaign name, status, budget, or bid strategy

delete_campaign

Delete a campaign (irreversible)

create_adset

Create an ad set with targeting, budget, and optimization goal

update_adset

Update ad set targeting, budget, status, or schedule

delete_adset

Delete an ad set (irreversible)

create_ad

Create an ad linking a creative to an ad set

update_ad

Update ad name, status, or swap creative

delete_ad

Delete an ad (irreversible)

create_adcreative

Create an ad creative (image, video, or carousel)

Installation

You need two environment variables:

Variable

Description

META_ACCESS_TOKEN

Access token (how to get one)

META_AD_ACCOUNT_ID

Ad account ID (with or without act_ prefix — find it in the Ads Manager URL: act_XXXXXXXXX)

Claude Code

Three installation scopes are available:

Scope

Flag

Config file

Use case

local

-s local

.mcp.json

This project only (default)

project

-s project

.claude/mcp.json

Shared with team via git

user

-s user

~/.claude/mcp.json

All your projects

Quick setup (inline env vars):

claude mcp add meta-marketing -s user \
  -e META_ACCESS_TOKEN=your-token \
  -e META_AD_ACCOUNT_ID=your-account-id \
  -- npx -y github:pauloFroes/mcp-meta-marketing

Replace -s user with -s local or -s project as needed.

Persistent setup (.env file):

Add to your .mcp.json:

{
  "meta-ads": {
    "command": "npx",
    "args": ["-y", "github:pauloFroes/mcp-meta-ads"],
    "env": {
      "META_ACCESS_TOKEN": "${META_ACCESS_TOKEN}",
      "META_AD_ACCOUNT_ID": "${META_AD_ACCOUNT_ID}"
    }
  }
}

Then define the values in your .env file:

META_ACCESS_TOKEN=your-access-token
META_AD_ACCOUNT_ID=your-ad-account-id

See .env.example for all required variables.

Codex

[mcp_servers.meta-marketing]
command = "npx"
args = ["-y", "github:pauloFroes/mcp-meta-marketing"]
env_vars = ["META_ACCESS_TOKEN", "META_AD_ACCOUNT_ID"]

Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "meta-marketing": {
      "command": "npx",
      "args": ["-y", "github:pauloFroes/mcp-meta-marketing"],
      "env": {
        "META_ACCESS_TOKEN": "your-token",
        "META_AD_ACCOUNT_ID": "your-account-id"
      }
    }
  }
}

Cursor

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "meta-marketing": {
      "command": "npx",
      "args": ["-y", "github:pauloFroes/mcp-meta-marketing"],
      "env": {
        "META_ACCESS_TOKEN": "your-token",
        "META_AD_ACCOUNT_ID": "your-account-id"
      }
    }
  }
}

VS Code

Add to .vscode/mcp.json in your project:

{
  "servers": {
    "meta-marketing": {
      "command": "npx",
      "args": ["-y", "github:pauloFroes/mcp-meta-marketing"],
      "env": {
        "META_ACCESS_TOKEN": "your-token",
        "META_AD_ACCOUNT_ID": "your-account-id"
      }
    }
  }
}

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "meta-marketing": {
      "command": "npx",
      "args": ["-y", "github:pauloFroes/mcp-meta-marketing"],
      "env": {
        "META_ACCESS_TOKEN": "your-token",
        "META_AD_ACCOUNT_ID": "your-account-id"
      }
    }
  }
}

How to get your Access Token

All methods require a Meta App. If you don't have one yet:

  1. Go to developers.facebook.comMy AppsCreate App

  2. Name it (e.g. ads-marketing-tool) — Meta blocks brand terms like "meta", "fb", "insta" in app names

  3. In Use cases, filter by "Ads and monetization" and select exactly these two:

    • "Create and manage ads with the Marketing API" — programmatic campaign management (CRUD)

    • "Measure ad performance data with the Marketing API" — performance insights and metrics

    Do not select "Create and manage app ads with the Meta Ads Manager" — it explicitly does not include Marketing API access.

  4. Associate with your Business Manager (Business Portfolio)

  5. Complete the remaining steps and create the app

Then choose one of the methods below:

Method

Duration

Best for

A — System User Token

Never expires

Production

B — Token Debugger

60 days

Quick setup, no code

C — Programmatic Exchange

60 days

Automation / scripts


Create a new System User or reuse an existing one.

1. Create or pick a System User:

  1. Go to business.facebook.comBusiness Settings

  2. Navigate to Users → System Users

  3. Create a new one (Add → name: mcp-marketing → role: Admin), or select an existing System User

2. Assign ad account assets:

  1. Click the System User → Add AssetsAd Accounts

  2. Select the ad account(s) you want to access → permission level: Manage campaigns

  3. Click Save Changes

Without this step the token won't have access to any ad account data.

3. Generate the token:

  1. On the System User page, click Generate New Token

  2. Select your app in the dropdown

  3. Check the scopes: ads_read, ads_management, and business_management

  4. Click Generate Token

  5. Copy it immediately — it's only shown once

This token never expires unless you revoke it or remove the System User.


Method B — Token Debugger (no code, 60 days)

Quick method entirely in the browser. No System User needed.

  1. Go to your app dashboard at developers.facebook.comMarketing API → Tools

  2. Select permissions: ads_read and ads_management → click Get Token

  3. Authorize when prompted — this generates a short-lived token (~1 hour)

  4. Go to Access Token Debugger

  5. Paste the token → click Debug

  6. At the bottom of the page, click Extend Access Token

  7. Copy the new token — it's valid for 60 days

You'll need to repeat this every ~55 days to keep the token active.


Method C — Programmatic Exchange (automatable, 60 days)

Same result as Method B, but via a single HTTP request — useful for scripts.

  1. Get a short-lived token via Marketing API → Tools (same as Method B, steps 1-3)

  2. Find your App ID and App Secret in your app → Settings → Basic

  3. Make a GET request (browser, curl, or code):

https://graph.facebook.com/v25.0/oauth/access_token?
  grant_type=fb_exchange_token&
  client_id={APP_ID}&
  client_secret={APP_SECRET}&
  fb_exchange_token={SHORT_LIVED_TOKEN}
  1. The response contains your long-lived access_token (60 days) and expires_in

Keep your App Secret safe — never expose it client-side.

License

MIT

Available Tools

18 tools
create_adCreate AdA

Create a new ad within an ad set. Requires adset_id and a creative_id (create the creative first with create_adcreative).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesAd name
statusYesInitial status
adset_idYesParent ad set ID
creative_idYesCreative ID to use (create with create_adcreative first)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds minimal behavioral context beyond the annotations. Annotations already indicate readOnlyHint=false (write operation) and destructiveHint=false. The description adds the requirement that a creative must pre-exist, which is useful, but it does not disclose potential side effects, validation behavior, or outcome on success. With annotations covering the basic safety profile, a score of 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that conveys the core purpose and the most important prerequisite. There is no wasted text, and the key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

For a simple create tool with a fully described schema and useful annotations, the description is adequately complete. It covers the essential prerequisites and scope. It does not describe return values, but no output schema exists, and the tool's behavior is straightforward. Minor gap: it doesn't mention the status parameter or any default behavior, but the schema covers that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description repeats the prerequisite for creative_id that is already stated in the schema ('create with create_adcreative first'). It adds no new parameter semantics beyond what the schema provides, so it does not exceed the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Create a new ad within an ad set.' The verb 'create' and resource 'ad' are specific, and the context 'within an ad set' distinguishes it from siblings like create_campaign and create_adset. It also mentions key dependencies (adset_id and creative_id), leaving no ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit sequencing guidance: 'create the creative first with create_adcreative.' This clearly indicates when to use this tool relative to a sibling. It does not explicitly state when not to use it, but the prerequisite and purpose are sufficient for an AI agent to choose this tool appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_adcreativeCreate Ad CreativeA

Create an ad creative. The object_story_spec is a JSON string defining the creative content (image, video, or carousel with link_data or video_data). Requires a page_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCreative name
object_story_specYesJSON creative spec. Image example: {"page_id":"123","link_data":{"image_hash":"abc","link":"https://...","message":"Ad text","call_to_action":{"type":"LEARN_MORE","value":{"link":"https://..."}}}}

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a mutating, non-destructive operation. The description adds the prerequisite of a page_id but does not disclose additional behavioral details such as required scopes, rate limits, or effects on related objects. This is a modest value-add beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loads the purpose, and contains no filler. Every clause contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

For a tool with only two parameters, full schema coverage, and existing annotations, the description covers the core functionality and key requirement. It is slightly vague about where page_id lives and doesn't mention return values, but this is acceptable given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents both parameters, and the description enhances object_story_spec by specifying supported content types (image, video, carousel) and mentioning a required page_id. This goes beyond the schema's example, though the page_id placement inside the JSON is not explicitly clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb ('Create') and resource ('an ad creative'), and elaborates on the object_story_spec JSON field. However, it does not explicitly differentiate from sibling tools like create_ad, so it doesn't fully earn a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for creating ad creatives and notes the need for a page_id, but it does not provide explicit guidance on when to choose this tool over alternatives (e.g., create_ad) or mention any exclusions. The context is clear but not comparative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_adsetCreate Ad SetA

Create a new ad set within a campaign. Requires campaign_id, targeting, billing_event, optimization_goal, budget, and status. Targeting is a JSON string with age, gender, geo, interests, etc.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesAd set name
statusYesInitial status
end_timeNoEnd time (ISO 8601). Required if using lifetime_budget.
targetingYesJSON targeting object. Example: {"age_min":25,"age_max":55,"geo_locations":{"countries":["BR"]},"publisher_platforms":["facebook","instagram"]}
start_timeNoStart time (ISO 8601)
campaign_idYesParent campaign ID
daily_budgetNoDaily budget in cents (e.g. 5000 = R$50.00). Required if campaign has no budget.
billing_eventNoBilling event (default: IMPRESSIONS)
lifetime_budgetNoLifetime budget in cents. Requires end_time.
promoted_objectNoJSON promoted object. Required for conversions. Example: {"pixel_id":"123","custom_event_type":"PURCHASE"}
optimization_goalYesWhat to optimize for

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false, so the mutation nature is clear. The description adds minimal behavioral context beyond that, mentioning required fields but no side effects, return values, or validation behavior. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and front-loaded with the main action. However, the requirements sentence is inaccurate, which detracts from its efficiency. Two sentences are appropriate for this tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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

Given the tool's complexity (11 params, 3 enums, no output schema), the description is adequate but incomplete. It does not mention prerequisites like campaign existence, budget constraints, or return behavior. The schema carries most of the semantic load, so the description adds only basic context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers all parameters with descriptions, so baseline is 3. The description attempts to summarize key parameters but is misleading: it says 'budget' is required while the actual parameters are daily_budget/lifetime_budget (both optional in schema), and billing_event is optional. This adds confusion rather than value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a new ad set within a campaign, using specific verb and resource. This distinguishes it from sibling tools like create_campaign or create_ad, as it explicitly names 'ad set' and 'within a campaign'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context that this is for creating ad sets within an existing campaign, and lists key required fields. However, it does not explicitly mention alternatives or when-not-to-use, such as pointing to update_adset for modifications.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_campaignCreate CampaignA

Create a new campaign. Requires name, objective, and status. Set special_ad_categories to [] if none apply. Budget can be set at campaign level (CBO) or at ad set level.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCampaign name
statusYesInitial status (recommend PAUSED to review before activating)
objectiveYesCampaign objective (ODAX)
bid_strategyNoBid strategy (default: LOWEST_COST_WITHOUT_CAP)
daily_budgetNoDaily budget in cents (e.g. 5000 = R$50.00). Set at campaign level for CBO.
lifetime_budgetNoLifetime budget in cents. Requires stop_time on ad sets.
special_ad_categoriesNoJSON array of special categories. Use "[]" if none. Options: CREDIT, EMPLOYMENT, HOUSING, ISSUES_ELECTIONS_POLITICS

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, indicating a non-destructive write operation. The description adds some context (required fields, budget levels) but does not disclose additional behavioral traits such as whether the campaign ID is returned, potential approval workflows, or side effects on related entities. With annotations covering the safety profile, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences, front-loaded with the purpose, followed by essential parameter guidance. Every sentence earns its place with no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

The description covers the core requirements, special category handling, and budget placement, which is solid for a 7-parameter tool with full schema coverage. However, there is no mention of what the tool returns (e.g., campaign ID) or any post-creation behavior, and since there is no output schema, a brief note would improve completeness. Still, it is adequately complete for the given complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds extra meaning beyond the schema by clarifying how to use special_ad_categories ('Set special_ad_categories to [] if none apply') and explaining CBO vs ad set budget allocation, which helps understand the budget parameters in context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action with a specific verb and resource: 'Create a new campaign.' This distinguishes it from sibling tools like create_adset and create_ad. It also mentions key requirements (name, objective, status) and nuances like CBO vs ad set budget, which solidifies the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool (creating a campaign) and includes practical guidance like setting special_ad_categories to [] when none apply and budget placement options. However, it does not explicitly contrast with alternative sibling tools (e.g., create_adset) or state when not to use this tool, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_adDelete AdA
Destructive

Delete an ad. This is irreversible. Consider using update_ad with status=ARCHIVED instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idYesAd ID to delete

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true, but the description adds the important context that the action is irreversible, which is valuable behavioral information beyond the structured annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences that immediately state the action and then provide a safety tip. No unnecessary words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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

For a simple single-parameter tool with clear annotations and a complete schema, the description covers all necessary context: the action, irreversibility, and an alternative approach. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully documents the only parameter (ad_id) with 100% coverage. The description does not add additional semantic meaning, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Delete' and resource 'ad', clearly stating what the tool does. It also distinguishes itself from the sibling 'update_ad' tool, which is a different operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-not-to-use guidance by suggesting 'update_ad with status=ARCHIVED' as an alternative, giving clear context for choosing between tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_adsetDelete Ad SetA
Destructive

Delete an ad set. This is irreversible. Consider using update_adset with status=ARCHIVED instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
adset_idYesAd set ID to delete

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, but the description adds that deletion is 'irreversible' and suggests a safer alternative. This adds context beyond the structured annotation by emphasizing the permanence and providing a mitigative approach.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the primary action, and every word earns its place. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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

For a simple single-parameter delete operation, the description covers purpose, irreversible consequences, and an alternative. No output schema exists, and none is needed given the clarity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameter 'adset_id' is described as 'Ad set ID to delete', which is clear. The description itself does not add extra parameter-level meaning, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Delete an ad set' with a specific verb and resource, distinguishing it from sibling tools like delete_campaign and delete_ad. It also immediately identifies the irreversible nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides a when-not-to-use alternative: 'Consider using update_adset with status=ARCHIVED instead.' This gives clear guidance on preferring a less destructive option when appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_campaignDelete CampaignA
Destructive

Delete a campaign. This is irreversible. Consider using update_campaign with status=ARCHIVED instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign ID to delete

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint: true and readOnlyHint: false, so the description doesn't need to repeat those. It adds the key nuance that deletion is 'irreversible,' which goes beyond the annotation by clarifying permanence. This is helpful and adds value without contradicting any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of three short sentences, each carrying essential information: the action, irreversibility, and an alternative. It is front-loaded with the primary verb and resource and contains no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

For a simple one-parameter delete tool with no output schema, the description adequately covers purpose, irreversibility, and alternatives. It doesn't mention any potential cascade effects or required permissions, but given the simplicity and the annotations, it is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for the single parameter campaign_id, with the field clearly described as 'Campaign ID to delete.' The description adds no further parameter detail, and since schema coverage is complete, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Delete a campaign,' which clearly specifies the verb and resource, matching the tool name exactly. It also distinguishes from sibling delete tools like delete_adset and delete_ad, and from update_campaign, which is explicitly mentioned as an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description suggests 'Consider using update_campaign with status=ARCHIVED instead,' providing an explicit alternative for reversible deletion. However, it doesn't explicitly state the exact conditions under which delete_campaign should be chosen (e.g., 'use when permanent deletion is required'), leaving some implied context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_account_insightsGet Ad Account InsightsA
Read-only

Get performance insights for the ad account. Optionally set level=campaign, adset, or ad to break down results. Use since/until for date ranges. Returns metrics like impressions, clicks, spend, cpc, cpm, ctr, reach.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNoAggregation level (default: account)
limitNoMax number of rows to return (default: 5000, max: 5000)
sinceNoStart date (YYYY-MM-DD). Used with 'until' to build time_range.
untilNoEnd date (YYYY-MM-DD). Used with 'since' to build time_range.
fieldsNoComma-separated list of metrics/dimensions. Common: impressions, clicks, spend, cpc, cpm, ctr, reach, frequency, actions, cost_per_action_type, conversions, cost_per_conversion. Default: impressions,clicks,spend,cpc,cpm,ctr,reach
filteringNoJSON array of filter objects. Example: [{"field":"impressions","operator":"GREATER_THAN","value":"0"}]
breakdownsNoComma-separated breakdowns. Common: age, gender, country, publisher_platform, device_platform, impression_device
time_incrementNoTime granularity: 1 (daily), 7, 14, monthly, or all_days (default: all_days)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows this is a safe read. The description adds the set of returned metrics (impressions, clicks, spend, etc.) and mentions optional breakdowns, but doesn't disclose behaviors like pagination, rate limits, or data volume constraints. This matches the calibration where annotations carry the safety burden and the description adds modest value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the core purpose, and each sentence adds relevant information without fluff. It is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

For an 8-parameter tool with no output schema, the description covers the main purpose, optional level breakdowns, date range usage, and lists common returned metrics. It doesn't explicitly mention default limit or time_increment, but those are in the schema. Overall, it provides sufficient context for an agent to understand what the tool does and what it returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description mentions 'level' and 'since/until' which are already in the schema, and lists common metrics that also appear in the schema's fields description. It adds no substantial meaning beyond the schema, hence the baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb+resource ('Get performance insights for the ad account') and immediately clarifies it is for the ad account level, distinguishing it from sibling tools like get_campaign_insights. It also mentions optional level breakdowns, making its purpose and scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context on usage: it is for the ad account, with optional level breakdowns and date ranges. However, it does not explicitly mention when to use this tool versus the sibling insight tools (e.g., get_campaign_insights) or state any exclusions, so it falls short of explicit 'when-not' guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ad_accountGet Ad Account DetailsA
Read-only

Get details of the ad account — name, status, currency, timezone, spend cap, balance, and business info.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoComma-separated fields. Default: id,name,account_status,currency,timezone_name,timezone_offset_hours_utc,amount_spent,balance,spend_cap,business_name,business_city,business_country_code

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only and non-destructive behavior. The description adds value by enumerating the returned fields (name, status, currency, etc.), giving agents concrete expectations about the output beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that immediately communicates the resource and key information returned. No wasted words or redundant details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

For a simple read-only tool with no output schema, the description sufficiently conveys what the tool returns. It could be slightly more complete by noting that the fields are customizable via the fields parameter, but the schema covers that. Overall, it's comprehensive enough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, 'fields', is fully described in the schema with a default list. The tool description does not add extra syntax or semantics, so the baseline of 3 applies due to high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool gets ad account details, listing specific attributes (name, status, currency, timezone, etc.). This distinguishes it from sibling tools that focus on insights or campaign/ad-level data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for retrieving ad account details, but it does not explicitly mention when to use this tool versus alternatives like get_account_insights. Usage is inferred from the resource and field list, not stated as guidelines.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ad_insightsGet Ad InsightsA
Read-only

Get performance insights for a specific ad by ID. Returns metrics like impressions, clicks, spend, cpc, cpm, ctr, reach.

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idYesAd ID
limitNoMax number of rows to return (default: 5000, max: 5000)
sinceNoStart date (YYYY-MM-DD). Used with 'until' to build time_range.
untilNoEnd date (YYYY-MM-DD). Used with 'since' to build time_range.
fieldsNoComma-separated list of metrics/dimensions. Common: impressions, clicks, spend, cpc, cpm, ctr, reach, frequency, actions, cost_per_action_type, conversions, cost_per_conversion. Default: impressions,clicks,spend,cpc,cpm,ctr,reach
filteringNoJSON array of filter objects. Example: [{"field":"impressions","operator":"GREATER_THAN","value":"0"}]
breakdownsNoComma-separated breakdowns. Common: age, gender, country, publisher_platform, device_platform, impression_device
time_incrementNoTime granularity: 1 (daily), 7, 14, monthly, or all_days (default: all_days)

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds value by enumerating the metrics returned (impressions, clicks, spend, etc.), but it does not disclose pagination behavior, rate limits, or the output structure. This is acceptable given the read-only annotation, but the addition is not extensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that directly states the tool's function and primary return values. It is front-loaded with the key action and resource, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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

With no output schema, the description partially covers return values by listing examples of metrics, but it does not describe the output format or how results are organized. It also does not mention time_range handling or that insights are at the ad level relative to other scopes. Given 8 parameters and a sibling set with similar tools, more contextual detail would improve completeness, but the schema covers parameter specifics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage for all 8 parameters, so baseline is 3. The description's mention of metrics like impressions and clicks overlaps with the default value of the 'fields' parameter but does not add new meaning. The phrase 'by ID' aligns with the required ad_id parameter but adds no extra semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool gets performance insights for a specific ad by ID, which distinguishes it from account-, campaign-, and adset-level insight tools. It also lists key metrics returned, reinforcing the tool's purpose. However, it does not explicitly name sibling tools for differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for ad-level performance analysis by saying 'for a specific ad by ID', but it does not explicitly state when to use this tool versus get_account_insights or get_campaign_insights. No exclusions or alternative recommendations are provided, so usage guidance is implied but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_adset_insightsGet Ad Set InsightsA
Read-only

Get performance insights for a specific ad set by ID. Returns metrics like impressions, clicks, spend, cpc, cpm, ctr, reach.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax number of rows to return (default: 5000, max: 5000)
sinceNoStart date (YYYY-MM-DD). Used with 'until' to build time_range.
untilNoEnd date (YYYY-MM-DD). Used with 'since' to build time_range.
fieldsNoComma-separated list of metrics/dimensions. Common: impressions, clicks, spend, cpc, cpm, ctr, reach, frequency, actions, cost_per_action_type, conversions, cost_per_conversion. Default: impressions,clicks,spend,cpc,cpm,ctr,reach
adset_idYesAd Set ID
filteringNoJSON array of filter objects. Example: [{"field":"impressions","operator":"GREATER_THAN","value":"0"}]
breakdownsNoComma-separated breakdowns. Common: age, gender, country, publisher_platform, device_platform, impression_device
time_incrementNoTime granularity: 1 (daily), 7, 14, monthly, or all_days (default: all_days)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is clear. The description adds minimal behavioral context beyond noting it returns metrics and requires an ad set ID. It does not discuss pagination, rate limits, or time-range defaults, though these are partly covered by the schema. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loaded with the main action. Every sentence earns its place: the first defines what it does, the second gives concrete examples of returned metrics. No redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

For a read-only insights tool with a detailed schema and annotations, the description is adequate but not exhaustive. It explains the core purpose and example outputs, while the schema handles parameter details. It lacks guidance on output format or unusual behaviors, but no output schema exists and the tool is relatively straightforward.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 8 parameters. The description's mention of metrics like impressions, clicks, spend, cpc, cpm, ctr, reach merely echoes the fields parameter's common values, adding no new semantics beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Get performance insights for a specific ad set by ID', using a specific verb and resource. It distinguishes from sibling tools (get_account_insights, get_campaign_insights, get_ad_insights) by explicitly targeting ad sets and listing sample metrics like impressions, clicks, and spend.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for ad set-level insights but does not explicitly say when to use this over alternatives like get_campaign_insights or get_ad_insights. No exclusionary guidance is given; usage context is only implicit from the tool name and resource mention.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_campaign_insightsGet Campaign InsightsA
Read-only

Get performance insights for a specific campaign by ID. Returns metrics like impressions, clicks, spend, cpc, cpm, ctr, reach.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax number of rows to return (default: 5000, max: 5000)
sinceNoStart date (YYYY-MM-DD). Used with 'until' to build time_range.
untilNoEnd date (YYYY-MM-DD). Used with 'since' to build time_range.
fieldsNoComma-separated list of metrics/dimensions. Common: impressions, clicks, spend, cpc, cpm, ctr, reach, frequency, actions, cost_per_action_type, conversions, cost_per_conversion. Default: impressions,clicks,spend,cpc,cpm,ctr,reach
filteringNoJSON array of filter objects. Example: [{"field":"impressions","operator":"GREATER_THAN","value":"0"}]
breakdownsNoComma-separated breakdowns. Common: age, gender, country, publisher_platform, device_platform, impression_device
campaign_idYesCampaign ID
time_incrementNoTime granularity: 1 (daily), 7, 14, monthly, or all_days (default: all_days)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds a list of returned metrics (impressions, clicks, spend, etc.) but does not disclose other behavioral details like pagination, date range handling, or potential rate limits. This adds some value but not extensive transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the primary action and follows with a concise list of example metrics. No redundant or verbose wording is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

The tool has 8 parameters fully documented in the schema, annotations covering safety, and no output schema. The description gives a high-level sense of return metrics but does not elaborate on response structure or pagination. Given the schema and annotations, this is adequately complete for a read-only insights tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 8 parameters have schema descriptions covering 100%, so the schema provides full parameter semantics. The description itself does not add meaning beyond the schema, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get performance insights for a specific campaign by ID', using a specific verb and resource. It distinguishes itself from sibling tools like get_account_insights, get_adset_insights, and get_ad_insights by specifying the campaign level.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for a specific campaign by ID, providing clear context that it is not for account-level or list operations. However, it does not explicitly mention alternatives or exclusions, such as 'use get_account_insights for account-level data'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_adsList AdsA
Read-only

List ads in the ad account. Optionally filter by ad set ID or effective status. Returns ad name, status, creative, and tracking info. Auto-paginates up to 10 pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoItems per page (default: 100, max: 100)
fieldsNoComma-separated fields. Default: id,name,status,effective_status,adset_id,campaign_id,creative
adset_idNoFilter ads by ad set ID. If set, queries /{adset_id}/ads instead of account-level.
effective_statusNoFilter by effective status

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds value by disclosing auto-pagination up to 10 pages and summarizing the return fields, which are not fully obvious from schema alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four concise sentences, front-loaded with the core purpose, then filters, return info, and pagination. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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

For a read-only list tool, the description covers purpose, filtering, return fields, and pagination. Annotations handle safety, and the schema documents all parameters, so the description is complete without an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaning by noting pagination behavior and return fields, complementing the schema's parameter descriptions. It also clarifies that adset_id switches the query path, though the schema already mentions this.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists ads in the ad account, using a specific verb and resource. It distinguishes from sibling tools like list_campaigns and list_adsets by focusing on ads and mentioning filtering by ad set ID or effective status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates optional filtering by ad set ID or effective status, giving clear context on how to narrow results. It does not explicitly compare with alternatives, but the usage context is clear enough for a list operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_adsetsList Ad SetsA
Read-only

List ad sets in the ad account. Optionally filter by campaign ID or effective status. Returns ad set name, status, targeting, budget, and schedule. Auto-paginates up to 10 pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoItems per page (default: 100, max: 100)
fieldsNoComma-separated fields. Default: id,name,status,effective_status,campaign_id,daily_budget,lifetime_budget,targeting,optimization_goal,billing_event,start_time,end_time
campaign_idNoFilter ad sets by campaign ID. If set, queries /{campaign_id}/adsets instead of account-level.
effective_statusNoFilter by effective status

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description discloses that it auto-paginates up to 10 pages and returns specific fields (name, status, targeting, budget, schedule), which goes beyond the annotations' read-only and non-destructive hints. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the action, no filler. Every sentence adds value, including pagination and return fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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

Despite no output schema, the description covers purpose, optional filters, return fields, and pagination behavior. Combined with strong annotations, this is a complete description for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters with descriptions; the description only reiterates the filter options without adding new semantics. Baseline 3 applies as schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it lists ad sets in the ad account, with a specific verb and resource. Distinguishes from sibling tools like list_campaigns and list_ads by naming the resource type. The optional filters add further specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: use when you need to list ad sets, optionally filtering by campaign ID or effective status. However, it does not explicitly mention when not to use it or name alternatives, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_campaignsList CampaignsA
Read-only

List campaigns in the ad account. Returns campaign name, status, objective, daily/lifetime budget, and bid strategy. Use effective_status to filter. Auto-paginates up to 10 pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoItems per page (default: 100, max: 100)
fieldsNoComma-separated fields. Default: id,name,status,effective_status,objective,daily_budget,lifetime_budget,bid_strategy,start_time,stop_time
effective_statusNoFilter by effective status

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, so safety is clear. The description adds valuable behavioral detail: it states the return fields, filtering capability, and auto-pagination up to 10 pages. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and resource. Every phrase adds value: listing, returned fields, filtering, pagination. No fluff or redundant repetition of schema data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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

For a read-only list tool with strong annotations and simple parameters, this description is sufficient. It covers return content, filtering options, and pagination behavior. The absence of an output schema is mitigated by the explicit field list. Sibling context confirms this is the standard listing tool for campaigns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes all three parameters with 100% coverage, so the baseline is 3. The description does not add much beyond echoing effective_status filtering, but it does mention auto-pagination, which indirectly clarifies the limit parameter's behavior. No significant compensation needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'List campaigns in the ad account,' which uses a specific verb and resource, clearly distinguishing it from sibling tools like list_adsets or get_campaign_insights. It also enumerates the primary returned fields (name, status, objective, budgets, bid strategy), reinforcing the tool's scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for use: listing campaigns in the ad account. It includes a practical hint to filter by effective_status. It doesn't explicitly mention alternatives, but the resource-focused wording makes the tool's role obvious compared to sibling insight or mutation tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_adUpdate AdA

Update an existing ad. Change name, status, or swap creative.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name
ad_idYesAd ID to update
statusNoStatus
creative_idNoNew creative ID to swap to

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the agent knows it is a non-destructive mutation. The description adds no further behavioral context—such as whether status changes are immediately effective, whether swapping creative impacts delivery, or any permission requirements. Beyond the basic mutation nature, there is no added transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that states the main action and the key editable fields. It is concise with no filler or redundant information, earning full credit for efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

For a simple update tool with four parameters and no output schema, the description is mostly complete. It lists the changeable fields and the action, and the schema covers required ad_id and enum values. However, it lacks any mention of response behavior (e.g., returns updated object or just success) or whether updates are partial (only provided fields changed). Given the low complexity, this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema fully documents all four parameters. The description mentions changing name, status, or creative, which aligns with the schema properties but adds no extra meaning beyond what is already present. It does not clarify edge cases like whether status enum includes DELETED or if creative_id must reference an existing creative. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Update an existing ad' with specific editable fields ('name, status, or swap creative'). It distinguishes itself from sibling tools like update_campaign and update_adset by specifying the resource ('existing ad') and action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (when you need to modify an ad), but it does not explicitly differentiate from alternatives or mention exclusions. For example, it does not say 'use delete_ad to remove an ad' or clarify that this only affects the ad, not its creatives or targeting. The context is clear but lacks explicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_adsetUpdate Ad SetA

Update an existing ad set. Send only the fields you want to change.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name
statusNoStatus
adset_idYesAd set ID to update
end_timeNoNew end time (ISO 8601)
targetingNoNew targeting JSON object
bid_amountNoBid amount in cents
daily_budgetNoNew daily budget in cents
lifetime_budgetNoNew lifetime budget in cents

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is known. The description adds valuable context: partial updates and the requirement that the ad set already exist. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise sentence, clearly front-loaded with the purpose and the key usage instruction. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

For a tool with 8 well-documented parameters and good annotations, the description is complete enough for a straightforward update operation. The lack of return-value details is a minor gap since no output schema is provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All parameters have schema descriptions (100% coverage), so the description does not need to repeat them. It only reinforces that fields are optional for updates, which is already implicit in the schema's required list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Update') and the resource ('existing ad set'), distinguishing it from create, delete, and other resource updates. It also underscores the partial-update behavior, adding clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it (updating existing ad sets) and the partial-update approach, but it does not explicitly contrast with alternatives like create_adset or delete_adset. No exclusions or prerequisites are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_campaignUpdate CampaignA

Update an existing campaign. Send only the fields you want to change. Cannot change objective after creation.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew campaign name
statusNoStatus
campaign_idYesCampaign ID to update
bid_strategyNoNew bid strategy
daily_budgetNoNew daily budget in cents
lifetime_budgetNoNew lifetime budget in cents

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnly=false and destructive=false. The description adds valuable behavior: partial patch semantics and an immutable field (objective). This goes beyond the schema and annotations without contradicting them. It does not cover auth or rate limits, but with annotations carrying safety signals, this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The description is front-loaded with the core action and immediately provides the essential usage rule. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

For a simple update tool with a well-defined schema, the description covers the crucial constraints: partial update and immutability of objective. There is no output schema, but the description could mention return format; however, it is not necessary for typical update tools. Sibling context and annotations cover most remaining needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides descriptions for 100% of parameters, so baseline is 3. The description adds extra meaning by clarifying that only fields needing change should be sent, and that objective cannot be changed (not even listed as a parameter). This helps the agent understand the intended usage of optional fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Update an existing campaign,' which clearly identifies the verb and resource. It distinguishes from sibling tools like create_campaign and delete_campaign, and adds scope with 'Send only the fields you want to change.' This is unambiguous and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives practical usage guidance: 'Send only the fields you want to change' and 'Cannot change objective after creation.' It implies the tool is for partial updates to existing campaigns. It doesn't explicitly mention alternatives, but the context makes it clear when to use this tool versus create/delete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 18 tool updatesv1.0.0
    • First observedcreate_ad
    • First observedcreate_adcreative
    • First observedcreate_adset
    • First observedcreate_campaign
    • First observeddelete_ad
    • First observeddelete_adset
    • First observeddelete_campaign
    • First observedget_account_insights
    • First observedget_ad_account
    • First observedget_ad_insights
    • First observedget_adset_insights
    • First observedget_campaign_insights
    • First observedlist_ads
    • First observedlist_adsets
    • First observedlist_campaigns
    • First observedupdate_ad
    • First observedupdate_adset
    • First observedupdate_campaign

TDQS

A4.1/5.0

Scored across 18 tools

Disambiguation5/5

Each tool targets a distinct resource and action, with clear separation between account, campaign, adset, ad, and creative operations. The four insights tools are differentiated by hierarchy level, and CRUD tools are resource-specific. No meaningful overlap.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern: get_, list_, create_, update_, delete_. The pattern is predictable and uniform across resources.

Tool Count4/5

18 tools is on the higher side but justified by the complexity of the Meta marketing domain. Each tool covers a necessary operation for the hierarchy of account, campaign, adset, ad, and creative.

Completeness4/5

Core lifecycle (create/update/delete/list/insights) is well-covered for campaigns, adsets, and ads. Gaps include creative management (only create, no update/list/delete) and no single-resource getters, but these are minor workarounds.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Unofficial MCP server implementation for Facebook Business API. Enables LLMs to manage ad campaigns and ads via natural language.
    2
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server to manage Meta Ads (Facebook/Instagram) campaigns, ad sets, insights, and audiences from Claude Code using natural language.
    9
    4
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for Meta/Facebook Marketing API allowing you to view and manage ad accounts, campaigns, ad sets, ads, and creatives, as well as fetch insights and upload ad images.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Python MCP server that exposes Meta Marketing API data, providing tools to manage ad accounts, campaigns, and analytics through natural language interfaces.
    MIT