MCP server that exposes Instagram Graph API operations (Reel uploads, image posts, carousels, insights) as tools
Instagram MCP has well-structured tool definitions with complete schemas and descriptions for all 12 tools. Naming follows verb_noun convention (upload_reel, create_carousel, publish_media). Descriptions are substantive (100-250 chars typical), explaining WHAT each tool does and WHEN to use it. However, several tools lack output schema documentation, parameter descriptions are sometimes generic, and error handling guidance is minimal. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Composition is sound, tools chain logically (upload → wait → publish). Security concern: no explicit mention of token/secret injection patterns in code review.
Check the processing status of a media container (IN_PROGRESS, FINISHED, ERROR, EXPIRED).
Bulk-delete orphaned videos from the GitHub Releases CDN used for temporary Instagram hosting. Deletes every hosted asset older than older_than_secs (default 3600s = 1h); a normal upload→publish→delete cycle finishes well under that, so anything older is leftover junk. Set dry_run=true to preview without deleting. Needs no asset IDs — the server discovers and removes its own assets. Safe to call repeatedly.
Create a carousel (multi-media) post from child container IDs.
Delete a previously hosted video from GitHub Releases. Pass the asset_id returned by host_video or upload_reel.
Retrieve engagement metrics for a published post or Reel.
Check how many posts remain in the 24-hour publishing quota.
Output schemas not documented. Tools return results but LLMs cannot see expected fields (e.g., what does publish_media return? media_id? timestamp? error details?). Forces LLMs to guess downstream field names.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are classified as READ_ONLY or WRITE/DESTRUCTIVE in comments, but not exposed to the MCP protocol. Agents cannot distinguish safe from risky operations.
Error handling lacks recovery guidance. No indication of which errors are retryable, user-fixable, or fatal. E.g., if publish_media fails, should the agent retry, check status first, or ask the user?
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | 2025-06-18+ | v2 |
Upload a local video file to GitHub Releases so it has a public URL. Use the returned URL with upload_reel. Use delete_hosted_asset to clean up after publishing.
List the most recent media items from the Instagram account.
Publish a media container that has finished processing.
Create an image post container from an image URL.
Create a Reel container from a video URL and optionally publish it immediately. Returns container_id for manual publishing or media_id if published.
Poll a media container until it finishes processing (FINISHED, ERROR, or EXPIRED). Blocks until done or timeout.
Parameter descriptions sometimes generic. E.g., 'metrics' in get_media_insights says 'Array of metric names' but does not list valid options (impressions, reach, engagement, etc.). LLMs will hallucinate invalid metric names.
No pagination documented for list_recent_media. Accepts 'limit' but no mention of offset, cursor, or total count. Large result sets could exhaust context window.