ig-publisher
Publishes and schedules Reels, photos, carousels, and stories to an Instagram professional account via the Instagram Graph API, with media validation, queue/history, insights, comments, and replies.
ig-publisher

English · O‘zbekcha
A local, self-hosted tool that publishes Reels, photos, carousels and stories to an Instagram professional (Business or Creator) account through the official Instagram Graph API, either with Instagram Login (graph.instagram.com) or with Facebook Login and a linked Page.
You can use it in three ways:
CLI: the
igcommand.MCP server: AI agents such as Claude Code or local LLM clients can publish, schedule and read stats.
Queue + systemd timer: posts scheduled with
--atare published automatically. The timer checks every 5 minutes.
There is no hosted backend. You use your own Meta app, and your token stays on your machine in data/ig.sqlite.
Features
Validation. Uses ffprobe to check Instagram's media requirements: codec, fps, duration, size, aspect ratio and moov atom. It also checks caption limits: 2200 characters, 30 hashtags and 20 @mentions.
Auto-fix. Re-encodes with ffmpeg when needed (H.264/AAC, 23–60 fps, faststart) and converts PNG/WebP to JPEG. Use
--no-fixto turn this off.Duplicate protection. The same media is not published twice unless you pass
--force.Upload. Videos are sent directly with
upload_type=resumablefirst. If that fails, the tool falls back to a public URL. Instagram accepts images and covers only by URL, so they are served through a host:tunnel: a cloudflared quick tunnel. No setup needed.static: your own web server.command: any upload command, for example rclone or the AWS CLI for S3/R2.
Wait and publish. Waits until the container is
FINISHED, then callsmedia_publishand returns the permalink.Resume. If a run is interrupted, the next attempt finds the ready container and publishes it.
Rate limits. Checks the 24-hour publishing quota before posting. Queue failures are retried with backoff.
Notifications and token refresh. Sends optional Telegram notifications and refreshes the token automatically.
Related MCP server: instagram-mcp-server
Requirements
Linux. The CLI and MCP server should also work on macOS, but that is untested. The scheduler uses systemd user timers, so it is Linux only.
Node.js ≥ 24. TypeScript runs natively, so there is no build step.
ffmpeg / ffprobe in
PATH, or setFFMPEG_PATH/FFPROBE_PATHin.env.cloudflared for the default
tunnelhost. You can skip it if you usestaticorcommand.An Instagram Business or Creator account and a Meta developer app. See SETUP.md.
Installation
git clone https://github.com/JavoxirJava/ig-publisher.git ~/ig-publisher
cd ~/ig-publisher
npm install
cp .env.example .env && chmod 600 .env
ln -s ~/ig-publisher/bin/ig ~/.local/bin/ig # put `ig` on your PATH
npm test # optional: full flow against a mock Graph API (needs ffmpeg)Then connect your account:
ig auth token - # paste the access token, press Enter, then Ctrl+D
ig doctor # everything should be ✅ (Telegram is optional)
ig scheduler install # optional: systemd timer for scheduled postsHow to get a token (about 30–60 minutes, one time):
Switch your Instagram account to Professional (Business or Creator).
Create an app at https://developers.facebook.com/apps with the use case "Manage messaging & content on Instagram". Leave it in Development mode. App Review is not needed to post to your own account.
Go to Instagram → API setup with Instagram login → Generate access tokens, add your account, click Generate token, then run
ig auth token -.
If your app only shows "API setup with Facebook login", set IG_LOGIN=facebook. The full step-by-step
guide, including the OAuth flow, the Facebook Login flow and troubleshooting, is in SETUP.md
(currently in Uzbek).
Quick start
ig doctor
ig post reel video.mp4 --caption "Text #hashtag" --cover cover.png --dry-run # validate only
ig post reel video.mp4 --caption "Text #hashtag" --cover cover.png # publish
ig post reel video.mp4 --caption-file caption.txt --at "tomorrow 09:00" # schedule
ig post carousel 1.jpg 2.png 3.mp4 --caption "..." --alt "description"
ig post story story.mp4
ig post --spec post.json
ig queue # scheduled posts
ig history # published posts, with permalinks--at accepts now, +30m, +2h, +1d, 09:00, tomorrow 09:00 (or ertaga 09:00) and
2026-10-27 18:30. Times are in local time.
Post spec (JSON)
{
"type": "reel",
"media": ["/abs/or/relative/video.mp4"],
"cover": "cover.png",
"caption": "Text\n\n#tag1 #tag2",
"shareToFeed": true,
"collaborators": ["friend_account"],
"label": "my-series-002"
}type:reel|image|carousel(2–20 media) |story.media: local files or ready-madehttps://URLs. Relative paths are resolved against the spec file.Optional fields:
captionFile,thumbOffsetMs,locationId,userTags([{username,x,y}]),altText,audioName,aiGenerated,trial(MANUAL|SS_PERFORMANCE),fix(defaulttrue).
A spec file is the easiest way to plug ig-publisher into your own pipeline, for example a video renderer.
Write post.json and run ig post --spec post.json --at "...".
All commands
ig auth token|url|login|status|refresh|logout
ig check <file> [--as reel|story|feed|carousel|cover]
ig queue [--all] | show|cancel <id> | retry <id> [--at ...] | run
ig limit | ig media | ig insights <media-id|account> | ig comments <id> | ig reply <id> <text>
ig scheduler install|uninstall|status ig tick ig notify-test
--json machine-readable JSON on stdout (for agents and scripts)Exit codes: 0 OK, 1 error, 2 bad usage, 3 duplicate.
MCP server
Register it with Claude Code:
claude mcp add --scope user ig-publisher -- node --disable-warning=ExperimentalWarning ~/ig-publisher/src/mcp.tsAny other MCP client can use the same stdio command: node .../src/mcp.ts.
Tools:
ig_account,ig_check_mediaig_publish(dryRun,force),ig_scheduleig_queue_list,ig_queue_cancel,ig_queue_retry,ig_historyig_media_list,ig_insights,ig_comments,ig_reply
A ready-made Claude Code skill is in skill/SKILL.md. Copy it to
~/.claude/skills/instagram-publisher/SKILL.md.
Multiple accounts
Each account gets its own env file and data directory:
mkdir -p profiles/second && cp .env.example profiles/second/.env
# in profiles/second/.env:
# IG_PROFILE=second
# IG_DATA_DIR=/home/you/ig-publisher/profiles/second/data
IG_ENV_FILE=$PWD/profiles/second/.env ig auth token -
IG_ENV_FILE=$PWD/profiles/second/.env ig scheduler install # timer: ig-publisher-secondprofiles/ is git-ignored.
Configuration
All settings live in .env. See .env.example for the full list: login type, upload mode,
host, Telegram, API version, polling and retry options.
Telegram notifications are optional. Set TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID, then run ig notify-test.
Project layout
src/config.ts .env, paths, binary discovery
src/db.ts node:sqlite (data/ig.sqlite): token, posts, queue
src/api/ http (errors/retry), auth (token, OAuth, refresh), publish, media (insights/comments)
src/media/probe.ts ffprobe checks + ffmpeg fixes
src/host/ tunnel (cloudflared + Range-capable file server), static, command
src/service.ts publish orchestration
src/queue.ts queue, time parsing, tick
src/scheduler.ts systemd user timer
src/cli.ts, src/mcp.ts
test/ end-to-end tests against a mock Graph API (npm test)Security
Never commit
.env,data/orprofiles/. They contain your access token and are git-ignored by default.The tunnel file server listens only on
127.0.0.1. It serves only the files of the current post, under a random secret path, and shuts down after publishing.Tokens are redacted from logs and error messages.
Disclaimer
This is an independent project. It is not affiliated with, endorsed by or sponsored by Meta or Instagram. You are responsible for following the Meta Platform Terms and Instagram's rules for the content you publish.
License
Available Tools
12 toolsig_accountB
Connected Instagram account, token expiry, 24h publishing quota and scheduler status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden, and it does disclose the substantive payload: connection state, token expiry, publishing quota, and scheduler status. However, it never states that the call is read-only / side-effect free, nor what happens when no account is connected or the token has expired — gaps that matter for a status tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact clause with no filler; each listed item (token expiry, quota, scheduler status) is distinct information. It loses a point only because the telegraphic, verb-less phrasing makes it less immediately parseable than a front-loaded action sentence would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description does reasonably well by enumerating the returned fields in place of a schema. It stops short of covering the failure modes (not connected, expired token) that an agent would want to know before calling, so it is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly implies the tool is parameterless and self-scoped to the connected account.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a noun phrase naming the resource and the data it exposes (account, token expiry, 24h quota, scheduler status), but supplies no verb, so it reads as a label rather than a statement of what the tool does. The resource is identifiable and distinguishable from siblings like ig_publish or ig_insights, but only by inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus ig_insights, ig_queue_list, or the other sibling tools, and no mention of preconditions such as whether the account must be connected first. The agent must infer usage entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ig_check_mediaA
Validate a local media file against Instagram specs (reel/story/feed/carousel/cover). Lists errors, auto-fixable issues and warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| as | No | ||
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the output shape (errors, auto-fixable issues, warnings). However, it never clarifies that validation is read-only and does not itself apply fixes, nor what permissions or file-access constraints apply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tightly packed sentence with the action front-loaded and the return contents appended. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no annotations and no output schema, the description covers purpose, target formats, and an overview of what comes back. The only gap is the absence of any statement that it is non-destructive and read-only.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 effectively documents both parameters: 'local media file' clarifies that `path` is a local filesystem path, and the parenthetical list (reel/story/feed/carousel/cover) enumerates the `as` values, matching the schema enum exactly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Validate') plus resource ('local media file') and the target spec domain (Instagram). It enumerates the five target formats, so an agent knows exactly what kind of check this performs, though it doesn't explicitly contrast with any sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies usage (pre-publish validation), but nothing states when to call it versus, say, jumping straight to ig_publish, nor any prerequisites such as the file needing to exist locally. No exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ig_commentsC
Comments (with replies) on a media id.
| Name | Required | Description | Default |
|---|---|---|---|
| mediaId | Yes |
TDQS
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 adds the useful detail that replies are included in the result, but says nothing about read-only nature, permissions, pagination, ordering, or volume of comments returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short clause with no filler, which is front-loaded, but the brevity comes at the cost of under-specification rather than true efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description is the only behavioral evidence an agent has, and it does not say what structure the comments come back in or how large a result to expect. For a read tool with a single required id, this leaves meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. 'on a media id' does tell the agent that the single parameter is an Instagram media identifier, but it gives no format, source, or validity guidance for that id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It identifies the resource (comments plus their replies on a media item), which distinguishes it from ig_reply, but the phrase is a bare noun fragment with no verb. An agent must infer that this retrieves comments rather than posts or moderates them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus siblings such as ig_media_list, ig_reply, or ig_check_media. The reader is left to guess the selection condition entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ig_historyC
Recent publish attempts with status and permalink.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the entire burden: it doesn't say whether this is read-only, whether failed attempts are included, how far back history goes, whether results are ordered or paginated, or what permissions are needed. 'With status and permalink' is the only behavioral hint and is too thin for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single fragment is front-loaded with zero padding, but its brevity comes from under-specification rather than discipline. Nothing wasteful, yet nothing earned beyond the bare noun phrase.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, unannotated, output-schema-less history tool with eleven siblings, the description omits filtering behavior, ordering, retention window, and return shape. An agent could call it, but not confidently or correctly in edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for both parameters, and the description never mentions 'limit' or 'status'. It is ambiguous whether 'status' in the prose refers to a returned field or the filter parameter, leaving the agent to guess at valid values and paging semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The fragment 'Recent publish attempts with status and permalink' identifies the resource (publish attempt history) and hints at returned fields, but supplies no verb and no scope. It is not distinguishable from siblings like ig_media_list, ig_queue_list, or ig_insights without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus ig_publish, ig_queue_list, or ig_insights, and no prerequisites or exclusions. The agent must infer that this is a post-hoc audit view rather than a live queue listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ig_insightsB
Insights for a media id (views, reach, likes, shares, saves, watch time...) or "account". Needs instagram_business_manage_insights.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | media id or "account" | |
| metrics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It helpfully states the required instagram_business_manage_insights permission and implies a read-only insights operation, but it omits rate-limit behavior, return format, and error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the core resource and target options. The second sentence about permissions is useful, though the overall phrasing is fragmented and slightly informal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 with no output schema and no annotations, the description covers the target and gives metric examples plus a permission requirement. However, it leaves gaps around metrics syntax, default behavior, and when to choose this tool over siblings like ig_account.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: the target parameter is documented in the schema, while metrics is not. The description partially compensates by listing example metrics (views, reach, likes, shares, saves, watch time), but it does not specify formatting, defaults, or whether metrics is optional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns Instagram insights for either a media id or "account," and lists example metrics. It distinguishes insights from sibling tools like ig_media_list or ig_comments, though it does not explicitly contrast with ig_account, which could be confused with account-level insights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no explicit guidance on when to use this tool versus alternatives such as ig_account, nor does it state exclusions. The only contextual note is the required permission scope, which is a prerequisite rather than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ig_media_listC
Recent posts on the account with like/comment counts.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a read-only listing and mentions engagement counts, but it does not disclose pagination behavior, recency window, authentication requirements, rate limits, or whether results are limited to the authenticated account.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no wasted words, and the key information is front-loaded. It is under-specified rather than verbose, so conciseness itself is strong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool, the description conveys what is returned at a high level (posts plus like/comment counts), but it omits essential context: no annotations, no output schema, and no documentation for the only parameter. An agent would have to guess about pagination, limits, and result scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has one optional parameter, limit, whose schema description coverage is 0%. The description does not mention the limit parameter at all, so its meaning, default, maximum, and effect on results are completely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear resource and content: recent posts on the account, including like and comment counts. It is distinguishable from a media-specific checker like ig_check_media, but it does not explicitly position itself against analytics or comment-focused siblings such as ig_insights or ig_comments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives, nor does it state when not to use it. Usage is only implied by the phrase 'recent posts.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ig_publishB
Publish to Instagram NOW (blocks until Instagram finishes processing, typically 1-5 min for a reel). Use dryRun:true first to validate without posting. Refuses media that was already published unless force:true.
| Name | Required | Description | Default |
|---|---|---|---|
| fix | No | Auto-fix media with ffmpeg (default true) | |
| type | No | reel | image | carousel | story (specFile bo‘lmasa majburiy) | |
| cover | No | Reel cover image (png/jpg, converted automatically) | |
| force | No | ||
| label | No | Name shown in history/notifications, e.g. my-series-002 | |
| media | No | Absolute local paths or public https URLs. reel/image/story: 1, carousel: 2-20 | |
| trial | No | ||
| dryRun | No | ||
| altText | No | ||
| caption | No | ||
| specFile | No | Path to a post JSON spec instead of the fields below | |
| userTags | No | ||
| audioName | No | ||
| locationId | No | ||
| aiGenerated | No | ||
| captionFile | No | ||
| shareToFeed | No | Reel also in main feed (default true) | |
| collaborators | No | ||
| thumbOffsetMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and discloses important traits: it blocks until Instagram finishes, reels may take 1-5 minutes, dryRun validates without posting, and duplicate media is refused unless force is set. It still omits permissions, error/response behavior, and irreversibility details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences with the core action, blocking caveat, validation recommendation, and duplicate-protection behavior front-loaded. There is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex 19-parameter publishing tool with no annotations and no output schema, so the description needs to cover more invocation context. It covers the critical blocking/dryRun/duplicate behavior but omits required parameter combinations such as type versus specFile, most parameter meanings, authentication expectations, and failure behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 37% for 19 parameters, so the description needs to compensate. It adds meaning only for dryRun, force, and duplicate-media handling, leaving most parameters such as type vs specFile, caption vs captionFile, trial, collaborators, and media shape unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 to Instagram NOW.' The emphasis on NOW and blocking behavior helps distinguish it from scheduled or queued publishing siblings, but it does not explicitly name an alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear guidance for dryRun and force, including validating first and overriding duplicate-media refusal. However, it does not explicitly say when to choose ig_publish over ig_schedule, ig_check_media, or queue-related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ig_queue_cancelC
Cancel a pending queue item.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a mutation but does not state whether cancellation is reversible, what permissions are required, what happens to an item that is not pending, or what the response 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with zero wasted words. It is appropriately sized for a simple one-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and an undocumented required parameter, the description is too sparse. It should at least identify what the id refers to and what happens on success or failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter 'id' has no description in the schema. The tool description does not clarify whether this is the queue item ID, the media ID, or another identifier, leaving a meaningful gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: cancel a pending queue item. It is immediately clear what operation is performed, though it does not explicitly differentiate this from sibling tools like ig_queue_retry or ig_queue_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, nor any preconditions beyond the word 'pending'. The agent must infer that this is for removal of queued items and not for retrying or listing them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ig_queue_listA
List pending/running queue items (all:true for full history).
| Name | Required | Description | Default |
|---|---|---|---|
| all | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. 'List' signals a read operation and the parenthetical discloses the key behavioral distinction between pending/running and full history, but it omits return format, ordering, pagination, and permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. The default scope is stated first and the parameter behavior is appended compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter list tool with no annotations or output schema, the description covers the core scope and flag behavior. It still leaves gaps around return values, ordering, and how it differs from adjacent history-oriented tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 for the single boolean parameter. It does so effectively by explaining that all:true returns full history while the default is pending/running, giving the boolean meaningful behavior beyond its bare type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('List') and resource ('queue items') and clarifies the default scope as pending/running. It does not, however, distinguish this from siblings like ig_history or explain why one would choose this list over that one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the default pending/running scope and the all:true full-history mode. There is no explicit guidance on when to use this versus ig_history or how it relates to queue action tools such as ig_queue_cancel and ig_queue_retry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ig_queue_retryC
Re-schedule a failed/cancelled/pending queue item.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| when | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It identifies eligible item states but says nothing about mutation effects, whether the retry is immediate or deferred, permission requirements, idempotency, or what happens to the item's existing schedule.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words, which is good. However, its extreme brevity is under-specification rather than effective conciseness, and it provides no structure around the optional 'when' parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and two parameters at 0% schema coverage, this description is too thin. It does not explain the action's effect, the role of 'when,' or what the caller should expect after rescheduling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters. It does not: 'id' is only implicitly referenced by 'queue item,' and the optional 'when' parameter is not mentioned at all, leaving its meaning and format completely undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Re-schedule' a 'queue item.' It also narrows scope to failed/cancelled/pending items. It does not, however, distinguish this tool from siblings such as ig_queue_cancel or ig_schedule, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by naming eligible item states ('failed/cancelled/pending'), but it never explicitly says when to choose this over ig_queue_cancel or ig_schedule. There are no prerequisites or exclusions, leaving alternatives to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ig_replyB
Reply to a comment. Posts publicly — confirm the text with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| commentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose the two most important traits — the reply is public and the text should be user-confirmed. It omits whether the reply can be edited or deleted, whether auth/ownership of the account is required, and any rate limits, leaving real behavioral gaps for a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and immediately followed by the safety constraint. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter, no-output tool the description covers the critical public-write warning, but it leaves both parameters undocumented and gives no hint of the response, which is a real gap at 0% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, and it says nothing about the two parameters. An agent must guess that commentId identifies the parent comment and that message accepts only plain text (no media, no mention syntax).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Reply to a comment" gives a specific verb plus resource, which separates it from ig_comments (reading) and ig_publish/ig_schedule (posting new content). It does not explicitly name any sibling as the alternative, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when someone has commented and you want to respond) and adds a workflow gate: confirm the text with the user first. It never says when NOT to use it (e.g., vs ig_publish for top-level posts, or ig_comments to just read), so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ig_scheduleB
Queue a post for later. when: "+2h", "09:00", "ertaga 09:00", "2026-10-27 18:30" (local time) or "now". Published by the systemd timer (ig scheduler install).
| Name | Required | Description | Default |
|---|---|---|---|
| fix | No | Auto-fix media with ffmpeg (default true) | |
| type | No | reel | image | carousel | story (specFile bo‘lmasa majburiy) | |
| when | Yes | ||
| cover | No | Reel cover image (png/jpg, converted automatically) | |
| label | No | Name shown in history/notifications, e.g. my-series-002 | |
| media | No | Absolute local paths or public https URLs. reel/image/story: 1, carousel: 2-20 | |
| trial | No | ||
| altText | No | ||
| caption | No | ||
| specFile | No | Path to a post JSON spec instead of the fields below | |
| userTags | No | ||
| audioName | No | ||
| locationId | No | ||
| aiGenerated | No | ||
| captionFile | No | ||
| shareToFeed | No | Reel also in main feed (default true) | |
| collaborators | No | ||
| thumbOffsetMs | No |
TDQS
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 usefully discloses that publication is handled by the systemd timer and references `ig scheduler install`, but it omits permissions, failure behavior, idempotency, and what happens to the queued item after scheduling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, front-loaded with the core action. The scheduling format examples and timer note are compact and earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter scheduling mutation with no annotations, no output schema, and low schema coverage, the description is too thin. It explains `when` and the timer mechanism but leaves most operational details uncovered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 39% across 18 parameters. The description adds valuable format examples for the required `when` parameter, which has no schema description, but it does not compensate for undocumented fields like type, media, caption, collaborators, or trial semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Queue a post for later.' This distinguishes scheduling from immediate publishing at a high level, though it does not explicitly name ig_publish or other queue-related siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'for later,' but the description does not explicitly say when to use this instead of ig_publish or how it relates to ig_queue_list, ig_queue_cancel, or ig_queue_retry. It also allows 'when': 'now', which blurs the boundary with immediate 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.
12 tool updates
v0.1.0- First observed
ig_account - First observed
ig_check_media - First observed
ig_comments - First observed
ig_history - First observed
ig_insights - First observed
ig_media_list - First observed
ig_publish - First observed
ig_queue_cancel - First observed
ig_queue_list - First observed
ig_queue_retry - First observed
ig_reply - First observed
ig_schedule
TDQS
Scored across 12 tools
Most tools have clearly distinct purposes: publish vs schedule vs queue management vs read-only insights. The only mild overlap is between ig_history (publish attempts), ig_media_list (posts on account), and ig_queue_list (pending items), but the descriptions make the boundaries reasonably clear.
All tools share a consistent ig_ prefix and snake_case, with a predictable queue_ sub-grouping. Minor deviation: some names are nouns (ig_account, ig_history, ig_insights, ig_comments) while others are verb-led (ig_publish, ig_check_media, ig_reply), but overall readable and coherent.
12 tools is well within the ideal 3-15 range and each tool maps to a distinct operation in the Instagram publishing workflow. No obvious filler tools.
The surface covers the full publish lifecycle: validate, publish, schedule, queue management, history, media listing, insights, and comments/replies. Notable gaps remain around post management (delete/unpublish, edit caption) and comment moderation (delete/hide), which agents may need.
Maintenance
Related MCP Connectors
MCP server for QPost — lets AI agents publish video and image posts to YouTube, TikTok, Instagram.
Agent-first social media publishing, scheduling, analytics, and unified inbox API + 16-tool MCP server across 18 social platforms (X, LinkedIn, Instagram, YouTube, TikTok, Threads, Bluesky, Reddit, Telegram, Discord, Mastodon, Facebook, Pinterest).
PostHero MCP server — schedule and publish social media posts from any MCP-compatible AI tool
Create, review, publish and schedule Instagram images, carousels and Reels with AI assistants.
Related MCP Servers
- AlicenseBqualityBmaintenanceMCP server for Instagram Graph API, Threads API & Meta platform — posting, insights, comments, messaging66722 npm31MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for automatic Instagram publishing — single image, carousel and Reels — via the official Instagram Graph API.11 npm-
- AlicenseAqualityCmaintenanceInstagram publishing MCP server using official Graph API, supporting single image and carousel posts, publishing limits, and token refresh. Works with any MCP client over stdio or HTTP.4AGPL 3.0
- FlicenseNot gradedqualityCmaintenanceA production-ready MCP server for interacting with Instagram/Meta APIs, enabling AI agents to manage content, analyze performance, research competitors, and handle publishing workflows.-