instagram-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| INSTAGRAM_MCP_DM_ENABLED | No | Set to '1' to enable Direct Message tools (requires App Review) | |
| INSTAGRAM_MCP_IG_USER_ID | Yes | Numeric Instagram Business Account ID | |
| INSTAGRAM_MCP_ACCESS_TOKEN | Yes | Long-lived access token with instagram_basic, instagram_content_publish, instagram_manage_comments, instagram_manage_insights permissions |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| healthcheckA | Verify the MCP is configured + ready: accounts present, token backend, Graph reachability. Does a live GET on the default account's profile if one is configured. Safe to call anytime; never mutates. Returns ok=false with a hint when no account is set. |
| list_accountsA | List configured Instagram accounts (labels + ig_user_id + default flag). Never returns tokens. |
| add_accountA | Store an Instagram Business/Creator account for use by every tool. label a short key you choose (e.g. "onde", "mycelium", "client-acme")
access_token a long-lived Instagram Graph API token (stored in the OS keychain)
ig_user_id the Instagram Business Account id (numeric)
app_secret optional Meta app secret — enables appsecret_proof call hardening
make_default set true to make this the account used when The token is written to the macOS keychain (or a chmod-600 file fallback) and is NEVER echoed back or logged. |
| set_default_accountB | Set which configured account is used when a tool's |
| remove_accountB | Remove a configured account + delete its stored token from the keychain. |
| account_infoB | Live profile snapshot for one account: username, name, followers, media count, etc. |
| get_profileA | Return the account's public profile fields (followers, follows, media count, bio, website). |
| list_mediaA | List recent media (posts/reels) for the account, newest first. limit 1-100 (default 25). |
| get_mediaA | Return full fields for one media object by id (caption, type, permalink, like/comment counts). |
| get_account_insightsB | Account-level analytics (reach, impressions, profile views, follower count). metrics: comma-separated Graph metric names (default reach,impressions,profile_views, follower_count). period: day|week|days_28|lifetime. Exact available metrics vary by Graph API version; on a mismatch the Meta error names the correct metric. |
| get_media_insightsA | Per-post analytics (reach, saves, likes, comments, shares, total interactions). metrics override is comma-separated; defaults suit feed posts. Reels/stories expose different metrics (e.g. plays, navigation) — pass them explicitly if needed. |
| get_audience_insightsA | Follower demographics (age, gender, country, city). Requires the account to have >=100 followers (Meta privacy floor) — below that the Graph returns an error, surfaced cleanly. Newer Graph versions use metric= follower_demographics with metric_type=total_value + breakdown=age|gender|country|city and a timeframe (last_14_days|last_30_days|last_90_days|prev_month) for engaged-audience metrics. All are override-able. |
| publishing_limitA | Remaining posts in the rolling 24h publishing quota (Instagram caps API posts/day). |
| publish_imageA | Publish a single image to the feed. image_url must be a PUBLIC https URL (Instagram fetches the bytes itself). caption <= 2200 chars. Two-step Graph flow (create container -> publish) handled internally. |
| publish_videoA | Publish a video to the feed. video_url must be a PUBLIC https URL. Video containers process asynchronously; this polls status up to 90s before publishing. |
| publish_reelA | Publish a Reel. video_url must be a PUBLIC https URL. share_to_feed also surfaces the reel in the main grid. cover_url (optional) sets the thumbnail. Reel containers process asynchronously (polled up to 90s). |
| publish_carouselA | Publish a multi-image carousel (2-10 images). Each image_url must be a PUBLIC https URL. Creates one child container per image (is_carousel_item) then a CAROUSEL parent, then publishes. |
| publish_storyB | Publish a Story (image OR video). Exactly one of image_url / video_url, PUBLIC https. |
| get_commentsA | List comments on a media object (text, username, timestamp, like_count, hidden). |
| reply_to_commentA | Reply to a comment. message <= 2200 chars. Returns the new comment id. |
| hide_commentB | Hide (or unhide) a comment from public view. hide=false unhides. |
| delete_commentA | Permanently delete a comment you own (or a comment on your media). Irreversible. |
| search_hashtagA | Resolve a hashtag name to its Graph id (needed before get_hashtag_media). |
| get_hashtag_mediaB | Recent or top media for a hashtag id. edge=top_media|recent_media. limit 1-100. Get the hashtag_id from search_hashtag first. Subject to Meta's 30-unique-hashtags per-7-days query limit per account. |
| get_mentionsC | List recent media where the account is @-mentioned (tags edge). |
| business_discoveryA | Public profile + (optionally) recent media for ANY business/creator account by username. Read-only competitor/prospect research via the business_discovery edge. Only works for Professional accounts (not personal). with_media pulls up to media_limit recent posts. |
| list_conversationsC | List Instagram DM conversations. REQUIRES Meta App Review (instagram_manage_messages). |
| get_messagesC | Read messages in a DM conversation. REQUIRES Meta App Review (instagram_manage_messages). |
| send_messageA | Send a DM. REQUIRES Meta App Review + the 24-hour standard-messaging window. recipient_id is the IGSID (Instagram-scoped user id) of the recipient. Outside the 24h customer-service window a paid message tag is required (not handled here). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/adelaidasofia/instagram-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server