instagram-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| INSTAGRAM_PASSWORD | Yes | Instagram password for login | |
| INSTAGRAM_USERNAME | Yes | Instagram username for login |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {
"claude/channel": {}
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| subscribeA | Subscribe to an Instagram thread and give it a short alias. This is the ONE place a raw thread id is entered (from list_threads or search_threads). Only subscribed chats deliver events. Args: chat_id: Thread id, e.g. '340282366841700000000000000000000000001'. alias: Short memorable handle (e.g. 'alex'). Derived from the thread title if omitted. |
| unsubscribeB | Unsubscribe from a chat. Stops delivering its events. Args: to: Alias or thread id to unsubscribe. |
| list_subscriptionsA | List subscribed chats and their aliases. |
| set_idleA | Tune how long a chat must be quiet before you get an [idle] nudge. Ramp it up to back off (60 = hourly while they're gone) or 0 to pause. Resets to the default the moment they next message. Args: minutes: Quiet-time threshold in minutes (0 pauses nudges). to: Chat alias. Omit for the sole subscribed target. |
| replyA | Send a text message. Address by alias via Args: text: Message text. to: Chat alias (e.g. "alex"). Omit for the sole subscribed target. |
| send_fileA | Send a photo or video (Instagram DMs take no other file types). The path is read on the bridge host (where Instagram is connected). Args: file_path: Path to the photo or video (on the bridge host). to: Chat alias. Omit for the sole subscribed target. view_mode: "once" (view once) or "replayable" (allow replay) sends it as a disappearing photo/video (videos: H.264 mp4). Omit for a normal one. |
| send_audioB | Send an audio file as a voice message (bridge converts to .m4a if needed). The path is read on the bridge host. Args: file_path: Path to the audio file (on the bridge host). to: Chat alias. Omit for the sole subscribed target. |
| send_typingA | Optional typing indicator: they see "typing..." while composing is true. Args: to: Chat alias. Omit for the sole subscribed target. composing: True starts the indicator, false stops it. |
| mark_readA | Optional read receipt ("Seen") up to the newest of these messages. Args: message_ids: Message ids from channel events; the newest one is used. to: Chat alias. Omit for the sole subscribed target. |
| download_attachmentA | Download a message's photo, video or voice clip; returns the path on the bridge host. View-once media lands in a temporary folder and is deleted soon; never keep it. Args: message_id: Message id from the channel event. to: Chat alias. Omit for the sole subscribed target. |
| open_shareA | Open a shared reel, post or story: download it and see what's in it. Returns the caption, the photos, and per video its file, length in seconds and
a preview: 6 evenly spaced frames stitched into one image, left to right, top
to bottom. Read the preview first. For a closer look, pull frames yourself:
Args: message_id: Message id of the share, from the channel event. to: Chat alias. Omit for the sole subscribed target. |
| transcribe_shareA | Transcribe what is said in a shared reel's (or post's) videos. Only when the words matter: music-only reels give noise. Reuses the open_share download. Args: message_id: Message id of the share, from the channel event. to: Chat alias. Omit for the sole subscribed target. |
| get_message_idsA | List this account's recent messages with their ids, newest first (for unsend). That is yours and the ones the owner sent from their phone. Args: to: Chat alias. Omit for the sole subscribed target. filter: Only messages whose text contains this substring. limit: How many to return (default 10). |
| unsendA | Unsend a message this account sent, for everyone. Get the id from get_message_ids. That covers yours and the ones the owner sent from their phone: when the operator tells you to delete one, do it. Args: message_id: Id of the message. to: Chat alias. Omit for the sole subscribed target. |
| reactA | React to a message with an emoji. An empty emoji removes your reaction. Args: message_id: Message id (from a channel event or get_message_ids). emoji: E.g. "❤️"; "" removes your reaction. to: Chat alias. Omit for the sole subscribed target. |
| list_threadsB | Get direct message threads from inbox. Args: amount: Maximum number of threads to fetch (default: 20). Returns: Object with 'threads' array (thread_id, thread_title, users, is_group, is_muted, unread, last_activity_at) and 'count'. |
| get_threadB | Get a specific thread with its messages. Args: thread_id: ID of the thread to fetch. amount: Maximum number of messages to fetch (default: 20). Returns: Thread object with thread_id, thread_title, users, is_group, and a messages array (message_id, sender, text, media_type, timestamp, ...). |
| search_threadsC | Search threads by username or title. Args: query: Search query (username or thread title). Returns: Object with 'query', 'threads' array of matches, and 'count'. |
| get_pending_threadsB | Get pending message request threads. Returns: Object with 'threads' array of pending threads and 'count'. |
| hide_threadC | Hide/delete a thread from inbox. Args: thread_id: ID of the thread to hide. |
| mark_thread_unreadB | Mark a thread as unread. Args: thread_id: ID of the thread to mark unread. |
| mute_threadC | Mute notifications for a thread. Args: thread_id: ID of the thread to mute. |
| unmute_threadB | Unmute notifications for a thread. Args: thread_id: ID of the thread to unmute. |
| get_messagesB | Get messages from a thread. Args: thread_id: ID of the thread to get messages from. amount: Maximum number of messages to fetch (default: 20). offset: Skip the N most recent messages (default: 0). Returns: Object with 'thread_id', 'messages' (sender, text, media_type, timestamp, seen_since when viewer's, share for a shared reel/post/story), 'count', 'offset', 'has_more'. |
| get_chat_logA | Get conversation as a readable chat log. Optimized for LLM analysis. Plain-text chronological log, ~5x smaller than JSON. Use get_messages for structured fields. Args: thread_id: ID of the thread to get messages from. amount: Maximum number of messages to fetch (default: 50). offset: Skip the N most recent messages (default: 0). Returns: Object with 'thread_id', 'log' (plain text), 'count', 'offset', 'has_more'. |
| share_mediaC | Share an Instagram post into a thread. Args: media_id: ID of the Instagram media/post to share. thread_id: Thread to share it into. |
| share_profileB | Share a user's Instagram profile into a thread. Args: user_id: ID of the user profile to share. thread_id: Thread to share it into. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 27 tools
Most tools target distinct resources+actions (send, react, unsend, mute, subscribe), and descriptions clarify intent well. However, get_thread, get_messages, and get_chat_log all retrieve the same thread content with only format/purpose differences, creating some overlap an agent could misselect between.
Names are consistently snake_case verb_noun (list_threads, get_messages, share_media, mark_thread_unread), which is highly readable. Minor deviation: a few bare-verb tools (subscribe, reply, react, unsend) lack the noun component, but they remain clear and consistent within themselves.
27 tools is heavy and slightly over the comfortable range for this domain. Several could be consolidated (the three message-retrieval tools, separate mute/unmute), but the DM bridge legitimately needs subscription, messaging, thread-management, and sharing surfaces.
The surface covers a full DM lifecycle: subscribe/unsubscribe to events, send/reply/audio/file, react, unsend, mark read, typing, attachment download, thread management (hide, mute, mark unread), search, and sharing reels/profiles. Minor gaps like group creation or blocking exist but core workflows are well covered.