ワンクリックで
add-slack
Add Slack as a channel. Can replace WhatsApp entirely or run alongside it. Uses Socket Mode (no public URL needed).
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Add Slack as a channel. Can replace WhatsApp entirely or run alongside it. Uses Socket Mode (no public URL needed).
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Wire Gmail MCP server into the agent so it can read, search, and send emails. Optional — not core functionality.
Add Telegram as a channel. Can replace WhatsApp entirely or run alongside it. Also configurable as a control-only channel (triggers actions) or passive channel (receives notifications only).
Add Agent Swarm (Teams) support to Telegram. Each subagent gets its own bot identity in the group. Requires Telegram channel to be set up first (use /add-telegram). Triggers on "agent swarm", "agent teams telegram", "telegram swarm", "bot pool".
Add new capabilities or modify GhostClaw behavior. Use when user wants to add channels (Telegram, Slack, email input), change triggers, add integrations, modify the router, or make any other customizations. This is an interactive skill that asks questions to understand what the user wants.
Debug agent issues. Use when things aren't working, agent fails, authentication problems, or to understand how the system works. Covers logs, environment variables, sessions, and common issues.
Run initial GhostClaw setup. Use when user wants to install dependencies, authenticate WhatsApp, register their main channel, or start the background services. Triggers on "setup", "install", "configure ghostclaw", or first-time setup requests.
| name | add-slack |
| description | Add Slack as a channel. Can replace WhatsApp entirely or run alongside it. Uses Socket Mode (no public URL needed). |
This skill adds Slack support to GhostClaw using the skills engine for deterministic code changes, then walks through interactive setup.
Read .ghostclaw/state.yaml. If slack is in applied_skills, skip to Phase 3 (Setup). The code changes are already in place.
Mode: Replace WhatsApp or add alongside it?
SLACK_ONLY=trueDo they already have a Slack app configured? If yes, collect the Bot Token and App Token now. If no, we'll create one in Phase 3.
Run the skills engine to apply this skill's code package. The package files are in this directory alongside this SKILL.md.
If .ghostclaw/ directory doesn't exist yet:
npx tsx scripts/apply-skill.ts --init
Or call initSkillsSystem() from skills-engine/migrate.ts.
npx tsx scripts/apply-skill.ts .claude/skills/add-slack
This deterministically:
src/channels/slack.ts (SlackChannel class implementing Channel interface)src/channels/slack.test.ts (46 unit tests)src/index.ts (multi-channel support, conditional channel creation)src/config.ts (SLACK_ONLY export)src/routing.test.ts@slack/bolt npm dependency.env.example with SLACK_BOT_TOKEN, SLACK_APP_TOKEN, and SLACK_ONLY.ghostclaw/state.yamlIf the apply reports merge conflicts, read the intent files:
modify/src/index.ts.intent.md — what changed and invariants for index.tsmodify/src/config.ts.intent.md — what changed for config.tsmodify/src/routing.test.ts.intent.md — what changed for routing testsnpm test
npm run build
All tests must pass (including the new slack tests) and build must be clean before proceeding.
If the user doesn't have a Slack app, share SLACK_SETUP.md which has step-by-step instructions with screenshots guidance, troubleshooting, and a token reference table.
Quick summary of what's needed:
xapp-...)message.channels, message.groups, message.imchat:write, channels:history, groups:history, im:history, channels:read, groups:read, users:readxoxb-...)Wait for the user to provide both tokens.
Add to .env:
SLACK_BOT_TOKEN=xoxb-your-bot-token
SLACK_APP_TOKEN=xapp-your-app-token
If they chose to replace WhatsApp:
SLACK_ONLY=true
Sync to container environment:
mkdir -p data/env && cp .env data/env/env
The container reads environment from data/env/env, not .env directly.
npm run build
launchctl kickstart -k gui/$(id -u)/com.ghostclaw
Tell the user:
- Add the bot to a Slack channel (right-click channel → View channel details → Integrations → Add apps)
- In that channel, the channel ID is in the URL when you open it in a browser:
https://app.slack.com/client/T.../C0123456789— theC...part is the channel ID- Alternatively, right-click the channel name → Copy link — the channel ID is the last path segment
The JID format for GhostClaw is:
slack:C0123456789
Wait for the user to provide the channel ID.
Use the IPC register flow or register directly. The channel ID, name, and folder name are needed.
For a main channel (responds to all messages, uses the main folder):
registerGroup("slack:<channel-id>", {
name: "<channel-name>",
folder: "main",
trigger: `@${ASSISTANT_NAME}`,
added_at: new Date().toISOString(),
requiresTrigger: false,
});
For additional channels (trigger-only):
registerGroup("slack:<channel-id>", {
name: "<channel-name>",
folder: "<folder-name>",
trigger: `@${ASSISTANT_NAME}`,
added_at: new Date().toISOString(),
requiresTrigger: true,
});
Tell the user:
Send a message in your registered Slack channel:
- For main channel: Any message works
- For non-main:
@<assistant-name> hello(using the configured trigger word)The bot should respond within a few seconds.
tail -f logs/ghostclaw.log
SLACK_BOT_TOKEN and SLACK_APP_TOKEN are set in .env AND synced to data/env/envsqlite3 store/messages.db "SELECT * FROM registered_groups WHERE jid LIKE 'slack:%'"launchctl list | grep ghostclawmessage.channels, message.groups, message.im)By default, bots only see messages in channels they've been explicitly added to. Make sure to:
channels:history and/or groups:history scopesIf the bot logs missing_scope errors:
.envmkdir -p data/env && cp .env data/env/envlaunchctl kickstart -k gui/$(id -u)/com.ghostclawIf the channel ID is hard to find:
C... ID from the URLhttps://app.slack.com/client/TXXXXXXX/C0123456789curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" "https://slack.com/api/conversations.list" | jq '.channels[] | {id, name}'The Slack channel supports:
SLACK_ONLY=true)NewMessage type, Channel.sendMessage interface, and routing logic.setTyping() method is a no-op. Users won't see "bot is typing..." while the agent works.syncChannelMetadata() paginates through all channels the bot is a member of, but has no upper bound or timeout. Workspaces with thousands of channels may experience slow startup.