Skip to main content
Operator connects to Slack using Socket Mode, which means no public URL or webhook is needed.

Setup

1. Create a Slack App

  1. Go to api.slack.com/apps and create a new app
  2. Enable Socket Mode under Settings
  3. Generate an App-Level Token with connections:write scope — this is your app_token

2. Configure Bot Token Scopes

Under OAuth & Permissions, add these bot token scopes:
  • app_mentions:read
  • channels:history
  • channels:read
  • chat:write
  • groups:history
  • groups:read
  • im:history
  • im:read
  • im:write
  • users:read

3. Subscribe to Events

Under Event Subscriptions, subscribe to:
  • app_mention
  • message.channels
  • message.groups
  • message.im

4. Install to Workspace

Install the app to your workspace and copy the Bot User OAuth Token — this is your bot_token.

5. Configure Operator

Add your tokens to ~/.env:
SLACK_BOT_TOKEN=xoxb-...
SLACK_APP_TOKEN=xapp-...
Configure the transport in operator.yaml:
agents:
  operator:
    transport:
      type: slack
      bot_token_env: SLACK_BOT_TOKEN
      app_token_env: SLACK_APP_TOKEN

Conversation Routing

Slack conversations use canonical IDs:
slack:{agent_name}:{channel_id}:{root_ts}
Where root_ts is thread_ts for threaded replies or ts for top-level posts. The runtime stores platform_message_id → conversation_id mappings so replies to proactive job messages continue in the correct history.

Commands

Messages starting with ! bypass the LLM and are handled directly:
CommandDescription
!helpList all available commands
!stopCancel the active request in the current conversation
!restartDirects to CLI (disabled in chat)
!configShow resolved configuration as JSON
!agentsList configured agents
!jobs [name]List all jobs, or show details for a specific job
!skillsList discovered skills with env status
!memoriesList pinned memories (agent and global scopes)