혼자였으면 못 했을 Slack 봇 연결, AI한테 하나씩 물어보며 끝까지 해본 기록
한 줄 요약
Hermes/OpenClaw 스터디 1주차 과제를 하면서, WSL에 설치된 Hermes Agent를 Slack에 연결해 제 봇인 mile을 슬랙 채팅창에서 @mile로 호출할 수 있게 만 들었습니다. 혼자 했다면 중간에 포기했을 것 같은 설정들을 Hermes에게 계속 물어보며 하나씩 확인했고, 마지막에는 Slack에서 실제로 @mile이 응답하는 상태까지 만들었습니다.
이런 분들께 도움돼요
Hermes/OpenClaw를 설치했는데 “이제 뭘 확인해야 하지?”에서 막힌 분
Slack 봇, manifest, OAuth token, Socket Mode,
.env가 한꺼번에 나와서 헷갈리는 분WSL을 쓰고 있는데 파일 탐색기에서 Linux 파일을 어디서 열어야 하는지 모르겠는 분
AI 에이전트를 터미널이 아니라 Slack에서 부르고 싶은 분
설정값을 감으로 바꾸기보다 실제 명령어와 확인 결과로 검증하고 싶은 분
시작점: 저는 정말 초보자 모드였다
처음 목표는 거창하지 않았습니다.
Hermes/OpenClaw 기반 에이전트 스터디 1주차 과제를 하면서, 먼저 제 컴퓨터에 뭐가 설치되어 있는지 확인하고 싶었습니다.
처음 Hermes에게 물어본 것도 이런 내용이었습니다.
내 목표는 Hermes/OpenClaw 기반 에이전트 스터디 1주차 과제를 하는 것이다.
먼저 내 현재 환경을 확인해 줘.
확인할 것:
1. Hermes 또는 OpenClaw가 설치되어 있는지
2. Claude Code 또는 Codex가 설치되어 있는지
3. 현재 작업 폴더가 어디인지
4. 과제 파일을 저장할 안전한 폴더를 어디로 잡으면 좋을지
주의:
- 추측하지 말고 실제 명령어와 파일 확인 결과를 기준으로 말해 줘.
- 토큰, API 키, .env 내용은 출력하지 마.
이때부터 제가 계속 붙잡고 간 원칙은 하나였습니다.
추측하지 말고, 실제 확인 결과를 보고 다음 단계로 가기
Hermes는 제 환경을 실제 명령어로 확인해줬습니다.
Hermes CLI가 설치되어 있는지
버전이 무엇인지
설정 파일 경로가 어디인지
Python 환경이 정상인지
.env파일이 있는지profile 구조가 어떻게 되어 있는지
예를 들어 확인된 내용은 이런 식이었습니다.
Hermes Agent v0.14.0
config path: /home/user/.hermes/config.yaml
.env path: /home/user/.hermes/.env
저는 여기서부터 이미 “아, 이걸 혼자 했으면 공식 문서랑 터미널 사이에서 계속 헤맸겠다”는 생각이 들었습니다.
처음 만든 것은 Slack 봇이 아니라 mile 프로필이었다
처음부터 Slack 봇을 만든 건 아니었습니다.
먼저 Hermes 안에서 별도 프로필을 만들고 싶었습니다. 기본 Hermes와 분리된, 제 일상 기록과 Slack 연결을 맡을 별도 에이전트 느낌의 프로필이 필요했습니다.
그래서 mile 프로필을 만들고, 그 안에 역할 문서도 정리했습니다.
확인된 경로는 다음과 같습니다.
/home/user/.hermes/profiles/mile/SOUL.md
/home/user/.hermes/profiles/mile/AGENTS.md
/home/user/.hermes/profiles/mile/memories/MEMORY.md
제가 직접 모든 구조를 외워서 만든 것은 아니고, Hermes에게 계속 물어봤습니다.
soul.md, agents.md, memory.md 파일 어디에 저장했는지 경로 알려줘.
이렇게 물으면 Hermes가 실제 파일을 찾아서 경로를 알려줬습니다.
이 과정이 좋았던 이유는, 제가 “대충 여기 있을 것 같은데?”라고 추측하지 않아도 됐기 때문입니다.
목표가 바뀌었다: 터미널 속 Hermes를 Slack에서 부르고 싶다
프로필을 만들고 나니 다음 욕심이 생겼습니다.
터미널에서만 쓰는 게 아니라 Slack에서 이렇게 부르고 싶었습니다.
@mile 안녕
처음엔 단순해 보였습니다.
“Slack 앱 하나 만들고 토큰 넣으면 되는 거 아닌가?”
그런데 실제로는 다음 개념들이 한꺼번에 나왔습니다.
Slack App
App Manifest
Bot User OAuth Token
App-Level Token
Socket Mode
OAuth scopes
Event Subscriptions
Hermes gateway
Hermes profile별
.envsystemd user service
저는 이 단어들이 한 번에 나오니까 꽤 막막했습니다.
그래서 다시 Hermes에게 말했습니다.
slack api 랑 cli 설정 해서 봇 토큰 생성 하고 워크스페이스에 설치까지 해줘
여기서부터는 거의 옆에서 튜터가 한 단계씩 잡아주는 느낌으로 진행했습니다.
1차 삽질: manifest는 만들었는데, 이걸 어디에 쓰는지 몰랐다
먼저 Hermes로 Slack manifest를 만들었습니다.
제가 입력한 명령은 이런 식이었습니다.
hermes --profile mile slack manifest --write
생성된 파일은 여기였습니다.
/home/user/.hermes/profiles/mile/slack-manifest.json
그다음 제가 한 말이 지금 보면 좀 초보자답습니다.
json 파일 복사하게 말해줘.
처음에는 “파일을 복사하는 명령어”가 필요한 줄 알았는데, 사실 제가 원한 건 Slack API 화면에 붙여넣을 JSON 내용이었습니다. 그래서 다시 말했습니다.
아니 텍스트를 복사할거야. 여기 채팅방에 알려줘.
결국 Hermes가 manifest 안에 어떤 내용이 들어 있는지 요약해줬습니다.
Slack 앱 이름은 처음에
Hermes로 들어가 있었음/hermes,/new,/retry,/background,/goal같은 slash command가 많이 포함되어 있었음OAuth bot scopes가 들어 있었음
event subscription이 켜져 있었음
Socket Mode도 활성화되어 있었음
이때 알게 된 점은, Slack 앱 설정을 손으로 하나하나 누르는 대신 manifest가 앱 설정의 출발점 역할을 한다는 것이었습니다.
2차 삽질: .env 파일을 못 찾았다
Slack 앱에서 토큰을 만들고 나면 Hermes에 넣어야 합니다.
문제는 제가 .env 파일을 못 찾았다는 겁니다.
제가 실제로 물어본 말이 이거였습니다.
.env 파일 경로좀
Hermes가 확인해준 기본 .env 경로는 다음이었습니다.
/home/user/.hermes/.env
그런데 저는 파일 탐색기에서 이걸 못 찾았습니다.
그래서 다시 물어봤습니다.
못 찾겠어 ㅠㅠ slack bot token 어디다가 붙여넣으면 돼?
이 부분이 초보자 입장에서는 은근히 큰 벽이었습니다.
WSL에서는 Linux 경로가 /home/user/...처럼 보이지만, Windows 파일 탐색기에서는 일반적인 C드라이브 경로처럼 바로 보이지 않습니다. 게다가 .hermes처럼 앞에 점이 붙은 폴더는 숨김 폴더처럼 느껴져서 더 헷갈렸습니다.
나중에 정리된 파일 탐색기 접근 경로는 이런 식이었습니다.
\\wsl.localhost\Ubuntu\home\user\.hermes\profiles\mile\.env
이걸 알고 나니 “아, WSL 안의 파일도 파일 탐색기에서 열 수 있구나”가 이해됐습니다.
3차 삽질: default .env와 profile .env가 달랐다
처음에는 기본 Hermes의 .env만 보고 있었습니다.
하지만 Slack에 연결하려는 건 mile 프로필이었습니다.
그래서 실제로 토큰을 넣어야 하는 곳은 여기가 되어야 했습니다.
/home/user/.hermes/profiles/mile/.env
이 차이가 중요했습니다.
Hermes는 profile별로 독립된 home처럼 동작합니다. 그래서 default의 .env에 토큰이 있어도, mile 프로필의 .env에 없으면 mile gateway에서는 Slack이 설정되지 않은 것으로 보일 수 있습니다.
실제로 한때 확인 결과가 이렇게 나왔습니다.
Slack: not configured
SLACK_BOT_TOKEN: 없음
SLACK_APP_TOKEN: 없음
이때 결론은 명확했습니다.
Slack 앱 쪽 설정은 했지만,
Hermes mile 프로필의 .env 파일에는 아직 Slack 토큰이 없다.
혼자였다면 여기서 “왜 Slack에서 설치했는데 Hermes는 모른다고 하지?” 하고 꽤 오래 헤맸을 것 같습니다.
토큰은 이렇게 들어갔다
공개 글이라 실제 토큰은 절대 쓰지 않겠습니다.
구조만 보면 .env에는 이런 식으로 들어갑니다.
SLACK_BOT_TOKEN=xoxb-[REDACTED]
SLACK_APP_TOKEN=xapp-[REDACTED]
SLACK_ALLOWED_USERS=U...[REDACTED]
여기서 역할도 처음엔 헷갈렸습니다.
SLACK_BOT_TOKEN: Slack Web API를 호출하는 봇 토큰SLACK_APP_TOKEN: Socket Mode 연결을 위한 app-level tokenSLACK_ALLOWED_USERS: Slack에서 Hermes를 사용할 수 있는 사용자 제한
그리고 이때부터 토큰에 대한 원칙도 생겼습니다.
토큰은 채팅창에 붙여넣지 않는다.
.env 파일에만 넣는다.
공개 글에는 [REDACTED]로만 남긴다.
사실 중간에 한 번 토큰을 대화에 붙여넣는 실수를 했습니다. 그래서 Slack에서 Revoke All OAuth Tokens를 눌러 기존 토큰을 폐기하고, 새 토큰을 다시 받아 넣었습니다.
그 실수 덕분에 오히려 확실히 배웠습니다.
Revoke All OAuth Tokens는 앱을 지우는 버튼이 아니라, 기존 OAuth 토큰을 무효화하는 버튼입니다. 누르면 기존 xoxb-... 토큰은 더 이상 작동하지 않고, 새 토큰을 다시 받아 .env에 넣어야 합니다.
4차 삽질: 봇 이름을 바꿨는데도 계속 Hermes로 보였다
Slack 앱 설정 화면에서 봇 이름을 이렇게 바꿨습니다.
Display Name (Bot Name):
MileDefault username:
mile
그리고 OAuth & Permissions에서 재설치도 했습니다.
그런데 Hermes가 Slack API로 확인해보니 한동안 계속 이렇게 나왔습니다.
auth.test user: hermes
users.info real_name: Hermes
bots.info name: Hermes
설정 화면에서는 Mile/mile로 보이는데, 실제 워크스페이스에 설치된 봇 유저는 여전히 Hermes/hermes였던 겁니다.
이때 정말 헷갈렸습니다.
제가 보기에는 분명히 바꿨는데, 확인 결과는 안 바뀌어 있었기 때문입니다.
결국 새 토큰 발급과 재설치 과정을 거친 뒤에야 Slack API 결과가 바뀌었습니다.
최종 확인은 이렇게 나왔습니다.
auth.test user: mile2
users.info name: mile2
users.info real_name: Mile
bots.info name: Mile
여기서 또 한 번 헷갈렸습니다.
API에는 mile2라고 나오는데, 실제 Slack에서는 @mile로 호출이 됐기 때문입니다.
결론은 이렇습니다.
Slack API 내부 username: mile2
Slack에서 실제 호출: @mile
봇 표시 이름: Mile
Slack이 내부 username 충돌을 피하려고 mile2를 붙였지만, UI에서는 @mile 멘션이 정상 매칭되는 상태로 보입니다.
gateway 재시작과 최종 확인
토큰을 바꾼 뒤에는 gateway를 재시작해야 했습니다.
systemctl --user restart hermes-gateway-mile.service
그리고 mile 프로필 기준으로 gateway 상태를 확인했습니다.
hermes --profile mile gateway list
정상 상태는 이렇게 보였습니다.
Gateways:
✗ default — not running
✓ mile (current) — PID ...
여기서도 배운 점이 있습니다.
그냥 hermes gateway list를 치면 default 프로필 기준으로 보여서 헷갈릴 수 있습니다. mile 프로필을 확인하려면 꼭 이렇게 봐야 했습니다.
hermes --profile mile gateway list
이 작은 차이가 디버깅 시간을 꽤 줄여줬습니다.
최종 결과
결국 최종 상태는 이렇게 정리됐습니다.
Hermes 프로필:
milegateway 서비스:
hermes-gateway-mile.serviceSlack workspace:
NileSlack 봇 표시 이름:
MileSlack 실제 호출:
@mileSlack API 내부 username:
mile2gateway 상태: 정상 실행 중
Slack에서는 이렇게 호출할 수 있게 됐습니다.
두 사람의 대화 스크린샷
처음에는 터미널 안에서만 쓰던 Hermes가, 이제 Slack에서 부르면 응답하는 개인 에이전트처럼 느껴졌습니다.
Before vs After
Before:
Hermes가 설치되어 있는지는 알겠는데 어디까지 설정된 건지 불명확했음
Slack 앱, token, manifest,
.env, gateway가 서로 어떻게 이어지는지 몰랐음WSL 파일을 Windows 파일 탐색기에서 어떻게 열어야 하는지도 헷갈렸음
Slack 설정 화면에서 이름을 바꿨는데 실제 봇 이름이 왜 안 바뀌는지 몰랐음
오류가 나면 “내가 뭘 잘못했지?”부터 생각했음
After:
mile프로필의 Slack gateway를 systemd 서비스로 실행할 수 있게 됨Slack에서
@mile로 Hermes를 호출할 수 있게 됨profile별
.env가 따로 있다는 걸 이해함Slack API 결과로 실제 봇 identity를 검증하는 방법을 알게 됨
토큰은 반드시
.env에만 넣고, 채팅/문서에는 남기지 않는 습관이 생김문제가 생기면
서비스 상태 → 프로필 기준 확인 → 토큰 존재 여부 → Slack API identity → Slack UI 호출순서로 점검할 수 있게 됨
제가 실제로 배운 것
1. AI에게 “다 해줘”보다 “확인해줘”가 더 중요했다
이번 작업에서 제일 도움이 됐던 건 Hermes가 대신 명령어를 알려준 것보다, 매 단계마다 실제 상태를 확인해준 점이었습니다.
예를 들면 이런 식입니다.
Slack이 연결됐는지 확인해줘.
.env 파일 경로 알려줘.
지금 gateway가 어떤 profile로 떠 있는지 확인해줘.
이 token이 어떤 봇을 가리키는지 확인해줘.
혼자였다면 Slack 화면에서 바뀐 것처럼 보이는 값을 믿고 넘어갔을 것 같습니다. 그런데 실제 API 결과를 보니 아직 예전 봇으로 남아 있는 경우가 있었습니다.
2. 초보자에게 파일 경로는 생각보다 큰 장벽이다
/home/user/.hermes/.env라는 경로를 들으면 개발자에게는 익숙할 수 있지만, 저는 파일 탐색기에서 어디를 열어야 하는지부터 막혔습니다.
WSL 경로와 Windows 파일 탐색기 경로가 다르게 보인다는 것도 이번에 체감했습니다.
이런 경로를 알게 된 게 실전적으로 도움이 됐습니다.
\\wsl.localhost\Ubuntu\home\user\.hermes\profiles\mile\.env
3. profile을 쓰면 설정도 profile별로 봐야 한다
mile 프로필로 gateway를 실행한다면, default Hermes가 아니라 mile 프로필의 설정과 .env를 봐야 합니다.
앞으로도 Hermes에서 여러 프로필을 쓴다면 이 원칙은 계속 중요할 것 같습니다.
프로필이 다르면 config도, .env도, memory도, gateway도 따로 본다.
4. 토큰은 한 번 노출되면 폐기하는 게 맞다
중간에 토큰을 잘못 붙여넣은 건 아찔했습니다.
하지만 그 덕분에 revoke의 의미도 확실히 알게 됐습니다.
Revoke All OAuth Tokens는 앱 삭제가 아님기존 OAuth 토큰을 무효화하는 것
새 토큰을 다시 받아
.env에 넣어야 함gateway 재시작이 필요함
앞으로는 토큰을 절대 채팅창에 붙여넣지 않을 생각입니다.
다음에 같은 작업을 한다면 이렇게 할 것 같다
다음에 또 Slack 봇을 연결한다면, 저는 처음부터 이렇게 진행할 것 같습니다.
먼저 Hermes profile을 정한다.
해당 profile의
.env경로를 확인한다.Slack manifest를 만들고 앱 설정에 반영한다.
Bot User OAuth Token과 App-Level Token을 만든다.
토큰은 채팅에 쓰지 말고
.env에 직접 넣는다.gateway를 재시작한다.
hermes --profile [프로필명] gateway list로 확인한다.Slack API에서 실제 bot name과 username을 확인한다.
마지막으로 Slack UI에서 직접
@봇이름을 입력해본다.
마무리
이번 작업은 단순히 Slack 봇 하나 연결한 일이 아니었습니다.
저에게는 “AI 에이전트와 같이 환경 설정을 해본 경험”에 가까웠습니다.
혼자였다면 아마 여기저기 문서를 열어놓고, Slack 설정 화면과 WSL 경로와 터미널 명령어 사이에서 많이 헤맸을 것 같습니다. 특히 .env 파일을 못 찾았던 순간, manifest JSON을 어디에 붙여넣는지 헷갈렸던 순간, 봇 이름을 바꿨는데도 계속 Hermes로 보이던 순간은 혼자였으면 꽤 막막했을 것 같습니다.
그런데 이번에는 막힐 때마다 이렇게 물었습니다.
이거 어디에 넣어?
지금 연결된 거 맞아?
왜 아직 Hermes로 보여?
재시작해줘.
다시 확인해줘.
그리고 Hermes는 매번 실제 명령어와 API 확인 결과를 기준으로 다음 단계를 잡아줬습니다.
결과적으 로 지금은 Slack에서 @mile을 부르면 제 WSL 안의 Hermes Agent가 응답합니다.
작은 연결 하나지만, 저한테는 “아, 이제 진짜 에이전트를 내 작업 환경에 붙일 수 있겠구나”라는 느낌을 준 실습이었습니다.