Claude CLI를 Discord에 연결하는 방법은 여러 가지입니다. 단순 webhook, 커스텀 봇, MCP 플러그인 등. 여기서는 Claude Code의 공식 Discord MCP 플러그인을 선택했습니다.
핵심 설계는 Claude CLI 세션 하나가 여러 Discord 채널을 동시에 처리한다는 점입니다.
채널마다 별도의 Claude 프로세스를 띄우지 않아도 됩니다.
메시지가 들어오면 chat_id로 어느 채널에서 왔는지 구분하고, 해당 채널의 컨텍스트로 응답합니다.
Discord 채널을 프로젝트 단위로 구분해두면 대화 컨텍스트가 섞이지 않습니다. 퀀트 시스템에 대한 질문은 퀀트 채널에서, 블로그 작업은 블로그 채널에서 이루어집니다. 나중에 채널별로 작업 디렉토리나 전문 AI 에이전트를 매핑하는 것도 자연스럽게 확장됩니다.
장기적으로는 Claude 하나가 아니라 역할별 AI 에이전트(분석가, 리스크 관리자, 운영자 등)가 각자의 채널을 통해 서로 소통하는 구조를 염두에 두고 있습니다. 지금 만드는 채널 구조가 그 토대가 됩니다.
Claude CLI는 tmux main 세션 안에서 계속 실행 중입니다.
(이전 글: tmux systemd 자동 실행 설정 참고)
Discord Bot이 WebSocket으로 메시지를 수신하고, MCP 플러그인이 Claude에게 전달합니다.
| 항목 | 설명 |
|---|---|
| Claude Code CLI | npm install -g @anthropic-ai/claude-code 설치 완료 |
| Discord 계정 + 서버 | 본인 소유 또는 관리자 권한이 있는 서버 |
| Discord Bot Token | Discord Developer Portal에서 생성 (아래 참고) |
| Node.js 18+ | Claude Code CLI 실행 환경 |
Claude Code CLI의 Discord MCP 플러그인을 설치합니다.
$ claude mcp add --transport sse plugin:discord
설치 후 Claude Code를 재시작하면 Discord 관련 도구(reply, fetch_messages 등)가 활성화됩니다.
my-bot).
bot 체크.
Bot Permissions: Read Messages, Send Messages, Read Message History.
생성된 URL로 본인 서버에 봇을 초대합니다.
$ claude /discord:setup # 프롬프트에 Bot Token 입력
봇이 서버에 있다고 해서 누구나 명령을 내릴 수 있으면 안 됩니다. 처음 사용 시 페어링으로 본인임을 확인합니다.
$ claude /discord:access pair ABC123 # ABC123 자리에 봇이 응답한 6자리 코드 입력
페어링 성공 시 봇이 DM으로 "승인됐습니다" 메시지를 보냅니다. 이후 DM으로 Claude에게 메시지를 보내면 응답합니다.
DM 외에 서버 채널에서도 대화하려면 채널마다 그룹을 등록해야 합니다. 각 채널의 chat_id를 먼저 확인합니다.
Discord 설정 → 고급 → 개발자 모드 활성화 후, 채널명을 우클릭 → ID 복사.
# requireMention: false → 멘션 없이 모든 메시지에 응답 # <CHANNEL_ID> 자리에 각 채널의 ID를 넣습니다 $ claude /discord:access group add <CHANNEL_ID_1> --no-mention $ claude /discord:access group add <CHANNEL_ID_2> --no-mention $ claude /discord:access group add <CHANNEL_ID_3> --no-mention
채널 구성 예시:
| 채널 | 주제 예시 | chat_id |
|---|---|---|
#project-a | 서비스 A 작업 | 개발자 모드로 채널 우클릭 → ID 복사 |
#project-b | 서비스 B 작업 | 개발자 모드로 채널 우클릭 → ID 복사 |
#rules | AI 봇 규칙 관리 | 개발자 모드로 채널 우클릭 → ID 복사 |
--no-mention 플래그를 붙이면 채널의 모든 메시지에 응답합니다.
붙이지 않으면 @봇이름으로 멘션해야만 응답합니다.
개인 서버 전용 채널은 --no-mention이 편합니다.
다른 사람도 쓰는 공용 채널은 멘션 방식을 권장합니다.
모든 접근 제어 상태는 ~/.claude/channels/discord/access.json에 저장됩니다.
{
"dmPolicy": "pairing", // DM: pairing | allowlist | disabled
"allowFrom": [
"<YOUR_DISCORD_USER_ID>" // 허용된 Discord 사용자 ID (페어링 후 자동 추가)
],
"groups": {
"<CHANNEL_ID_1>": { // 채널 chat_id
"requireMention": false, // 멘션 없이 응답
"allowFrom": [] // 채널별 추가 제한 (비워두면 전체 허용)
},
"<CHANNEL_ID_2>": {
"requireMention": false,
"allowFrom": []
}
},
"pending": {} // 대기 중인 페어링 코드
}
| 필드 | 역할 |
|---|---|
dmPolicy | DM 처리 방식. pairing: 페어링된 사용자만, allowlist: allowFrom 목록만, disabled: DM 비활성 |
allowFrom | DM을 허용할 Discord 사용자 ID 목록 |
groups[chat_id] | 채널별 설정. requireMention + allowFrom |
pending | 페어링 진행 중인 코드. 승인 또는 만료 후 자동 삭제 |
$ claude /discord:access # dmPolicy, 허용 사용자 목록, 등록된 채널 목록 출력
각 채널에서 메시지를 보내 Claude가 응답하는지 확인합니다.
사용자: 퀀트 설계 진행상황 알려줘 Claude: [응답]
tmux attach -t mainaccess.json에 해당 chat_id가 등록됐는지 확인지금 구성은 사람 ↔ Claude 1:1 대화지만, 같은 구조 위에서 더 확장할 수 있습니다.
| 단계 | 구성 | 채널 역할 |
|---|---|---|
| 현재 | 사람 → Discord → Claude CLI | 주제별 대화 격리 |
| 다음 | 사람 + 여러 AI 에이전트 → Discord | 에이전트별 채널 할당, 결과 공유 |
| 장기 | AI 에이전트끼리 채널로 소통 | 분석가 에이전트 → 채널 → 운영 에이전트 |
예를 들어 퀀트 시스템(FORTUNA)에서는 분석 에이전트가 백테스트 결과를 #fortuna에 올리면,
리스크 에이전트가 같은 채널에서 결과를 읽고 검토 의견을 달고,
사람이 최종 승인하는 흐름으로 발전할 수 있습니다.
Discord 채널이 에이전트 간 공유 메모리이자 감사 로그 역할을 하게 됩니다.
#fortuna는 퀀트 에이전트들의 대화 공간, #argus는 자산관리 에이전트들의 공간처럼요.