/cyrus-setup-slack
Configure Slack integration for Cyrus — create a Slack app from manifest, then guide the user to save credentials.
$ npx -y skills add cyrusagents/cyrus --skill cyrus-setup-slack --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/cyrus-setup-slack
Context preview
The summary Claude sees to decide when to auto-load this skill.
Configure Slack integration for Cyrus — create a Slack app from manifest, then guide the user to save credentials.
SKILL.md
cyrus-setup-slack.SKILL.mdname: cyrus-setup-slack
description: Configure Slack integration for Cyrus — create a Slack app from manifest, then guide the user to save credentials.
**CRITICAL: Never use `Read`, `Edit`, or `Write` tools on `~/.cyrus/.env` or any file inside `~/.cyrus/`. Use only `Bash` commands (`grep`, `printf >>`, etc.) to interact with env files — secrets must never be read into the conversation context. Never scrape, extract, or read secret values from web pages — guide the user to copy them manually.**
Setup Slack
Creates a Slack application from a pre-built manifest so Cyrus can respond to messages in Slack channels.
Step 1: Check Existing Configuration
grep -E '^SLACK_BOT_TOKEN=' ~/.cyrus/.env 2>/dev/null
If `SLACK_BOT_TOKEN` is already set, inform the user:
> Slack is already configured. Skipping this step. > To reconfigure, remove `SLACK_BOT_TOKEN` and `SLACK_SIGNING_SECRET` from `~/.cyrus/.env` and re-run.
Skip to completion.
Step 2: Read Variables
Read the base URL (set by `setup-endpoint`):
grep '^CYRUS_BASE_URL=' ~/.cyrus/.env | cut -d= -f2-
You also need `AGENT_NAME` and `AGENT_DESCRIPTION` — these were collected in Step 0 of the orchestrator and should be available from the conversation context.
Step 3: Build Manifest JSON
Construct the manifest, substituting `<AGENT_NAME>`, `<AGENT_DESCRIPTION>`, and `<CYRUS_BASE_URL>` with actual values.
**IMPORTANT: Use the manifest template EXACTLY as shown below.** The event subscription path MUST be `/slack-webhook` (not `/slack/events` or any other path). This matches the route registered by `SlackEventTransport` in the Cyrus codebase.
**NOTE: this list of scopes must be kept in sync with the Slack App configuration and the list of scopes defined at [https://github.com/cyrusagents/cyrus-hosted/blob/main/apps/app/src/lib/slack/constants.ts](https://github.com/cyrusagents/cyrus-hosted/blob/main/apps/app/src/lib/slack/constants.ts). If you change scopes here, propose matching changes there and update any live Slack App configuration that relies on this manifest.**
{
"display_information": {
"name": "<AGENT_NAME>",
"description": "<AGENT_DESCRIPTION>",
"background_color": "#00240e"
},
"features": {
"bot_user": {
"display_name": "<AGENT_NAME>",
"always_online": true
}
},
"oauth_config": {
"redirect_urls": [
"<CYRUS_BASE_URL>/slack/oauth/callback"
],
"scopes": {
"user": [
"canvases:read",
"canvases:write",
"channels:history",
"chat:write",
"groups:history",
"im:history",
"mpim:history",
"users:read",
"users:read.email",
"reactions:write",
"search:read.public",
"search:read.private",
"search:read.mpim",
"search:read.im",
"search:read.files",
"search:read.users"
],
"bot": [
"groups:read",
"app_mentions:read",
"assistant:write",
"canvases:write",
"channels:history",
"channels:read",
"chat:write",
"chat:write.customize",
"groups:history",
"im:history",
"im:read",
"files:read",
"files:write",
"mpim:history",
"reactions:write",
"search:read.files",
"search:read.public",
"search:read.users",
"users:read",
"users:read.email",
"mpim:read"
]
},
"pkce_enabled": false
},
"settings": {
"event_subscriptions": {
"request_url": "<CYRUS_BASE_URL>/slack-webhook",
"bot_events": [
"app_mention",
"member_joined_channel",
"message.channels",
"message.groups",
"message.mpim",
"message.im"
]
},
"org_deploy_enabled": false,
"socket_mode_enabled": false,
"token_rotation_enabled": false
}
}Step 4: Create Slack App
**All paths use the "From a manifest" flow.** Never create the app "From scratch".
Determine which browser automation mode to use (see orchestrator rules):
1. If `claude-in-chrome` MCP tools are available → use **Path A-1** (claude-in-chrome) 2. If `agent-browser` is installed and a Chrome debug session is connected → use **Path A-2** (agent-browser) 3. Otherwise → use **Path B** (manual)
Path A-1: claude-in-chrome Automation
Use the `mcp__claude-in-chrome__*` tools to navigate and interact with the user's existing Chrome browser.
1. Navigate to https://api.slack.com/apps 2. Click **Create New App** 3. Select **From a manifest** in the modal 4. Pick the workspace 5. Click **Next** 6. Select **JSON** tab and paste the manifest from Step 3 (fully substituted with real values) 7. Click **Next**, review, click **Create**
After creation, the app lands on the Basic Information page. **Do NOT take screenshots of credential pages.** Proceed to Step 5 (credential collection).
Path A-2: agent-browser Automation
If `agent-browser` is connected to a Chrome debug session:
4a. Navigate to Slack app creation
agent-browser navigate "https://api.slack.com/apps"
Take a screenshot to verify the page loaded and the user is logged in.
4b. Click "Create New App"
agent-browser click "button:text('Create New App')"4c. Select "From a manifest" in the modal
agent-browser click "button:text('From a manifest')"4d. Select workspace
Take a screenshot to see the workspace picker. Click the appropria
Read more
name: cyrus-setup-slack description: Configure Slack integration for Cyrus — create a Slack app from manifest, then guide the user to save credentials.
**CRITICAL: Never use `Read`, `Edit`, or `Write` tools on `~/.cyrus/.env` or any file inside `~/.cyrus/`. Use only `Bash` commands (`grep`, `printf >>`, etc.) to interact with env files — secrets must never be read into the conversation context. Never scrape, extract, or read secret values from web pages — guide the user to copy them manually.**
Setup Slack
Creates a Slack application from a pre-built manifest so Cyrus can respond to messages in Slack channels.
Step 1: Check Existing Configuration
grep -E '^SLACK_BOT_TOKEN=' ~/.cyrus/.env 2>/dev/null
If `SLACK_BOT_TOKEN` is already set, inform the user:
> Slack is already configured. Skipping this step. > To reconfigure, remove `SLACK_BOT_TOKEN` and `SLACK_SIGNING_SECRET` from `~/.cyrus/.env` and re-run.
Skip to completion.
Step 2: Read Variables
Read the base URL (set by `setup-endpoint`):
grep '^CYRUS_BASE_URL=' ~/.cyrus/.env | cut -d= -f2-
You also need `AGENT_NAME` and `AGENT_DESCRIPTION` — these were collected in Step 0 of the orchestrator and should be available from the conversation context.
Step 3: Build Manifest JSON
Construct the manifest, substituting `<AGENT_NAME>`, `<AGENT_DESCRIPTION>`, and `<CYRUS_BASE_URL>` with actual values.
**IMPORTANT: Use the manifest template EXACTLY as shown below.** The event subscription path MUST be `/slack-webhook` (not `/slack/events` or any other path). This matches the route registered by `SlackEventTransport` in the Cyrus codebase.
**NOTE: this list of scopes must be kept in sync with the Slack App configuration and the list of scopes defined at [https://github.com/cyrusagents/cyrus-hosted/blob/main/apps/app/src/lib/slack/constants.ts](https://github.com/cyrusagents/cyrus-hosted/blob/main/apps/app/src/lib/slack/constants.ts). If you change scopes here, propose matching changes there and update any live Slack App configuration that relies on this manifest.**
{
"display_information": {
"name": "<AGENT_NAME>",
"description": "<AGENT_DESCRIPTION>",
"background_color": "#00240e"
},
"features": {
"bot_user": {
"display_name": "<AGENT_NAME>",
"always_online": true
}
},
"oauth_config": {
"redirect_urls": [
"<CYRUS_BASE_URL>/slack/oauth/callback"
],
"scopes": {
"user": [
"canvases:read",
"canvases:write",
"channels:history",
"chat:write",
"groups:history",
"im:history",
"mpim:history",
"users:read",
"users:read.email",
"reactions:write",
"search:read.public",
"search:read.private",
"search:read.mpim",
"search:read.im",
"search:read.files",
"search:read.users"
],
"bot": [
"groups:read",
"app_mentions:read",
"assistant:write",
"canvases:write",
"channels:history",
"channels:read",
"chat:write",
"chat:write.customize",
"groups:history",
"im:history",
"im:read",
"files:read",
"files:write",
"mpim:history",
"reactions:write",
"search:read.files",
"search:read.public",
"search:read.users",
"users:read",
"users:read.email",
"mpim:read"
]
},
"pkce_enabled": false
},
"settings": {
"event_subscriptions": {
"request_url": "<CYRUS_BASE_URL>/slack-webhook",
"bot_events": [
"app_mention",
"member_joined_channel",
"message.channels",
"message.groups",
"message.mpim",
"message.im"
]
},
"org_deploy_enabled": false,
"socket_mode_enabled": false,
"token_rotation_enabled": false
}
}Step 4: Create Slack App
**All paths use the "From a manifest" flow.** Never create the app "From scratch".
Determine which browser automation mode to use (see orchestrator rules):
1. If `claude-in-chrome` MCP tools are available → use **Path A-1** (claude-in-chrome) 2. If `agent-browser` is installed and a Chrome debug session is connected → use **Path A-2** (agent-browser) 3. Otherwise → use **Path B** (manual)
Path A-1: claude-in-chrome Automation
Use the `mcp__claude-in-chrome__*` tools to navigate and interact with the user's existing Chrome browser.
1. Navigate to https://api.slack.com/apps 2. Click **Create New App** 3. Select **From a manifest** in the modal 4. Pick the workspace 5. Click **Next** 6. Select **JSON** tab and paste the manifest from Step 3 (fully substituted with real values) 7. Click **Next**, review, click **Create**
After creation, the app lands on the Basic Information page. **Do NOT take screenshots of credential pages.** Proceed to Step 5 (credential collection).
Path A-2: agent-browser Automation
If `agent-browser` is connected to a Chrome debug session:
4a. Navigate to Slack app creation
agent-browser navigate "https://api.slack.com/apps"
Take a screenshot to verify the page loaded and the user is logged in.
4b. Click "Create New App"
agent-browser click "button:text('Create New App')"4c. Select "From a manifest" in the modal
agent-browser click "button:text('From a manifest')"4d. Select workspace
Take a screenshot to see the workspace picker. Click the appropria
Your (Claude Code|Codex|Cursor|Gemini) powered (Linear|GitHub|GitLab|Slack) agent.
Repo: cyrusagents/cyrus
Other skills on cyrus.
- /google
Search the web for information. Use when you need to look something up, find current information, or research a topic.
Open skill - /release-core-test
Invoke when dev-testing a Cyrus change that spans CYPACK (edgeworker + CLI) and CYHOST (Vercel-hosted GUI) and the hosted GUI needs to point at an unreleased `cyrus-core` from this repo. Publishes `cyrus-core` (and `claude-runner` if needed) as a `-test.N` prerelease under the
Open skill - /cyrus-setup-claude-auth
Configure Claude Code authentication for Cyrus — API key, OAuth token, or third-party provider.
Open skill - /cyrus-setup-endpoint
Configure the public webhook endpoint for Cyrus — ngrok, Cloudflare Tunnel, or custom URL.
Open skill - /cyrus-setup-github
Configure GitHub for Cyrus — gh CLI login and git config for PRs, with optional webhook setup to enable @mention responses in PR comments, automated rebases and merges, and auto-fixing based on CI failures (coming soon).
Open skill - /cyrus-setup-gitlab
Configure GitLab authentication for Cyrus — glab CLI login and git config for creating merge requests.
Open skill

