SuperAPI AI Directory

instagram-post

Marketing & growth

View repository

Updated 10-15 21:02

About this skill

Instagram post creation and direct publishing (instagram-post)

Overview

Take the topic, write an Instagram-optimized draft (caption + media), and before publishing, audit the Korean-language quality of the caption, then, once the user approves the final version that passed the audit, immediately publish via the Graph API. This skill instagram_publish_image / instagram_publish_video / instagram_publish_reel calls the tools.

Publishing is an irreversible act that goes out to a public business account. If a caption with spelling errors or an AI-ish feel goes up once, it stays that way — which is why the audit is not optional but a required step.

Only Instagram Professional (Business or Creator) accounts are supported . Personal accounts cannot publish via the Graph API.

Scheduled and recurring publishing is handled by Claude Cowork. The Instagram Graph API itself does not provide server-side scheduling parameters, so this skill only publishes immediately.

Trigger keywords

Instagram, Insta, Instagram, reel, REEL, caption, image publishing, video publishing

Workflow

Step 0: Apply style (if any)

Draft creation 전 에 threads_style_load Check the style profile saved in . (The profile saved by the Threads skill is also reused for Instagram captions.) If a profile exists, reflect its dimensions (tone, sentence length, opening, emoji, signature) in the caption.

Step 1: Determine media type + write caption

Media Tool Notes
Image instagram_publish_image JPEG-only (PNG is rejected — differs from Threads)
Video instagram_publish_video Public URL, publish after container polling
릴 instagram_publish_reel share_to_feed=True (default) also share to feed
  • Caption: Instagram captions are recommended at 2200 characters (including hashtags). Put the core message in the first 2 lines.
  • Hashtags: 5-15 recommended. Place them at the end separated from the body, or as the first comment.
  • Image URL: Must be publicly accessible (Meta fetches it server-side with cURL). Private/signed URLs are rejected.

Step 2: 3-stage Korean audit (required before publishing)

Before showing the caption to the user before , pass it through ⟨the 3-stage Korean audit⟩. The order is fixed:

  moai-coworker:ai-slop-reviewer     1차 일반 슬롭 정리
→ moai-writer:korean-spell-check     2차 맞춤법 — 제안 수집 (미공개 정보가 섞였으면 건너뜀)
→ moai-writer:korean-humanize        3차 정밀 윤문 + 맞춤법 반영 + Phase 6 최종 검수
  • [HARD] The audit comes before approval. If the caption is modified after approval, the text the user approved and the text that gets published become different. The user must the very caption that will be publishedview and approve it.
  • [HARD] korean-humanizecomes last. The final review in Phase 6 judged that that very outputis published.
  • [HARD] The genre is 카피다. SNS captions are copy, not prose. If you apply prose standards, a normal rewrite gets caught by the change-rate gate and halted.
  • [HARD] If the judgment is hold_and_report, do not publish. Show the reason as-is and return to step 1.
  • [HARD] After the audit, count the caption length again. Because the audit edits sentences, the 2200-character judgment is based on the final version .
  • Hashtags are not subject to the audit (proper nouns/tag strings). Only the caption body is processed.

korean-spell-checksends the original text to an external service (nara-speller.co.kr). Instagram captions are text that will be made public anyway, so there is usually no problem. However, not-yet-public information(unannounced release dates, non-public results, counterparties to contracts) is mixed in, skip this step — even if omitted, korean-humanizealso checks spelling.

Step 3: Final version confirmation (approval gate)

Show the final versionthat passed the audit to the user and get approval. Do not publish without approval ("autonomous, not automatic").

  • [HARD] For approval, show the approval document to the user as-is and get an explicit response. Do not ask in a conversational tone, "Is this okay?" — publishing is irreversible, so have the user choose explicitly.

  • [HARD] Show all the arguments that are actually passed. Do not summarize; present the following as-is:

    What to show 왜
    The full caption text that passed the audit + final character count The sentence itself that will be published
    Media type (IMAGE / VIDEO / REEL) Determines which tool is called
    image_url / video_url Original text as-is Which image/video is being uploaded
    If it is a reel, share_to_feed 값 True면 also to the feed it is shared — if it is buried in a summary, the user approves without knowing
    Publishing account (instagram_get_profile 의 username) Prevents misposting when using multiple accounts
    Hashtag list
    One-line result of the 3-stage audit What changed
  • If the user requests edits, return to step 1, refine, pass the 3-stage audit again , and then get re-approval.

  • If the user approves, go to step 4.

The options consist of "Publish as-is" / "Request edits" / "Cancel publishing".

Step 4: Immediate publishing (upon approval)

Publish the approved draft immediately according to the media type:

instagram_publish_image(text="<캡션>", image_url="https://example.com/photo.jpg")
# → {media_id, container_id, permalink_hint, platform: "instagram"}
instagram_publish_reel(text="<캡션>", video_url="https://example.com/reel.mp4", share_to_feed=True)
# REELS/VIDEO 는 container 가 FINISHED 될 때까지 폴링 후 발행된다.

[HARD] If it fails ambiguously, do not retry. Instagram publishing is a two-step process: create a container → publish, and for Reels/videos, poll until the container is FINISHED ready. If it ends with a timeout or no response, only step 1 may have succeeded — calling it again as-is will either post the same content twice or leave a duplicate container behind.

[HARD] This server has no tool to ask back whether publishing occurred. instagram_get_profilereturns only account information, and instagram_insights·instagram_comments_listto look it up, you must already have media_idbut in an ambiguous failure that value is not available. Therefore, ask the user to check directly in the Instagram app, and only republish after receiving confirmation that it was not posted. The skill does not decide on its own.

Publishing happens immediately within the session. There is no background automatic publishing. If scheduling is needed, hand it off to Claude Cowork.

Cautions

Situation Response
Image is PNG Convert to JPEG and retry (.png URL fails fast)
Media URL is private Use a public URL (Meta fetches it from the server)
setup_required error IG_ACCESS_TOKEN, IG_USER_ID Set the environment variable (see CONNECTORS.md)
Personal account error Only Instagram Professional (Business/Creator) accounts are supported — account conversion required
When scheduling/regular publishing is requested Guide them to hand it off to Claude Cowork (this skill only publishes immediately)
At audit stage 3, hold_and_report verdict Do not publish. Show the reason as-is and return to step 1
Caption contains undisclosed information korean-spell-check Omit (external transmission) — note the omission in the result
Publishing tool fails ambiguously Do not retry. Ask the user to check the Instagram app, then decide
"Skip the audit and just post it" request Do not skip. Inform them that this is an irreversible public post and proceed with the audit

Output format

## Instagram 포스트 (발행 완료)

<캡션>

**미디어**: IMAGE / VIDEO / REEL — <URL>
**해시태그**: # ...

**결과**:
- media_id: ... · permalink: https://www.instagram.com/p/.../

Pre-publishing setup (one time only)

Instagram credentials (separate from Threads) are required:

Do not write the token directly into .mcp.json. Since this file is committed to the repository, putting the value in as-is will leave the token in git history, diffs, and deployment packages. In the file, put only the reference .

{
  "env": {
    "IG_ACCESS_TOKEN": "${IG_ACCESS_TOKEN}",
    "IG_USER_ID": "${IG_USER_ID}"
  }
}

Put the actual value only in the operating system environment variables.

macOS / Linux:

export IG_ACCESS_TOKEN="<Facebook Page 장기 액세스 토큰>"
export IG_USER_ID="<Instagram Professional 계정 ID>"

Windows (PowerShell):

$env:IG_ACCESS_TOKEN = "<Facebook Page 장기 액세스 토큰>"
$env:IG_USER_ID = "<Instagram Professional 계정 ID>"

For the issuance procedure (Meta App → Facebook Login → long-lived Page token → IG_USER_ID resolution), see mcp-servers/moai-mcp-threads-poster/CONNECTORS.md the Instagram section.

Verifying operation: instagram_get_profile tool call → if profile information is returned, the integration succeeded.

Related skills

Skill When to use
instagram-comments Comment management after publishing (list/reply/hide)
threads-post-draft Drafting and publishing for Threads
threads-style-learn Style profile analysis·save (this skill applies to drafts)
moai-coworker:ai-slop-reviewer 3-stage audit, 1st — general AI slop cleanup (required before publishing)
moai-writer:korean-spell-check 3-stage audit, 2nd — spelling·spacing (omitted when undisclosed information is present)
moai-writer:korean-humanize 3-stage audit, 3rd — precise copyediting + final review (장르: 카피, required before publishing·last)

When not to use this skill

  • Comment management: instagram-comments skill usage
  • Threads publishing: threads-* skill / tool usage
  • Scheduled·regular publishing: Claude Cowork (this plugin supports immediate publishing only)