@멘션 한 번이면 클로드가 답한다 — 디스코드로 만든 팀 AI 비서

슬랙에서 클로드를 태그로 부르려다 팀 플랜 벽에 막혀 텔레그램·디스코드를 저울질하고 디스코드로 정한 이유. @멘션→스레드→claude -p(headless Claude Code) 아키텍처, 구독으로 API 결제 0원, MCP·스킬 그대로 사용, 로컬 옵시디언 메모 동기화까지 덤으로 해결한 과정.

시작은 슬랙이었다

팀 프로젝트 관리용으로 “메신저에서 클로드를 태그로 불러 쓰는” 환경을 만들고 싶었다. 슬랙에 클로드를 붙이는 공식 기능(Claude in Slack, 이른바 클로드 태그)이 이미 있어서 그걸 쓰려고 했는데 — 팀 플랜을 요구했다. 혼자 쓰거나 소규모로 굴리는 입장에선 기능 하나 때문에 요금제를 통째로 올리는 게 납득이 안 됐다.

그래서 “그럼 내가 쓰는 메신저에 직접 붙이자"로 방향을 틀었고, 후보를 좁혔다.

  • 카카오톡 — 탈락. 일반 채팅방에 붙일 봇 API가 아예 없다. 오픈빌더는 1:1 채널 챗봇 전용이고, 비공식 자동화는 계정 정지 위험이 있다.
  • 텔레그램 — 공식 봇 API가 가장 간단하고 진입장벽이 낮다. 다만 대화가 한 줄기라 여러 주제를 동시에 굴리면 금방 뒤엉킨다.
  • 디스코드 — 최종 선택.

디스코드를 고른 이유는 명확했다.

  • 스레드 구조. 멘션 하나에 스레드가 하나 생기니 주제별로 문맥이 자연스럽게 분리된다. 이게 뒤에 나올 --resume 세션 매핑과 정확히 맞아떨어진다.
  • 채널 분리. 업무/메모/일정처럼 용도별 채널을 나눠 쓸 수 있다.
  • 첨부파일과 코드블록을 제대로 다룬다. 파일 올리고 바로 “이거 분석해줘"가 된다.
  • 봇 권한을 세밀하게 준다. 어떤 채널에서 뭘 할 수 있는지 서버 단위로 통제된다.
  • 슬래시 명령이 1급 시민. /일정등록 같은 걸 자동완성·인자 검증까지 붙여 만들 수 있다.
  • 무료이고, PC·모바일 클라이언트가 다 있어서 나가서도 그대로 쓴다.

핵심 아키텍처

1
디스코드 @멘션 → discord.py 봇 → claude -p (headless Claude Code) → 응답 전송
  • 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회 + 당일 매시간 반복, 삭제 = 완료 처리)

디스코드에서 슬래시 명령으로 일정을 등록하고, 봇이 마감일과 D-day를 정리해 보여주는 화면

보안 설계

봇이 있는 서버의 모든 멤버가 내 PC의 클로드를 쓰게 되므로 도구를 잠가야 한다. --allowedTools를 읽기/검색 계열(Read, Glob, Grep, WebSearch, WebFetch)과 허용할 MCP 도구(mcp__redmine__list_issues 등)로만 제한하고, Bash·Write·Edit 같은 실행/쓰기 도구는 막았다.

디스코드 봇 등록 절차

개발자 포털에서:

  1. New Application → Bot 메뉴에서 토큰 발급
  2. MESSAGE CONTENT INTENT 스위치 켜기 — 안 켜면 봇이 메시지를 못 읽는다. 최다 실수 포인트.
  3. OAuth2 URL Generator에서 bot 스코프 + 필요한 권한 체크
  4. 생성된 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·스킬·로컬 파일)에 메신저라는 입구를 하나 뚫어준 것이다. 그래서 새로 설정할 게 거의 없었다.
  • 다음에 해볼 것: 부팅 시 자동 시작 등록, 스레드별 도구 권한 분리.