오픈소스 에이전트(Hermes)로 만든 슬랙 봇에게 ERP·구글 캘린더·Linear·웹 검색 권한을 세 시간 만에 연결한 과정과, 중간에 만난 "봇이 갑자기 침묵하는" 버그를 잡은 기록입니다.
배경 — 머리는 좋은데 손발이 없는 비서
저희 B2B팀에는 슬랙에 상주하는 AI 비서 '김실장'이 있습니다. 오픈소스 에이전트 프레임워크인 Hermes를 제 개인 맥북에어에 설치해서 만든 봇인데, 슬랙에서 멘션하면 대답하고, 정체성 문서(SOUL.md)에 적어둔 대로 B2B팀 업무를 전담하도록 세팅해 뒀습니다.
문제는 이 비서가 말만 잘한다는 것이었습니다. 정체성 문서에는 "B2B Sales ERP 조회·생성·수정을 전담한다"고 적혀 있는데, 정작 ERP에 접속할 수단이 없었습니다. 일정을 물어봐도 캘린더를 못 보고, 회사 소식을 조사시켜도 검색 엔진이 없으니 브라우저를 통째로 띄워서 헤매다 실패하기 일쑤였죠.
발상 — 클로드코드에게 "너랑 비교해봐"라고 시키기
여기서 쓴 접근이 이번 사례의 핵심입니다. 제가 권한 목록을 하나하나 뜯어본 게 아니라, 클로드코드에게 자기 자신과 김실장을 비교하게 했습니다.
"현재 폴더에는 헤르메스 에이전트가 설치되어 있어. 현재 클로드 너가 가진 권한과 헤르메스가 가지고 있는 권한을 비교해서, 헤르메스가 일을 더 잘하기 위해 권한 추가나 하네스 설정이 필요한 것을 정리해서 제안해줘."
클로드코드는 이미 제 환경에서 Linear MCP, 구글 연동, ERP 스킬을 다 쓰고 있는 상태였습니다. 그러니 "내가 가진 것 중 김실장에게 없는 것"을 찾는 건 클로드코드 입장에서 아주 명확한 문제가 됩니다. 몇 분 만에 설정 파일과 로그를 뒤져서 이런 진단표가 나왔습니다.
영역 클로드코드 김실장
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
B2B Sales ERP ✅ 스킬 보유 ❌ API 키 자체가 없음
구글 (캘린더·메일·드라이브) ✅ ⚠️ 인증이 끊긴 채 방치
Linear ✅ MCP 연결 ❌ 없음
웹 검색 ✅ ❌ 검색 백엔드 미설정
복구 스냅샷·종료 검증 — ❌ 꺼져 있음"능력의 격차가 아니라 연결의 격차"라는 게 진단의 결론이었습니다.
실행 — 연동 4종 세트
1) ERP: 키를 문서에 박지 않고 파일로 분리
ERP 연동에서 배운 게 하나 있습니다. 클로드코드 쪽 스킬 문서에는 API 키가 평문으로 박혀 있었는데, 김실장 쪽에는 키를 별도 파일(권한 600)로 빼고, 스킬 문서에는 "이 파일에서 읽어라"라고만 적었습니다. 이렇게 하면 키 값이 AI의 대화 기록이나 슬랙 로그에 노출될 일이 없습니다. 연동 후 실제 API를 호출해 HTTP 200까지 확인.
2) 구글: '오류 페이지'가 정상인 인증 흐름
구글 인증은 브라우저 승인이 필요해서 제가 직접 개입한 유일한 단계였습니다. 재미있는 건 승인 후 "localhost에 연결할 수 없음" 오류 페이지가 뜨는 게 정상이라는 점입니다. 일부러 죽은 주소로 보내서, 주소창에 담긴 인증 코드를 복사해 클로드코드에게 넘기는 방식이거든요. 코드를 붙여넣자 토큰 교환과 검증(실제 캘린더 목록 조회)까지 클로드코드가 알아서 끝냈습니다.
3) Linear: "터미널인 척하기" 우회
Linear는 공식 MCP 서버가 있어서 hermes mcp install linear 한 줄이면 되는데, 로그인 명령이 "진짜 터미널에서만 실행 가능"이라며 거부하는 벽에 막혔습니다. 클로드코드가 가상 터미널(script 명령)로 감싸서 실행하는 우회로를 찾아냈고, 브라우저 인증까지 자동으로 열려서 도구 57개가 연결됐습니다.
한 가지 안전장치도 함께 넣었습니다. 봇이 Linear에 마음대로 쓰지 못하도록, 정체성 문서에 "Linear 등록·수정은 반드시 초안을 보여주고 승인받은 뒤 실행, 조회는 자유" 룰을 추가했습니다.
4) 웹 검색: 유료 메인 + 무료 예비
검색은 Tavily(무료 티어 월 1,000 회)를 메인으로, DuckDuckGo를 예비로 이중화했습니다. 클로드코드가 헤르메스 소스 코드를 읽고 "키가 있으면 Tavily를 자동 우선 사용한다"는 걸 확인해줘서 설정 파일은 건드릴 필요도 없었습니다.
삽질 — 봇이 갑자기 침묵했다
연동을 다 마치고 슬랙에서 @김실장 오늘과 내일 내 일정 알려줘를 보냈는데, ✅ 반응만 달고 답이 없었습니다.
클로드코드에게 조사를 시켰더니 세션 데이터베이스를 열어서 원인을 찾아냈습니다. 김실장이 메시지를 받긴 받았는데, 스스로 "응답하지 않음(NO_REPLY)"을 선택한 것이었습니다.
이유가 허탈합니다. 슬랙 시스템은 봇에게 메시지를 전달할 때 @김실장 멘션 태그를 본문에서 지우고 전달합니다. 그런데 정체성 문서에는 "명시적으로 호출된 경우에만 응답하라"고 적혀 있었죠. 김실장 눈에는 멘션 없는 인용문만 보이니 "나를 부른 게 아니구나" 하고 침묵한 겁니다. 규칙을 잘 지켜서 생긴 버그입니다.
해결은 한 줄이었습니다. 정체성 문서에 "메시지가 너에게 전달됐다는 것 자체가 이미 호출됐다는 뜻이다"라는 해석 룰을 추가하니 바로 대답하기 시작했습니다.
내친김에 스레드 대화 설정도 고쳤습니다. 기본값은 스레드에서 이어 말할 때도 매번 멘션해야 하는데, 사람끼리 대화할 때 매번 이름을 부르지 않듯이 한 번 부른 스레드에서는 멘션 없이 이어지도록 바꿨습니다.
결과
실제 작업 시간은 3시간 정도. 이제 슬랙에서 이런 게 다 됩니다.
"이번 달 대시보드 요약해줘" → ERP 실시간 조회
"오늘 내 일정 알려줘" → 구글 캘린더
"Linear에서 진행 중 프로젝트 보여줘" → Linear 조회 (등록은 승인 후)
"OO 회사 최근 소식 검색해줘" → Tavily 검색
배운 점
"너랑 비교해봐"는 강력한 진단 프롬프트다. AI에게 추상적으로 "뭐가 부족해?"라고 묻는 것보다, 이미 잘 갖춰진 환경(클로드코드 자신)을 기준점으로 주면 격차가 구체적으로 나온다.
오픈소스 봇의 격차는 능력이 아니라 연결이다. 모델은 같은 수준인데 API 키 하나, 인증 하나가 없어서 못 하는 일이 대부분이었다.
AI 봇의 버그는 코드가 아니라 '규칙 충돌'에서 온다. 침묵 버그는 코드 오류가 아니라, 시스템 동작(멘션 제거)과 지시문("멘션 시에만 응답")이 충돌한 결과였다. 봇이 이상하게 굴면 로그보다 먼저 지시문을 의심할 것.
비밀 키는 문서가 아니라 파일에. AI에게 주는 스킬 문서에 키를 평문으로 박으 면 대화 기록으로 새어나간다. 파일 분리 + "읽어서 써라" 패턴이 안전하다.
작업 환경: Hermes(오픈소스 에이전트, 개인 맥북에어) + Claude Code. 본문의 도식 2장은 Claude Code의 diagram-design 스킬(김태현님 제작 GPTers 버전)로 생성했습니다.
*로나(RONA)야~ 너는 어디에 있니? - 어서 돌아오렴...