Slack
Socket 모드 (기본값)
빠른 설정 (초보자)
- Slack 앱을 생성하고 Socket Mode 를 활성화합니다.
- App Token (
xapp-...) 과 Bot Token (xoxb-...) 을 생성합니다. - OpenClaw 에 토큰을 설정하고 Gateway(게이트웨이) 를 시작합니다.
설정
- https://api.slack.com/apps 에서 Slack 앱을 생성합니다 (From scratch).
- Socket Mode → 켬으로 전환합니다. 그런 다음 Basic Information → App-Level Tokens → 범위
connections:write로 Generate Token and Scopes 를 선택합니다. App Token (xapp-...) 을 복사합니다. - OAuth & Permissions → 봇 토큰 범위를 추가합니다 (아래 매니페스트 사용). Install to Workspace 를 클릭합니다. Bot User OAuth Token (
xoxb-...) 을 복사합니다. - 선택 사항: OAuth & Permissions → User Token Scopes 를 추가합니다 (아래 읽기 전용 목록 참조). 앱을 다시 설치하고 User OAuth Token (
xoxp-...) 을 복사합니다. - Event Subscriptions → 이벤트를 활성화하고 다음을 구독합니다:
message.*(편집/삭제/스레드 브로드캐스트 포함)app_mentionreaction_added,reaction_removedmember_joined_channel,member_left_channelchannel_renamepin_added,pin_removed
- 읽도록 할 채널에 봇을 초대합니다.
- Slash Commands →
channels.slack.slashCommand를 사용하는 경우/openclaw를 생성합니다. 네이티브 명령을 활성화하는 경우, 내장 명령마다 하나의 슬래시 명령을 추가합니다 (/help와 동일한 이름). Slack 에서는 기본적으로 네이티브가 꺼져 있으므로channels.slack.commands.native: true를 설정해야 합니다 (전역commands.native의 기본값은"auto"로 Slack 을 끕니다). - App Home → Messages Tab 을 활성화하여 사용자가 봇에게 다이렉트 메시지 를 보낼 수 있게 합니다.
name 를 사용하여 channels.slack.accounts 를 설정합니다. 공통 패턴은 gateway/configuration 를 참조하십시오.
OpenClaw 설정 (Socket 모드)
환경 변수로 토큰을 설정하세요 (권장):SLACK_APP_TOKEN=xapp-...SLACK_BOT_TOKEN=xoxb-...
사용자 토큰 (선택 사항)
OpenClaw 는 읽기 작업 (히스토리, 핀, 반응, 이모지, 멤버 정보) 에 Slack 사용자 토큰 (xoxp-...) 을 사용할 수 있습니다. 기본적으로 읽기 전용으로 유지됩니다. 사용자 토큰이 있으면 읽기는 사용자 토큰을 우선하며, 쓰기는 명시적으로 옵트인하지 않는 한 봇 토큰을 사용합니다. userTokenReadOnly: false 를 설정하더라도, 봇 토큰이 사용 가능하면 쓰기에는 봇 토큰이 계속 우선됩니다.
사용자 토큰은 설정 파일에서만 구성할 수 있습니다 (환경 변수 미지원). 다중 계정의 경우 channels.slack.accounts.<id>.userToken 를 설정하십시오.
봇 + 앱 + 사용자 토큰 예시:
토큰 사용 규칙
- 읽기 작업 (히스토리, 반응 목록, 핀 목록, 이모지 목록, 멤버 정보, 검색) 은 구성된 경우 사용자 토큰을 우선 사용하며, 그렇지 않으면 봇 토큰을 사용합니다.
- 쓰기 작업 (메시지 전송/편집/삭제, 반응 추가/제거, 핀/해제, 파일 업로드) 은 기본적으로 봇 토큰을 사용합니다.
userTokenReadOnly: false이고 봇 토큰이 없을 경우 OpenClaw 는 사용자 토큰으로 대체합니다.
히스토리 컨텍스트
channels.slack.historyLimit(또는channels.slack.accounts.*.historyLimit) 는 최근 채널/그룹 메시지를 프롬프트에 포함할 개수를 제어합니다.messages.groupChat.historyLimit로 대체됩니다. 비활성화하려면0를 설정하십시오 (기본값 50).
HTTP 모드 (Events API)
Gateway(게이트웨이) 가 HTTPS 를 통해 Slack 에서 접근 가능한 경우 (일반적인 서버 배포) HTTP 웹훅 모드를 사용합니다. HTTP 모드는 Events API + Interactivity + Slash Commands 를 공유 요청 URL 로 사용합니다.설정 (HTTP 모드)
- Slack 앱을 생성하고 Socket Mode 를 비활성화합니다 (HTTP 만 사용하는 경우 선택 사항).
- Basic Information → Signing Secret 을 복사합니다.
- OAuth & Permissions → 앱을 설치하고 Bot User OAuth Token (
xoxb-...) 을 복사합니다. - Event Subscriptions → 이벤트를 활성화하고 Request URL 을 Gateway(게이트웨이) 웹훅 경로로 설정합니다 (기본값
/slack/events). - Interactivity & Shortcuts → 활성화하고 동일한 Request URL 을 설정합니다.
- Slash Commands → 명령에 대해 동일한 Request URL 을 설정합니다.
https://gateway-host/slack/events
OpenClaw 설정 (최소)
channels.slack.accounts.<id>.mode = "http" 를 설정하고 각 계정마다 고유한 webhookPath 를 제공하여 각 Slack 앱이 자체 URL 을 가리키도록 합니다.
매니페스트 (선택 사항)
이 Slack 앱 매니페스트를 사용하면 앱을 빠르게 생성할 수 있습니다 (원하는 경우 이름/명령을 조정). 사용자 토큰을 구성할 계획이라면 사용자 범위를 포함하십시오.slash_commands 항목을 추가합니다 (/help 목록과 일치). channels.slack.commands.native 로 재정의할 수 있습니다.
범위 (현재 vs 선택)
Slack Conversations API 는 타입별 범위를 사용합니다. 실제로 사용하는 대화 타입 (channels, groups, im, mpim) 에 필요한 범위만 있으면 됩니다. 개요는 https://docs.slack.dev/apis/web-api/using-the-conversations-api/ 를 참조하십시오.봇 토큰 범위 (필수)
chat:write(chat.postMessage를 통한 메시지 전송/업데이트/삭제) https://docs.slack.dev/reference/methods/chat.postMessageim:write(사용자 다이렉트 메시지 를 위해conversations.open로 DM 열기) https://docs.slack.dev/reference/methods/conversations.openchannels:history,groups:history,im:history,mpim:historyhttps://docs.slack.dev/reference/methods/conversations.historychannels:read,groups:read,im:read,mpim:readhttps://docs.slack.dev/reference/methods/conversations.infousers:read(사용자 조회) https://docs.slack.dev/reference/methods/users.inforeactions:read,reactions:write(reactions.get/reactions.add) https://docs.slack.dev/reference/methods/reactions.get https://docs.slack.dev/reference/methods/reactions.addpins:read,pins:write(pins.list/pins.add/pins.remove) https://docs.slack.dev/reference/scopes/pins.read https://docs.slack.dev/reference/scopes/pins.writeemoji:read(emoji.list) https://docs.slack.dev/reference/scopes/emoji.readfiles:write(files.uploadV2를 통한 업로드) https://docs.slack.dev/messaging/working-with-files/#upload
사용자 토큰 범위 (선택, 기본 읽기 전용)
channels.slack.userToken 를 구성하는 경우 User Token Scopes 아래에 추가합니다.
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read
오늘은 필요 없음 (하지만 향후 필요할 가능성 있음)
mpim:write(conversations.open를 통한 그룹 DM 열기/DM 시작을 추가하는 경우에만)groups:write(비공개 채널 관리: 생성/이름 변경/초대/보관을 추가하는 경우에만)chat:write.public(봇이 참여하지 않은 채널에 게시하려는 경우에만) https://docs.slack.dev/reference/scopes/chat.write.publicusers:read.email(users.info에서 이메일 필드가 필요한 경우에만) https://docs.slack.dev/changelog/2017-04-narrowing-email-accessfiles:read(파일 메타데이터를 나열/읽기 시작하는 경우에만)
설정
Slack 는 Socket 모드만 사용합니다 (HTTP 웹훅 서버 없음). 두 토큰을 모두 제공하십시오:SLACK_BOT_TOKENSLACK_APP_TOKEN
messages.ackReaction +
messages.ackReactionScope 로 전역 제어됩니다. 봇이 응답한 후 ack 반응을 지우려면 messages.removeAckAfterReply 를 사용하십시오.
제한
- 발신 텍스트는
channels.slack.textChunkLimit로 분할됩니다 (기본값 4000). - 선택적 줄바꿈 분할: 길이 분할 전에 빈 줄 (문단 경계) 기준으로 분할하려면
channels.slack.chunkMode="newline"를 설정합니다. - 미디어 업로드는
channels.slack.mediaMaxMb로 제한됩니다 (기본값 20).
답글 스레딩
기본적으로 OpenClaw 는 메인 채널에 답글을 보냅니다. 자동 스레딩을 제어하려면channels.slack.replyToMode 를 사용하십시오:
| 모드 | 동작 |
|---|---|
off | 기본값. 메인 채널에 답글. 트리거 메시지가 이미 스레드인 경우에만 스레드로 답글합니다. |
first | 첫 번째 답글은 스레드 (트리거 메시지 아래) 로 보내고, 이후 답글은 메인 채널로 보냅니다. 컨텍스트를 유지하면서 스레드 난잡함을 줄이는 데 유용합니다. |
all | 모든 답글을 스레드로 보냅니다. 대화를 한 곳에 유지하지만 가시성이 낮아질 수 있습니다. |
slack sendMessage) 모두에 적용됩니다.
채팅 유형별 스레딩
channels.slack.replyToModeByChatType 를 설정하여 채팅 유형별로 다른 스레딩 동작을 구성할 수 있습니다:
direct: 1:1 다이렉트 메시지 (Slackim)group: 그룹 다이렉트 메시지 / MPIM (Slackmpim)channel: 일반 채널 (공개/비공개)
replyToModeByChatType.<chatType>replyToMode- 프로바이더 기본값 (
off)
channels.slack.dm.replyToMode 는 채팅 유형 재정의가 설정되지 않은 경우 direct 에 대한 폴백으로 여전히 허용됩니다.
예시:
다이렉트 메시지 만 스레드로 처리:
수동 스레딩 태그
세밀한 제어를 위해 에이전트 응답에서 다음 태그를 사용하십시오:[[reply_to_current]]— 트리거 메시지에 답글 (스레드 시작/유지).[[reply_to:<id>]]— 특정 메시지 ID 에 답글.
세션 + 라우팅
- 다이렉트 메시지 는
main세션을 공유합니다 (WhatsApp/Telegram 과 유사). - 채널은
agent:<agentId>:slack:channel:<channelId>세션에 매핑됩니다. - Slash 명령은
agent:<agentId>:slack:slash:<userId>세션을 사용합니다 (접두사는channels.slack.slashCommand.sessionPrefix로 구성 가능). - Slack 이
channel_type를 제공하지 않는 경우, OpenClaw 는 채널 ID 접두사 (D,C,G) 로부터 이를 추론하고 세션 키를 안정적으로 유지하기 위해 기본값channel를 사용합니다. - 네이티브 명령 등록은
commands.native(전역 기본값"auto"→ Slack 끔) 을 사용하며, 작업공간별로channels.slack.commands.native로 재정의할 수 있습니다. 텍스트 명령은 독립형/...메시지가 필요하며commands.text: false로 비활성화할 수 있습니다. Slack 슬래시 명령은 Slack 앱에서 관리되며 자동으로 제거되지 않습니다. 명령에 대한 접근 그룹 검사를 우회하려면commands.useAccessGroups: false를 사용하십시오. - 전체 명령 목록 + 설정: Slash commands
다이렉트 메시지 보안 (페어링)
- 기본값:
channels.slack.dm.policy="pairing"— 알 수 없는 다이렉트 메시지 발신자는 페어링 코드 (1 시간 후 만료) 를 받습니다. - 승인 방법:
openclaw pairing approve slack <code>. - 누구나 허용하려면
channels.slack.dm.policy="open"와channels.slack.dm.allowFrom=["*"]를 설정하십시오. channels.slack.dm.allowFrom는 사용자 ID, @핸들, 또는 이메일을 허용합니다 (토큰이 허용하는 경우 시작 시 해석). 마법사는 설정 중 토큰이 허용하면 사용자명을 받아 ID 로 해석합니다.
그룹 정책
channels.slack.groupPolicy는 채널 처리를 제어합니다 (open|disabled|allowlist).allowlist는 채널이channels.slack.channels에 나열되어 있을 것을 요구합니다.SLACK_BOT_TOKEN/SLACK_APP_TOKEN만 설정하고channels.slack섹션을 생성하지 않으면, 런타임 기본값으로groupPolicy가open로 설정됩니다. 이를 잠그려면channels.slack.groupPolicy,channels.defaults.groupPolicy, 또는 채널 허용 목록을 추가하십시오.- 구성 마법사는
#channel이름을 허용하고 가능한 경우 ID 로 해석합니다 (공개 + 비공개). 여러 항목이 일치하면 활성 채널을 우선합니다. - 시작 시 OpenClaw 는 허용 목록의 채널/사용자 이름을 ID 로 해석하고 (토큰이 허용하는 경우) 매핑을 로그에 기록하며, 해석되지 않은 항목은 입력된 그대로 유지합니다.
- 채널을 전혀 허용하지 않으려면,
channels.slack.groupPolicy: "disabled"를 설정하십시오 (또는 빈 허용 목록 유지).
channels.slack.channels.<id> 또는 channels.slack.channels.<name>):
allow:groupPolicy="allowlist"일 때 채널 허용/차단.requireMention: 채널에 대한 멘션 게이팅.tools: 선택적 채널별 도구 정책 재정의 (allow/deny/alsoAllow).toolsBySender: 채널 내 발신자별 도구 정책 재정의 (키는 발신자 ID/@핸들/이메일;"*"와일드카드 지원).allowBots: 이 채널에서 봇 작성 메시지 허용 (기본값: false).users: 선택적 채널별 사용자 허용 목록.skills: 스킬 필터 (생략 = 모든 Skills, 비어 있음 = 없음).systemPrompt: 채널용 추가 시스템 프롬프트 (주제/목적과 결합).enabled:false를 설정하여 채널 비활성화.
전달 대상
cron/CLI 전송 시 다음을 사용하십시오:- 다이렉트 메시지 용
user:<id> - 채널 용
channel:<id>
도구 작업
Slack 도구 작업은channels.slack.actions.* 로 게이팅할 수 있습니다:
| 작업 그룹 | 기본값 | 참고 |
|---|---|---|
| reactions | enabled | 반응 추가 + 목록 |
| messages | enabled | 읽기/전송/편집/삭제 |
| pins | enabled | 고정/해제/목록 |
| memberInfo | enabled | 멤버 정보 |
| emojiList | enabled | 사용자 지정 이모지 목록 |
보안 참고 사항
- 쓰기는 기본적으로 봇 토큰을 사용하여 상태 변경 작업이 앱의 봇 권한과 식별자 범위 내에 유지되도록 합니다.
userTokenReadOnly: false를 설정하면 봇 토큰을 사용할 수 없을 때 사용자 토큰을 쓰기 작업에 사용할 수 있으며, 이는 설치 사용자의 접근 권한으로 작업이 실행됨을 의미합니다. 사용자 토큰은 매우 높은 권한을 가지므로 작업 게이트와 허용 목록을 엄격히 관리하십시오.- 사용자 토큰 쓰기를 활성화하는 경우, 사용자 토큰에 예상되는 쓰기 범위 (
chat:write,reactions:write,pins:write,files:write) 가 포함되어 있는지 확인하십시오.
문제 해결
다음 순서를 먼저 실행하십시오:- 연결되었지만 채널 응답이 없음:
groupPolicy에 의해 채널이 차단되었거나channels.slack.channels허용 목록에 없음. - 다이렉트 메시지 무시됨:
channels.slack.dm.policy="pairing"일 때 발신자가 승인되지 않음. - API 오류 (
missing_scope,not_in_channel, 인증 실패): 봇/앱 토큰 또는 Slack 범위가 불완전함.
참고
- 멘션 게이팅은
channels.slack.channels로 제어됩니다 (requireMention를true로 설정).agents.list[].groupChat.mentionPatterns(또는messages.groupChat.mentionPatterns) 도 멘션으로 계산됩니다. - 다중 에이전트 재정의:
agents.list[].groupChat.mentionPatterns에 에이전트별 패턴을 설정하십시오. - 반응 알림은
channels.slack.reactionNotifications를 따릅니다 (reactionAllowlist를allowlist모드와 함께 사용). - 봇 작성 메시지는 기본적으로 무시됩니다.
channels.slack.allowBots또는channels.slack.channels.<id> .allowBots로 활성화하십시오..allowBots`. - 경고: 다른 봇에 대한 답글을 허용하는 경우 (
channels.slack.allowBots=true또는channels.slack.channels.<id>.allowBots=true),requireMention,channels.slack.channels.<id>.users허용 목록 및/또는AGENTS.md와SOUL.md의 명확한 가드레일로 봇 간 무한 답글 루프를 방지하십시오. - Slack 도구의 반응 제거 의미론은 /tools/reactions 를 참조하십시오.
- 첨부 파일은 허용되고 크기 제한 내인 경우 미디어 저장소로 다운로드됩니다.