시작은 슬랙이었다
팀 프로젝트 관리용으로 “메신저에서 클로드를 태그로 불러 쓰는” 환경을 만들고 싶었다. 슬랙에 클로드를 붙이는 공식 기능(Claude in Slack, 이른바 클로드 태그)이 이미 있어서 그걸 쓰려고 했는데 — 팀 플랜을 요구했다. 혼자 쓰거나 소규모로 굴리는 입장에선 기능 하나 때문에 요금제를 통째로 올리는 게 납득이 안 됐다.
그래서 “그럼 내가 쓰는 메신저에 직접 붙이자"로 방향을 틀었고, 후보를 좁혔다.
- 카카오톡 — 탈락. 일반 채팅방에 붙일 봇 API가 아예 없다. 오픈빌더는 1:1 채널 챗봇 전용이고, 비공식 자동화는 계정 정지 위험이 있다.
- 텔레그램 — 공식 봇 API가 가장 간단하고 진입장벽이 낮다. 다만 대화가 한 줄기라 여러 주제를 동시에 굴리면 금방 뒤엉킨다.
- 디스코드 — 최종 선택.
디스코드를 고른 이유는 명확했다.
- 스레드 구조. 멘션 하나에 스레드가 하나 생기니 주제별로 문맥이 자연스럽게 분리된다.
이게 뒤에 나올
--resume세션 매핑과 정확히 맞아떨어진다. - 채널 분리. 업무/메모/일정처럼 용도별 채널을 나눠 쓸 수 있다.
- 첨부파일과 코드블록을 제대로 다룬다. 파일 올리고 바로 “이거 분석해줘"가 된다.
- 봇 권한을 세밀하게 준다. 어떤 채널에서 뭘 할 수 있는지 서버 단위로 통제된다.
- 슬래시 명령이 1급 시민.
/일정등록같은 걸 자동완성·인자 검증까지 붙여 만들 수 있다. - 무료이고, PC·모바일 클라이언트가 다 있어서 나가서도 그대로 쓴다.
핵심 아키텍처
| |
claude -p --output-format json은 응답과 함께session_id를 돌려준다. 이걸 디스코드 스레드 ID와 매핑해 저장해두고, 다음 메시지에--resume <session_id>를 붙이면 스레드마다 대화 문맥이 유지된다.- Claude Code에 구독(Pro/Max) 로그인이 되어 있으면
claude -p는 구독량으로 처리되어 Anthropic API 결제가 필요 없다. 슬랙 쪽에서 막혔던 요금 문제가 여기서 사라진다. - headless 모드에서도 그 PC에 설정된 MCP 서버와 스킬을 전부 그대로 인식한다. 내 PC에서 쓰던 환경이 그대로 디스코드로 나오는 셈이다.
예상 못 한 수확: 로컬 메모 동기화가 같이 풀렸다
옵시디언처럼 메모를 로컬 파일로 쌓아두고 있었는데, 이걸 폰에서도 보려면 어느 서비스든 결국 유료 동기화 플랜을 권한다. 슬랙 때와 똑같은 벽이다.
그런데 이 봇을 붙이고 나니 그 문제가 통째로 사라졌다. 메모 파일은 계속 내 PC에 로컬로 있고, 디스코드에서 멘션 한 번이면 클로드가 그 파일들을 읽어서 답한다. 동기화를 할 필요가 없다 — 파일을 옮기는 게 아니라, 파일이 있는 곳에 질문을 보내는 구조이기 때문이다.
여기에 MCP를 얹으면 더 좋아진다. 레드마인 같은 사내 시스템을 MCP로 물려두면, 봇이 일정과 이슈를 조회해서 디스코드 채팅에 보기 좋게 정리해 뿌려준다. 로컬 메모 + MCP 데이터를 한 자리에서 묶어 요약해주니, 별도 대시보드를 안 만들어도 “오늘 뭐 있지"가 채팅 한 줄로 끝난다.
봇 기능
- 멘션 → 스레드 자동 생성 후 답변
- 첨부파일 자동 다운로드 후 클로드가 Read 도구로 분석
- 슬래시 명령(
/일정등록,/일정목록,/일정삭제)으로 일정 알림 (마감 전날 1회 + 당일 매시간 반복, 삭제 = 완료 처리)

보안 설계
봇이 있는 서버의 모든 멤버가 내 PC의 클로드를 쓰게 되므로 도구를 잠가야 한다.
--allowedTools를 읽기/검색 계열(Read, Glob, Grep, WebSearch, WebFetch)과
허용할 MCP 도구(mcp__redmine__list_issues 등)로만 제한하고,
Bash·Write·Edit 같은 실행/쓰기 도구는 막았다.
디스코드 봇 등록 절차
개발자 포털에서:
- New Application → Bot 메뉴에서 토큰 발급
- MESSAGE CONTENT INTENT 스위치 켜기 — 안 켜면 봇이 메시지를 못 읽는다. 최다 실수 포인트.
- OAuth2 URL Generator에서
bot스코프 + 필요한 권한 체크 - 생성된 URL로 서버 초대
다른 클로드 구독자도 자기 토큰과 자기 구독으로 돌릴 수 있게
zip(봇 코드 + .env.example + 설치 가이드 + setup.bat)으로 묶어뒀다.
setup.bat이 Python(winget)·discord.py 설치와 설정 파일 생성까지 자동화하고,
계정이 필요한 부분(디스코드 토큰 발급, 클로드 로그인)만 수동으로 남는다.
막혔던 점과 해결
- 스토어(MSIX) 설치 Python은 AppData가 가상화되어
%APPDATA%\Claude\claude-code\의 claude.exe를 못 읽는다 (PowerShell에선 보이는데 Python에선 FileNotFoundError). → claude.exe를 AppData 밖 폴더로 복사해서 해결. 단독 실행파일이라 복사만으로 동작. - 배치 파일에 한글을 넣으면 cmd가 명령을 깨뜨린다 (
chcp 65001이후 파서가 바이트 오프셋을 잘못 읽어'laudeBot'은(는)...같은 유령 오류 발생). → bat 파일은 ASCII만 사용. - PowerShell 파이프로 한글을 넘기면 인코딩이 깨진다. → 파이썬 subprocess에서
UTF-8 바이트로 stdin에 직접 쓰면 안전. 파이썬 실행도
-u(unbuffered) +PYTHONUTF8=1필수 (안 하면 print가 버퍼에 갇혀 로그가 안 보이거나 이모지 출력에서 죽는다). - 봇을 AI 세션의 백그라운드 프로세스로 띄우면 세션이 끝날 때 봇도 같이 죽는다. → bat 더블클릭으로 독립 콘솔에서 실행해야 한다. 콘솔 창 닫으면 봇 종료, 최소화는 OK.
- 같은 봇 토큰으로 프로세스를 2개 띄우면 게이트웨이에 둘 다 붙어서 답장이 중복된다.
메모/생각
- 결국 세 번의 “유료 플랜을 쓰세요"를 같은 방법 하나로 넘겼다. 슬랙 클로드 태그(팀 플랜), 메모 동기화(구독), API 결제 — 내 PC에서 도는 봇 하나로 셋 다 정리됐다.
- 핵심은 클로드를 어디 올려두는 게 아니라, 이미 내 PC에 갖춰둔 환경(MCP·스킬·로컬 파일)에 메신저라는 입구를 하나 뚫어준 것이다. 그래서 새로 설정할 게 거의 없었다.
- 다음에 해볼 것: 부팅 시 자동 시작 등록, 스레드별 도구 권한 분리.