Supervised Meta Ads Operating System for Claude Code. Create, read, update, duplicate campaigns, ad sets, and ads with validation gates, naming enforcement, and operator control.
The server defines 12 tools with explicit input schemas and descriptions visible in the source code. However, critical gaps emerge: (1) Output schemas are entirely undocumented, none of the 12 tools specify what fields or structure they return, forcing LLMs to infer results blindly. (2) Several parameter descriptions lack actionable constraints (e.g., 'account_id' described only as 'Ad account ID (e.g., act_123456789)' with no validation rules or format specification). (3) Error handling is absent, no tool documents how to recover from failures, what makes an input invalid, or when to retry vs. escalate. (4) The two write operations (create_multi_asset_ad, create_adset) are richly described but lack confirmation-before-execute safeguards; agents could accidentally create duplicate ad sets or malformed ads. (5) Many read-only tools accept optional filtering parameters but do not document pagination behavior or result limits, tools like get_ads and get_adsets accept a 'limit' parameter but the description does not state the maximum, default, or what happens if limit exceeds API boundaries. Baseline: average tool description length is 194 chars; most tools here cluster around 150 - 250 chars (acceptable range), but descriptions focus on WHAT the tool does, not WHEN to use it or dependencies. Output schemas are completely missing, which is a critical gap per the rubric (100% of A+ tools document return types). Tool names follow verb_noun convention (run_setup_check, get_ad_accounts, create_adset) and are mostly clear, but naming consistency could improve (e.g., discover_all_accounts is unique; a parallel resource discovery tool using list_ would be more predictable).
Check Meta API token health, permissions, and rate limit status. Returns token validity, granted permissions, missing permissions, and current rate limit usage percentage.
Create a new ad set (always PAUSED, no exceptions). Runs Advantage+ audience enforcement, parent campaign inspection, ABO/CBO enforcement, ICP signal mapping, narrowing detection, pre-write validation, creates the ad set, and verifies post-write.
Create an ad with enforced identity, multi-asset support, and verification. Supports two asset modes (not mixed): VIDEO mode for 9:16 and/or 1:1 videos, or STATIC IMAGE mode for 2+ image dimension hashes. Mixed video + image is blocked. INSTAGRAM GATE enforced via placement_mode.
Discover all ad accounts, their pages, pixels, and Instagram accounts. Used to generate or update the account registry (config/accounts.yaml). Returns a comprehensive mapping of all accessible assets.
Get detailed information about a specific ad account. Returns account configuration, status, spend data, pixel info, and connected assets.
No output schemas documented for any of the 12 tools. LLMs cannot know what fields are returned, their types, or how to chain results to downstream tools. This violates the critical pattern 'Tools returning lists should accept page/offset and limit parameters and return a total count or next_cursor.'
Pagination behavior is undocumented. Tools like get_ads, get_adsets, get_ad_accounts accept a 'limit' parameter but do not specify the maximum value, default, behavior on overflow, or whether results include a total_count or next_cursor.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | <=2025-11-25 | v2 |
List Facebook Pages available for ads on a specific ad account.
List all ad accounts accessible to the authenticated user. Returns account IDs, names, statuses, currencies, and timezones for all accounts in your business portfolio.
List ads for an account, campaign, or ad set.
Get detailed ad set information including targeting, optimization, learning stage, frequency caps, and attribution settings.
List ad sets for an account or filtered by campaign.
List Instagram accounts available for ads on a specific ad account. Returns instagram_user_id (the canonical identifier) for each account. This is the first step in the Instagram identity resolution ladder.
Check MCP setup readiness and return structured results. Validates token, permissions, account access, pages, Instagram identity, pixels, and local configuration. Returns pass/warn/fail for each check with exact fix instructions for failures. Read-only. Does not modify any configuration or Meta settings.
Write operations (create_multi_asset_ad, create_adset) lack confirmation-before-execute safeguards. Agents could accidentally create duplicate ad sets, malformed ads, or wasted ad spend without a dry-run or explicit confirmation step. Agents make mistakes, these tools should enforce a confirm pattern.
Zero error handling guidance. No tool documents how to recover from failures, what makes input invalid, or when to retry vs. escalate. Descriptions like 'Check Meta API token health' do not explain what happens if the token is invalid, what error is returned, or what the LLM should do next.
Parameter descriptions lack actionable constraints and validation rules. E.g., 'account_id' is described as 'Ad account ID (e.g., act_123456789)' but does not document the format (must it always start with 'act_'?), length, character restrictions, or what happens if malformed.
create_multi_asset_ad accepts 16 parameters, many optional and interdependent. E.g., video_9x16_id and video_1x1_id are mutually exclusive with image hashes (VIDEO mode vs STATIC IMAGE mode), and copy_mode='auto' requires angle_name and icp_name. These dependencies are documented in the description but not enforced with clear enum/validation rules or separated into distinct tools. High cognitive load for LLMs; risk of malformed requests.
discover_all_accounts has no description of what 'comprehensive mapping' means or what structure is returned. Is it a dict, a list of objects, or YAML? How many results? When should an LLM call this instead of get_ad_accounts? Vague description invites misuse.
Parameter 'status_filter' appears in get_ads and get_adsets with description 'Filter by effective_status: ACTIVE, PAUSED, ARCHIVED, or ALL.' But it is a free-form string parameter, should be declared as an enum constraint to prevent hallucinated values like 'PENDING' or 'INACTIVE'.
No tool documents dependencies or prerequisite calls. E.g., create_multi_asset_ad requires page_id and adset_id, but the description does not hint that get_account_pages and get_adsets must be called first. Per best practice: 'If you only have a name, call search_users() first.' guidance prevents wasted calls.