Model Context Protocol (MCP) server for Meta Ads API - Provides tools to interact with Meta/Facebook advertising platform
This Meta Ads MCP server has 8 tools with mostly complete schemas and adequate descriptions, but falls short of production quality in several critical areas. All tools have input schemas with proper types and descriptions, which is a strong baseline. However, output schemas are not documented, we cannot verify what structure each tool returns, making it impossible for LLMs to chain results confidently. Descriptions are present but generic and under-optimized for LLM decision-making (averaging ~70 chars, below the 194-char baseline for A+ tools). Parameter names are mostly clear (verb-noun style), but some tools expose access_token as a parameter despite the guideline that credentials must never appear as tool parameters, this is a critical security issue. Error handling is not evident in the visible code; there is no recovery guidance or error classification. The create_ad tool lacks important details (no enum for status values, no examples of valid tracking_specs format). Tools are well-composed (each does one thing), but the server lacks pagination documentation for list-returning tools. Overall, this is a functional but baseline-quality implementation.
Create a new ad with an existing creative.
Get detailed information about a specific ad account.
Get ad accounts accessible by a user.
Get creative details for a specific ad. Best if combined with get_ad_image to get the full image.
Get detailed information about a specific ad.
Get, download, and visualize a Meta ad image in one step. Useful to see the image in the LLM.
access_token exposed as tool parameter in all 8 tools. Credentials must never appear as parameters, they get logged in traces and prompt history. Use server-side secret injection via environment variables instead.
Output schemas are not documented for any tool. LLMs cannot plan downstream calls or extract needed fields without knowing what each tool returns. This breaks tool chaining and forces wasteful discovery calls.
create_ad tool lacks enum constraint for 'status' parameter. Description says '(default: ACTIVE)' but does not list valid values. LLM may hallucinate invalid statuses (e.g. 'PENDING', 'DRAFT'), use enum ["ACTIVE", "PAUSED", ...] instead.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Get ads for a Meta Ads account with optional filtering.
Search the Facebook Ads Library archive.
Tools returning lists (get_ad_accounts, get_ads, search_ads_archive) do not document pagination strategy. No mention of limit defaults, maximum page size, or cursor-based pagination. get_ads has 'limit' parameter but no max constraint documented.
create_ad 'tracking_specs' parameter is array with minimal description. Example is given in description ('e.g. [{"action.type":"offsite_conversion",...}]'), but this violates the rule against example values in descriptions, they get hallucinated. Use formal JSON Schema format or enum instead.
Descriptions are brief and generic. Average length ~70 chars (below 194-char baseline). Lack WHEN-to-use guidance and dependency hints. E.g., 'get_ads' does not explain how it differs from search_ads_archive or when each should be called.
No error handling or recovery guidance visible. If a tool fails (e.g., invalid account_id, rate limit, auth failure), LLM receives no actionable recovery path. Missing pattern: error classification and recovery suggestions.
create_ad (WRITE operation) has no confirmation or dry-run capability. Agents can irreversibly create ads without validation. Missing pattern: confirmation-request for destructive operations.