Exposes Meta (Facebook) Marketing API tools via Model Context Protocol. Allows MCP-compatible agents to manage ads, campaigns, ad sets, and creatives.
Meta Ads MCP has 17 tools with consistent naming (verb_noun pattern) and reasonable descriptions. However, critical gaps undermine production readiness: (1) Input schemas lack proper JSON Schema type definitions, parameters are documented in docstrings but not formally declared in the schema objects shown. (2) Output schemas are completely undocumented, no tool describes what fields it returns, forcing LLMs to guess. (3) Descriptions are present but generic; many lack actionable context (e.g., 'Get performance metrics' without explaining when to call vs. similar tools). (4) No error handling guidance, tools return raw API responses without recovery hints. (5) No pagination support despite tools returning lists (get_campaigns, get_ads, get_creatives). (6) Parameter constraints (enums, ranges) are documented in docstrings but not enforced via schema. Baseline: avg tool description ~120 chars (acceptable), but avg param description ~40 chars (too terse). 8/17 tools are read-only (low risk); 9/17 are write operations with no confirmation or dry-run pattern.
Create a new ad inside an ad set (always starts PAUSED). ad_set_id: Target ad set ID name: Ad name page_id: Facebook Page ID (numeric) link: Landing page URL (e.g. 'https://example.com/product') message: Primary text / ad copy creative_id: Use existing creative ID instead of building inline (overrides other creative fields) object_story_id: Use an existing story/post ID image_hash: Hash of an uploaded image video_id: Video ID title: Ad headline description: Ad description call_to_action_type: LEARN_MORE | SHOP_NOW | SIGN_UP | etc.
Create a new ad set inside a campaign (always starts PAUSED). campaign_id: Target campaign ID name: Ad set name daily_budget_bdt: Daily budget in BDT (e.g. 800). Use 0 for CBO campaigns (budget at campaign level). pixel_id: Pixel ID for conversion tracking (numeric Meta pixel ID) custom_event_type: PURCHASE | INITIATED_CHECKOUT | VIEW_CONTENT | LEAD optimization_goal: OFFSITE_CONVERSIONS | LINK_CLICKS | IMPRESSIONS | REACH bid_strategy: LOWEST_COST_WITHOUT_CAP | LOWEST_COST_WITH_BID_CAP | COST_CAP age_min: Minimum age (default 18) age_max: Maximum age (default 65) genders: Comma-separated gender IDs (1=male, 2=female, empty=all) excluded_audience_ids: Comma-separated custom audience IDs to exclude included_audience_ids: Comma-separated custom audience IDs to target
Create a new campaign (always starts PAUSED). name: Campaign name objective: OUTCOME_SALES | OUTCOME_LEADS | OUTCOME_TRAFFIC | OUTCOME_AWARENESS daily_budget_bdt: Daily budget in BDT (0 = no campaign-level budget, set at ad set level) buying_type: AUCTION | RESERVED
Output schemas completely undocumented. No tool describes what fields it returns (e.g., get_campaigns returns JSON but LLM cannot know if it includes budget_remaining, status, objective, etc.). Forces LLMs to guess structure and risks downstream tool call failures.
Input schemas lack formal JSON Schema type definitions. Parameters are documented in docstrings but the schema objects shown do not include 'type' fields (e.g., date_preset is described as string but schema does not declare type:string). Violates JSON Schema standard and prevents client-side validation.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
Duplicate an ad set into a target campaign (creates it PAUSED). ad_set_id: The ad set ID to duplicate campaign_id: Target campaign ID new_name: Name for the copy (optional)
Duplicate an existing campaign (creates it PAUSED). campaign_id: The campaign ID to duplicate new_name: Name for the copy (optional)
Get overall ad account performance: spend, purchases, CPA, ROAS, impressions, etc. date_preset: today | yesterday | last_7d | last_14d | last_30d | this_month | last_month
Get performance metrics for a specific ad. ad_id: The ad ID date_preset: today | yesterday | last_7d | last_14d | last_30d | this_month | last_month
Get performance metrics for a specific ad set. ad_set_id: The ad set ID date_preset: today | yesterday | last_7d | last_14d | last_30d | this_month | last_month
List ad sets inside a campaign with budgets, targeting, optimization goal, and bid strategy. campaign_id: The campaign ID
List ads inside an ad set with creative details (title, body, media). ad_set_id: The ad set ID
Get performance metrics for a specific campaign: spend, impressions, purchases, CPA, etc. campaign_id: The campaign ID (e.g. '120235305295420168') date_preset: today | yesterday | last_7d | last_14d | last_30d | this_month | last_month
List campaigns with name, status, objective, budget, and buying type. status_filter: ACTIVE | PAUSED | ARCHIVED | ALL
List available ad creatives in the account (title, body, media spec).
Pause or enable an ad set. ad_set_id: The ad set ID status: ACTIVE | PAUSED
Pause or enable a campaign. campaign_id: The campaign ID status: ACTIVE | PAUSED
Update an ad set's daily budget. ad_set_id: The ad set ID daily_budget_bdt: New daily budget in BDT (e.g. 800)
Update a CBO campaign's daily budget. campaign_id: The campaign ID daily_budget_bdt: New daily budget in BDT (e.g. 4500)
No pagination support. Tools returning lists (get_campaigns, get_ads, get_creatives) lack limit, offset, and total_count. Large result sets will blow context window. Baseline: paginated tools should accept page/offset + limit and return next_cursor or total.
No error handling guidance. Tools return raw API responses without recovery hints. E.g., if campaign_id is invalid, LLM receives bare error with no suggestion to call get_campaigns() first. Violates recovery-guide pattern.
Write operations lack confirmation/dry-run pattern. create_campaign, create_ad_set, create_ad, and budget updates are irreversible but have no confirmation step. Agents can accidentally create duplicate campaigns or drain budgets. Baseline: destructive tools should support dry-run or require explicit confirmation.