| name | instagram-comments |
| description | Instagram 미디어의 댓글을 관리합니다 — 목록 조회, 답글 작성, 댓글 숨김. `manage_comments` 권한이 부여된 경우에만 동작합니다. 발행된 게시물의 댓글 모더레이션(응대/정리) 에 사용합니다.
다음과 같은 요청 시 사용하세요:
- "인스타 게시물 댓글 확인해줘"
- "이 댓글에 답글 달아줘"
- "스팸 댓글 숨겨줘"
- "최근 포스트 댓글 정리해줘"
- "특정 댓글 숨김 처리해줘"
[책임 경계] vs 형제 스킬: Instagram 댓글 *조회/답글/숨김* 만 담당합니다. 포스트 발행은 instagram-post 스킬, 인사이트 조회는 instagram_insights 도구를 직접 사용하세요.
|
| version | 1.3.0 |
Instagram 댓글 관리 (instagram-comments)
개요
발행된 Instagram 미디어의 댓글을 조회하고, 답글을 달고, 댓글을 숨긴다. 이 스킬은 Instagram Graph API 의 댓글 엔드포인트(manage_comments 권한 게이트) 를 통해 instagram_comments_list / instagram_comments_reply / instagram_comments_hide 도구를 호출한다.
권한: 세 가지 도구 모두 Meta 앱에 manage_comments 권한이 부여되어 있어야 한다. 권한이 없으면 API 가 거부한다.
트리거 키워드
댓글, comment, 답글, reply, 숨김, hide, 모더레이션, 스팸, 정리
워크플로우
1단계: 댓글 목록 조회
특정 미디어(media_id) 의 댓글을 나열한다:
instagram_comments_list(media_id="<미디어 ID>")
media_id 는 instagram_publish_image 등 발행 도구가 반환한 media_id (또는 instagram_insights 로 조회한 미디어 ID).
2단계: 답글 초안 작성
특정 댓글에 달 답글을 먼저 초안으로만 쓴다. 이 단계에서는 아직 아무것도 발행하지 않는다.
답글 본문도 저장된 문체 프로필을 반영해 작성한다 (있으면). 공격적/스팸 댓글에는 답글 대신 숨김을 권장.
3단계: 한국어 감사 3단 (답글 발행 전 필수)
답글은 브랜드 계정 이름으로 공개된 자리에 나가고, 사업 계정에 그대로 남는다. 사용자에게 보여주기 전에 ⟨한국어 감사 3단⟩을 통과시킨다. 순서는 고정이다:
moai-coworker:ai-slop-reviewer 1차 일반 슬롭 정리
→ moai-writer:korean-spell-check 2차 맞춤법 — 제안 수집 (미공개 정보가 섞였으면 건너뜀)
→ moai-writer:korean-humanize 3차 정밀 윤문 + 맞춤법 반영 + Phase 6 최종 검수
- [HARD]
korean-humanize가 마지막이다. Phase 6 최종 검수가 판정한 바로 그 산출물이 발행된다.
korean-spell-check는 원문을 외부 서비스(nara-speller.co.kr)로 보낸다. 답글에 아직 공개되지 않은 정보(미발표 출시일·비공개 실적·고객 개인정보)가 섞였다면 이 단계를 건너뛴다 — 생략해도 korean-humanize가 맞춤법을 함께 본다. 생략했으면 그 사실을 결과에 적는다.
- 감사가
hold_and_report로 판정하면 발행하지 않는다. 사유를 그대로 보여주고 2단계로 돌아간다.
4단계: 승인 게이트 (답글·숨김 공통)
[HARD] 답글 발행과 댓글 숨김은 승인 없이 실행하지 않는다. 둘 다 고객이 보는 자리에서 일어나는 일이다.
- [HARD] 승인은 §승인 요청 계약의 경로로 받는다. 산문으로 "올릴까요?"라고 묻지 않는다. 물을 수 없다는 이유로 게이트를 건너뛰지 않는다 — 경로 선택은 §승인 요청 계약을 따른다.
- [HARD] 요약하지 말고 실제로 넘어가는 인자 전부를 그대로 보여준다:
| 보여줄 것 | 답글 | 숨김 |
|---|
발행 계정 (IG_USER_ID) | ✓ | ✓ |
대상 게시물 media_id | ✓ | ✓ |
대상 댓글 comment_id | ✓ | ✓ |
| 대상 댓글 원문 전문과 작성자 | ✓ | ✓ |
| 감사를 마친 답글 전문과 바이트 수 | ✓ | — |
| 감사 3단에서 무엇이 바뀌었는지 한 줄 | ✓ | — |
| 숨김 사유 (스팸 / 비난 / 기타) | — | ✓ |
승인 선택지는 이렇게 구성한다:
| 선택지 | 뜻 |
|---|
| 이대로 실행 (권장) | 보여준 인자 그대로 답글 발행 또는 숨김 |
| 고쳐 쓰기 / 대상 바꾸기 | 2단계로 복귀 → 감사 3단 재통과 → 재승인 |
| 취소 | 아무것도 실행하지 않고 종료 |
- [HARD] 여러 댓글을 한꺼번에 처리할 때도 건별로 보여준다. "스팸 5건 숨김" 같은 묶음 승인은 금지한다 — 5건 중 하나가 정당한 고객 불만이어도 사용자가 알 수 없다. 목록으로 한 번에 제시하되, 각 건의 댓글 원문·작성자·사유가 모두 보여야 한다.
숨김은 되돌릴 수 있다(아래 5단계). 그래도 승인을 받는 이유는, 숨김이 누군가를 침묵시키는 결정이기 때문이다. 되돌릴 수 있다는 것과 해도 된다는 것은 다르다. 특히 스팸으로 잘못 분류된 정당한 불만을 숨기면, 고객은 자기 댓글이 사라진 것을 보고 브랜드를 떠난다.
5단계: 실행
승인된 것만 실행한다.
instagram_comments_reply(comment_id="<댓글 ID>", text="<감사를 마치고 승인된 답글>")
instagram_comments_hide(comment_id="<댓글 ID>")
숨김은 가역적이다 — Meta 정책에 따라 다시 보이게 할 수 있다. 답글은 가역적이지 않다.
- [HARD] 실패해도 자동 재시도하지 않는다. 답글 발행이 애매하게 실패하면(타임아웃·응답 없음) 재시도하지 않고 멈춘다. 성공 신호가 없다는 것은 답글이 달리지 않았다는 증거가 아니며, 확인 없는 재시도는 같은 답글을 두 번 단다.
- [HARD] 이 서버에는 답글이 달렸는지 확인할 수단이 없다.
instagram_comments_list(media_id) 는 그 미디어의 댓글 목록만 가져온다 — 특정 댓글에 달린 답글(replies) 은 조회하지 않는다(instagram_api.py comments_list). 게다가 그 엔드포인트 경로 자체가 아직 검증 대상(@MX:TODO)이다. 이 도구로 "답글 없음"을 판정하면 성공한 답글을 못 본 채 두 번 달게 된다.
- 따라서 애매한 실패 뒤에는 사용자에게 Instagram 앱·웹에서 해당 댓글을 직접 열어 확인해 달라고 요청하고, 달리지 않았다는 사용자의 확인을 받은 뒤에만 다시 실행한다. 스킬이 혼자 판정하지 않는다.
- 나중에 replies 를 조회하는 도구가 실제로 노출되면 그때 이 조항을 바꾼다. 도구가 있을 것이라 가정하고 미리 써 두지 않는다.
승인 요청 계약 (런타임 중립)
[HARD] 이 스킬의 게이트는 특정 도구 이름에 묶이지 않는다. AskUserQuestion은 Claude 런타임의 수단일 뿐이고, Codex를 비롯한 다른 런타임에는 그 도구가 없다. 도구 이름으로 계약을 쓰면 그 도구가 없는 런타임에서 게이트가 영구 blocker가 되어, 승인이 필요한 모든 작업이 그냥 멈춘다. 그건 안전이 아니라 고장이다.
승인은 아래 순서로 구한다. 위에서부터 실제로 가능한 첫 번째를 쓴다.
승인의 정의는 수단이 아니라 결과다: 승인서를 사용자에게 그대로 보여주고, 그에 대한 명시적 응답을 받는 것. 아래는 그 결과를 만드는 경로들이며, 위에서부터 가능한 첫 번째를 쓴다.
| 순위 | 경로 | 조건 |
|---|
| 1 | 런타임의 구조화 질문 도구 (AskUserQuestion 등) | 그 도구가 현재 세션에 노출돼 있을 때 |
| 2 | 일반 대화로 승인서를 제시하고 다음 턴에서 응답을 받는다 | 사용자와 직접 대화 중일 때. 도구가 없어도 이 경로는 언제나 열려 있다 |
| 3 | 구조화 blocker 반환 → 상위 오케스트레이터가 물어봄 | 서브에이전트로 실행 중일 때 |
[HARD] 런타임의 도구 실행 권한 프롬프트는 승인이 아니다. 그 프롬프트는 "이 도구를 호출해도 되는가"를 물을 뿐, 게이트가 보여주기로 한 인자·견적·동의 문항을 표시하지 않는다. 승인서 전체와 선택지를 실제로 표시하는 경우에만 2번 경로로 인정한다.
[HARD] 2번 경로가 있으므로 "물을 수단이 없다"는 상황은 사실상 없다. 대화가 가능한 곳에서는 언제나 승인서를 글로 제시할 수 있다. fail-closed는 대화도 blocker 반환도 불가능한 완전 무인 실행에만 해당한다 — 그 경우에만 실행하지 않고 멈춘다.
[HARD] 3번을 쓸 때 blocker는 그 자체로 승인 요청서여야 한다. 상위가 무엇을 물어야 할지 모르면 되물을 수 없고, 그러면 교착된다. 다음을 모두 담는다:
- 승인받을 행위 한 줄 (무엇이 되돌릴 수 없는지 / 얼마가 나가는지)
- 게이트가 요구하는 인자 전부 (요약하지 않은 값)
- 선택지 목록 — 상위가 그대로 사용자에게 제시할 수 있는 형태
- 재개 방법 — 어떤 답을 받으면 무엇을 이어서 실행하는지
[HARD] 세 경로가 모두 불가능한 무인 실행에서는 실행하지 않는다(fail-closed). 물을 수단이 없다는 것은 승인을 받았다는 뜻이 아니다. 이때는 "승인 수단이 없어 진행하지 못했다"고 기록하고 멈춘다 — 조용히 진행하지 않는다. 반대로 대화가 가능한데 도구가 없다는 이유로 멈추는 것도 잘못이다. 2번 경로를 쓴다.
이 계약은 CLAUDE.local.md §범용성 원칙(OS 2종 × 런타임 2종에서 동일 동작)의 게이트 쪽 적용이다. 한 런타임에서만 도는 게이트는 미완성으로 본다.
주의사항
| 상황 | 대응 |
|---|
manage_comments 권한 없음 | Meta 앱 검수(App Review) 로 권한 추가 필요 |
setup_required 에러 | IG_ACCESS_TOKEN / IG_USER_ID 환경변수 설정 |
| Personal 계정 | Graph API 미지원 — Professional 계정 필요 |
| 엔드포인트 미검증 | comments 엔드포인트 경로는 run-phase 검증 대상(@MX:TODO) — 최초 사용 시 공식 문서로 경로 재확인 권장 |
감사 3단에서 hold_and_report 판정 | 답글을 발행하지 않음. 사유를 그대로 보여주고 2단계로 복귀 |
| 답글에 미공개 정보·고객 개인정보가 섞임 | korean-spell-check 생략 (외부 전송) — 생략 사실을 결과에 적음 |
| 사용자가 승인 게이트에서 취소 | 아무것도 실행하지 않고 종료. 부분 실행 금지 |
출력 형식
## 댓글 관리 결과
**미디어**: <media_id>
**댓글 수**: N
| 댓글 ID | 작성자 | 본문 | 상태 |
|---|---|---|---|
| ... | ... | ... | 표시/숨김 |
**조치**: (답글/숨김 내역)
발행 전 설정 (최초 1회)
Threads 와 동일한 Instagram 자격증명(IG_ACCESS_TOKEN / IG_USER_ID) 에 추가로 Meta 앱에 manage_comments 권한이 부여되어야 한다. 발급 절차는 mcp-servers/moai-mcp-threads-poster/CONNECTORS.md 의 Instagram 섹션 참조.
관련 스킬
| 스킬 | 사용 시점 |
|---|
instagram-post | 포스트 발행 (댓글 관리 전에 발행이 선행) |
이 스킬을 사용하지 말아야 할 때
- 포스트 발행:
instagram-post 스킬
- 인사이트 조회:
instagram_insights 도구 직접 호출
- Threads 댓글: Threads API 는 본 플러그인 범위 밖