MCP server to control Instagram from Claude AI - post photos, reels, carousels, reply to comments, send DMs, and get analytics
Server has 5 tools with clear verb-noun naming (get_*, list_*, update_*). Descriptions are present and moderately detailed (100-250 chars), explaining WHAT and WHEN. Input schemas are visible with types and constraints (enums, min/max). However, output schemas are NOT documented, LLMs cannot predict return structure. Parameter descriptions are adequate but lack dependency hints. The update_profile tool correctly flags WRITE operations. Error handling is basic (ValueError with context) but lacks recovery guidance or categorization. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels.
Fetch basic info about the connected Instagram Business account. Use this first to verify the token and IG user ID are valid. Returns username, follower count, media count, and account type.
Get account-level insights (reach, impressions, profile views, follower growth). Use 'day' for last 24h, 'week' for 7 days, 'days_28' for monthly trends. Useful for content strategy decisions.
Get performance metrics for a single post/reel. Returns reach, impressions, saved, video_views (if video), and engagement. Different media types return different metrics — reels have plays, photos don't.
List recent posts/reels from the account. Returns id, caption, media_type, permalink, timestamp, like_count, comments_count. Use the returned IDs with get_media_insights or get_comments.
Update your Instagram Business profile bio and/or website URL. THIS IS A WRITE OPERATION. At least one of biography or website must be provided. Changes are live immediately on your public profile. Required permission: instagram_business_manage_profile (Add this in your Meta app → Use cases → Permissions and features if missing.)
Output schemas not documented. LLMs cannot predict return structure (fields, types, nesting). Responses are inferred from code comments only.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). update_profile is marked WRITE in metadata but tool definition lacks destructiveHint annotation.
Error handling returns raw ValueError with context string. No recovery guidance, categorization (retryable vs user-fixable), or actionable next steps for LLM.
list_recent_media accepts limit (1-50) but no pagination support (offset, cursor, next_token). Large result sets not handled; no total_count returned.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
update_profile requires at least one of biography/website but no validation or error message guides LLM if both are null. Constraint underdocumented.