slack-connect

SkillCommunication

Set up Slack as a notification channel for your Egregore — creates the workspace app, invites the bot, and binds a channel. Use for /slack-connect, ''connect slack'', or ''set up slack notifications''.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the slack-connect skill

What this skill tells your AI

The instructions your AI receives, as published by egregore-labs/egregore in .codex/skills/slack-connect/SKILL.md and read by ahel’s review.

Set up Slack as a notification channel for your Egregore.

Arguments: $ARGUMENTS (none expected)

When to invoke

Trigger phrases:

  • "set up slack", "connect slack", "slack-connect"
  • "add slack notifications", "slack channel", "notify us on slack"

Disambiguation:

  • "set up telegram" → /telegram-connect
  • "set up teams" → /teams-connect
  • "send a message to slack" → NOT this — use the separate notification consent protocol in .claude/context/notification-consent.md

What this does

Connects one Slack channel to Egregore notifications using an app the org creates in its own workspace. After this, everything that plans a group notification may also resolve Slack as a receiving channel; all resolved channels are shown before separate dispatch approval.

The privacy contract, stated plainly to the user: the install screen will say only "Send messages as @Egregore." The app cannot read messages — the manifest requests one scope, chat:write. The workspace owns the app and the token; revoking either cuts Egregore off instantly.

Works in both modes. Check which one first:

MODE=$(jq -r '.mode // "connected"' egregore.json 2>/dev/null)
  • local — the token stays in the gitignored .env on this machine and messages go straight from here to Slack. No Egregore server is in the path.
  • connected — the token is stored on the org's row so the hosted service can deliver group notifications from any member's session.

Only Step 5 differs between the modes.

Step 0: Prerequisites

  1. A Slack workspace where this person can install apps. Some workspaces require admin approval for new apps — if theirs does, the install in Step 2 turns into a request the admin must approve first.
  2. Nothing to install locally. No CLI, no cloud account.

Step 1: Create the app from the manifest (human, ~1 min)

Show the manifest:

cat slack-app/manifest.yml

(If this instance doesn't carry slack-app/, fetch it from the framework repo.)

Guide them: https://api.slack.com/appsCreate New AppFrom a manifest → pick their workspace → paste the manifest → Create.

Step 2: Install and copy the bot token (human, 2 clicks + 1 paste)

Settings → Install App → Install to WorkspaceAllow.

Then copy the Bot User OAuth Token from the same page. It starts with xoxb-. Validate the prefix when they paste it:

  • xoxb- — correct.
  • xoxp- (user token) or xapp- (app-level token) — wrong item on the page; point them back to Install App → Bot User OAuth Token.

Do not store it anywhere yet.

Step 3: Invite the bot to the channel (human, 1 line)

In the target channel: /invite @Egregore (or channel name → IntegrationsAdd apps). With only chat:write, the bot can post solely in channels it is a member of — skipping this yields not_in_channel at send time.

Step 4: Channel ID (human pastes, agent validates)

Ask for the channel ID: channel name → About tab → Channel ID at the bottom (or the /archives/C… segment of a channel link).

Validate: must match ^[CG][A-Z0-9]{6,}$. A D… id is a DM — not supported; ask for a channel.

Smoke-test the token before persisting anything (no message is sent):

curl -sS https://slack.com/api/auth.test -H "Authorization: Bearer <TOKEN>"

"ok":true proves the token and names the workspace — confirm it is the one they expect. invalid_auth here means a mispasted or revoked token; fix now, not at send time.

Step 5: Persist

Local mode — token to .env (gitignored — never commit), channel to .egregore-state.json (NOT egregore.json — the state file is untracked and shared across worktrees):

printf 'SLACK_BOT_TOKEN=%s\n' '<TOKEN>' >> .env
jq '.slack_channel_id = "<CHANNEL_ID>" | .slack_channel_name = "<#channel-name>"' \
  .egregore-state.json > .egregore-state.json.tmp && mv .egregore-state.json.tmp .egregore-state.json

Connected mode — store on the org so any member's session can deliver:

API_URL=$(jq -r '.api_url' egregore.json)
KEY=$(grep '^EGREGORE_API_KEY=' .env | cut -d= -f2-)
curl -sS -X POST "$API_URL/api/org/slack" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"channel_id":"<CHANNEL_ID>","bot_token":"<TOKEN>","channel_name":"<#channel-name>"}'

Expect {"status":"connected", …}.

Step 6: Verify with separate exact notification consent

Follow .claude/context/notification-consent.md. Connecting Slack is not consent to send a test message. Prepare after configuration is final:

PLAN_JSON=$(bash bin/notify.sh plan group "Slack channel connected — this message reached you through Egregore.")

Show every resolved receiving channel—potentially Telegram, Teams, and Slack—and the exact message in a dedicated Send / Edit / Cancel checkpoint. Only dispatch after Send is selected for that preview.

Troubleshooting quick table

SymptomCause → fix
invalid_authWrong, revoked, or other-workspace token → Step 2, re-copy from Install App
not_in_channelBot not invited to the channel → Step 3
channel_not_foundWrong channel ID, or a private channel the bot isn't in → Step 4 / invite it
missing_scopeApp not created from the manifest → recreate from Step 1, reinstall
account_inactiveApp was uninstalled from the workspace → reinstall
ratelimitedTransient — retried automatically
Install becomes an approval requestWorkspace requires admin approval → the admin approves, then continue
Local plan omits slack from channelsHalf-configured: SLACK_BOT_TOKEN missing from .env or slack_channel_id missing from .egregore-state.json

After

Emit telemetry (fire-and-forget):

bash bin/telemetry.sh emit "slack-connect" '{"command":"slack-connect"}' 2>/dev/null &

Signals

GitHub stars
288
Forks
21
Last commit
Sep 2026

ahel review

  • S4info
    community integration — published by egregore-labs, not slack

Automated review, not a security audit. Ruleset v1.

Advanced
Catalog kind
skill
Gateway key
slack-connect
Source
github.com/egregore-labs/egregore