0. sns-relay 는 무엇이고 왜 만들었나
풀고 싶었던 문제
블로그에 글을 하나 쓰면, 그 글을 알리려고 SNS 마다 다시 써야 합니다. Threads 는 짧고 가볍게, 인스타그램은 사진과 캡션으로, 페이스북은 링크와 함께, 네이버는 소제목을 붙여서. 채널마다 말투와 길이, 사진 규칙이 달라서 글 한 편에 30분~1시간이 더 듭니다. 이 일이 쌓이면 블로그를 쓰는 시간보다 옮기는 시간이 더 길어집니다.
sns-relay 가 하는 일
- 블로그 글 주소 또는 메모·사진
- 채널별 초안 Claude 가 작성
- 내가 검토
- 미리보기 dry-run
- Threads · Instagram · Facebook 공식 API 로 게시
- 네이버 붙여 넣기용 원고
- 블로그 글 주소 하나(또는 메모와 사진)를 주면 본문을 읽어 옵니다.
- Claude 가 채널마다 맞는 초안을 씁니다. 사실은 원문에 있는 것만 씁니다.
- 내가 읽고 승인한 초안만 다음 단계로 갑니다.
- 게시 직전에 최종 문구를 미리보기로 한 번 더 보여 줍니다.
- 내가 "올려"라고 해야 Meta 의 공식 API 로 올립니다. 네이버는 공식 글쓰기 API 가 없어서 붙여 넣기용 원고를 만들어 주고, 발행은 직접 합니다.
설계에서 지킨 원칙
| 원칙 | 이유 |
|---|---|
| 사람이 승인한 것만 게시 | AI 가 쓴 글이 내 이름으로 바로 나가지 않게 합니다. 초안을 고치면 승인이 자동으로 풀립니다 |
| 공식 API 만 사용 | 화면을 흉내 내는 자동화(매크로·크롤링)는 계정 정지 위험이 있습니다. Meta 가 허락한 방법만 씁니다 |
| 중복 게시 방지 | 게시 결과를 모르면 다시 올리지 않고 사람에게 확인을 받습니다 |
| 비밀 값은 내 컴퓨터에만 | 토큰은 작업 폴더의 .env 파일에만 두고, 화면·로그·대화에 나오지 않게 합니다 |
| 내 콘텐츠만 | 내 블로그 글, 내 메모, 내 유튜브 영상만 다룹니다. 남의 글을 퍼 나르는 도구가 아닙니다 |
1. 누가 쓰면 좋은가
이런 분께 맞습니다
- 블로그를 운영하면서 SNS 도 같이 하는 1인 운영자·소상공인·프리랜서. 글은 블로그에 쓰고, SNS 는 알리는 통로로 쓰는 분.
- 채널마다 글을 다시 쓰는 시간이 아깝지만, AI 가 마음대로 올리는 것은 불안한 분.
- Claude(Claude Code 또는 Claude Desktop)를 이미 쓰고 있거나 써 볼 생각이 있는 분.
- 개발자가 아니어도 됩니다. 터미널에 명령어 몇 줄을 붙여 넣을 수 있으면 충분합니다. 막히면 AI 에게 물어볼 프롬프트를 이 문서에 넣어 두었습니다.
이런 경우에는 맞지 않습니다
- 사람 확인 없이 완전히 자동으로 매일 수십 개씩 올리고 싶은 경우. sns-relay 는 일부러 사람의 승인을 거칩니다.
- 남의 글이나 영상을 가져와 다시 올리는 경우.
- 페이스북 개인 프로필에 올리고 싶은 경우. Meta 가 2018년에 막아서 페이지에만 올릴 수 있습니다.
- 네이버 블로그 자동 발행이 꼭 필요한 경우. 네이버는 공식 글쓰기 API 가 없어서 반자동입니다.
2. 준비물과 걸리는 시간
| 준비물 | 설명 | 어디서 |
|---|---|---|
| 컴퓨터 | Windows · macOS · Linux | |
| Node.js 22.12 이상 | sns-relay 를 실행하는 프로그램 | 3-1절 |
| git | 저장소를 내려받는 프로그램 | 3-1절 |
| Claude Code 또는 Claude Desktop | AI 와 대화하며 쓰려면 필요합니다. 터미널만 쓸 거면 없어도 됩니다 | claude.ai |
| 인스타그램 계정 | 프로페셔널(비즈니스)로 바꿉니다 | 5-1절 |
| 페이스북 개인 계정 + 페이지 | 페이지를 새로 만듭니다 | 5-2절 |
| Threads 계정 | 공개 계정이어야 합니다 | 5-3절 |
| (선택) Cloudinary 계정 | 내 컴퓨터의 사진을 올릴 때 필요합니다 | 5-10절 |
걸리는 시간: 설치 15분, Meta 계정·토큰 준비 1~2시간(처음 한 번만), 첫 글 올리기 10분. 토큰 준비는 화면을 오가는 일이 많아서 시간 여유가 있을 때 한 번에 하는 것을 권합니다.
3. 설치
3-1. Node.js 와 git 설치
sns-relay 는 Node.js 위에서 돌아갑니다. 처음 써 보는 분은 Node.js 와 git 을 먼저 설치해야 합니다. 설치 화면은 운영체제와 버전마다 달라서, AI 에게 내 컴퓨터에 맞는 방법을 물어보는 것이 가장 빠릅니다.
아래 프롬프트를 Claude 나 ChatGPT 채팅창에 그대로 붙여 넣으세요. <운영체제> 만 바꿉니다(예: Windows 11, macOS Sonoma).
나는 개발을 처음 해 보는 사람이야. <운영체제> 컴퓨터에
Node.js 22.12 이상(LTS)과 git 을 설치하고 싶어.
1. 공식 사이트에서 받는 방법으로, 클릭 순서대로 하나씩 알려 줘.
2. 설치 중에 나오는 선택지는 기본값으로 둬도 되는지 알려 줘.
3. 설치가 끝난 뒤 터미널(Windows 는 PowerShell)을 여는 방법과,
아래 명령으로 제대로 설치됐는지 확인하는 방법을 알려 줘.
node --version
npm --version
git --version
4. node 버전이 22.12 보다 낮게 나오면 어떻게 하는지도 알려 줘.
세 명령 모두 버전 번호가 나오면 끝입니다. node --version 이 v22.12.0 이상이어야 합니다.
Claude Code 를 쓰고 있다면 Claude Code 에게 직접 맡겨도 됩니다.
내 컴퓨터에 Node.js(22.12 이상)와 git 이 설치돼 있는지 확인해 줘.
없거나 버전이 낮으면 설치 방법을 알려 주고, 내가 설치한 뒤 다시 확인해 줘.
3-2. sns-relay 설치
터미널을 열고 sns-relay 를 둘 폴더로 이동한 뒤, 아래 명령을 한 줄씩 실행합니다.
git clone https://github.com/SomySam/sns-relay.git
cd sns-relay
npm install
npm install -g .
sns-relay --version
| 명령 | 하는 일 |
|---|---|
git clone … |
저장소를 내 컴퓨터로 내려받습니다 |
cd sns-relay |
내려받은 폴더로 들어갑니다 |
npm install |
필요한 부품을 받고 빌드까지 합니다 |
npm install -g . |
어느 폴더에서든 sns-relay 명령을 쓸 수 있게 등록합니다 |
sns-relay --version |
버전 번호가 나오면 성공입니다 |
- 등록한 명령은 방금 내려받은 폴더를 가리킵니다. 이 폴더를 지우거나 옮기지 마세요.
npm install -g git+https://...같은 한 줄 설치는 빌드를 건너뛰어 실패하니 쓰지 않습니다.
Claude Code 에게 맡기는 프롬프트
https://github.com/SomySam/sns-relay 저장소를 설치해 줘.
README 의 「설치」 절차(git clone → npm install → npm install -g .)를 그대로 따르고,
마지막에 sns-relay --version 으로 확인해 줘.
저장소 폴더는 <원하는 위치, 예: D:\sns-relay> 에 둬.
4. 작업 폴더 만들기
초안과 게시 기록, 비밀 값(토큰)이 쌓이는 폴더입니다. 저장소 폴더와 따로 만듭니다. 예를 들어 저장소가 D:\sns-relay 라면 작업 폴더는 D:\my-sns-work 처럼 둡니다.
sns-relay init --dir <작업 폴더>
폴더 안에 다음이 생깁니다.
| 파일 | 역할 |
|---|---|
config.json |
채널 설정과 말투 메모 |
.env |
토큰·시크릿을 적는 파일. 5장에서 채웁니다 |
.gitignore |
.env 가 실수로 git 에 올라가지 않게 막습니다 |
work/ |
글마다 만든 초안과 상태 |
5. 토큰 발급부터 .env 채우기까지
5-0. 먼저 읽어 두기
토큰이 뭔가요? sns-relay 가 내 대신 글을 올리려면 Meta 에게 "이 프로그램이 내 계정에 글을 올려도 된다"는 허락을 받아야 합니다. 그 허락을 담은 긴 문자열이 토큰입니다. 비밀번호와 비슷해서 남에게 보이면 안 됩니다.
전체 순서
- 5-1 인스타 프로페셔널 전환
- 5-2 페이스북 페이지 만들기
- 5-3 Threads 공개 계정 확인
- 5-4 Meta 개발자 등록
- 5-5 앱 1개 만들기 이용 사례 3개
- 5-6 기본 앱 ID·시크릿
- 5-7 Threads 토큰
- 5-8 Instagram 토큰
- 5-9 페이스북 페이지 토큰
- 5-10 선택: Cloudinary
- 5-11 doctor 로 점검
무엇을 어디서 받아 .env 의 어느 칸에 넣는가
.env 칸 |
무엇 | 어디서 | 절 |
|---|---|---|---|
META_APP_ID, META_APP_SECRET |
기본 앱 ID·시크릿 | 앱 대시보드 › 앱 설정 › 기본 설정 | 5-6 |
THREADS_APP_ID, THREADS_APP_SECRET |
Threads 앱 ID·시크릿 | 이용 사례 › Threads API 액세스 › 설정 | 5-7 |
THREADS_TOKEN |
Threads 토큰 | 같은 화면의 「사용자 토큰 생성기」 | 5-7 |
THREADS_USER_ID |
Threads 계정 숫자 ID | 토큰으로 조회(프롬프트 제공) | 5-7 |
IG_APP_ID, IG_APP_SECRET |
Instagram 앱 ID·시크릿 | 이용 사례 › Instagram 로그인이 포함된 API 설정 | 5-8 |
IG_TOKEN |
Instagram 토큰 | 같은 화면의 「계정 추가」 | 5-8 |
IG_USER_ID |
인스타 계정 숫자 ID | 토큰으로 조회(프롬프트 제공) | 5-8 |
FB_PAGE_ID |
페이스북 페이지 숫자 ID | 페이지 선택 창 또는 페이지 정보 | 5-9 |
FB_PAGE_TOKEN |
페이지 토큰 | sns-relay token page 가 자동으로 적음 |
5-9 |
THREADS_TOKEN_EXPIRES_AT, IG_TOKEN_EXPIRES_AT |
만료일 | sns-relay token refresh 가 자동으로 적음 |
5-11 |
CLOUDINARY_* |
사진 업로드용(선택) | Cloudinary 대시보드 | 5-10 |
꼭 지킬 것
- 토큰·시크릿은 채팅창(Claude, ChatGPT 등)에 붙여 넣지 마세요. 메모장으로
.env를 열어 직접 붙여 넣습니다. - 캡처를 AI 에게 보내 질문할 때는 시크릿과 토큰 칸을 가린 뒤 보냅니다. 앱 ID 는 공개돼도 되는 값입니다.
.env에는키=값형태로,=뒤에 따옴표·공백·#주석 없이 붙여 넣습니다.
.env 파일 여는 법: 작업 폴더에서 .env 를 오른쪽 클릭 → 「연결 프로그램」 → 메모장. 파일이 안 보이면 탐색기 「보기」에서 「숨긴 항목」을 켭니다(macOS 는 Finder 에서 Cmd + Shift + .).
화면 안내 기준: 모두 PC 웹 브라우저 기준입니다. Meta 화면은 자주 바뀌므로 메뉴 이름이 조금 다르면 비슷한 이름을 찾으세요. 아래 캡처는 2026년 9월 실제 진행 화면이며, 개인 정보는 회색 상자로 가렸습니다.
5-1. 인스타그램 프로페셔널 계정으로 바꾸기
개인 계정은 API 로 글을 올릴 수 없습니다. 프로페셔널 계정으로 바꿔야 합니다.
- PC 에서 instagram.com 에 로그인합니다.
- 왼쪽 아래 ☰(더 보기) → 설정을 엽니다.
- 「내 인사이트 및 도구」 아래 「프로페셔널 계정」을 누릅니다.

- 계정 유형은 「비즈니스」를 고릅니다. 크리에이터도 되지만 비즈니스가 제약이 적습니다.
- 카테고리를 고릅니다(예: 블로그).
- 「Facebook 페이지 연결」을 물으면 건너뛰어도 됩니다. sns-relay 는 인스타 로그인 방식을 써서 페이지와 연결하지 않아도 됩니다.
💡 자주 막히는 곳: 프로필 링크는 PC 에서 못 바꿉니다
프로필에 블로그 주소를 넣고 싶어서 PC 의 「프로필 편집」을 열면 웹사이트 칸이 회색입니다. 안내 문구대로 휴대폰 인스타그램 앱에서만 바꿀 수 있습니다.

휴대폰 앱: 프로필 → 프로필 편집 → 링크 → 외부 링크 추가 → 주소 입력 → ✓.
5-2. 페이스북 페이지 만들기
페이스북 개인 프로필에는 프로그램이 글을 올릴 수 없습니다. 글을 올릴 페이지가 따로 필요합니다.
- PC 브라우저 주소창에
facebook.com/pages/create를 입력합니다. 나중에 Meta 개발자 등록에 쓸 개인 계정으로 로그인한 상태여야 합니다. - 페이지 이름(인스타 계정과 맞추면 좋습니다), 카테고리(예: 블로그), 소개를 넣고 「페이지 만들기」를 누릅니다.
- 이어지는 설정 화면은 웹사이트와 프로필 사진만 넣고 나머지는 「건너뛰기」 해도 됩니다. WhatsApp 연결, Instagram 연결도 건너뜁니다.
5-3. Threads 계정 확인
- Threads 계정이 공개 상태인지 확인합니다. 비공개면 5-7절에서 토큰 버튼이 눌리지 않습니다. Threads 설정 → 개인정보 보호 → 「비공개 프로필」을 끕니다.
- Threads 사용자 이름을 적어 둡니다. 인스타 이름과 다를 수 있습니다. 예를 들어 인스타는
myblog, Threads 는my.blog처럼 점이 들어가기도 합니다. 5-7절의 테스터 추가에는 Threads 이름을 써야 합니다.
5-4. Meta 개발자 등록
developers.facebook.com에 들어가 페이지를 만든 그 페이스북 계정으로 로그인합니다.- 오른쪽 위 「시작하기」를 누르고 약관 동의, 휴대폰 인증을 합니다. 직업을 물으면 「개발자」를 고릅니다.
- 끝나면 「앱」 화면이 나옵니다.

💡 자주 막히는 곳: 인증 문자가 안 와요
- 국가는 대한민국(+82), 번호는 맨 앞 0을 빼고 넣습니다.
010-1234-5678→10 1234 5678 - Meta 문자는 해외 번호로 와서 스팸함이나 통신사 「국제 문자 수신 차단」에 걸리기 쉽습니다.
- 「다시 보내기」를 여러 번 누르면 한동안 막힙니다. 몇 시간 뒤에 한 번만 다시 요청합니다.
- 그래도 안 되면 페이스북 계정 센터 → 개인정보 → 연락처 정보에서 휴대폰을 먼저 인증한 뒤 다시 시도합니다.
5-5. 앱 만들기 (이용 사례 3개를 앱 하나에)
Threads, 인스타그램, 페이스북을 앱 하나로 모두 처리합니다.
① 안내 창 — 초록색 「앱 만들기」를 누르면 새 방식 안내 창이 뜹니다. 파란 「앱 만들기」를 누릅니다.

② 앱 상세 정보

- 앱 이름: 예)
My SNS Relay. 이름에Facebook,Instagram,Meta,FB,IG가 들어가면 거절됩니다. 사용자에게는 보이지 않고 나중에 바꿀 수 있습니다. - 앱 연락처 이메일: 자주 확인하는 메일. Meta 가 앱 제한·정책 안내를 이 주소로 보냅니다.
- 「다음」을 누릅니다.
③ 이용 사례 — 처음에는 「추천(6)」으로 걸러져 있어서 필요한 항목이 다 보이지 않습니다.

- 왼쪽 필터에서 「콘텐츠 관리 (5)」를 누릅니다. 필요한 세 항목이 한 화면에 모입니다.
- 아래 세 개를 모두 체크합니다.
- Threads API 액세스
- Instagram에서 메시지 및 콘텐츠 관리
- 페이지의 모든 부분 관리

- 왼쪽 아래가 「이용 사례 3개 추가됨」이 되면 「다음」을 누릅니다.
💡 자주 막히는 질문: 앱을 채널마다 따로 만들어야 하나요?
아닙니다. 「모두 (20)」에서 Threads 를 체크하면 인스턴트 게임, Facebook 로그인, 데이터 전송처럼 함께 쓸 수 없는 몇 개만 회색으로 바뀝니다. 인스타그램과 페이지 항목은 그대로 고를 수 있으니 앱 하나면 됩니다.

목록 맨 아래의 「이용 사례 없이 앱 만들기」나 「기타」는 고르지 않습니다.

④ 비즈니스 — 「아직 비즈니스 포트폴리오를 연결하지 않겠습니다」를 고르고 「다음」. 내 계정에만 쓸 때는 필요 없습니다.
⑤ 요구 사항 — 앱을 공개(라이브)할 때의 조건 안내입니다. 읽고 「다음」.
⑥ 개요 — 「앱 만들기」를 누릅니다. 페이스북 비밀번호를 다시 물으면 직접 입력합니다.
앱 대시보드에 이용 사례 3개가 보이면 성공입니다. 왼쪽 위 안내 창(1/7)은 닫아도 됩니다.

5-6. 기본 앱 ID·시크릿 → META_APP_ID, META_APP_SECRET
- 앱 대시보드 왼쪽 아래 「앱 설정」 → 「기본 설정」을 엽니다.
- 앱 ID 를
.env의META_APP_ID=뒤에 붙여 넣습니다. - 앱 시크릿 코드 옆 「표시」를 누르고(비밀번호를 물을 수 있습니다) 나온 값을
META_APP_SECRET=뒤에 붙여 넣습니다.
⚠ 앱은 하나지만 ID·시크릿은 세 쌍입니다. 기본 앱, Threads, Instagram 이 각각 다른 번호를 씁니다. 5-7, 5-8절에서 나머지 두 쌍을 받습니다.
5-7. Threads 토큰
① 게시 권한 확인
- 대시보드에서 「Threads API 액세스 맞춤 설정 이용 사례」를 누릅니다.
- 「권한 및 기능」에서
threads_basic과threads_content_publish가 「추가됨」인지 봅니다.threads_content_publish옆에 「추가」 버튼이 있으면 누릅니다.
② 내 Threads 계정을 테스터로 추가
- 왼쪽 메뉴 「앱 역할」 → 「역할」을 엽니다.
- 「사람 추가」 → 역할 「Threads 테스터」 → Threads 사용자 이름(인스타 이름 아님)을 입력하고 추가합니다.
③ Threads 에서 초대 수락
- PC 에서 threads.com 에 로그인하고 설정을 엽니다.
- 「설정 더 보기」 → 「웹사이트 권한」 → 「초대」 탭에서 내 앱 초대를 수락합니다.
💡 자주 막히는 곳: 「웹사이트 권한」이 안 보여요
PC 웹 설정의 첫 화면에는 「웹사이트 권한」이 없습니다. 「설정 더 보기」 안에 들어 있습니다.

그래도 없으면 휴대폰 Threads 앱에서 프로필 → ☰ → 설정 → 계정 → 웹사이트 권한 → 초대로 수락합니다. 초대 목록이 비어 있으면 ②에서 Threads 이름을 잘못 넣은 경우가 많습니다.
④ 앱 ID·시크릿과 토큰 받기
- Threads 이용 사례 화면 왼쪽에서 「설정」을 엽니다.
- 위쪽 Threads 앱 ID →
.env의THREADS_APP_ID= - Threads 앱 시크릿 코드 옆 「보기」 →
THREADS_APP_SECRET= - 아래 「사용자 토큰 생성기」에서 내 계정 옆 「액세스 토큰 생성하기」를 누릅니다.

💡 자주 막히는 곳: 「액세스 토큰 생성하기」가 회색이라 안 눌려요
화면 설명대로 토큰은 공개 Threads 계정에만 만들 수 있습니다. 가장 흔한 원인은 비공개 계정입니다.
- Threads 설정 → 개인정보 보호 → 「비공개 프로필」을 끕니다.
- 이 Meta 화면을 새로고침(F5) 합니다. 실제로 이 두 단계로 풀렸습니다.
- 그래도 회색이면 ①의
threads_content_publish가 추가됐는지, ③의 초대 수락이 끝났는지 확인합니다. 수락이 화면에 늦게 반영될 수 있으니 몇 분 뒤 다시 봅니다.
- 동의 창이 뜹니다. 권한 목록에 「Create and share posts on Threads profile」(글 게시 권한)이 있는지 확인하고, 파란 「(내 계정) 계정으로 계속」을 누르면 60일짜리 토큰이 나옵니다.

- 「액세스 권한 수정」에서 게시 권한을 끄지 마세요. 답글·인사이트 같은 나머지 선택 항목은 켜 둬도 됩니다.
- 나온 토큰을 바로 복사해
.env의THREADS_TOKEN=뒤에 붙여 넣고 저장합니다. 창을 닫으면 다시 볼 수 없습니다. 놓쳤다면 「액세스 토큰 생성하기」를 다시 누르면 새 토큰이 나옵니다.
⑤ THREADS_USER_ID 채우기
계정의 숫자 ID 는 토큰으로 조회해야 나옵니다. 토큰을 주소창에 붙여 넣는 방법은 기록이 남아 권하지 않습니다. Claude Code 에게 아래처럼 맡기면 토큰 값을 보지 않고 채워 줍니다.
<작업 폴더>/.env 의 THREADS_TOKEN 으로 Threads API 의 /me 를
fields=id,username 으로 조회해서, 나온 id 를 같은 파일의 THREADS_USER_ID= 에 채워 줘.
토큰 값은 화면·로그·답변 어디에도 출력하지 마. 조회된 username 만 알려 줘.
5-8. Instagram 토큰
- 대시보드에서 「Instagram에서 메시지 및 콘텐츠 관리 맞춤 설정 이용 사례」를 누르고 「Instagram 로그인이 포함된 API 설정」을 엽니다.
- 위쪽 Instagram 앱 ID →
IG_APP_ID=, Instagram 앱 시크릿 코드 옆 「표시」 →IG_APP_SECRET= - 1번 「필수 메시지 권한 추가」의 파란 「Add all required permissions」를 먼저 누릅니다.
instagram_business_basic,instagram_business_content_publish가 여기서 추가됩니다. - 2번 「액세스 토큰 생성」의 「계정 추가」를 누릅니다.
💡 자주 막히는 곳: 「앱에 사람을 추가하세요」 창이 떠요
인스타 계정이 아직 테스터가 아니면 이 창이 먼저 뜹니다. 여기서 위쪽의 일반 「테스터」가 아니라 아래쪽 「Instagram 테스터」를 고르고, 인스타 사용자 이름을 넣어 추가합니다.

그다음 인스타그램에서 초대를 수락합니다. PC 웹 instagram.com: ☰ → 설정 → 「앱 및 웹사이트」(안 보이면 설정 검색창에 「앱」 입력) → 「테스터 초대」 탭 → 수락. PC 에 없으면 휴대폰 앱의 설정 → 웹사이트 권한 → 앱 및 웹사이트 → 테스터 초대에서 수락합니다. 수락한 뒤 Meta 화면을 새로고침하고 「계정 추가」를 다시 누릅니다.
- 인스타 로그인과 권한 허용을 마치면 토큰이 나옵니다. 바로 복사해
IG_TOKEN=뒤에 붙여 넣고 저장합니다. IG_USER_ID는 인스타 사용자 이름이 아니라 숫자입니다. Claude Code 에게 맡깁니다.
<작업 폴더>/.env 의 IG_TOKEN 으로 Instagram API(graph.instagram.com)의 /me 를
fields=user_id,username 으로 조회해서, 나온 user_id 를 IG_USER_ID= 에 채워 줘.
토큰 값은 화면·로그·답변 어디에도 출력하지 마. 조회된 username 만 알려 줘.
5-9. 페이스북 페이지 토큰
페이지 토큰은 발급 버튼이 따로 없습니다. Graph API 탐색기에서 1시간짜리 임시 토큰을 받으면, sns-relay token page 가 그것을 만료 없는 페이지 토큰으로 바꿔 .env 에 적습니다.
① 권한 먼저 켜기
대시보드 → 「페이지의 모든 부분 관리 맞춤 설정 이용 사례」 → 「권한 및 기능」에서 아래 세 개 옆 「추가」를 누릅니다.
| 권한 | 동의 창에 보이는 이름 | 용도 |
|---|---|---|
pages_manage_posts |
페이지 콘텐츠 제작 및 관리 | 글 게시 |
pages_read_engagement |
페이지에 게시된 콘텐츠 읽기 | 게시 확인 |
pages_show_list |
관리 중인 페이지 리스트를 표시 | 페이지 토큰 조회 |
💡 자주 막히는 곳: 탐색기의 「권한 추가」 목록에 pages_manage_posts 가 안 보여요
탐색기 목록에는 이용 사례에서 이미 추가한 권한만 나옵니다. 아래처럼 pages_show_list 만 보이면 ①을 아직 안 한 것입니다. ①을 한 뒤 탐색기를 새로고침(F5) 하면 보입니다. 칸에 pages_ 를 입력하면 빨리 찾습니다.

② 탐색기에서 임시 토큰 받기
developers.facebook.com/tools/explorer에 들어갑니다.- 오른쪽 「Meta 앱」에서 내 앱을 고릅니다.
- 「권한 추가」에서 위 세 권한을 모두 고릅니다.
- 「Generate Access Token」을 누릅니다. 페이지 선택 창이 뜹니다.
③ 페이지 선택 창
- 「현재 페이지에만 옵트 인」을 고릅니다. 앱이 글을 올릴 페이지에만 권한을 주는 것이 안전합니다. 「모든 현재 및 향후 페이지」는 나중에 만드는 페이지까지 자동으로 열어 줍니다.

- 5-2절에서 만든 페이지 하나만 체크하고 「계속」을 누릅니다. 페이지 이름 아래 숫자가 페이지 ID 입니다.
.env의FB_PAGE_ID=뒤에 적어 둡니다.

- 액세스 요청 검토 화면에서 권한 세 줄이 모두 「페이지 1개 선택됨」인지 확인하고 「저장」을 누릅니다.

- 탐색기 위쪽 「액세스 토큰」 칸에 긴 문자열이 채워집니다. 이것을 복사합니다. 약 1시간 뒤 만료되니 바로 다음 단계로 갑니다.
④ 페이지 토큰으로 바꾸기
META_APP_ID, META_APP_SECRET, FB_PAGE_ID 가 .env 에 채워져 있어야 합니다. 터미널에서 실행합니다.
sns-relay token page --dir <작업 폴더>
토큰을 물으면 ③에서 복사한 값을 붙여 넣고 Enter. 입력은 화면에 보이지 않고 셸 기록에도 남지 않습니다. 결과는 .env 의 FB_PAGE_TOKEN 에만 적힙니다.
「FB_PAGE_ID … 페이지의 토큰이 없습니다」가 나오면 ③에서 그 페이지를 체크하지 않았거나 FB_PAGE_ID 숫자가 틀린 것입니다. .env 는 바뀌지 않았으니 ②부터 다시 하면 됩니다.
5-10. (선택) 사진 자동 업로드 — Cloudinary
인스타그램·Threads 는 인터넷에 공개된 이미지 주소만 받습니다. 내 컴퓨터의 사진이나 WebP 대표 이미지를 쓰려면 Cloudinary 가 JPEG 공개 주소로 바꿔 줍니다. 블로그 대표 이미지가 이미 JPEG 공개 주소라면 건너뛰어도 됩니다.
- console.cloudinary.com 에서 무료 가입합니다. 카드는 필요 없습니다.
- 대시보드의 Product Environment Credentials 에서 세 값을 찾습니다. API Secret 은 눈 모양 아이콘을 눌러야 보입니다.
.env 칸 |
대시보드 항목 |
|---|---|
CLOUDINARY_CLOUD_NAME |
Cloud name |
CLOUDINARY_API_KEY |
API Key |
CLOUDINARY_API_SECRET |
API Secret |
- 작업 폴더
config.json에"imageHost": "cloudinary"한 줄을 더합니다. 다른 항목은 그대로 둡니다.
{
"channels": ["threads", "instagram", "facebook", "naver"],
"imageHost": "cloudinary"
}
무료 요금제는 월 25 크레딧(저장 1GB, 전송 1GB, 또는 변환 1,000회가 각각 1크레딧)이고 이미지 한 장은 10MB 까지입니다. SNS 사진 기준으로 매달 수백 건 게시까지는 무료 안입니다(어림값이며 원본이 크면 줄어듭니다).
5-11. 점검
sns-relay doctor --dir <작업 폴더>
채널마다 토큰이 살아 있는지, 어느 계정인지, 만료일이 언제인지 읽기만 해서 보여 줍니다. 토큰 값은 출력하지 않습니다.
| 표시 | 뜻 | 할 일 |
|---|---|---|
| ✔ | 정상 | 없음 |
| ⚠ | 경고(만료일 모름, 만료가 가까움 등) | 안내대로 합니다. 게시는 됩니다 |
| ✖ | 오류(값 없음, 토큰 만료, 권한 부족, ID 불일치 등) | 해당 절로 돌아가 고칩니다 |
- 처음에는 Threads·Instagram 에 「만료일을 모릅니다」 경고가 나옵니다. 토큰을 받고 24시간이 지난 뒤 아래를 한 번 실행하면 만료일이 적히고 60일이 연장됩니다.
sns-relay token refresh threads --dir <작업 폴더>
sns-relay token refresh instagram --dir <작업 폴더>
- 「USER_ID 가 토큰의 계정과 다릅니다」는 5-7⑤, 5-8⑥의 프롬프트로 다시 채우면 됩니다.
사용할 채널이 모두 ✔ 가 되면 준비 끝입니다. 수고하셨습니다.
6. 사용법 세 가지
세 방법 모두 같은 작업 폴더와 같은 안전장치를 씁니다. 편한 것 하나만 고르면 됩니다.
| (a) Claude Code 플러그인 | (b) Claude Desktop | (c) 터미널 CLI | |
|---|---|---|---|
| 이런 분께 | Claude Code 를 이미 쓰는 분. 가장 권합니다 | 채팅 앱이 편한 분 | AI 없이 직접 하고 싶은 분 |
| 쓰는 모습 | "이 글 SNS 에 올려 줘" 라고 말하기 | 프롬프트 draft_sns_posts 에 주소 넣기 |
sns-relay fetch … 등 명령 입력 |
| 초안 작성 | Claude 가 씀 | Claude 가 씀 | 내가 직접(또는 다른 AI 로) 씀 |
| 설정 난이도 | 쉬움 | 보통(설정 파일 편집) | 쉬움 |
(a)와 (b)를 같은 앱에 둘 다 연결하면 도구가 두 번 보이니 하나만 연결합니다.
(a) Claude Code 플러그인
플러그인을 설치하면 스킬(초안 작성부터 승인 요청까지의 절차)과 MCP 서버(Claude 가 sns-relay 를 부르는 연결)가 함께 들어옵니다.
- Claude Code 입력창에서 실행합니다.
/plugin marketplace add SomySam/sns-relay
/plugin install sns-relay@sns-relay
- MCP 서버가 작업 폴더를 알도록 환경 변수
SNS_RELAY_DIR을 설정합니다.- Windows: 터미널에서
setx SNS_RELAY_DIR "<작업 폴더>" - macOS / Linux: 셸 설정 파일(
~/.zshrc등)에export SNS_RELAY_DIR=<작업 폴더>를 추가합니다. 터미널에서 시작한 Claude Code 에만 적용됩니다.
- Windows: 터미널에서
- Claude Code 를 모든 창까지 완전히 종료했다가 다시 켭니다.
/mcp를 실행해sns-relay가 connected 인지 확인합니다.
Claude Code 에게 맡기는 프롬프트
sns-relay 플러그인을 쓰려고 해. 작업 폴더는 <작업 폴더> 야.
README 의 「Claude Code 스킬 / 플러그인」 절차대로 SNS_RELAY_DIR 환경 변수를 설정해 주고,
재시작 뒤 /mcp 에서 무엇을 확인하면 되는지 알려 줘.
첫 사용: "이 글 SNS 에 올려 줘 <블로그 글 주소>" 라고 말합니다. 이후 흐름은 8장에 있습니다.
(b) Claude Desktop (MCP)
Claude Desktop 의 설정 파일 claude_desktop_config.json 에 sns-relay 를 등록합니다. 파일은 Claude Desktop 설정 → 개발자 → 「구성 편집」으로 열 수 있습니다.
macOS / Linux:
{"mcpServers":{"sns-relay":{"command":"sns-relay","args":["mcp","--dir","<작업 폴더>"]}}}
Windows 는 npm 전역 명령을 앱이 바로 실행하지 못하므로 node 로 실행합니다. 터미널에서 npm root -g 를 실행해 나온 폴더를 <npm root -g 결과> 자리에 넣습니다.
{"mcpServers":{"sns-relay":{"command":"node","args":["<npm root -g 결과>\\sns-relay\\dist\\cli\\index.js","mcp","--dir","<작업 폴더>"]}}}
- JSON 안에서는 경로의
\를\\로 두 번 씁니다. 예:D:\\my-sns-work - 이미
mcpServers가 있으면sns-relay항목만 그 안에 더합니다. - Claude Desktop 을 완전히 종료했다가 다시 켭니다.
AI 에게 맡기는 프롬프트 (Claude Code 나 다른 채팅 AI)
Windows 에서 Claude Desktop 에 sns-relay MCP 서버를 등록하려고 해.
작업 폴더는 <작업 폴더> 야. npm root -g 를 실행해서 경로를 확인한 뒤,
claude_desktop_config.json 의 mcpServers 에 sns-relay 항목을 추가해 줘.
기존 항목은 지우지 말고, JSON 경로의 역슬래시는 두 번 써 줘.
첫 사용: 입력창의 프롬프트 목록에서 draft_sns_posts 를 골라 글 주소를 넣고 시작합니다. 실제 게시는 미리보기(dry-run)를 먼저 거쳐야 열립니다.
(c) 터미널 CLI
AI 없이 명령으로 직접 합니다. 작업 폴더에서 실행하거나 명령마다 --dir <작업 폴더> 를 붙입니다.
sns-relay fetch <글 주소> # 본문 가져오기 + 채널별 빈 초안 파일
sns-relay rules # 초안 작성 규칙 보기
# work/<id>/drafts/*.md 를 메모장 등으로 열어 본문을 채웁니다
sns-relay drafts <id> # 초안 검증
sns-relay approve <id> --channels threads,facebook # 검토한 채널만 승인
sns-relay publish <id> --dry-run # 게시 전 최종 확인
sns-relay publish <id> --channels threads # 실제 게시(채널을 꼭 지정)
sns-relay status # 글 × 채널 상태
<id> 는 fetch 가 알려 주는 작업 이름입니다. 전체 명령은 README 의 「터미널 (CLI)」 절에 있습니다.
7. 말투 설정
기본 규칙은 누구나 쓰는 공통 원칙입니다. 내 계정 말투는 작업 폴더 config.json 의 notes 에 적습니다. 사실에 관한 규칙을 뺀 나머지는 메모가 우선합니다.
{
"notes": {
"common": "짧은 호흡, 핵심만, 위트 있게. 1인칭으로 혼잣말하듯.",
"threads": "마지막은 가벼운 질문으로 닫기.",
"naver": "소제목마다 예시 하나씩."
}
}
common은 모든 채널에,threads·instagram·facebook·naver는 그 채널에만 적용됩니다.- 기존
config.json의 다른 항목은 그대로 두고notes만 고칩니다.
8. 첫 글 올리기
Claude 와 대화하는 흐름입니다. (a) 플러그인은 스킬이, (b) Desktop 은 draft_sns_posts 프롬프트가 같은 절차를 따릅니다.
- 글 주소를 알려 줍니다.
나: 이 글 SNS 에 올려 줘 <블로그 글 주소>
- Claude 가 글을 가져와 채널별 초안을 쓰고 검증 결과와 함께 보여 줍니다. 오류(✖)는 Claude 가 고치고, 경고(⚠)는 알려 줍니다.
- 초안을 읽고 고칠 곳을 말합니다. 고치면 승인이 풀리니 다시 확인합니다.
나: 스레드는 첫 문장을 좀 더 가볍게 바꿔 줘
- 마음에 드는 채널만 명시해 승인합니다. "좋아요"만 말하면 Claude 가 어느 채널인지 되묻습니다.
나: threads, facebook 승인
- 게시 전 미리보기(dry-run)를 봅니다. 채널별 최종 문구와 링크, 인스타그램은 이미지 확인 결과까지 나옵니다. 아직 아무것도 올라가지 않았습니다.
- 괜찮으면 명시적으로 허락합니다.
나: 올려
- Claude 가 게시물 주소를 알려 주고 채널별 상태를 보여 줍니다. 승인하지 않은 채널과 네이버는 올라가지 않습니다.
처음 게시한 뒤 꼭 확인할 것: Meta 앱이 개발 모드이면 게시물이 앱 관리자·테스터에게만 보일 수 있습니다. 로그아웃한 시크릿 창에서 게시물 주소를 열어 보세요. 안 보이면 앱을 라이브로 전환해야 합니다.
결과 불명이 나오면
응답이 끊기는 등으로 게시됐는지 알 수 없으면 ? 결과 불명 으로 표시됩니다.
- 다시 게시하지 않습니다. 중복 게시를 막기 위한 안전장치입니다.
- 1~2분 뒤 상태를 다시 확인합니다.
- 계속 불명이면 해당 채널에서 글이 실제로 올라갔는지 직접 봅니다.
- Claude 에게 결과를 알려 확정합니다.
나: threads 에 올라갔어. 주소는 <게시물 주소>
나: threads 에는 안 올라갔어
CLI 로는 다음과 같습니다.
sns-relay resolve <id> threads --published <게시물 주소>
sns-relay resolve <id> threads --not-published
8-1. 글감·사진으로 올리기
블로그 글이 없어도 내 메모와 사진으로 올릴 수 있습니다.
나: 이 사진이랑 메모로 SNS 글 올려 줘
터미널로는 다음과 같습니다.
sns-relay new --title "<제목>" --text <글감 파일> --image <사진 파일 또는 주소> [--link <주소>] --dir <작업 폴더>
- 로컬 사진 파일은 5-10절의 Cloudinary 가 필요합니다. 공개 이미지 주소는 없어도 됩니다.
--link를 주지 않으면 링크 없이 올라갑니다. Threads 는 이미지 글, 페이스북은 사진 글, 인스타그램은 이미지와 캡션입니다.- 사진 여러 장:
--image를 여러 번 줍니다(최대 10장). 첫 장이 대표이고, 인스타그램은 첫 장 비율로 잘립니다. Claude Code 에서는 입력창에 여러 장을 올리면 됩니다. sns-relay image에 사진을 하나만 주면 사진이 한 장이 됩니다(목록 전체를 바꿈).- 링크가 있는 글은 여러 장이 인스타그램에만 올라가고, Threads·페이스북은 링크 글로 올라갑니다.
- 여러 장 게시는 준비에 몇 분 걸릴 수 있습니다.
- 여러 장 기능은 글감 작업에 쓰는 것을 권합니다(블로그 글을 다시 가져오면 사진 목록이 블로그 대표 이미지로 돌아갑니다).
- 네이버 원고에는 사진을 직접 붙여 넣습니다.
8-2. 대표 이미지가 WebP 일 때
인스타그램은 JPEG 만 받습니다. 대표 이미지가 WebP 라면 JPEG 로 옮깁니다(5-10절 준비 필요).
sns-relay image <id> --article --dir <작업 폴더>
이미지가 바뀌므로 승인이 풀립니다. 다시 확인하고 승인한 뒤 미리보기를 봅니다.
9. 네이버 올리기
네이버는 공식 글쓰기 API 가 없어서 자동으로 올리지 않습니다. 승인된 네이버 초안을 붙여 넣기용 원고로 받아 직접 발행합니다.
- 붙여 넣기용 원고를 만듭니다.
work/<id>/naver.md가 만들어지고 기본 앱으로 열립니다(열지 않으려면--no-open).
sns-relay naver <id> --dir <작업 폴더>
- 네이버 블로그 글쓰기 화면을 엽니다.
- 원고의 「제목」 칸 내용을 제목에 붙여 넣습니다. 칸 제목 줄(
## …)은 빼고 그 아래 내용만 복사합니다. - 「본문」 칸 내용을 본문에 붙여 넣습니다.
- 「소제목」 칸을 보고 본문의 소제목에 제목 서식을 입힙니다.
- 발행 버튼 → 발행 설정 창의 「태그 편집」에 「태그」 칸의 태그를 하나씩 입력하고 Enter 로 확정합니다. 쉼표로 이어 붙이면 한 태그가 됩니다.
- 발행합니다.
- 발행된 글 주소를 Claude 에게 알려 주면 기록됩니다. CLI 로는
sns-relay mark naver <id> --url <발행 주소> --dir <작업 폴더>입니다.
10. 후킹·문투 바꾸기
- 이번 글만 바꾸려면 대화로 요청합니다.
나: 스레드 첫 문장 후킹 3안 보여 줘
Claude 가 채널별로 현재 첫 문장과 3안을 보여 주고, 고른 안으로 첫 문장만 고칩니다.
- Claude Desktop 에서는 프롬프트
rewrite_hooks에 작업 이름을 넣어 같은 일을 할 수 있습니다. - 계속 적용하려면 7장의
notes를 고칩니다. - 내용이 바뀐 초안은 승인이 풀립니다. 이미 게시된 칸은 고치지 않습니다.
11. 유지 관리
| 언제 | 할 일 | 명령 |
|---|---|---|
| 한 달에 한 번 | 토큰 상태 점검. 만료 14일 전부터 경고합니다 | sns-relay doctor |
| Threads·인스타 토큰 만료 전(60일) | 60일 연장. 발급 24시간 뒤부터 가능, 만료되면 새로 발급 | sns-relay token refresh threads / instagram |
| 페이스북 데이터 접근 기한 전(90일) | 페이지 토큰 자체는 만료가 없지만 앱의 데이터 접근 기한이 있습니다. 5-9절 ②~④를 다시 합니다 | sns-relay token page |
| 업데이트가 나왔을 때 | 저장소 폴더에서 실행. 플러그인은 /plugin marketplace update sns-relay |
git pull → npm install |
- 만료일은 UTC 날짜로 적힙니다(한국 시간보다 최대 하루 이르게 보일 수 있습니다).
- 토큰을 갱신하면
.env의 값 뒤에 붙인#주석은 지워집니다.
12. 문제 해결
| 증상 | 원인과 해결 |
|---|---|
sns-relay 명령을 찾을 수 없다 |
3-2절의 npm install -g . 를 저장소 폴더에서 다시 실행하고, 터미널을 새로 엽니다 |
| 인증 문자가 안 온다 | 5-4절 「자주 막히는 곳」 |
| 이용 사례에 인스타·페이지 항목이 안 보인다 | 필터가 「추천」입니다. 「콘텐츠 관리」를 누릅니다(5-5절) |
| Threads 초대 수락 메뉴가 없다 | 설정 → 「설정 더 보기」 → 「웹사이트 권한」(5-7절 ③) |
| 「액세스 토큰 생성하기」가 회색 | Threads 비공개 해제 후 새로고침(5-7절 ④) |
| 인스타 「계정 추가」에서 사람 추가 창이 뜬다 | 「Instagram 테스터」로 추가하고 수락(5-8절) |
| 탐색기 권한 목록에 pages_ 권한이 없다 | 이용 사례의 「권한 및 기능」에서 먼저 추가(5-9절 ①) |
| 플러그인 MCP 가 연결되지 않는다 | SNS_RELAY_DIR 설정 뒤 Claude Code 를 모든 창까지 재시작. 한 번 실패하면 약 15분간 재시도를 건너뜁니다. sns-relay --version 으로 설치도 확인합니다 |
? 결과 불명 |
다시 게시하지 않습니다. 8장 「결과 불명이 나오면」 |
| Cloudinary ✖ | .env 의 세 값을 다시 확인합니다 |
| 로컬 사진을 쓰라는데 imageHost 오류 | config.json 의 imageHost 를 cloudinary 로(5-10절) |
| 인스타 게시가 이미지 때문에 막힌다 | JPEG, 가로세로 비율 0.8~1.91, 8MB 이하여야 합니다 |
| 게시했는데 나만 보인다 | 앱이 개발 모드입니다. 라이브로 전환합니다 |
| 토큰 오류·만료로 실패 | doctor 로 채널을 확인하고, Threads·인스타는 token refresh(만료됐으면 새로 발급), 페이스북은 token page 로 다시 발급 |
막히는 화면이 있으면 토큰·시크릿을 가린 캡처와 함께 Claude 에게 이렇게 물어보세요.
sns-relay 튜토리얼 <절 번호>를 따라 하는 중인데 이 화면에서 막혔어.
캡처를 보고 다음에 무엇을 눌러야 하는지 알려 줘. (토큰·시크릿은 가렸어)
부록 A. 유튜브 영상으로 올리기 (준비 중)
아직 정식 버전에 들어가지 않은 기능입니다. 개발과 테스트는 끝났고, 실제 영상으로 한 번 확인한 뒤 v0.3.0 에서 열릴 예정입니다. 열리면 이 절을 채웁니다.
예정된 내용은 다음과 같습니다.
- 내 채널 영상만 다룹니다.
config.json에 내 채널 핸들(@…)을 적어 확인합니다. - 영상 내용은 유튜브 스튜디오에서 받은 자막 파일(
.srt등)로 읽습니다. 초안은 자막에 있는 내용만 씁니다. - 추가 토큰은 필요 없습니다. 영상 제목·썸네일은 공개 정보로 가져옵니다. 나중에 구글 로그인으로 자막을 자동으로 받는 기능이 생기면, 그때 필요한 발급 절차를 5장에 더합니다.
- 게시 모양: Threads·페이스북은 영상 링크 카드, 인스타그램은 영상 썸네일 사진입니다.
부록 B. 용어 풀이
| 용어 | 뜻 |
|---|---|
| 토큰 | 프로그램이 내 계정에 글을 올려도 된다는 허락을 담은 문자열. 비밀번호처럼 다룹니다 |
| 앱 ID / 앱 시크릿 | Meta 개발자 앱의 번호와 비밀번호. ID 는 공개돼도 되고, 시크릿은 비밀입니다 |
| 테스터 | 심사를 받지 않은 앱을 써 볼 수 있게 허락된 계정. 내 계정에만 쓸 때는 나를 테스터로 넣으면 됩니다 |
| 이용 사례 | Meta 앱이 무엇을 할지 고르는 묶음(Threads, 인스타, 페이지 등) |
.env |
비밀 값을 적어 두는 파일. git 에 올라가지 않게 막혀 있습니다 |
| MCP | Claude 가 바깥 프로그램(여기서는 sns-relay)을 부를 수 있게 하는 연결 방식 |
| 스킬 | Claude 가 따르는 작업 절차서. 플러그인에 들어 있습니다 |
| dry-run | 실제로 올리지 않고 결과만 미리 보는 것 |
| Graph API 탐색기 | Meta 가 개발자에게 주는 시험용 화면. 여기서 페이지용 임시 토큰을 받습니다 |