@iflow-mcp/jeremylongshore-claude-channel-slack
v0.3.0
Published
Slack channel for Claude Code — two-way chat via Socket Mode
Downloads
80
Readme
Slack Channel for the Claude Code
Two-way Slack ↔ Claude Code bridge. Chat with Claude from Slack DMs and channels, just like you'd chat in the terminal.
Research Preview — Channels require Claude Code v2.1.80+ and
claude.ailogin.
How It Works
Slack workspace (cloud)
↕ WebSocket (Socket Mode — outbound only, no public URL)
server.ts (local MCP server, spawned by Claude Code)
↕ stdio (MCP transport)
Claude Code sessionSocket Mode means no public URL needed — works behind firewalls, NAT, anywhere.
Quick Start
1. Create a Slack App
- Go to api.slack.com/apps → Create New App → From scratch
- Socket Mode: Settings → Socket Mode → Enable → Generate App-Level Token (
xapp-...) withconnections:writescope - Event Subscriptions: Enable → Subscribe to bot events:
message.im— DMsmessage.channels— public channelsmessage.groups— private channelsapp_mention— @ mentions
- Bot Token Scopes (OAuth & Permissions):
chat:write— send messageschannels:history— read public channelsgroups:history— read private channelsim:history— read DMsreactions:write— add reactionsfiles:read— download shared filesfiles:write— upload filesusers:read— resolve display names
- Install to Workspace → Copy Bot Token (
xoxb-...)
2. Configure Tokens
/slack-channel:configure xoxb-your-bot-token xapp-your-app-token3. Run
Pick your runtime:
Option A: Bun (recommended)
cd slack && bun install
# Current (claude-code-plugins marketplace):
claude --channels plugin:slack-channel@claude-code-plugins
# Future (after upstream approval):
# claude --channels plugin:slack-channel@claude-plugins-officialOption B: Node.js / npx
cd slack && npm install
# In .mcp.json, change command to: "npx", args: ["tsx", "server.ts"]
claude --channels plugin:slack-channel@claude-code-pluginsOption C: Docker
cd slack && docker build -t claude-slack-channel .
# In .mcp.json, change command to: "docker", args: ["run", "--rm", "-i", "-v", "~/.claude/channels/slack:/state", "claude-slack-channel"]
claude --channels plugin:slack-channel@claude-code-plugins4. Pair Your Account
- DM the bot in Slack — you'll get a 6-character pairing code
- In your terminal:
/slack-channel:access pair <code> - You're connected. Chat away.
Access Control
See ACCESS.md for the full schema.
/slack-channel:access policy allowlist # Only pre-approved users
/slack-channel:access add U12345678 # Add a user
/slack-channel:access remove U12345678 # Remove a user
/slack-channel:access channel C12345678 # Opt in a channel
/slack-channel:access channel C12345678 --mention # Require @mention
/slack-channel:access status # Show current configSecurity
- Sender gating: Every inbound message hits a gate. Ungated messages are silently dropped before reaching Claude.
- Outbound gate: Replies only work to channels that passed the inbound gate.
- File exfiltration guard: Cannot send
.env,access.json, or other state files through the reply tool. - Prompt injection defense: System instructions explicitly tell Claude to refuse pairing/access requests from Slack messages.
- Bot filtering: All
bot_idmessages are dropped (prevents bot-to-bot loops). - Link unfurling disabled: All outbound messages set
unfurl_links: false, unfurl_media: false. - Token security:
.envischmod 0o600, never logged, never in tool results. - Static mode: Set
SLACK_ACCESS_MODE=staticto freeze access at boot (no runtime mutation).
Development
# Dev mode (bypasses plugin allowlist):
claude --dangerously-load-development-channels server:slackOne-Pager & System Analysis
Full project one-pager and operator-grade system analysis
Contributors
- @jeremylongshore — author
- @maui-99 — security hardening (v0.3.0)
License
MIT
