MCP server for Meta advertising campaign structure analysis and optimization
Single tool 'analyze_structure' has a reasonable description (145 chars) but critical schema gaps. Input schema is present but lacks parameter descriptions, the 'campaigns' array parameter has no description of expected object structure (id, name, objective, status, daily_budget, ad_set_count, conversions_7d fields). Output schema is completely undocumented; the tool returns complex nested analysis objects with health_score, analyses (naming/budget/learning_phase), and recommendations, but none of this is declared in the tool definition. No error handling guidance, no parameter validation hints, no recovery paths. Tool name 'analyze_structure' is generic and does not start with a clear action verb (should be 'analyze_campaign_structure' or 'get_campaign_health_analysis'). Code shows defensive input handling and detailed analysis logic, but this is not reflected in the tool contract exposed to the LLM.
Analyzes campaign structure data and provides recommendations for Meta advertising campaigns. Checks naming conventions, budget distribution across ad sets, and learning phase status. Returns health scores and actionable recommendations.
Input schema lacks parameter descriptions. 'campaigns' array parameter has no description of expected object structure (id, name, objective, status, daily_budget, ad_set_count, conversions_7d). LLM cannot infer what fields are required or their types.
Output schema completely undocumented. Tool returns complex nested objects (health_score, analyses.naming/budget/learning_phase, all_issues, all_recommendations) but none of this structure is declared. LLM cannot plan downstream use of returned data.
Tool name 'analyze_structure' is generic and does not clearly convey action. Baseline verb_noun pattern suggests 'analyze_campaign_structure', 'get_campaign_health_analysis', or 'assess_meta_campaign_health'. Current name is ambiguous about what 'structure' means.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 43 | 2026-07-28+ | v2 |
No error handling guidance. Code handles invalid campaign data (defensive check for dict type) but tool definition provides no recovery hints. If campaigns array is malformed, LLM receives no guidance on what to do next.
No parameter constraints documented. 'campaigns' array has no min/max length, no description of required vs optional fields within each campaign object. LLM may pass incomplete or oversized payloads.