Slack
상태: Slack 앱 통합을 통한 DM + 채널용 프로덕션 준비 완료. 기본 모드는 Socket Mode이며, HTTP 요청 URL도 지원됩니다.페어링
Slack DM은 기본적으로 페어링 모드를 사용합니다.
슬래시 명령
기본 명령 동작 및 명령 카탈로그.
채널 문제 해결
채널 전반의 진단 및 복구 플레이북.
빠른 설정
- Socket Mode (기본값)
- HTTP 요청 URL
새 Slack 앱 만들기
Slack 앱 설정에서 Create New App 버튼을 누르세요:
- from a manifest를 선택하고 앱용 워크스페이스를 선택합니다
- 아래의 예시 매니페스트를 붙여넣고 계속해서 생성합니다
connections:write권한이 있는 App-Level Token(xapp-...)을 생성합니다- 앱을 설치하고 표시되는 Bot Token(
xoxb-...)을 복사합니다
매니페스트 및 scope 체크리스트
- Socket Mode (기본값)
- HTTP 요청 URL
추가 매니페스트 설정
위 기본값을 확장하는 다양한 기능을 노출합니다.선택적 기본 슬래시 명령
선택적 기본 슬래시 명령
선택적 저자 표시 scope(쓰기 작업)
선택적 저자 표시 scope(쓰기 작업)
발신 메시지가 기본 Slack 앱 ID 대신 활성 에이전트 ID(사용자 지정 사용자 이름 및 아이콘)를 사용하도록 하려면
chat:write.customize bot scope를 추가하세요.이모지 아이콘을 사용하는 경우 Slack은 :emoji_name: 구문을 기대합니다.선택적 사용자 토큰 scope(읽기 작업)
선택적 사용자 토큰 scope(읽기 작업)
channels.slack.userToken을 구성하는 경우 일반적인 읽기 scope는 다음과 같습니다:channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read(Slack 검색 읽기에 의존하는 경우)
토큰 모델
- Socket Mode에는
botToken+appToken이 필요합니다. - HTTP 모드에는
botToken+signingSecret이 필요합니다. botToken,appToken,signingSecret,userToken은 일반 텍스트 문자열 또는 SecretRef 객체를 허용합니다.- 구성 토큰은 환경 변수 폴백보다 우선합니다.
SLACK_BOT_TOKEN/SLACK_APP_TOKEN환경 변수 폴백은 기본 계정에만 적용됩니다.userToken(xoxp-...)은 구성 전용이며(환경 변수 폴백 없음), 기본값은 읽기 전용 동작(userTokenReadOnly: true)입니다.
- Slack 계정 검사는 자격 증명별
*Source및*Status필드(botToken,appToken,signingSecret,userToken)를 추적합니다. - 상태는
available,configured_unavailable,missing입니다. configured_unavailable은 계정이 SecretRef 또는 다른 비인라인 비밀 소스를 통해 구성되었지만, 현재 명령/런타임 경로가 실제 값을 확인할 수 없음을 의미합니다.- HTTP 모드에서는
signingSecretStatus가 포함되며, Socket Mode에서는 필수 쌍이botTokenStatus+appTokenStatus입니다.
작업 및 게이트
Slack 작업은channels.slack.actions.*로 제어됩니다.
현재 Slack 도구에서 사용할 수 있는 작업 그룹:
| 그룹 | 기본값 |
|---|---|
| messages | 활성화됨 |
| reactions | 활성화됨 |
| pins | 활성화됨 |
| memberInfo | 활성화됨 |
| emojiList | 활성화됨 |
send, upload-file, download-file, read, edit, delete, pin, unpin, list-pins, member-info, emoji-list가 포함됩니다.
접근 제어 및 라우팅
- DM 정책
- 채널 정책
- 멘션 및 채널 사용자
channels.slack.dmPolicy는 DM 접근을 제어합니다(레거시: channels.slack.dm.policy):pairing(기본값)allowlistopen(channels.slack.allowFrom에"*"가 포함되어 있어야 함, 레거시:channels.slack.dm.allowFrom)disabled
dm.enabled(기본값 true)channels.slack.allowFrom(권장)dm.allowFrom(레거시)dm.groupEnabled(그룹 DM 기본값 false)dm.groupChannels(선택적 MPIM 허용 목록)
channels.slack.accounts.default.allowFrom은default계정에만 적용됩니다.- 이름이 있는 계정은 자체
allowFrom이 설정되지 않은 경우channels.slack.allowFrom을 상속합니다. - 이름이 있는 계정은
channels.slack.accounts.default.allowFrom을 상속하지 않습니다.
openclaw pairing approve slack <code>를 사용합니다.스레딩, 세션 및 답장 태그
- DM은
direct, 채널은channel, MPIM은group으로 라우팅됩니다. - 기본
session.dmScope=main을 사용하면 Slack DM은 에이전트 메인 세션으로 합쳐집니다. - 채널 세션:
agent:<agentId>:slack:channel:<channelId>. - 해당하는 경우 스레드 답장은 스레드 세션 접미사(
:thread:<threadTs>)를 만들 수 있습니다. channels.slack.thread.historyScope기본값은thread이며,thread.inheritParent기본값은false입니다.channels.slack.thread.initialHistoryLimit은 새 스레드 세션이 시작될 때 가져오는 기존 스레드 메시지 수를 제어합니다(기본값20, 비활성화하려면0으로 설정).channels.slack.thread.requireExplicitMention(기본값false):true인 경우 암시적 스레드 멘션을 억제하여, 봇이 이미 해당 스레드에 참여했더라도 스레드 내부의 명시적@bot멘션에만 응답합니다. 이 설정이 없으면 봇이 참여한 스레드의 답장은requireMention게이팅을 우회합니다.
channels.slack.replyToMode:off|first|all|batched(기본값off)channels.slack.replyToModeByChatType:direct|group|channel별 설정- direct 채팅용 레거시 폴백:
channels.slack.dm.replyToMode
[[reply_to_current]][[reply_to:<id>]]
replyToMode="off"는 명시적 [[reply_to_*]] 태그를 포함한 Slack의 모든 답장 스레딩을 비활성화합니다. 이는 "off" 모드에서도 명시적 태그를 계속 존중하는 Telegram과 다릅니다. 이 차이는 플랫폼의 스레딩 모델을 반영합니다. Slack 스레드는 메시지를 채널에서 숨기지만, Telegram 답장은 기본 채팅 흐름에서 계속 표시됩니다.
Ack 반응
ackReaction은 OpenClaw가 수신 메시지를 처리하는 동안 확인 이모지를 보냅니다.
확인 순서:
channels.slack.accounts.<accountId>.ackReactionchannels.slack.ackReactionmessages.ackReaction- 에이전트 ID 이모지 폴백(
agents.list[].identity.emoji, 없으면"👀")
- Slack은 shortcode를 기대합니다(예:
"eyes"). - Slack 계정별 또는 전역적으로 반응을 비활성화하려면
""를 사용하세요.
텍스트 스트리밍
channels.slack.streaming은 실시간 미리보기 동작을 제어합니다:
off: 실시간 미리보기 스트리밍을 비활성화합니다.partial(기본값): 미리보기 텍스트를 최신 부분 출력으로 교체합니다.block: 청크 단위 미리보기 업데이트를 추가합니다.progress: 생성 중에는 진행 상태 텍스트를 표시한 다음, 최종 텍스트를 보냅니다.streaming.preview.toolProgress: 초안 미리보기가 활성 상태일 때 도구/진행 업데이트를 동일한 편집 미리보기 메시지로 라우팅합니다(기본값:true). 별도의 도구/진행 메시지를 유지하려면false로 설정하세요.
channels.slack.streaming.nativeTransport는 channels.slack.streaming.mode가 partial일 때 Slack 기본 텍스트 스트리밍을 제어합니다(기본값: true).
- 기본 텍스트 스트리밍과 Slack assistant 스레드 상태를 표시하려면 답장 스레드를 사용할 수 있어야 합니다. 스레드 선택은 여전히
replyToMode를 따릅니다. - 채널 및 그룹 채팅 루트는 기본 스트리밍을 사용할 수 없을 때 일반 초안 미리보기를 계속 사용할 수 있습니다.
- 최상위 Slack DM은 기본적으로 스레드 밖에서 유지되므로 스레드 스타일 미리보기가 표시되지 않습니다. 그곳에서 진행 상태를 보이게 하려면 스레드 답장이나
typingReaction을 사용하세요. - 미디어 및 비텍스트 페이로드는 일반 전달로 폴백합니다.
- 미디어/오류 최종 응답은 임시 초안을 플러시하지 않고 보류 중인 미리보기 편집을 취소합니다. 자격이 되는 텍스트/블록 최종 응답은 미리보기를 제자리에서 편집할 수 있을 때만 플러시됩니다.
- 스트리밍이 답장 중간에 실패하면 OpenClaw는 남은 페이로드에 대해 일반 전달로 폴백합니다.
channels.slack.streamMode(replace | status_final | append)는channels.slack.streaming.mode로 자동 마이그레이션됩니다.- boolean
channels.slack.streaming은channels.slack.streaming.mode와channels.slack.streaming.nativeTransport로 자동 마이그레이션됩니다. - 레거시
channels.slack.nativeStreaming은channels.slack.streaming.nativeTransport로 자동 마이그레이션됩니다.
Typing 반응 폴백
typingReaction은 OpenClaw가 답장을 처리하는 동안 수신 Slack 메시지에 임시 반응을 추가한 다음, 실행이 끝나면 제거합니다. 이는 기본 "is typing..." 상태 표시기를 사용하는 스레드 답장 밖에서 특히 유용합니다.
확인 순서:
channels.slack.accounts.<accountId>.typingReactionchannels.slack.typingReaction
- Slack은 shortcode를 기대합니다(예:
"hourglass_flowing_sand"). - 이 반응은 best-effort 방식이며, 답장 또는 실패 경로가 완료된 후 자동으로 정리를 시도합니다.
미디어, 청킹 및 전달
수신 첨부 파일
수신 첨부 파일
Slack 파일 첨부 파일은 Slack에서 호스팅되는 비공개 URL(토큰 인증 요청 흐름)에서 다운로드되며, 가져오기에 성공하고 크기 제한을 충족하면 미디어 저장소에 기록됩니다.런타임 수신 크기 상한은
channels.slack.mediaMaxMb로 재정의하지 않는 한 기본값이 20MB입니다.발신 텍스트 및 파일
발신 텍스트 및 파일
- 텍스트 청크는
channels.slack.textChunkLimit을 사용합니다(기본값 4000) channels.slack.chunkMode="newline"은 문단 우선 분할을 활성화합니다- 파일 전송은 Slack 업로드 API를 사용하며 스레드 답장(
thread_ts)을 포함할 수 있습니다 - 발신 미디어 상한은 구성된 경우
channels.slack.mediaMaxMb를 따르며, 그렇지 않으면 채널 전송은 미디어 파이프라인의 MIME 종류 기본값을 사용합니다
전달 대상
전달 대상
선호되는 명시적 대상:
- DM용
user:<id> - 채널용
channel:<id>
명령 및 슬래시 동작
슬래시 명령은 Slack에서 단일 구성 명령 또는 여러 기본 명령으로 표시됩니다. 명령 기본값을 변경하려면channels.slack.slashCommand를 구성하세요:
enabled: falsename: "openclaw"sessionPrefix: "slack:slash"ephemeral: true
channels.slack.commands.native: true 또는 전역 구성의 commands.native: true로 활성화됩니다.
- Slack의 기본 명령 자동 모드는 off이므로
commands.native: "auto"는 Slack 기본 명령을 활성화하지 않습니다.
- 최대 5개 옵션: 버튼 블록
- 6-100개 옵션: 정적 선택 메뉴
- 100개 초과 옵션: interactivity 옵션 핸들러를 사용할 수 있을 때 비동기 옵션 필터링을 사용하는 외부 선택
- Slack 제한 초과: 인코딩된 옵션 값은 버튼으로 폴백
agent:<agentId>:slack:slash:<userId> 같은 격리된 키를 사용하며, 여전히 CommandTargetSessionKey를 사용해 명령 실행을 대상 대화 세션으로 라우팅합니다.
인터랙티브 답장
Slack은 에이전트가 작성한 인터랙티브 답장 제어를 렌더링할 수 있지만, 이 기능은 기본적으로 비활성화되어 있습니다. 전역적으로 활성화:[[slack_buttons: Approve:approve, Reject:reject]][[slack_select: Choose a target | Canary:canary, Production:production]]
- 이는 Slack 전용 UI입니다. 다른 채널은 Slack Block Kit 지시문을 자체 버튼 시스템으로 변환하지 않습니다.
- 인터랙티브 콜백 값은 원시 에이전트 작성 값이 아니라 OpenClaw가 생성한 불투명 토큰입니다.
- 생성된 인터랙티브 블록이 Slack Block Kit 제한을 초과하면 OpenClaw는 잘못된 블록 페이로드를 보내는 대신 원래 텍스트 답장으로 폴백합니다.
Slack의 Exec 승인
Slack은 Web UI나 터미널로 폴백하는 대신, 인터랙티브 버튼과 상호작용을 갖춘 기본 승인 클라이언트로 동작할 수 있습니다.- Exec 승인은 기본 DM/채널 라우팅에
channels.slack.execApprovals.*를 사용합니다. - Plugin 승인은 요청이 이미 Slack에 도착했고 승인 ID 종류가
plugin:일 때 동일한 Slack 기본 버튼 표면을 통해 계속 확인될 수 있습니다. - 승인자 권한 부여는 여전히 강제됩니다. 승인자로 식별된 사용자만 Slack을 통해 요청을 승인하거나 거부할 수 있습니다.
interactivity가 활성화되면 승인 프롬프트는 대화에 직접 Block Kit 버튼으로 렌더링됩니다.
이 버튼이 존재하면 기본 승인 UX가 되며, OpenClaw는
도구 결과에서 채팅 승인을 사용할 수 없다고 하거나 수동 승인이 유일한 경로일 때만 수동 /approve 명령을 포함해야 합니다.
구성 경로:
channels.slack.execApprovals.enabledchannels.slack.execApprovals.approvers(선택 사항, 가능한 경우commands.ownerAllowFrom으로 폴백)channels.slack.execApprovals.target(dm|channel|both, 기본값:dm)agentFilter,sessionFilter
enabled가 설정되지 않았거나 "auto"이고 최소 하나의
승인자가 확인되면 기본 exec 승인을 자동으로 활성화합니다. Slack을 기본 승인 클라이언트로 명시적으로 비활성화하려면 enabled: false를 설정하세요.
승인자가 확인될 때 기본 승인을 강제로 켜려면 enabled: true를 설정하세요.
명시적인 Slack exec 승인 구성이 없는 기본 동작:
approvals.exec 전달은 별도입니다. exec 승인 프롬프트도
다른 채팅이나 명시적인 대역 외 대상으로 라우팅해야 하는 경우에만 사용하세요. 공유 approvals.plugin 전달도
별도입니다. 요청이 이미 Slack에 도착한 경우 Slack 기본 버튼은 계속 plugin 승인을 처리할 수 있습니다.
동일 채팅 /approve도 이미 명령을 지원하는 Slack 채널 및 DM에서 동작합니다. 전체 승인 전달 모델은 Exec approvals을 참조하세요.
이벤트 및 운영 동작
- 메시지 편집/삭제/스레드 브로드캐스트는 시스템 이벤트로 매핑됩니다.
- 반응 추가/제거 이벤트는 시스템 이벤트로 매핑됩니다.
- 멤버 참여/나감, 채널 생성/이름 변경, 핀 추가/제거 이벤트는 시스템 이벤트로 매핑됩니다.
channel_id_changed는configWrites가 활성화되어 있으면 채널 구성 키를 마이그레이션할 수 있습니다.- 채널 topic/purpose 메타데이터는 신뢰할 수 없는 컨텍스트로 처리되며 라우팅 컨텍스트에 주입될 수 있습니다.
- 스레드 시작자와 초기 스레드 히스토리 컨텍스트 시딩은 적용 가능한 경우 구성된 발신자 허용 목록에 따라 필터링됩니다.
- 블록 작업과 모달 상호작용은 풍부한 페이로드 필드와 함께 구조화된
Slack interaction: ...시스템 이벤트를 출력합니다:- 블록 작업: 선택된 값, 라벨, picker 값,
workflow_*메타데이터 - 라우팅된 채널 메타데이터와 폼 입력이 포함된 모달
view_submission및view_closed이벤트
- 블록 작업: 선택된 값, 라벨, picker 값,
구성 참조 포인터
기본 참조:-
구성 참조 - Slack
주요 Slack 필드:
- 모드/인증:
mode,botToken,appToken,signingSecret,webhookPath,accounts.* - DM 접근:
dm.enabled,dmPolicy,allowFrom(레거시:dm.policy,dm.allowFrom),dm.groupEnabled,dm.groupChannels - 호환성 토글:
dangerouslyAllowNameMatching(최후 수단, 필요하지 않으면 끄기) - 채널 접근:
groupPolicy,channels.*,channels.*.users,channels.*.requireMention - 스레딩/히스토리:
replyToMode,replyToModeByChatType,thread.*,historyLimit,dmHistoryLimit,dms.*.historyLimit - 전달:
textChunkLimit,chunkMode,mediaMaxMb,streaming,streaming.nativeTransport,streaming.preview.toolProgress - 운영/기능:
configWrites,commands.native,slashCommand.*,actions.*,userToken,userTokenReadOnly
- 모드/인증:
문제 해결
채널에 답장이 없음
채널에 답장이 없음
다음 순서로 확인하세요:
groupPolicy- 채널 허용 목록(
channels.slack.channels) requireMention- 채널별
users허용 목록
DM 메시지가 무시됨
DM 메시지가 무시됨
확인할 항목:
channels.slack.dm.enabledchannels.slack.dmPolicy(또는 레거시channels.slack.dm.policy)- 페어링 승인 / 허용 목록 항목
Socket mode가 연결되지 않음
Socket mode가 연결되지 않음
Slack 앱 설정에서 bot + app 토큰과 Socket Mode 활성화 여부를 확인하세요.
openclaw channels status --probe --json에 botTokenStatus 또는
appTokenStatus: "configured_unavailable"이 표시되면 Slack 계정은
구성되어 있지만 현재 런타임이 SecretRef 기반
값을 확인할 수 없다는 뜻입니다.HTTP mode가 이벤트를 수신하지 않음
HTTP mode가 이벤트를 수신하지 않음
다음을 확인하세요:
- signing secret
- webhook path
- Slack 요청 URL(Events + Interactivity + Slash Commands)
- HTTP 계정별 고유한
webhookPath
signingSecretStatus: "configured_unavailable"이
나타나면 HTTP 계정은 구성되어 있지만 현재 런타임이
SecretRef 기반 signing secret을 확인할 수 없다는 뜻입니다.기본/슬래시 명령이 실행되지 않음
기본/슬래시 명령이 실행되지 않음
의도한 구성이 다음 중 무엇인지 확인하세요:
- Slack에 일치하는 슬래시 명령이 등록된 기본 명령 모드(
channels.slack.commands.native: true) - 또는 단일 슬래시 명령 모드(
channels.slack.slashCommand.enabled: true)
commands.useAccessGroups와 채널/사용자 허용 목록도 확인하세요.