关于 cyrus-setup-slack
引导用户通过预置清单创建并安装供 Cyrus 使用的 Slack 应用。支持浏览器自动化或手动操作,并避免将凭据值读入 Agent 上下文。
主要功能
- 01通过清单创建 Slack 应用
- 02支持浏览器辅助或手动设置
- 03在环境文件中添加凭据占位项
- 04引导用户手动填写凭据
- 05验证凭据字段已填写
适用场景
- 01将 Cyrus 连接到 Slack 工作区
- 02在不暴露密钥的情况下设置 Slack 凭据
- 03无法使用浏览器自动化时配置 Slack 应用
MCP 相关
该技能可使用 claude-in-chrome MCP 工具,在用户的浏览器中操作 Slack 应用设置。文档未说明其提供 MCP 服务端。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cyrusagents/ cyrus --skill cyrus-setup-slack安装后在 Claude Code 中输入/cyrus-setup-slack确认已加载。
详细介绍
重要:绝不要使用 Read、Edit 或 Write 工具操作 ~/.cyrus/.env 或 ~/.cyrus/ 内的任何文件。只能使用 Bash 命令(grep、printf >> 等)与环境变量文件交互——绝不能将密钥读入对话上下文。绝不要从网页抓取、提取或读取密钥值——请引导用户手动复制。
设置 Slack
根据预先构建的清单创建 Slack 应用,以便 Cyrus 能够在 Slack 频道中回复消息。
步骤 1:检查现有配置
grep -E '^SLACK_BOT_TOKEN=' ~/.cyrus/.env 2>/dev/null
如果已设置 SLACK_BOT_TOKEN,请告知用户:
Slack 已配置。跳过此步骤。 如需重新配置,请从
~/.cyrus/.env中移除SLACK_BOT_TOKEN和SLACK_SIGNING_SECRET,然后重新运行。
跳至完成步骤。
步骤 2:读取变量
读取基础 URL(由 setup-endpoint 设置):
grep '^CYRUS_BASE_URL=' ~/.cyrus/.env | cut -d= -f2-
还需要 AGENT_NAME 和 AGENT_DESCRIPTION——这些变量已在编排器的步骤 0 中收集,应可从对话上下文中获取。
步骤 3:构建清单 JSON
将 <AGENT_NAME>、<AGENT_DESCRIPTION> 和 <CYRUS_BASE_URL> 替换为实际值,构建清单。
重要:必须严格按照以下内容使用清单模板。 事件订阅路径必须为 /slack-webhook(不能是 /slack/events 或其他路径)。该路径与 Cyrus 代码库中 SlackEventTransport 注册的路由一致。
注意:此处的权限范围列表必须与 Slack App 配置以及 https://github.com/cyrusagents/cyrus-hosted/blob/main/apps/app/src/lib/slack/constants.ts 中定义的权限范围列表保持同步。如果在此更改权限范围,请同时提议更改对应位置,并更新依赖此清单的任何线上 Slack App 配置。
{
"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
}
}
步骤 4:创建 Slack App
所有路径都必须使用“From a manifest”流程。 绝不要选择“From scratch”创建应用。
根据编排器规则,确定要使用哪种浏览器自动化模式:
- 如果有
claude-in-chromeMCP 工具 → 使用 路径 A-1(claude-in-chrome) - 如果已安装
agent-browser且已连接 Chrome 调试会话 → 使用 路径 A-2(agent-browser) - 否则 → 使用 路径 B(手动操作)
路径 A-1:使用 claude-in-chrome 自动化
使用 mcp__claude-in-chrome__* 工具导航并操作用户现有的 Chrome 浏览器。
- 导航至 https://api.slack.com/apps
- 点击 Create New App
- 在模态框中选择 From a manifest
- 选择工作区
- 点击 Next
- 选择 JSON 标签页,并粘贴步骤 3 中的清单(已替换为实际值)
- 点击 Next,检查内容,然后点击 Create
创建后,应用会进入 Basic Information 页面。不要截取凭据页面的屏幕截图。 继续执行步骤 5(收集凭据)。
路径 A-2:使用 agent-browser 自动化
如果 agent-browser 已连接到 Chrome 调试会话:
4a. 导航至 Slack 应用创建页面
agent-browser navigate "https://api.slack.com/apps"
截取屏幕截图,确认页面已加载且用户已登录。
4b. 点击“Create New App”
agent-browser click "button:text('Create New App')"
4c. 在模态框中选择“From a manifest”
agent-browser click "button:text('From a manifest')"
4d. 选择工作区
截取屏幕截图查看工作区选择器。点击相应的工作区。如果列出了多个工作区,请询问用户要选择哪一个。
agent-browser click "button:text('Next')"
4e. 选择 JSON 格式并粘贴清单
如果尚未选中,请点击 JSON 标签页:
agent-browser click "button:text('JSON')"
使用 JavaScript 粘贴清单:
agent-browser eval "var editor = document.querySelector('textarea, [role=\"textbox\"], .ace_editor textarea, .CodeMirror textarea'); if (editor) { var nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype, 'value').set; nativeInputValueSetter.call(editor, JSON.stringify(<MANIFEST_JSON>, null, 2)); editor.dispatchEvent(new Event('input', { bubbles: true })); 'pasted'; } else { 'editor not found'; }"
如果不起作用,请尝试:
agent-browser click "textarea"
agent-browser keyboard "Control+a"
agent-browser type '<MANIFEST_JSON_STRING>'
截取屏幕截图进行确认,然后点击 Next:
agent-browser click "button:text('Next')"
4f. 检查并创建
截取屏幕截图确认摘要,然后点击 Create:
agent-browser click "button:text('Create')"
创建后,不要截取凭据页面的屏幕截图,也不要尝试抓取密钥。 继续执行步骤 5。
路径 B:手动引导式设置
引导用户完成清单流程:
创建 Slack 应用
- 前往 https://api.slack.com/apps
- 点击 Create New App
- 在弹窗中选择 From a manifest
- 选择要关联此应用的工作区
- 点击 Next
- 选择 JSON 格式,并粘贴以下清单:
打印已完全替换变量的清单 JSON,供用户复制。
- 点击 Next,查看摘要,然后点击 Create
继续执行步骤 5。
步骤 5:安装应用并收集凭据
创建应用后(无论采用哪种方式),引导用户完成安装并收集凭据。**Agent 绝不能从页面抓取、读取或提取机密信息。**用户需手动复制。
5a. 安装到工作区
告知用户:
- 在 Slack 应用设置中,点击左侧边栏里的 Install App
- 点击 Install to Workspace
- 点击 Allow
如果使用浏览器自动化(A-1 或 A-2),Agent 可以前往 Install App 页面并点击按钮,但必须在安装完成后停止操作,且不得截取结果页面。
5b. 添加凭据占位符
在 env 文件中添加占位行,供用户填写:
grep -q '^SLACK_BOT_TOKEN=' ~/.cyrus/.env || echo 'SLACK_BOT_TOKEN=' >> ~/.cyrus/.env
grep -q '^SLACK_SIGNING_SECRET=' ~/.cyrus/.env || echo 'SLACK_SIGNING_SECRET=' >> ~/.cyrus/.env
5c. 打开 env 文件进行编辑
# macOS
code --new-window ~/.cyrus/.env 2>/dev/null || open -a TextEdit ~/.cyrus/.env
# Linux
code --new-window ~/.cyrus/.env 2>/dev/null || xdg-open ~/.cyrus/.env
5d. 引导用户复制凭据
告知用户:
我已打开
~/.cyrus/.env。你需要粘贴两个值:
Bot User OAuth Token — 前往应用的 OAuth & Permissions 页面,复制 Bot User OAuth Token(以
xoxb-开头),并将其粘贴到SLACK_BOT_TOKEN=后面Signing Secret — 前往应用的 Basic Information 页面,向下滚动到 App Credentials,点击 Signing Secret 旁边的 Show,复制该值,并将其粘贴到
SLACK_SIGNING_SECRET=后面完成后保存并关闭文件。
5e. 等待并验证
用户确认已保存后,进行验证:
grep -c '^SLACK_BOT_TOKEN=.' ~/.cyrus/.env
grep -c '^SLACK_SIGNING_SECRET=.' ~/.cyrus/.env
两项都必须返回 1(= 后面的 . 可确保值不为空)。如果任一项返回 0,请让用户检查文件。
完成
✓ 已从清单创建并安装 Slack 应用 ✓ Bot token 和 signing secret 已保存到
~/.cyrus/.env
**注意:**在 Cyrus 实际运行之前,事件订阅中的 request_url 将无法通过 Slack 的验证质询。Cyrus 启动后,请前往应用的 Event Subscriptions 页面并重新输入 URL,以触发验证;否则 Slack 会自动重试。