Instagram MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| INSTAGRAM_MCP_HOME | No | Where the token lives. Defaults to ~/.config/instagram-mcp. | |
| INSTAGRAM_MCP_APP_ID | No | Only for auth --oauth; never stored. | |
| INSTAGRAM_MCP_PROFILE | No | Token profile, for a second account (auth --profile NAME). Defaults to default. | |
| INSTAGRAM_MCP_TIMEZONE | No | IANA timezone for days and times, e.g. Europe/Paris. Defaults to the computer's timezone. | |
| INSTAGRAM_MCP_LOG_LEVEL | No | Logging level, always logged to stderr. Defaults to WARNING. | |
| INSTAGRAM_MCP_APP_SECRET | No | Only for auth --oauth; never stored. | |
| INSTAGRAM_MCP_OUTPUT_DIR | No | Where save_to files go. Defaults to ~/Documents/instagram-mcp. | |
| INSTAGRAM_MCP_API_VERSION | No | Graph API version. Defaults to v26.0. | |
| INSTAGRAM_MCP_REDIRECT_URI | No | Only for auth --oauth; never stored. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Read-only tools for an Instagram Business or Creator account (Meta's official Instagram API).
Getting started: if a tool reports a sign-in problem, call get_instagram_auth_status and relay its
next_step. Signing in happens in a terminal (instagram-mcp auth), never in the chat: tokens
must not be pasted here.
Picking tools:
"How am I doing": get_instagram_performance_summary (period vs previous period).
Trends and growth charts: get_instagram_metrics_over_time (day/week/month buckets).
Best and worst content: get_instagram_top_media; catalogue: list_instagram_media (include_insights for per-post numbers); specific posts: get_instagram_media_insights.
Audience (age, gender, cities, countries; followers or engaged accounts): get_instagram_audience.
When to post: get_instagram_online_followers. Live stories: list_instagram_stories.
Comments: list_instagram_comments. Mentions/UGC: list_instagram_tagged_media.
Benchmarking other accounts: get_instagram_public_account.
A full snapshot in one call (monthly reports): get_instagram_report.
Anything else: query_instagram_api (raw Graph API GET).
Data notes: every result states its exact date_range and timezone: quote it. Rolling periods end
yesterday; Meta's numbers can still change for 48 hours and go back 2 years. Post metrics are
lifetime totals. Percentages are 0-100, *_s are seconds. Anything Instagram can't provide is null
or listed in unavailable/notes: say so instead of inventing numbers.
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
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_instagram_auth_statusA | Check whether the Instagram server has a working token, which account it reads, which API host it uses, and when the token expires (Instagram Login tokens renew themselves). Call this first if another Instagram tool reports a sign-in problem. |
| get_instagram_profileA | The connected Instagram account's profile and current counts: username, display name, biography, website, followers, following and number of posts. For performance over a period use get_instagram_performance_summary. |
| get_instagram_performance_summaryA | Account-level totals for a period, like the Insights overview in the Instagram app: views, reach, accounts engaged, interactions (likes, comments, shares, saves, replies, reposts), profile link taps, follows, unfollows and net follows, each with the previous period and % change, plus engagement rate (interactions / reach). Any range up to 2 years; reach and accounts_engaged need a range of 29 days or less (unique accounts can't be added up). For trends use get_instagram_metrics_over_time; for posts get_instagram_top_media. |
| get_instagram_metrics_over_timeA | A time series of account metrics by day, week or month, for trend analysis and growth charts (views, reach, interactions, likes, comments, shares, saves, follows, unfollows, net follows, …). One Instagram request per bucket: use week or month for long periods. Buckets cut off by the range are flagged partial=true. |
| get_instagram_audienceB | Who the audience is: age, gender, age × gender, top cities and top countries of the followers, or of the accounts that engaged with the content. Rows have counts and share_pct; age also has app_share_pct (the app's own rule) and gender share_of_known_pct. |
| get_instagram_online_followersA | When followers are on Instagram: average followers online per hour of the day, and the best weekday + hour slots, in the report timezone. Use it to pick posting times. |
| query_instagram_apiA | Run any read-only GET on Meta's Instagram Graph API for the connected account and return Meta's raw JSON: the escape hatch when no other tool fits. Account insights allow at most 30 days between since and until (Unix seconds) and go back 2 years. Pagination: pass 'after' from paging.cursors. Meta's error message is returned if a request is invalid. |
| list_instagram_mediaA | List the account's posts and reels (newest first) with caption, type, publish time, permalink, likes and comments; optionally with each post's lifetime insights and an embedded thumbnail. Covers the whole history, not just two years. For a ranking within a period use get_instagram_top_media; stories are in list_instagram_stories. |
| get_instagram_media_insightsA | Every lifetime metric Meta has for specific posts, reels or stories: views, reach, likes, comments, shares, saves, reposts, interactions, engagement rate; follows, profile visits and profile activity for feed posts; average and total watch time and skip rate for reels; replies and navigation for stories. |
| get_instagram_top_mediaA | Rank the posts published in a period by a lifetime metric (views, reach, interactions, saves, shares, engagement rate, average watch time, …), with all their insights. Also returns how many posts were published in the period. |
| list_instagram_storiesA | The account's current stories (published in the last 24 hours) with their insights: views, reach, replies, shares, interactions, follows, profile visits and navigation (taps forward/back, exits, swipes). Meta doesn't give access to expired stories. |
| list_instagram_commentsA | Read comments (username, text, time, likes) on one post or across the latest posts, e.g. to summarise sentiment, find questions or content ideas. Needs the comments permission on the token (instagram_manage_comments or instagram_business_manage_comments). |
| list_instagram_tagged_mediaA | Public posts by other accounts in which the connected account is tagged (newest first), with owner, caption, likes and comments: useful to track mentions, collaborations and UGC. |
| get_instagram_public_accountA | Public profile and recent posts of another Business or Creator account (followers, posts, bio, and per post likes, comments and reel views), for benchmarking against peers or vetting partners. Needs a unified login or Facebook Login token. |
| get_instagram_reportA | Everything about the account for a period in one stable JSON snapshot (schema_version 1):
profile, performance totals vs the previous period (with content-type and follower
splits), follower audience (gender, age, top 10 cities and countries), every post published
in the period with its lifetime insights, and the best hours to post. Sections Instagram
can't provide are null or empty and explained in |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| instagram_checkup | Review how the account performed in a period and suggest what to do next. |
| post_deep_dive | Explain how one post performed and what to learn from it. |
| audience_portrait | Describe who follows and who engages with the account. |
| benchmark_accounts | Compare the account with similar public accounts. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 15 tools
Descriptions do an unusually good job of cross-referencing sibling tools (e.g. profile vs performance_summary vs report, top_media vs list_media), so most pairs are clearly separable. The main overlaps are get_instagram_report, which aggregates profile/performance/audience/top_media/best-hours into one call, and get_instagram_media_insights vs get_instagram_top_media, which both surface per-post lifetime insights; agents may hesitate between the rollup and its constituent tools.
Every tool follows a consistent verb_noun pattern with a uniform instagram_ namespace (get_/list_/query_), and the get vs list distinction maps cleanly onto single-object vs collection. No camelCase or mixed conventions appear.
15 tools sits at the top of the well-scoped range and each one has a distinct analytical role (account, time series, audience, media, stories, comments, tagged, public, report, raw escape hatch, auth). Nothing looks like filler.
For a read-only Instagram analytics domain the surface is very thorough: profile, period totals, trends, audience, posts/reels/stories, comments, tagged media, peer benchmarking, a combined report, and a query_instagram_api escape hatch for uncovered GETs. The only gaps are write operations (publishing, comment replies), which appear deliberately out of scope but could be dead ends for users expecting them.