본문으로 건너뛰기

Slack 설정

Socket Mode를 사용해 Hermes Agent를 Slack 봇으로 연결합니다. Socket Mode는 공개 HTTP 엔드포인트 대신 WebSocket을 사용하므로, Hermes 인스턴스가 외부에 공개되어 있을 필요가 없습니다. 방화벽 뒤, 노트북, 비공개 서버에서도 동작합니다.

Classic Slack Apps Deprecated

Classic Slack 앱, 즉 RTM API를 사용하는 예전 Slack 앱은 2025년 3월에 완전히 지원 종료되었습니다. Hermes는 최신 Bolt SDK와 Socket Mode를 사용합니다. 예전 classic 앱을 가지고 있다면 아래 절차에 따라 새 앱을 만들어야 합니다.

개요

구성 요소
라이브러리Python용 slack-bolt / slack_sdk (Socket Mode)
연결 방식WebSocket - 공개 URL 필요 없음
필요한 인증 토큰Bot Token (xoxb-) + App-Level Token (xapp-)
사용자 식별Slack Member ID (예: U01ABC2DEF3)

1단계: Slack App 생성

가장 빠른 방법은 Hermes가 생성한 manifest를 붙여 넣는 것입니다. 이 manifest는 내장 slash command 전체(/btw, /stop, /model 등), 필요한 OAuth scope, event subscription, Socket Mode 활성화를 한 번에 선언합니다.

  1. manifest를 생성합니다.
    hermes slack manifest --write
    이 명령은 ~/.hermes/slack-manifest.json을 만들고, Slack 화면에 붙여 넣는 방법을 출력합니다.
  2. https://api.slack.com/apps로 이동한 뒤 Create New App -> From an app manifest를 선택합니다.
  3. 워크스페이스를 선택하고 JSON 내용을 붙여 넣은 다음 검토 후 Next -> Create를 클릭합니다.
  4. 6단계: 워크스페이스에 앱 설치로 건너뜁니다. scope, event, slash command 설정은 manifest가 이미 처리했습니다.

옵션 B: 처음부터 수동 생성

  1. https://api.slack.com/apps로 이동합니다.
  2. Create New App을 클릭합니다.
  3. From scratch를 선택합니다.
  4. 앱 이름을 입력하고(예: "Hermes Agent") 워크스페이스를 선택합니다.
  5. Create App을 클릭합니다.

앱의 Basic Information 페이지로 이동합니다. 이어서 2-6단계를 진행합니다.


2단계: Bot Token scope 설정

왼쪽 사이드바에서 Features -> OAuth & Permissions로 이동합니다. Scopes -> Bot Token Scopes까지 스크롤한 뒤 다음 scope를 추가합니다.

Scope용도
chat:write봇으로 메시지 보내기
app_mentions:read채널에서 @mention 감지
channels:history봇이 참여한 공개 채널의 메시지 읽기
channels:read공개 채널 목록 및 정보 조회
groups:history봇이 초대된 비공개 채널의 메시지 읽기
im:historyDM 기록 읽기
im:read기본 DM 정보 보기
im:writeDM 열기 및 관리
users:read사용자 정보 조회
files:read음성 메모와 오디오를 포함한 첨부 파일 읽기 및 다운로드
files:write파일 업로드(이미지, 오디오, 문서)
Missing scopes = missing features

channels:historygroups:history가 없으면 봇은 채널 메시지를 받지 못하고 DM에서만 동작합니다. files:read가 없으면 Hermes가 채팅은 할 수 있지만, 사용자가 업로드한 첨부 파일을 안정적으로 읽을 수 없습니다. 가장 자주 빠지는 scope입니다.

선택 scope:

Scope용도
groups:read비공개 채널 목록 및 정보 조회

3단계: Socket Mode 활성화

Socket Mode를 사용하면 공개 URL을 요구하지 않고 봇이 WebSocket으로 연결됩니다.

  1. 왼쪽 사이드바에서 Settings -> Socket Mode로 이동합니다.
  2. Enable Socket Mode를 ON으로 전환합니다.
  3. App-Level Token을 만들라는 안내가 표시됩니다.
    • 이름은 hermes-socket처럼 입력합니다. 이름 자체는 중요하지 않습니다.
    • connections:write scope를 추가합니다.
    • Generate를 클릭합니다.
  4. 토큰을 복사합니다. xapp-로 시작합니다. 이 값이 SLACK_APP_TOKEN입니다.

App-level token은 언제든 Settings -> Basic Information -> App-Level Tokens에서 확인하거나 다시 만들 수 있습니다.


4단계: 이벤트 구독

이 단계는 봇이 어떤 메시지를 볼 수 있는지를 결정하므로 매우 중요합니다.

  1. 왼쪽 사이드바에서 Features -> Event Subscriptions로 이동합니다.
  2. Enable Events를 ON으로 전환합니다.
  3. Subscribe to bot events를 펼친 뒤 다음 event를 추가합니다.
Event필수 여부용도
message.im필수봇이 DM을 받음
message.channels필수봇이 추가된 공개 채널의 메시지를 받음
message.groups권장봇이 초대된 비공개 채널의 메시지를 받음
app_mention필수봇이 @mention될 때 Bolt SDK 오류 방지
  1. 페이지 하단의 Save Changes를 클릭합니다.
Missing event subscriptions is the #1 setup issue

봇이 DM에서는 동작하지만 채널에서는 동작하지 않는다면, 거의 항상 message.channels(공개 채널) 또는 message.groups(비공개 채널)를 추가하지 않은 경우입니다. 이 event가 없으면 Slack은 채널 메시지를 봇에게 전달하지 않습니다.


5단계: Messages 탭 활성화

이 단계는 봇에게 DM을 보낼 수 있게 합니다. 이 설정이 없으면 사용자가 봇에게 DM을 보내려 할 때 **"Sending messages to this app has been turned off"**가 표시됩니다.

  1. 왼쪽 사이드바에서 Features -> App Home으로 이동합니다.
  2. Show Tabs까지 스크롤합니다.
  3. Messages Tab을 ON으로 전환합니다.
  4. **"Allow users to send Slash commands and messages from the messages tab"**을 체크합니다.
Without this step, DMs are completely blocked

scope와 event subscription이 모두 올바르더라도 Messages Tab이 활성화되어 있지 않으면 Slack은 사용자가 봇에게 DM을 보내지 못하게 막습니다. 이는 Hermes 설정 문제가 아니라 Slack 플랫폼 요구사항입니다.


6단계: 워크스페이스에 앱 설치

  1. 왼쪽 사이드바에서 Settings -> Install App으로 이동합니다.
  2. Install to Workspace를 클릭합니다.
  3. 권한을 검토한 뒤 Allow를 클릭합니다.
  4. 인증이 끝나면 xoxb-로 시작하는 Bot User OAuth Token이 표시됩니다.
  5. 이 토큰을 복사합니다. 이 값이 SLACK_BOT_TOKEN입니다.

나중에 scope 또는 event subscription을 변경했다면, 변경 사항이 적용되도록 앱을 반드시 다시 설치해야 합니다. Install App 페이지에 재설치 안내 배너가 표시됩니다.


7단계: 허용 목록용 사용자 ID 찾기

Hermes는 허용 목록에 Slack Member ID를 사용합니다. 사용자명이나 표시 이름이 아닙니다.

Member ID를 찾는 방법:

  1. Slack에서 사용자의 이름 또는 아바타를 클릭합니다.
  2. View full profile을 클릭합니다.
  3. ...(more) 버튼을 클릭합니다.
  4. Copy member ID를 선택합니다.

Member ID는 U01ABC2DEF3 같은 형식입니다. 최소한 본인의 Member ID는 필요합니다.


8단계: Hermes 설정

~/.hermes/.env 파일에 다음 값을 추가합니다.

# Required
SLACK_BOT_TOKEN=xoxb-your-bot-token-here
SLACK_APP_TOKEN=xapp-your-app-token-here
SLACK_ALLOWED_USERS=U01ABC2DEF3 # Comma-separated Member IDs

# Optional
SLACK_HOME_CHANNEL=C01234567890 # Default channel for cron/scheduled messages
SLACK_HOME_CHANNEL_NAME=general # Human-readable name for the home channel (optional)

또는 대화형 설정을 실행합니다.

hermes gateway setup    # Select Slack when prompted

그런 다음 gateway를 시작합니다.

hermes gateway              # Foreground
hermes gateway install # Install as a user service
sudo hermes gateway install --system # Linux only: boot-time system service

9단계: 채널에 봇 초대

gateway를 시작한 뒤에는, 봇이 응답해야 하는 채널마다 봇을 초대해야 합니다.

/invite @Hermes Agent

봇은 채널에 자동으로 참여하지 않습니다. 각 채널에 개별적으로 초대해야 합니다.


Slash command

모든 Hermes 명령(/btw, /stop, /new, /model, /help 등)은 Telegram과 Discord에서처럼 Slack의 네이티브 slash command로 동작합니다. Slack에서 /를 입력하면 자동완성 목록에 모든 Hermes 명령과 설명이 표시됩니다.

동작 방식은 다음과 같습니다. Hermes는 1단계의 옵션 A에서 설명한 Slack app manifest를 생성하며, 이 manifest는 COMMAND_REGISTRY에 등록된 모든 명령을 slash command로 선언합니다. Socket Mode에서는 manifest의 url 필드 값과 관계없이 Slack이 WebSocket을 통해 command event를 전달합니다.

업데이트 후 slash command 새로고침

Hermes에 새 명령이 추가되면(예: hermes update 이후), manifest를 다시 생성하고 Slack 앱을 업데이트합니다.

hermes slack manifest --write

Slack에서 다음을 수행합니다.

  1. https://api.slack.com/apps를 열고 Hermes 앱을 선택합니다.
  2. Features -> App Manifest -> Edit로 이동합니다.
  3. ~/.hermes/slack-manifest.json의 새 내용을 붙여 넣습니다.
  4. Save를 클릭합니다. scope 또는 slash command가 바뀐 경우 Slack이 앱 재설치를 안내합니다.

레거시 /hermes <subcommand>도 계속 동작

예전 manifest와의 하위 호환성을 위해 /hermes btw run the tests처럼 입력할 수도 있습니다. Hermes는 이를 /btw run the tests와 같은 방식으로 라우팅합니다. 자유 형식 질문도 동작합니다. /hermes what's the weather?는 일반 메시지로 처리됩니다.

스레드 안에서 명령 사용: !cmd 접두사

Slack은 스레드 답글 안에서 네이티브 slash command를 차단합니다. 스레드에서 /queue를 시도하면 Slack은 *"/queue is not supported in threads. Sorry!"*라고 응답합니다. 앱 설정으로 이를 다시 허용할 방법은 없으며, Slack은 해당 command event를 Hermes에 전달하지 않습니다.

대신 Hermes는 맨 앞의 !를 대체 명령 접두사로 인식합니다. 이 방식은 스레드 안에서도, 그 외 위치에서도 동작합니다. 일반 스레드 답글로 !queue, !stop, !model gpt-5.4 등을 입력하면 Hermes가 slash command와 동일하게 처리하고 같은 스레드에 답합니다.

첫 번째 토큰만 알려진 명령 목록과 비교하므로, !nice work 같은 일반 메시지는 명령으로 처리되지 않고 그대로 에이전트에 전달됩니다.

고급: slash command 배열만 출력

Slack manifest를 수동으로 관리하고 있고 slash command 목록만 필요하다면 다음을 실행합니다.

hermes slack manifest --slashes-only > /tmp/slashes.json

출력된 배열을 기존 manifest의 features.slash_commands 키에 붙여 넣습니다.


봇 응답 방식

Hermes가 각 상황에서 어떻게 동작하는지 이해해 두면 문제를 훨씬 빨리 진단할 수 있습니다.

상황동작
DM봇은 모든 메시지에 응답합니다. @mention이 필요 없습니다.
채널봇은 @mention된 경우에만 응답합니다. 예: @Hermes Agent what time is it?. 채널에서는 Hermes가 해당 메시지에 연결된 스레드로 답합니다.
스레드기존 스레드 안에서 Hermes를 @mention하면 같은 스레드에 답합니다. 봇이 해당 스레드에서 활성 session을 갖게 되면, 이후 같은 스레드의 답글에는 @mention이 필요 없습니다. 봇이 대화 흐름을 자연스럽게 따라갑니다.

채널에서 대화를 시작할 때는 항상 봇을 @mention하세요. 봇이 스레드에서 활성화된 뒤에는 같은 스레드에서 mention 없이 이어서 답할 수 있습니다. 스레드 밖의 채널 메시지는 바쁜 채널의 소음을 줄이기 위해 @mention이 없으면 무시됩니다.


설정 옵션

8단계의 필수 환경 변수 외에도 ~/.hermes/config.yaml에서 Slack 봇 동작을 세부 조정할 수 있습니다.

스레드 및 응답 동작

platforms:
slack:
# Controls how multi-part responses are threaded
# "off" -> never thread replies to the original message
# "first" -> first chunk threads to user's message (default)
# "all" -> all chunks thread to user's message
reply_to_mode: "first"

extra:
# Whether to reply in a thread (default: true).
# When false, channel messages get direct channel replies instead
# of threads. Messages inside existing threads still reply in-thread.
reply_in_thread: true

# Also post thread replies to the main channel
# (Slack's "Also send to channel" feature).
# Only the first chunk of the first reply is broadcast.
reply_broadcast: false
Key기본값설명
platforms.slack.reply_to_mode"first"여러 조각으로 나뉜 응답을 어떤 방식으로 스레드에 연결할지 결정합니다. 가능한 값: "off", "first", "all"
platforms.slack.extra.reply_in_threadtruefalse이면 채널 메시지에 스레드 대신 채널 직접 답글로 응답합니다. 기존 스레드 안의 메시지는 계속 스레드 안에서 답합니다.
platforms.slack.extra.reply_broadcastfalsetrue이면 스레드 답글을 메인 채널에도 게시합니다. 첫 번째 응답의 첫 번째 chunk만 broadcast됩니다.

session 격리

# Global setting - applies to Slack and all other platforms
group_sessions_per_user: true

true(기본값)이면 공유 채널 안에서도 사용자마다 독립된 대화 session을 갖습니다. 예를 들어 #general에서 두 사용자가 Hermes와 대화하면 서로 다른 기록과 context를 사용합니다.

채널 전체가 하나의 대화 session을 공유하는 협업 모드를 원한다면 false로 설정합니다. 이 경우 사용자가 context 증가와 token 비용을 공유하며, 한 사용자의 /reset이 모든 사용자의 session을 지운다는 점에 유의하세요.

mention 및 trigger 동작

slack:
# Require @mention in channels (this is the default behavior;
# the Slack adapter enforces @mention gating in channels regardless,
# but you can set this explicitly for consistency with other platforms)
require_mention: true

# Prevent thread auto-engagement: only reply to channel messages that
# contain an explicit @mention. With this OFF (default), Slack can
# "auto-engage" - remembering past mentions in a thread and following
# up on bot-message replies, and resuming active sessions without a
# fresh mention. With strict_mention ON, every new channel message
# must @mention the bot before Hermes will respond.
strict_mention: false

# Custom mention patterns that trigger the bot
# (in addition to the default @mention detection)
mention_patterns:
- "hey hermes"
- "hermes,"

# Text prepended to every outgoing message
reply_prefix: ""
When to use strict_mention

Slack의 기본 "봇이 이 스레드를 기억하고 이어서 응답하는" 동작이 사용자에게 예상 밖으로 보일 수 있는 바쁜 워크스페이스에서는 true로 설정하는 것이 좋습니다. 예를 들어 긴 기술 지원 스레드에서 봇이 초반에 도움을 준 뒤, 이후에는 명시적으로 다시 호출할 때만 응답하길 원할 수 있습니다. DM과 활성 interactive session에는 영향이 없습니다.

정보

Slack은 두 패턴을 모두 지원합니다. 기본적으로 대화를 시작하려면 @mention이 필요하지만, 특정 채널은 SLACK_FREE_RESPONSE_CHANNELS(쉼표로 구분한 channel ID) 또는 config.yamlslack.free_response_channels로 예외 처리할 수 있습니다. 봇이 스레드에서 활성 session을 갖게 되면 이후 같은 스레드의 답글에는 mention이 필요 없습니다. DM에서는 봇이 항상 mention 없이 응답합니다.

미인증 사용자 처리

slack:
# What happens when an unauthorized user (not in SLACK_ALLOWED_USERS) DMs the bot
# "pair" -> prompt them for a pairing code (default)
# "ignore" -> silently drop the message
unauthorized_dm_behavior: "pair"

모든 platform에 대해 전역으로 설정할 수도 있습니다.

unauthorized_dm_behavior: "pair"

slack: 아래의 platform별 설정은 전역 설정보다 우선합니다.

음성 전사

# Global setting - enable/disable automatic transcription of incoming voice messages
stt_enabled: true

true(기본값)이면 들어오는 오디오 메시지는 에이전트가 처리하기 전에 설정된 STT provider를 통해 자동 전사됩니다.

전체 예제

# Global gateway settings
group_sessions_per_user: true
unauthorized_dm_behavior: "pair"
stt_enabled: true

# Slack-specific settings
slack:
require_mention: true
unauthorized_dm_behavior: "pair"

# Platform config
platforms:
slack:
reply_to_mode: "first"
extra:
reply_in_thread: true
reply_broadcast: false

홈 채널

SLACK_HOME_CHANNEL에는 Hermes가 예약 메시지, cron 작업 결과, 그 밖의 proactive 알림을 보낼 채널 ID를 설정합니다. 채널 ID를 찾는 방법:

  1. Slack에서 채널 이름을 오른쪽 클릭합니다.
  2. View channel details를 클릭합니다.
  3. 맨 아래까지 스크롤하면 Channel ID가 표시됩니다.
SLACK_HOME_CHANNEL=C01234567890

봇이 해당 채널에 초대되어 있어야 합니다. (/invite @Hermes Agent)


멀티 워크스페이스 지원

Hermes는 하나의 gateway 인스턴스에서 여러 Slack 워크스페이스에 동시에 연결할 수 있습니다. 각 워크스페이스는 자체 bot user ID로 독립 인증됩니다.

설정

SLACK_BOT_TOKEN에 여러 bot token을 쉼표로 구분한 목록으로 제공합니다.

# Multiple bot tokens - one per workspace
SLACK_BOT_TOKEN=xoxb-workspace1-token,xoxb-workspace2-token,xoxb-workspace3-token

# A single app-level token is still used for Socket Mode
SLACK_APP_TOKEN=xapp-your-app-token

또는 ~/.hermes/config.yaml에 설정합니다.

platforms:
slack:
token: "xoxb-workspace1-token,xoxb-workspace2-token"

OAuth 토큰 파일

환경 변수나 config의 token 외에도 Hermes는 다음 위치의 OAuth token file에서 token을 불러옵니다.

~/.hermes/slack_tokens.json

이 파일은 team ID를 token entry에 매핑하는 JSON 객체입니다.

{
"T01ABC2DEF3": {
"token": "xoxb-workspace-token-here",
"team_name": "My Workspace"
}
}

이 파일의 token은 SLACK_BOT_TOKEN으로 지정한 token과 병합됩니다. 중복 token은 자동으로 제거됩니다.

동작 방식

  • 목록의 첫 번째 token이 primary token이며, Socket Mode 연결(AsyncApp)에 사용됩니다.
  • 시작 시 각 token은 auth.test로 인증됩니다. gateway는 각 team_id를 자체 WebClientbot_user_id에 매핑합니다.
  • 메시지가 도착하면 Hermes는 올바른 워크스페이스별 client를 사용해 응답합니다.
  • primary bot_user_id(첫 번째 token에서 얻은 값)는 단일 bot identity를 기대하는 기능과의 하위 호환성을 위해 사용됩니다.

음성 메시지

Hermes는 Slack에서 음성 기능을 지원합니다.

  • 수신: 음성/오디오 메시지는 설정된 STT provider로 자동 전사됩니다. 지원 예: 로컬 faster-whisper, Groq Whisper(GROQ_API_KEY), OpenAI Whisper(VOICE_TOOLS_OPENAI_KEY)
  • 송신: TTS 응답은 오디오 파일 첨부로 전송됩니다.

채널별 prompt

특정 Slack 채널에 임시 system prompt를 할당합니다. prompt는 매 turn마다 런타임에 주입되며 transcript history에는 저장되지 않습니다. 따라서 변경 사항이 즉시 적용됩니다.

slack:
channel_prompts:
"C01RESEARCH": |
You are a research assistant. Focus on academic sources,
citations, and concise synthesis.
"C02ENGINEERING": |
Code review mode. Be precise about edge cases and
performance implications.

키는 Slack channel ID입니다. channel details의 About에서 맨 아래로 스크롤하면 확인할 수 있습니다. 일치하는 채널의 모든 메시지에는 prompt가 임시 system instruction으로 주입됩니다.

채널별 Skill 바인딩

특정 채널이나 DM에서 새 session이 시작될 때 skill을 자동으로 로드합니다. 매 turn 주입되는 채널별 prompt와 달리, skill binding은 session 시작 시점에 skill 내용을 user message로 주입합니다. 이 내용은 대화 기록의 일부가 되며 이후 turn마다 다시 로드할 필요가 없습니다.

이 방식은 flashcards, 특정 도메인 Q&A 봇, support triage 채널처럼 목적이 뚜렷한 DM이나 채널에 적합합니다. 짧은 답글마다 모델의 skill selector가 로드 여부를 판단하게 두고 싶지 않을 때 유용합니다.

slack:
channel_skill_bindings:
# DM channel - always runs in "german-flashcards" mode
- id: "D0ATH9TQ0G6"
skills:
- german-flashcards
# Research channel - preload multiple skills in order
- id: "C01RESEARCH"
skills:
- arxiv
- writing-plans
# Short form: single skill as a string
- id: "C02SUPPORT"
skill: hubspot-on-demand

참고:

  • 바인딩은 channel ID 기준으로 매칭됩니다. 바인딩된 채널의 thread message는 부모 channel의 바인딩을 상속합니다.
  • skill은 session 시작 시에만 로드됩니다. 새 session 또는 auto-reset 이후를 의미합니다. 바인딩을 변경했다면 /new를 실행하거나 session이 자동 reset될 때까지 기다려야 적용됩니다.
  • channel_prompts와 함께 사용하면 skill 지침 위에 채널별 말투나 제약을 추가할 수 있습니다.

문제 해결

문제해결 방법
봇이 DM에 응답하지 않음event subscription에 message.im이 포함되어 있는지 확인하고 앱을 다시 설치합니다.
봇이 DM에서는 동작하지만 채널에서는 동작하지 않음가장 흔한 문제입니다. event subscription에 message.channelsmessage.groups를 추가하고, 앱을 다시 설치한 뒤 /invite @Hermes Agent로 봇을 채널에 초대합니다.
봇이 채널의 @mention에 응답하지 않음1) message.channels event가 구독되어 있는지 확인합니다. 2) 봇이 채널에 초대되어 있어야 합니다. 3) channels:history scope가 추가되어 있는지 확인합니다. 4) scope/event 변경 후 앱을 다시 설치합니다.
봇이 비공개 채널 메시지를 무시함message.groups event subscription과 groups:history scope를 모두 추가한 뒤 앱을 다시 설치하고 봇을 /invite합니다.
DM에서 "Sending messages to this app has been turned off"가 표시됨App Home 설정에서 Messages Tab을 활성화합니다. 5단계를 참고하세요.
"not_authed" 또는 "invalid_auth" 오류Bot Token과 App Token을 다시 생성하고 .env를 업데이트합니다.
봇이 응답은 하지만 채널에 게시하지 못함/invite @Hermes Agent로 봇을 채널에 초대합니다.
봇이 채팅은 하지만 업로드된 이미지/파일을 읽지 못함files:read를 추가한 뒤 앱을 다시 설치합니다. Slack이 scope/auth/permission 실패를 반환하면 Hermes가 첨부 파일 접근 진단을 채팅에 표시합니다.
missing_scope 오류OAuth & Permissions에서 필요한 scope를 추가한 뒤 앱을 다시 설치합니다.
Socket 연결이 자주 끊김네트워크를 확인합니다. Bolt는 자동 재연결하지만, 불안정한 연결은 지연을 유발합니다.
scope/event를 변경했는데 아무것도 바뀌지 않음scope 또는 event subscription을 바꾼 뒤에는 워크스페이스에 앱을 반드시 다시 설치해야 합니다.

빠른 체크리스트

봇이 채널에서 동작하지 않으면 다음 항목을 모두 확인하세요.

  1. message.channels event가 구독되어 있음(공개 채널)
  2. message.groups event가 구독되어 있음(비공개 채널)
  3. app_mention event가 구독되어 있음
  4. channels:history scope가 추가되어 있음(공개 채널)
  5. groups:history scope가 추가되어 있음(비공개 채널)
  6. scope/event 추가 후 앱을 다시 설치했음
  7. 봇이 채널에 초대되어 있음(/invite @Hermes Agent)
  8. 메시지에서 봇을 @mention하고 있음

보안

경고

항상 SLACK_ALLOWED_USERS를 설정해 허가된 사용자의 Member ID를 지정하세요. 이 설정이 없으면 gateway는 안전을 위해 기본적으로 모든 메시지를 거부합니다. bot token은 절대 공유하지 말고 비밀번호처럼 다루세요.

  • token은 ~/.hermes/.env에 저장하고 파일 권한은 600으로 제한하는 것이 좋습니다.
  • Slack 앱 설정에서 token을 주기적으로 rotate하세요.
  • Hermes config 디렉터리에 접근할 수 있는 사용자를 점검하세요.
  • Socket Mode를 사용하면 공개 endpoint가 노출되지 않아 공격 표면이 하나 줄어듭니다.