Slack Skill
Full Slack workspace integration with three modes:
- Scripts — 9 Python scripts for on-demand Slack operations
- Session Bridge — connect THIS Claude Code session to Slack (background listener + inbox file, no extra API costs)
- Unified Launcher —
claudicle.pywith Claude Agent SDK, soul engine, per-channel sessions (requires SDK API key)
When to Use This Skill
Scripts (on-demand)
- Posting messages to Slack channels or threads (with optional AI feedback buttons)
- Reading channel history or thread replies
- Searching messages, files, channels, or users via RTS API (with legacy fallback)
- Streaming messages in real-time via chat streaming API
- Adding or managing reactions on messages
- Uploading files or code snippets
- Listing channels, getting channel info, or joining channels (including bulk join)
- Looking up users by name, ID, or email
Session Bridge (recommended)
- Connecting any running Claude Code session to Slack
- Responding to @mentions and DMs with full tool access (this session IS the brain)
- No extra API costs — messages processed in the current session context
- Auto-notification of new messages via UserPromptSubmit hook
- Personality as Claudicle via soul.md instructions (no XML machinery needed)
Unified Launcher (persistent, requires SDK API key)
- Running Claudicle as an interactive terminal + Slack bot in one process
- Responding to @mentions and DMs in real time as "Claudicle, Artifex Maximus"
- Multi-turn conversations in threads (per-channel session continuity via Claude Agent SDK)
- Per-user personality modeling (learns communication style, interests, expertise)
- Cross-thread soul state (tracks current project, task, topic, emotional state)
- Three-tier memory: working memory (per-thread), user models (per-user), soul memory (global)
- All Slack activity visible in terminal alongside direct terminal interactions
Prerequisites
All scripts require the SLACK_BOT_TOKEN environment variable (a Bot User OAuth Token starting with xoxb-). Scripts also require requests (uv pip install --system requests).
Optional: SLACK_USER_TOKEN (xoxp-) enables workspace-wide search via legacy search.messages/search.files when the RTS API is unavailable. The bot token is used for all other operations.
# Verify tokens
echo $SLACK_BOT_TOKEN
echo $SLACK_USER_TOKEN # optional, for legacy search fallback
First-Time Setup
- Go to api.slack.com/apps → Create New App → From Scratch
- Name it "Claude Code" → select your workspace
- OAuth & Permissions → Bot Token Scopes → add all:
app_mentions:readchannels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,im:writechannels:join— enables bot to join public channels programmaticallychat:writefiles:write,files:readreactions:write,reactions:readsearch:read— legacy search (bot-visible channels only)search:read.public,search:read.private,search:read.im,search:read.mpim,search:read.files,search:read.users— RTS API (unified search, Feb 2026+)users:read,users:read.emailusers:write(optional — enables green presence dot)
- Settings → Socket Mode → toggle ON → generate an App-Level Token:
- Name:
socket-mode - Scope:
connections:write - Copy the
xapp-token
- Name:
- Event Subscriptions → toggle ON (no Request URL needed with Socket Mode) → Subscribe to Bot Events → add:
app_mention— channel @mentionsmessage.im— direct messages (required for DMs to work)app_home_opened— App Home tab rendering
- App Home → Show Tabs → enable "Allow users to send Slash commands and messages from the messages tab"
- Install to Workspace → approve permissions → copy Bot User OAuth Token
- Set environment variables (add to shell profile):
export SLACK_BOT_TOKEN=xoxb-... # Bot User OAuth Token export SLACK_APP_TOKEN=xapp-... # App-Level Token (Socket Mode) export SLACK_USER_TOKEN=xoxp-... # (optional) User Token for legacy workspace-wide search - Invite the bot to channels:
/invite @Claude Code
After any scope or event subscription change: reinstall the app (Install App → Reinstall to Workspace) and restart the launcher.
Quick Start
# Post a message
python3 ~/.claude/skills/slack/scripts/slack_post.py "#general" "Hello from Claude"
# Post with AI feedback buttons
python3 ~/.claude/skills/slack/scripts/slack_post.py "#general" "Here's my analysis" --ai
# Read recent messages
python3 ~/.claude/skills/slack/scripts/slack_read.py "#general" -n 10
# Search the workspace (auto-detects RTS API, falls back to legacy)
python3 ~/.claude/skills/slack/scripts/slack_search.py "deployment status"
# Search with RTS API (messages, files, channels, users)
python3 ~/.claude/skills/slack/scripts/slack_search.py "deployment" --rts --type channels
# Stream a message in real-time
python3 ~/.claude/skills/slack/scripts/slack_stream.py "#general" "Streaming message..."
# Join all public channels
python3 ~/.claude/skills/slack/scripts/slack_channels.py --join-all-public
# Connect this session to Slack (recommended)
cd ~/.claude/skills/slack/daemon && python3 slack_listen.py --bg
python3 ~/.claude/skills/slack/scripts/slack_check.py
# Start the unified launcher (requires SDK API key)
cd ~/.claude/skills/slack/daemon && python3 claudicle.py
Session Bridge (Recommended)
Connect any running Claude Code session to Slack. A background listener catches @mentions and DMs → inbox.jsonl. This session reads the inbox, processes with full tool access, posts responses back. No extra API costs.
# Connect
cd ~/.claude/skills/slack/daemon && python3 slack_listen.py --bg
# Check messages
python3 ~/.claude/skills/slack/scripts/slack_check.py
# Respond to thread, remove hourglass, mark handled
python3 ~/.claude/skills/slack/scripts/slack_post.py "C12345" "response" --thread "TS"
python3 ~/.claude/skills/slack/scripts/slack_react.py "C12345" "TS" "hourglass_flowing_sand" --remove
python3 ~/.claude/skills/slack/scripts/slack_check.py --ack 1
# Disconnect
python3 ~/.claude/skills/slack/daemon/slack_listen.py --stop
Soul Formatter (optional): scripts/slack_format.py adds Open Souls cognitive step formatting — perception framing, dialogue extraction, monologue logging.
python3 slack_format.py perception "Tom" "What's the status?" # → Tom said, "..."
echo "$raw" | python3 slack_format.py extract # → external dialogue only
echo "$raw" | python3 slack_format.py extract --narrate --log # → narrated + logged
python3 slack_format.py instructions # → cognitive step XML format
Automated Respond: /slack-respond processes all pending messages as Claudicle with full cognitive steps — perception, monologue, dialogue, post, ack — in a single invocation. See ~/.claude/skills/slack-respond/SKILL.md.
Soul Activation: /ensoul activates the Claudicle identity in any Claude Code session with persistent soul.md injection through compaction/resume. /slack-sync #channel then binds the ensouled session to a Slack channel. Both are opt-in per session. The soul registry (~/.claude/hooks/soul-registry.py) tracks all active sessions and their channel bindings — ensouled or not.
For full installation, architecture, inbox format, auto-notification hook, and troubleshooting, see references/session-bridge.md.
App Home: The Home tab renders automatically when a user opens Claudicle's profile (via app_home_opened in the listener). Shows live status, toolkit, cognitive architecture, memory system. Refresh manually:
python3 ~/.claude/skills/slack/scripts/slack_app_home.py "USER_ID"
python3 ~/.claude/skills/slack/scripts/slack_app_home.py --all
python3 ~/.claude/sk