주제를 Instagram 게시글(이미지/비디오/릴) 초안으로 작성해 즉시 발행합니다. 저장된 문체 프로필이 있으면 자동 적용합니다. 큐·예약·상태머신 없이 세션 안에서 직접 발행합니다. 예약·정기 발행은 사용 중인 앱의 예약 기능을 확인합니다.
다음과 같은 요청 시 사용하세요:
- "이 주제로 Instagram 포스트 작성해줘"
- "인스타에 올릴 이미지 캡션 써줘"
- "이 영상 인스타 릴로 올려줘" (share_to_feed)
- "인스타에 비디오 게시해줘"
- "이 뉴스를 Instagram 용으로 요약해줘"
- "이 초안 인스타에 바로 올려줘" (승인 → 즉시 발행)
[책임 경계] vs 형제 스킬: Instagram 이미지/비디오/릴 *초안 작성·즉시 발행* 만 담당합니다. 댓글 관리는 instagram-comments 스킬, Threads 발행은 threads-* 스킬, 멀티 채널 포맷은 threads-multichannel 스킬을 사용하세요. 예약·정기 발행은 앱에서 ...
Installs into .claude/skills of the current project.
Are you the author of Instagram Post?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/modu-ai-instagram-post-moai-cowork)
---
name: instagram-post
description: |
주제를 Instagram 게시글(이미지/비디오/릴) 초안으로 작성해 즉시 발행합니다. 저장된 문체 프로필이 있으면 자동 적용합니다. 큐·예약·상태머신 없이 세션 안에서 직접 발행합니다. 예약·정기 발행은 사용 중인 앱의 예약 기능을 확인합니다.
다음과 같은 요청 시 사용하세요:
- "이 주제로 Instagram 포스트 작성해줘"
- "인스타에 올릴 이미지 캡션 써줘"
- "이 영상 인스타 릴로 올려줘" (share_to_feed)
- "인스타에 비디오 게시해줘"
- "이 뉴스를 Instagram 용으로 요약해줘"
- "이 초안 인스타에 바로 올려줘" (승인 → 즉시 발행)
[책임 경계] vs 형제 스킬: Instagram 이미지/비디오/릴 *초안 작성·즉시 발행* 만 담당합니다. 댓글 관리는 instagram-comments 스킬, Threads 발행은 threads-* 스킬, 멀티 채널 포맷은 threads-multichannel 스킬을 사용하세요. 예약·정기 발행은 앱에서 지원 여부를 확인합니다.
version: "1.2.2"
---
# Instagram 포스트 작성·직접 발행 (instagram-post)
## 개요
주제를 받아 Instagram 초안(캡션 + 미디어)을 작성하고, **발행 전에 사실·개인정보·문장·미디어를 점검한 뒤**, 최종본을 사용자가 승인하면 **즉시** Graph API 로 발행합니다. 이 스킬은 `instagram_publish_image` / `instagram_publish_video` / `instagram_publish_reel` 도구를 호출합니다.
발행은 공개된 사업 계정에 되돌릴 수 없이 나가는 일입니다. 맞춤법이 틀렸거나 AI 티가 나는 캡션이 한 번 올라가면 그대로 남습니다 — 그래서 감사가 선택이 아니라 필수 단계입니다.
> **Instagram Professional(Business 또는 Creator) 계정만 지원** 됩니다. Personal 계정은 Graph API 로 발행할 수 없습니다.
> 본 스킬은 즉시 발행만 합니다. 예약·정기 발행은 사용 중인 앱에서 해당 기능이 실제로 제공되는지 확인합니다.
## 트리거 키워드
Instagram, 인스타, 인스타그램, 릴, REEL, 캡션, 이미지 발행, 비디오 발행
## 워크플로우
### 0단계: 문체 적용 (있으면)
초안 작성 *전* 에 `threads_style_load` 로 저장된 문체 프로필을 확인한다 (Threads 스킬이 저장한 프로필을 Instagram 캡션에도 재사용). 프로필이 있으면 그 차원(말투·문장 길이·오프닝·이모지·시그니처) 을 캡션에 반영한다.
### 1단계: 미디어 타입 결정 + 캡션 작성
| 미디어 | 도구 | 비고 |
|---|---|---|
| 이미지 | `instagram_publish_image` | **JPEG-only** (PNG 거부됨 — Threads 와 상이) |
| 비디오 | `instagram_publish_video` | 공개 URL, container 폴링 후 발행 |
| 릴 | `instagram_publish_reel` | `share_to_feed=True` (기본) 면 피드에도 공유 |
- **캡션**: Instagram 캡션은 2200자 권장(해시태그 포함). 핵심 메시지는 첫 2줄에.
- **해시태그**: 5-15개 권장. 본문과 분리해 마지막에 배치하거나 첫 댓글로.
- **이미지 URL**: 반드시 **공개 접근 가능** 해야 한다 (Meta 가 서버에서 cURL 로 가져간다). 비공개/서명 URL 은 거부된다.
### 2단계: 발행 전 최종 점검 (필수)
캡션을 사용자에게 보여주기 전에 주장·수치·고유명사와 미디어를 원자료와 대조하고, 미공개 정보·개인정보가 없는지 확인한다. 맞춤법·띄어쓰기·어색한 반복을 직접 읽어 고친 뒤 원래 뜻을 다시 대조한다. 출처나 공개 가능 여부를 확인하지 못하면 발행을 보류한다.
- **[HARD] 점검이 승인보다 앞이다.** 사용자는 발행될 바로 그 캡션과 미디어를 보고 승인해야 한다.
- **[HARD] 캡션 길이는 최종본 기준으로 다시 센다.** 해시태그를 포함해 한도를 확인한다.
- `moai-coworker:ai-slop-reviewer`, `moai-writer:korean-spell-check`, `moai-writer:korean-humanize`가 현재 세션에 있으면 보조 검수에 사용할 수 있다. 별도 플러그인 설치를 발행 조건으로 삼지 않는다. 외부 맞춤법 서비스를 쓰기 전에 미공개 정보나 개인정보가 전송되는지 확인한다.
- 보조 검수에서 `hold_and_report`가 나오거나 의미 보존을 확인할 수 없으면 발행하지 않고 1단계로 돌아간다. 보조 검수 뒤에도 최종본을 직접 다시 읽는다.
### 3단계: 최종본 확인 (승인 게이트)
점검을 마친 **최종본**을 사용자에게 보여주고 승인을 받는다. **승인 없이는 발행하지 않는다** ("자동 아닌 자율").
- **[HARD] 승인은 사용자에게 승인서를 그대로 보여주고 명시적 응답을 받는다.** 대화체로 "괜찮으세요?"라고 묻지 않는다 — 발행은 되돌릴 수 없으므로 사용자가 명시적으로 고르게 한다.
- **[HARD] 실제로 넘어가는 인자를 전부 보여준다.** 요약이 아니라 다음을 그대로 제시한다:
| 보여줄 것 | 왜 |
|---|---|
| 점검을 마친 캡션 전문 + 최종 글자 수 | 발행될 문장 그 자체 |
| 미디어 타입 (IMAGE / VIDEO / REEL) | 어느 도구가 호출되는지 결정 |
| `image_url` / `video_url` **원문 그대로** | 어떤 이미지·영상이 올라가는지 |
| 릴이면 `share_to_feed` 값 | `True`면 **피드에도** 공유된다 — 요약에 묻히면 사용자가 모른 채 승인한다 |
| 발행 계정 (`instagram_get_profile` 의 username) | 여러 계정을 쓰는 경우 오발행 방지 |
| 해시태그 목록 | |
| 최종 점검 결과 한 줄 | 무엇이 바뀌었는지 |
- 사용자가 수정을 요청하면 1단계로 돌아가 다듬고, **최종 점검을 다시 한 뒤** 재승인을 받는다.
- 사용자가 승인하면 4단계로 간다.
선택지는 「이대로 발행」 / 「수정 요청」 / 「발행 취소」로 구성한다.
### 4단계: 즉시 발행 (승인 시)
승인된 초안을 미디어 타입에 맞춰 즉시 발행한다:
```python
instagram_publish_image(text="<캡션>", image_url="https://example.com/photo.jpg")
# → {media_id, container_id, permalink_hint, platform: "instagram"}
```
```python
instagram_publish_reel(text="<캡션>", video_url="https://example.com/reel.mp4", share_to_feed=True)
# REELS/VIDEO 는 container 가 FINISHED 될 때까지 폴링 후 발행된다.
```
**[HARD] 애매하게 실패하면 재시도하지 않는다.** Instagram 발행은 컨테이너 생성 → 발행 2단계이고, 릴·비디오는 컨테이너가 `FINISHED` 될 때까지 폴링한다. 타임아웃·응답 없음으로 끝나면 **1단계만 성공했을 수 있다** — 그대로 다시 호출하면 같은 글이 두 번 올라가거나 중복 컨테이너가 남는다.
**[HARD] 이 서버에는 발행 여부를 되물을 도구가 없다.** `instagram_get_profile`은 계정 정보만 반환하고, `instagram_insights`·`instagram_comments_list`는 조회하려면 이미 `media_id`가 있어야 하는데 애매한 실패에서는 그 값이 없다. 따라서 **사용자에게 Instagram 앱에서 직접 확인해 달라고 요청**하고, 올라가지 않았다는 확인을 받은 뒤에만 다시 발행한다. 스킬이 혼자 판단하지 않는다.
> 발행은 세션 안에서 즉시 일어난다. 백그라운드 자동 발행은 없다. 예약이 필요하면 사용 중인 앱의 지원 여부를 확인한다.
## 주의사항
| 상황 | 대응 |
|------|------|
| 이미지가 PNG | JPEG 로 변환 후 재시도 (`.png` URL 은 빠른 실패) |
| 미디어 URL 이 비공개 | 공개 URL 사용 (Meta 가 서버에서 fetch) |
| `setup_required` 에러 | 앱 설정 또는 사용자 홈의 `.moai/mcp/threads.json`에 `IG_ACCESS_TOKEN`, `IG_USER_ID` 설정 (CONNECTORS.md 참조) |
| Personal 계정 오류 | Instagram Professional(Business/Creator) 계정만 지원 — 계정 전환 필요 |
| 예약·정기 발행 요청 시 | 앱에서 지원 여부를 확인하고, 본 스킬은 즉시 발행만 한다고 안내 |
| 출처·공개 가능 여부 미확인 또는 보조 검수 `hold_and_report` | 발행하지 않음. 사유를 보여주고 1단계로 복귀 |
| 캡션에 미공개 정보가 섞임 | 공개 여부를 확인할 때까지 발행 보류. 외부 맞춤법 서비스에 전송하지 않음 |
| 발행 도구가 애매하게 실패 | 재시도 금지. 사용자에게 Instagram 앱 확인을 요청한 뒤 판단 |
| "점검 건너뛰고 바로 올려줘" 요청 | 점검을 마친 최종본을 승인받은 뒤 발행 |
## 출력 형식
```markdown
## Instagram 포스트 (발행 완료)
<캡션>
**미디어**: IMAGE / VIDEO / REEL — <URL>
**해시태그**: # ...
**결과**:
- media_id: ... · permalink_hint: 서버가 반환한 참고값 (실제 게시물 링크는 Instagram에서 확인)
```
## 발행 전 설정 (최초 1회)
Instagram 자격증명(Threads 와 별개) 이 필요하다:
**토큰은 `.mcp.json`에 직접 쓰지 않는다.** 이 파일은 저장소에 커밋되므로 값을 그대로 넣으면
토큰이 git 이력·diff·배포 패키지에 남는다. 파일에는 **참조만** 둔다.
```json
{
"env": {
"IG_ACCESS_TOKEN": "${IG_ACCESS_TOKEN}",
"IG_USER_ID": "${IG_USER_ID}"
}
}
```
실제 값은 앱 설정 또는 사용자 홈의 `.moai/mcp/threads.json`에 넣는다. 서버의 자격증명 읽기 순서는 `CONNECTORS.md`를 따른다. 아래 환경변수 예시는 개발자가 셸에서 직접 실행할 때만 사용한다.
**macOS / Linux**:
```bash
export IG_ACCESS_TOKEN="<Facebook Page 장기 액세스 토큰>"
export IG_USER_ID="<Instagram Professional 계정 ID>"
```
**Windows** (PowerShell):
```powershell
$env:IG_ACCESS_TOKEN = "<Facebook Page 장기 액세스 토큰>"
$env:IG_USER_ID = "<Instagram Professional 계정 ID>"
```
발급 절차(Meta App → Facebook Login → 장기 Page 토큰 → IG_USER_ID 해석) 는 `mcp-servers/moai-mcp-threads-poster/CONNECTORS.md` 의 Instagram 섹션 참조.
**동작 확인**: `instagram_get_profile` 도구 호출 → 프로필 정보 반환되면 연동 성공.
## 관련 스킬
| 스킬 | 사용 시점 |
|------|----------|
| `instagram-comments` | 발행 후 댓글 관리 (목록/답글/숨김) |
| `threads-post-draft` | Threads 용 초안 작성·발행 |
| `threads-style-learn` | 문체 프로필 분석·저장 (본 스킬이 초안에 적용) |
| `moai-coworker:ai-slop-reviewer` | 노출된 경우 AI 문구 추가 검토 |
| `moai-writer:korean-spell-check` | 노출되고 외부 전송이 허용된 경우 맞춤법 제안 |
| `moai-writer:korean-humanize` | 노출된 경우 `장르: 카피`로 추가 윤문·의미 검수 |
## 이 스킬을 사용하지 말아야 할 때
- 댓글 관리: `instagram-comments` 스킬 사용
- Threads 발행: `threads-*` 스킬 / 도구 사용
- 예약·정기 발행: 사용 중인 앱의 지원 여부 확인 (본 플러그인은 즉시 발행만)