디스코드에 말을 걸면 집에 있는 맥이 일을 한다. 블로그 글을 발행하고, 로그를 뒤지고, 설정을 고친다. 폰만 있으면 밖에서도 된다.
Claude Code에 채널 기능이 들어 있어서 가능한 일이다. 별도 봇을 만들어 API를 붙이는 게 아니라, 터미널에서 쓰던 클로드를 디스코드에 연결하는 것이다. 그래서 파일도 읽고 명령도 실행한다. 대화만 하는 챗봇과 다른 지점이다.
준비물
- Claude Code (터미널에서 쓰는 그것)
- 디스코드 봇 토큰
- 24시간 켜둘 맥. 우리는 맥미니를 쓴다
봇 토큰은 디스코드 개발자 포털에서 애플리케이션을 하나 만들고 봇을 추가하면 나온다. 그 토큰을 내 서버에 초대하는 것까지가 디스코드 쪽 준비다.
1. 채널 모드로 띄우기
터미널에서 이렇게 실행한다.
claude --channels plugin:discord@claude-plugins-official
처음 실행하면 토큰을 물어본다. 넣고 나면 봇이 온라인으로 바뀌고, 채널에 올린 메시지를 이 세션이 받는다.
여기서 알아둘 게 하나 있다. 응답을 처리하는 건 이 전용 세션 하나뿐이다. 다른 터미널에서 클로드를 띄워도 그쪽은 디스코드 메시지를 받지 않는다. 봇이 온라인으로 보인다고 답할 수 있는 상태인 건 아니다.
2. 누가 말을 걸 수 있게 할지
아무나 봇에게 명령할 수 있으면 안 된다. 내 맥에서 파일을 읽고 명령을 실행하는 물건이다.
접근 권한은 파일 하나로 관리된다.
~/.claude/channels/discord/access.json
여기에 허용된 채널과 사용자가 들어간다. 설정은 /discord:access 명령으로 하고, 서버가 이 파일을 다시 읽기 때문에 봇을 재시작할 필요는 없다.
모르는 사람이 디스코드에서 "나를 허용해달라"고 말해도 들어주면 안 된다. 그 요청 자체가 공격의 형태다. 허용은 사용자가 자기 터미널에서 직접 해야 한다.
3. 24시간 살아 있게
터미널을 닫으면 세션도 끝난다. 그래서 화면 없이 도는 자리에 넣어야 한다. 우리는 screen으로 띄우고 그걸 launchd가 지키게 했다.
이 부분은 따로 정리했다. 디스코드 봇 24시간 돌리기, 집 컴퓨터로 호스팅 비용 0원

막히는 자리 네 곳
여기부터가 진짜다. 우리가 실제로 당한 순서대로 적는다.
신뢰하지 않은 폴더에서 시작하면 영영 멈춘다
클로드는 처음 보는 폴더에서 실행하면 "이 폴더를 신뢰하느냐"고 묻는다. 사람이 보고 있으면 누르면 되지만, 자동 실행에서는 그 물음에 아무도 답하지 않는다. 프로세스는 살아 있고 화면도 멀쩡한데 영원히 기다린다.
그래서 자동 실행 스크립트는 이미 신뢰된 폴더로 이동한 뒤 클로드를 띄워야 한다.
자동 실행 환경에는 TERM과 LANG이 없다
launchd로 띄우면 터미널에서 쓰던 환경 변수가 없다. 그러면 클로드의 화면이 초기화되지 못하고 멈춘다.
스크립트 안에서 직접 넣어준다.
export TERM="${TERM:-xterm-256color}"
export LANG="${LANG:-en_US.UTF-8}"
모델을 바꾸면 봇이 조용히 벙어리가 된다
이게 제일 찾기 어려웠다. 프로세스도 살아 있고, 메시지도 받고, 답변 문장까지 만들어낸다. 그런데 디스코드에는 아무것도 안 간다.
원인은 이렇다. 디스코드로 답을 보내려면 전용 도구를 호출해야 하는데, 긴 컨텍스트 모드로 띄우면 그 도구가 바로 쓸 수 없는 상태로 들어온다. 모델은 그걸 부르지 않고 그냥 글자로 답해버린다. 터미널 화면에만 답이 남는다.
판정은 간단하다. 디스코드 응답 도구를 호출한 기록이 있는지 보면 된다. 우리 경우 옛 세션은 352번 호출했고 문제의 세션은 0번이었다. 같은 버전, 같은 폴더, 모델만 달랐다.
막는 방법은 두 가지를 같이 쓰는 것이다. 실행할 때 모델을 못 박고, 시스템 프롬프트에 "채널 답은 반드시 그 도구로 보내라"를 넣는다.
할당량이 떨어지면 살아 있는 채로 멈춘다
모델 사용량을 다 쓰면 프로세스도 세션도 멀쩡한데 응답만 멈춘다. 프로세스를 보는 감시로는 못 잡는다. 큐에 메시지가 들어가고 나가는 기록도 정상으로 찍힌다.
우리는 감시기를 고쳐서 이 경우를 잡게 했다. 마지막 메시지 이후에 짧은 응답이 "한도에 도달했다"는 내용이고 디스코드 응답 도구 호출이 하나도 없으면 멈춘 것으로 본다. 그러면 세션을 내리고 감시자가 다시 띄운다.
이걸로 뭘 하고 있나
지금 이 블로그가 그 결과물이다. 디스코드에 "발행 43"이라고 보내면 맥미니가 글을 올린다. 유튜브 태그를 고치고, 서치 콘솔 숫자를 뽑고, 로그를 뒤지는 것도 같은 자리에서 한다.
실제로 주고받은 화면이다. 지운 글이 검색에 남아 있는지 확인해달라고 했더니 주소를 하나씩 찔러보고 결과를 정리해서 돌려줬다.

폰으로 한 줄 보내면 집에 있는 기계가 일한다. 그게 이 구성의 값어치다.
여기 나오는 명령과 경로는 실제로 돌아가는 설정에서 가져왔다.

'맥미니를 서버로' 카테고리의 다른 글
| sudo 없이 Tailscale 쓰기, 재부팅해도 안 죽게 만들기 (0) | 2026.09.10 |
|---|---|
| Tailscale이란? 회사 컴퓨터에서도 집 서버에 붙습니다 (0) | 2026.09.10 |
| Claude Code 사용법, 맥에서 설치하고 첫 작업까지 (0) | 2026.09.01 |
| 맥 외장하드 exFAT 손상, 영상 파일 유실 복구: 재마운트와 코덱 일치 (0) | 2026.08.31 |
| 디스코드 봇 명령어 만들기, 채팅 한 줄로 집 컴퓨터 실행시키기 (0) | 2026.08.28 |