Skip to main content
Glama
JainAditi09

instagram-mcp

by JainAditi09

instagram-mcp

An MCP server that wraps the Instagram API (Instagram Login flow): publish photos, reels, and stories (from a URL, a local file, or — via the included subagent — a local file hosted through Google Drive); read comments and performance insights; moderate comments; draft on-brand captions using MCP sampling; and schedule reels for later.

Built as a learning project after Anthropic's "Introduction to Model Context Protocol" course, to turn the course concepts into a real, working integration — not just tools, but resources, prompts, sampling, logging, progress notifications, and a Claude Code subagent on top.

For the full story — the Meta developer setup process and every problem hit along the way, plus a deeper design writeup of every MCP concept used and why — see docs/01-meta-developer-setup.md and docs/02-mcp-server-design.md.

Quick start

npm install
npm run build

Then set two environment variables (IG_USER_ID, IG_ACCESS_TOKEN) in your MCP client config — see Setup below for how to get them, and Connect it to Claude for where they go.

Related MCP server: meta-mcp

What's in this project

Path

What it is

src/instagram.ts

The actual Instagram API client — auth, GET/POST helpers, publishing flows, resumable upload. No MCP-specific code.

src/index.ts

The MCP layer — registers everything in instagram.ts as tools/resources/prompts with schemas.

.claude/agents/instagram-manager.md

A Claude Code subagent scoped to just this server (+ Google Drive), with judgment calls baked into its system prompt.

docs/01-meta-developer-setup.md

Narrative of the Meta app / token setup process, including every blocker hit and how it was resolved.

docs/02-mcp-server-design.md

Design writeup: problem statement, architecture, and an explanation of every MCP concept this project uses.

Setup

1. Account & app requirements

  • Your Instagram account must be a Business or Creator account. This project uses Instagram API with Instagram Login — the account authorizes the app directly, no Facebook Page needed.

  • Create a Meta app at https://developers.facebook.com/apps (Business type), add the Instagram product, and inside it choose "API setup with Instagram login."

  • Under App roles → Roles, add your Instagram account as an Instagram Tester, then accept the invite from inside the Instagram app itself (Settings → Apps and Websites → Tester Invites). The app can't authorize your account until this is accepted.

  • On the "API setup with Instagram login" page, step 1 lists required permissions: instagram_business_basic, instagram_business_manage_comments, instagram_business_manage_messages. Add two more via "Go to permissions and features": instagram_business_content_publish (needed for post_image/post_reel/post_story) and instagram_business_manage_insights (needed for get_media_insights).

See docs/01-meta-developer-setup.md if any of this goes sideways — it documents the specific errors this project hit (business portfolio blockers, "insufficient developer role," permission-name renames) and how each was fixed.

2. Get your credentials

On the same "API setup with Instagram login" page, under "2. Generate access tokens":

  1. Click Add account, log in as your Instagram account, and approve the permissions. This adds a row showing your account and its Instagram User ID (e.g. 17841471531885841) — that's your IG_USER_ID.

  2. Click Generate token in that row to get a token. If it's issued as long-lived (60 days) you're done. If it's short-lived, exchange it:

    GET https://graph.instagram.com/access_token
      ?grant_type=ig_exchange_token
      &client_secret={instagram-app-secret}
      &access_token={short-lived-token}

Long-lived tokens expire after 60 days — for real use you'd add a refresh job; not included here to keep this a learning-sized project.

If you add permissions after already generating a token, regenerate the token. A token only carries whatever permissions existed at the moment it was created — adding scopes afterward does nothing until you get a fresh one.

3. Configure environment variables

The server reads IG_USER_ID and IG_ACCESS_TOKEN from the environment — set these in your MCP client config (below), not in a committed .env file.

Connect it to Claude

Claude Desktop / Claude Code — add to your MCP config (claude_desktop_config.json or .mcp.json):

{
  "mcpServers": {
    "instagram": {
      "command": "node",
      "args": ["/absolute/path/to/instagram-mcp/dist/index.js"],
      "env": {
        "IG_USER_ID": "your-instagram-scoped-user-id",
        "IG_ACCESS_TOKEN": "your-long-lived-token"
      }
    }
  }
}

Restart Claude Desktop / Claude Code after saving. You should see the instagram server's tools available in a new conversation.

Note on config file locations: newer Claude Desktop builds may manage connectors through the in-app Settings UI instead of a hand-edited file, or may only expose custom-connector fields for remote (https://) servers, not local stdio ones like this. If you don't see a claude_desktop_config.json being read, look for a Developer settings section with an Edit Config button — that's the one that accepts this JSON.

Tools exposed

Tool

Description

list_media

Recent posts/reels with basic counts

get_media_insights

Reach, likes, comments, saves, (video) shares/views

get_comments

Comments on a media item

reply_to_comment

Public reply to a comment

hide_comment

Hide/unhide a comment

delete_comment

Permanently delete a comment

post_image

Publish a single photo (public URL)

post_reel

Publish a Reel from a public URL or a local file (handles the container → upload/poll → publish flow, reports progress)

post_story

Publish a 24h story (public URL)

schedule_reel

Queue a Reel to publish at a future time (see Scheduling)

list_scheduled_posts

List queued reels and their status

cancel_scheduled_post

Cancel a pending scheduled reel

suggest_caption

Uses MCP sampling to ask the connected client's model for 3 caption options, grounded in the account's recent captions

Resources exposed

URI

Description

instagram://media

The account's most recent media, as a browsable resource (not just a tool call)

instagram://media/{media_id}/comments

Comments on a specific media item, addressed by URI

instagram://scheduled

The current in-memory queue of scheduled reels

Prompts exposed

Prompt

Description

weekly_engagement_review

A ready-made prompt (optionally takes post_count) that has the model pull recent posts + insights and summarize what's working

MCP concepts this project demonstrates

Beyond basic tools, this server exercises the rest of the MCP surface:

  • Resourcesinstagram://media and instagram://media/{id}/comments let a client browse/attach Instagram data directly, the same way it would browse a file, rather than only getting data back from a tool call.

  • Promptsweekly_engagement_review is a reusable prompt template the client can surface (e.g. as a slash command) instead of the user having to type out the same multi-step instruction each time.

  • Samplingsuggest_caption calls server.server.createMessage(...), which asks the client's model (whatever Claude the person is running) to generate text, using account context this server already has. The server never calls its own separate LLM API key — it borrows the client's model via the protocol.

  • Logging & progress notifications — every mutating tool call sends structured log messages via sendLoggingMessage. post_reel additionally sends notifications/progress updates while it polls Instagram's video processing status (which can take 30s–2min), so a client that supports progress UI can show real-time status instead of a silent hang.

See docs/02-mcp-server-design.md for the full writeup of why each of these was built the way it was.

Local file uploads (post_reel with video_path)

post_reel accepts either video_url (public URL) or video_path (an absolute path to a file on this machine). For a local file, the server uploads the raw bytes directly to Meta's servers via the resumable upload flow (rupload.facebook.com) — no need to host the file publicly yourself.

One honest caveat: Meta's docs describe this resumable path as intended for apps using "Facebook Login for Business," and this project uses Instagram Login instead. In practice it works for most Instagram Login apps too, but if post_reel with video_path fails with a permission or host error, the fallback is to host the file somewhere public and use video_url instead (see the Drive-based workflow below for one way to do that without leaving the conversation).

post_image and post_story don't have a local-file option — Instagram's photo/story publishing API has no resumable-upload equivalent for images, so these two tools still require a public image_url/video_url.

Local assets for any post type: the instagram-manager subagent

For a workflow where you just hand over a local file — photo, reel, or story — and don't want to think about hosting at all, use the included Claude Code subagent instead of calling the tools directly:

.claude/agents/instagram-manager.md

This subagent has access to both mcp__instagram (this server) and a Google Drive connector, and is instructed to: upload the local file to Drive → set it to link-shareable → build a direct-download URL → call the matching Instagram tool with that URL. It also knows to fall back to post_reel's video_path if a Drive-hosted reel fails (large video files can hit Google's virus-scan interstitial, which serves an HTML warning page instead of raw bytes).

To use it: copy the file into ~/.claude/agents/ (available in every project) or your project's own .claude/agents/, then check that the mcp__google-drive name in its frontmatter matches whatever your Drive connector is actually named in your Claude Code config (claude mcp list). See docs/02-mcp-server-design.md §6–7 for the full reasoning behind this design (why it's a subagent concern and not server code).

Scheduling (schedule_reel)

Instagram's API has no native "publish later" — real scheduling of organic posts only exists inside Meta's own Business Suite UI, not the API. So schedule_reel holds the job in this server's memory and fires it with a timer at the right time.

This means scheduled posts only fire while this MCP server process stays alive — i.e. while Claude Desktop (or whatever client launched it) stays open. Quitting the app cancels anything still pending. It's fine for same-session or same-day scheduling ("post this in 2 hours"); it is not a durable schedule you can set and then close your laptop on.

For real "survive a reboot, fire while I'm asleep" scheduling, you'd want a system-level mechanism instead — a cron job or macOS launchd task that invokes a small standalone script (reusing src/instagram.ts's postReel) at the target time, independent of Claude Desktop's process lifecycle. Not implemented here, to keep this project at learning-project scope.

Notes / gotchas carried over from the Graph API itself

  • post_image/post_story still need a public URL — no local-file option for those two (see above). post_reel is the exception, via video_path.

  • Reels take time to process. post_reel polls the container's status_code until it's FINISHED before publishing (Meta recommends polling for up to ~5 minutes; most reels finish in 30s–2min).

  • Rate limit: 25 published posts per rolling 24h window, shared across photos/reels/stories.

  • Reel eligibility for the Reels tab needs 9:16 aspect ratio and 5–90s duration; longer/differently-shaped video still publishes but as a regular video post.

  • Metric names have drifted. Instagram merged impressions/plays into a single views metric — if insights calls ever start failing across every post consistently, suspect a metric-name mismatch before assuming it's a permissions issue.

Next steps to extend this

  • Real persistent scheduling via a generated cron/launchd job.

  • A create_carousel_post tool (multi-image, same container/publish pattern as post_image but with children params).

  • Native local-file support for post_image/post_story in server code (would still need some public-hosting step, since Instagram has no resumable upload for photos — possibly a short-lived local HTTP endpoint via a tunnel, as an alternative to the subagent's Drive-based approach).

  • Account-level insights (follower count, profile views) via a resource.

  • Token refresh handling instead of manual 60-day renewal.

  • An automatic retry/fallback wrapper around Drive-hosted post_reel calls, instead of relying on the subagent's prompt-level instruction to notice and react to a failure.

  • Swap the manual env vars for a proper OAuth flow if you want other people to connect their own accounts to this server.

Available Tools

13 tools
cancel_scheduled_postA

Cancel a pending scheduled reel by id (from schedule_reel or list_scheduled_posts).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It clearly conveys the destructive nature of the action ('Cancel') and the precondition ('pending'). However, it does not state whether cancellation is reversible, what happens if the reel has already been posted, or any other side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler. The core action and input source are front-loaded, and every word contributes to understanding the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema, the description covers the action, required input, id source, and scheduling state. It could mention what result to expect on success or failure, but that is not essential for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only says 'id' is a string with no description. The tool description compensates by explaining that id refers to a scheduled reel and pointing to the tools that produce valid ids, which is valuable for correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Cancel'), a clear resource ('pending scheduled reel'), and identifies exactly where the id comes from ('from schedule_reel or list_scheduled_posts'). This clearly distinguishes it from the sibling scheduling and listing tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: use it to cancel a pending scheduled reel, and the required id is obtained from schedule_reel or list_scheduled_posts. It does not explicitly list exclusions or alternative tools, but the intended scenario is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_commentA

Permanently delete a comment. This cannot be undone — use hide_comment if you just want to reduce visibility.

ParametersJSON Schema
NameRequiredDescriptionDefault
comment_idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It clearly discloses that the operation is permanent ('This cannot be undone') and destructive ('Permanently delete'). It does not mention possible cascading effects or auth requirements, but the most critical behavioral trait is well communicated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no redundant phrases. The primary action is front-loaded, and the crucial caveat and alternative follow immediately. Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter delete tool with no output schema, the description covers purpose, irreversibility, and the sibling alternative. It does not describe the response format or error behavior, but those are less critical for a straightforward action.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does not explain comment_id's format, source, or how to obtain it; it only implies the parameter refers to the comment being deleted. The parameter name is self-explanatory but no added semantics are provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Permanently delete a comment') and explicitly differentiates it from the sibling hide_comment. An agent can immediately understand the tool's core function and how it differs from related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names the alternative (hide_comment) and states the condition that selects it ('if you just want to reduce visibility'). This gives clear when-to-use / when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_commentsA

List comments on a media item.

ParametersJSON Schema
NameRequiredDescriptionDefault
media_idYesInstagram media id

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description alone must carry behavioral disclosure. 'List' implies a read-only operation, but the description does not mention pagination, return format, authentication, rate limits, or whether only top-level comments are returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with no filler and the core scope front-loaded. It communicates the tool's job efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool, this may be minimally sufficient, but the lack of an output schema and any mention of comment fields, ordering, or pagination leaves an agent without important retrieval expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents media_id as 'Instagram media id' with 100% coverage. The description's 'on a media item' reinforces the connection but adds no further semantic detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and a clear resource ('comments on a media item'). It is unambiguous and visibly distinct from sibling tools that reply to, hide, or delete comments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended usage is implied: use it when you want to retrieve comments for a media item. However, it does not explicitly state exclusions or alternatives, so the agent must infer the boundary against siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_media_insightsA

Get performance insights (reach, likes, comments, saves, and for video/reels: shares and views) for a specific media item.

ParametersJSON Schema
NameRequiredDescriptionDefault
media_idYesInstagram media id, from list_media
media_typeNoMedia type from list_media (e.g. REELS, VIDEO, IMAGE) — determines which metrics are valid

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry behavioral transparency. The verb 'Get' implies a read-only operation, and the description discloses conditional metric availability for video/reels. However, it does not mention authentication requirements, errors, invalid media_type behavior, or the shape of the response, leaving some behavioral burden unmet.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. It communicates the core action, the target resource, and the metric details efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool, the description covers the purpose and the key conditional behavior. It could mention the return shape or how media_id should be obtained, but the schema already says media_id comes from list_media and the metric list is explicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description reinforces the media_type dependency and the scope of insights, but it does not add significant semantic value beyond the schema's already detailed parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Get'), a specific resource ('performance insights for a specific media item'), and enumerates the metrics returned. It is clearly distinguishable from siblings like get_comments or post_el.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the context for using the tool: retrieving insights for a specific media item, and notes that media_type affects which metrics are valid. It does not explicitly name alternatives or when-not to use it, but the conditions are clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hide_commentA

Hide or unhide a comment. Hidden comments stay visible only to their author and the account (reversible).

ParametersJSON Schema
NameRequiredDescriptionDefault
hideNo
comment_idYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that hidden comments remain visible only to the author and account, and that the action is reversible — both essential behavioral traits beyond what the name implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler. The core action is front-loaded, and the critical visibility/reversibility detail is delivered immediately after, making every word earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with no output schema, the description covers the core action, the effect on visibility, and reversibility. It lacks explicit alternative guidance, but the essential context an agent needs to invoke the tool correctly is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no descriptions for parameters, so the description must compensate. 'Hide or unhide' clarifies the toggle behavior of the 'hide' boolean, but it does not explain the required 'comment_id' field, which is left to inference from its name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb plus resource — 'Hide or unhide a comment' — which is unambiguous. The added visibility rule and reversibility note distinguish it from delete_comment, making the tool's purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through the word 'reversible', suggesting this is for temporarily hiding rather than permanently deleting comments. However, it does not explicitly name alternatives like delete_comment or state conditions for choosing this tool over them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_mediaA

List recent media (posts, reels, carousels) on the connected Instagram account, with basic engagement counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of disclosing behavior. 'List' conveys a non-mutating operation and 'with basic engagement counts' hints at return content, but it does not mention ordering, pagination, rate limits, or whether this requires special permissions. For a simple list tool this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one efficient sentence, front-loaded with the primary action ('List recent media') followed by concise clarifiers for scope and return content. Every element earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter list tool with no output schema, the description identifies the resource and return value type but does not specify the output shape or pagination behavior. It is usable, but an agent might still be unsure about the exact media object fields beyond engagement counts.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description needed to explain the 'limit' parameter. It does not mention limit at all, leaving the agent to rely solely on the schema's min/max/default metadata, which is clear but not supplemented by the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('List'), a specific resource ('recent media on the connected Instagram account'), and names the media types included. It is clearly distinct from siblings that create/schedule content or return insights for a single media item.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the read-only listing purpose obvious, which implies use when the agent needs recent media and engagement counts. However, it does not explicitly say when to prefer this over siblings like get_media_insights or list_scheduled_posts, leaving routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_scheduled_postsA

List all scheduled reels and their current status (pending, running, published, failed, cancelled).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It clarifies that the tool lists current statuses and enumerates possible values, which is useful, but it does not disclose whether the operation is read-only, whether results are ordered, or what the actual return shape looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence that names the resource and the key status values without filler. Every word contributes to agent understanding, and the status list is front-loaded after the primary purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool with no output schema, the description conveys the essential behavior and expected status output. It is slightly incomplete because it does not describe the result format or any ordering/filtering behavior, but these are minor given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline is 4 because there is no parameter meaning to document. The description appropriately focuses on what the tool returns rather than parameters, and no parameter information is missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and a resource ('scheduled reels') with an explicit status enumeration. It is distinguishable from siblings like schedule_reel and cancel_scheduled_post, though the slight mismatch between the tool name 'scheduled_posts' and description 'scheduled reels' introduces minor ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes its scope clear by listing all scheduled reels and statuses, which implies when an agent would use it. However, it provides no explicit guidance about when to choose this tool over alternatives such as list_media or cancel_scheduled_post, and no exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_imageA

Publish a single photo to the feed. image_url must be a publicly reachable JPEG URL (Instagram fetches it directly).

ParametersJSON Schema
NameRequiredDescriptionDefault
captionNo
image_urlYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It discloses a critical behavior: Instagram fetches the image directly from a publicly reachable JPEG URL. This is valuable operational context, though it does not cover side effects, authentication, or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with no filler. The core action is stated first, and the critical URL constraint is front-loaded immediately after.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity, two-parameter tool without an output schema, this description covers the essential operational details: what is published, where it is published, and how the image must be provided. Some potential details like auth or rate limits are absent, but the core usage is adequately specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds crucial meaning to image_url by specifying it must be a publicly reachable JPEG, which goes beyond the schema's plain 'format: uri'. The caption parameter is left to the schema, but the most important parameter is well explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Publish a single photo to the feed.' This clearly distinguishes it from sibling tools like post_story and post_reel, which target different formats and surfaces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'to the feed' and 'single photo' provides clear context for when this tool applies, especially alongside post_story and post_reel. It does not explicitly name alternatives or exclusions, but the intended use is clear enough for an agent to select it correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_reelA

Publish a Reel. Provide exactly one of video_url (a publicly reachable MP4/MOV URL) or video_path (a local file path on this machine — uploaded directly to Meta's servers, no public hosting needed). This call blocks while Instagram processes the video (usually 30s-2min) and publishes once ready. Reports progress while waiting.

ParametersJSON Schema
NameRequiredDescriptionDefault
captionNo
video_urlNo
video_pathNoAbsolute path to a local video file, e.g. /Users/you/Videos/clip.mp4
share_to_feedNoWhether the Reel also appears in the main feed

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description discloses several critical behaviors: it blocks while Instagram processes the video, processing usually takes 30 seconds to 2 minutes, progress is reported, and local files are uploaded directly to Meta's servers. This is substantial behavioral context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences with no filler. It front-loads the primary action, then covers the key parameter constraint, and finally the blocking/progress behavior. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with four optional parameters and no output schema, the description gives enough to call it correctly: the video source constraint, the blocking behavior, and progress reporting. The remaining parameter meanings are covered by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds critical meaning beyond the schema by requiring exactly one of video_url or video_path and explaining the difference: video_url must be publicly reachable, while video_path is a local file requiring no hosting. This compensates well for the 50% schema coverage, though caption semantics are left largely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the specific verb 'Publish' and resource 'a Reel,' making the tool's purpose immediately clear. It also differentiates from siblings by emphasizing immediate publishing and blocking behavior, distinguishing it from schedule_reel and post_story.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly conveys when to use this tool: to publish a Reel now, not schedule it. It does not explicitly mention alternatives like schedule_reel or post_story, but the context and blocking behavior make the intended usage unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_storyA

Publish a 24-hour story from either an image or a video URL (provide exactly one).

ParametersJSON Schema
NameRequiredDescriptionDefault
image_urlNo
video_urlNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full transparency burden. It does add useful behavioral context by specifying '24-hour' ephemerality and the exclusive input rule, but it omits auth/permission requirements, expected return value, and behavior when the exactly-one constraint is violated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. Every word contributes either the core action, the content type, the input sources, or the exclusivity constraint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool, the description covers the essential invocation constraint, but without annotations or an output schema, it leaves out what happens after publishing and how the caller learns the result. It is minimally viable but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It clearly maps the two parameters to image and video URLs and adds the critical constraint that exactly one must be provided, which the schema does not express.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Publish'), a distinct resource ('24-hour story'), and the two acceptable input sources (image or video URL). The term 'story' clearly separates it from sibling tools like post_image and post_reel, so an agent can identify what this tool does immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool instead of post_image, post_reel, or schedule_reel. The parenthetical 'provide exactly one' is a parameter constraint, not tool-selection context or an explicit when/when-not rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reply_to_commentA

Publicly reply to a comment on one of the account's media items.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes
comment_idYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose two meaningful behavioral traits: the reply is publicly visible and it is scoped to the account's own media items. It stops short of disclosing side effects (e.g., the reply appearing in the public thread, persistence after the original comment is hidden), auth expectations, or failure conditions such as disabled comments or invalid comment_id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single ten-word sentence front-loads the verb and the key scope qualifiers ('Publicly', 'one of the account's media items') with zero filler. Every word earns its place for a tool this simple.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple: 2 required scalar params, no output schema, no annotations. The description covers the essentials — action, visibility, and ownership scope — well enough for an agent to select and invoke it. Remaining gaps (how comment_id is sourced, failure behavior) are minor and partly inferable from sibling tools like get_comments.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds some meaning beyond the schema by scoping comment_id to a comment on the account's own media, and message as the public reply content. It does not, however, tell the agent where to obtain comment_id (e.g., from get_comments) or provide value-format guidance beyond the schema's type and maxLength.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('reply') with a specific resource ('a comment on one of the account's media items'), and the qualifier 'publicly' sharpens the meaning. It is clearly distinguishable from siblings like get_comments, hide_comment, and delete_comment, though it does not explicitly name any alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The trigger condition is implied: use this when a public response to a user's comment on the account's media is needed. However, there is no explicit guidance on when not to use it (e.g., for moderation use hide_comment/delete_comment) and no mention of prerequisites or restrictions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schedule_reelA

Schedule a Reel to publish at a future time. Provide exactly one of video_url or video_path, plus an ISO 8601 scheduled_time (e.g. 2026-09-01T18:30:00). LIMITATION: this only fires while this MCP server keeps running (i.e. while Claude Desktop stays open) — it is not a durable/cloud schedule. Best for same-session or same-day scheduling, not 'post this while I'm asleep and my laptop is off.'

ParametersJSON Schema
NameRequiredDescriptionDefault
captionNo
video_urlNo
video_pathNo
share_to_feedNo
scheduled_timeYesISO 8601 datetime, e.g. 2026-09-01T18:30:00

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and it excels: it explicitly discloses that scheduling only fires while the MCP server remains running, that it is not durable/cloud scheduling, and that it is best for same-session/same-day use. This is a critical behavioral caveat an agent must know before invoking the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose first, then required parameters, then the critical limitation in a clearly marked paragraph. Every sentence earns its place without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter tool with no annotations and no output schema, the description covers the required parameter, the one-of constraint, the time format, and the main behavioral caveat. It doesn't describe the response/confirmation an agent should expect, and it leaves the two optional boolean/string params implicit, which is a minor completeness gap rather than a blocking one.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 20%, and the description compensates by adding the crucial 'exactly one of video_url or video_path' constraint and a concrete ISO 8601 example for scheduled_time. It doesn't elaborate on caption or share_to_feed, but those are reasonably self-explanatory from their names and schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb and resource: 'Schedule a Reel to publish at a future time.' This clearly distinguishes it from immediate-publish siblings like post_reel and from management tools like cancel_scheduled_post.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear invocation guidance ('Provide exactly one of video_url or video_path, plus an ISO 8601 scheduled_time') and strongly frames when it is appropriate via the same-session limitation and the 'laptop is off' counterexample. It doesn't explicitly name an alternative tool for immediate posting, so it stops short of full sibling routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_captionA

Generate 3 caption options for a post using the connected client's model (MCP sampling) — grounded in the account's recent caption style.

ParametersJSON Schema
NameRequiredDescriptionDefault
toneNoOptional tone hint, e.g. 'playful', 'minimal', 'aspirational'
topicYesWhat the post is about, e.g. 'new candle restock, vanilla scent'

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does a good job: it discloses that the tool calls the connected client's model via MCP sampling, that it only generates suggestions rather than posting, and that output is style-aware. It doesn't explicitly mention whether user approval is required during sampling or that no data is saved, but the wording is not misleading.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly worded sentence. It front-loads the primary action and output, then adds the method and grounding in a natural second clause, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with no output schema, the description covers the core purpose, number of results, method, and style context. It doesn't spell out the exact return format or explicitly confirm that nothing is published, but these are inferable and the sibling tool list reinforces that this is a suggestion-only action.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters ('topic' and 'tone') are already fully documented in the input schema. The description adds contextual framing but no parameter-specific details beyond what the schema provides, which matches the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Generate'), a resource ('caption options'), an exact quantity ('3'), and the context ('for a post'). It also names the method (MCP sampling) and grounding signal ('recent caption style'), making it clearly distinct from sibling posting, scheduling, and comment tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use this tool—when on-brand caption options are needed for a post—by highlighting the grounding in the account's recent caption style. Since all siblings are posting, scheduling, or comment tools, there is no overlap requiring explicit exclusions; a minor gap is that it doesn't explicitly say 'use before publishing.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.1.0
    • First observedcancel_scheduled_post
    • First observeddelete_comment
    • First observedget_comments
    • First observedget_media_insights
    • First observedhide_comment
    • First observedlist_media
    • First observedlist_scheduled_posts
    • First observedpost_image
    • First observedpost_reel
    • First observedpost_story
    • First observedreply_to_comment
    • First observedschedule_reel
    • First observedsuggest_caption

TDQS

A4.1/5.0

Scored across 13 tools

Disambiguation5/5

Each tool maps to a distinct action/resource: publishing types are separated by medium and timing, scheduled posts have their own list/cancel pair, and comment actions are clearly differentiated. Even the closely related post_reel and schedule_reel are disambiguated by immediate vs. future publication.

Naming Consistency5/5

All tools use snake_case verb_noun names with clear verbs such as post, schedule, list, cancel, suggest, get, reply, hide, and delete. The pattern is consistent across publishing, scheduling, analytics, and comment moderation.

Tool Count5/5

13 tools is within the ideal 3-15 range and maps cleanly to four functional areas: publishing, scheduling, captions/insights, and comment management. No tool feels redundant.

Completeness4/5

The server covers publishing via story/image/reel, scheduling and cancellation, recent media listing and insights, captions, and full comment moderation including reversible hiding and permanent deletion. Minor gaps exist, such as no scheduling for stories/images and no direct media deletion/editing, but core Instagram workflows are well covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to manage Instagram Business accounts by automating content publishing, scheduling posts, and analyzing performance metrics. Supports posts, stories, reels, and carousels with detailed audience insights and hashtag discovery.
    -
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to manage Instagram and Threads accounts — publish content, handle comments, view insights, search hashtags, and manage DMs through the Meta Graph API.
    59
    19 npm
    12
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables reading, publishing, commenting, direct messaging, and pulling insights from Instagram Business or Creator accounts via the Graph API.
    6
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Enables posting and managing Instagram content (photos, reels, stories, carousels) and interacting with media and comments via Instagram Graph API.
    10
    7 npm
    -