配置 Slack MCP 服务:为 Opik 的 send-code-review-slack 命令打通 Cursor 消息通道
【免费下载链接】comet-llmDebug, evaluate, and monitor your LLM applications, RAG systems, and agentic workflows with comprehensive tracing, automated evaluations, and production-ready dashboards.项目地址: https://gitcode.com/GitHub_Trending/co/comet-llm
本篇指南讲解如何在 Cursor IDE 中配置 Slack MCP(Model Context Protocol)服务器,使仓库内置的send-code-review-slack命令能够把代码审查请求自动发送到#code-review频道。读完本文,你将掌握从创建 Slack App、申请 User OAuth Token,到编写mcp.json与.env.local、再到验证命令全链路可用的完整实操方案,并理解仓库中该命令的底层调用逻辑。
背景:为什么这套代码审查流程需要 Slack MCP
在 comet-llm(Opik)仓库中,团队通过.agents/commands/comet/send-code-review-slack.md定义了一条名为cursor send-code-review-slack的 Agent 命令,用于在完成分支开发后,自动提取当前分支的 GitHub PR 信息(Jira 工单、测试环境链接、FE/BE/Python/TypeScript 各组件摘要),并按固定模板向#code-review频道发送代码审查请求。
这条命令的发送环节依赖Slack MCP 服务器。仓库选用的是支持User OAuth Token(SLACK_MCP_XOXP_TOKEN)的自定义 MCP 服务器(Docker 镜像ghcr.io/korotovsky/slack-mcp-server),其关键特性是:消息将以你本人(authenticated user)的身份发送,而不是以 bot 身份发送,这使代码审查通知更贴近人工提交流程,团队成员可以直接看到"谁请求了审查"。
整套配置的落点分为两个层面:
- 工作区级(一次性,由管理员完成):创建 Slack App、配置 User Token Scopes;
- 用户级(每位开发者各自完成):安装 App 到工作区、获取自己的 User OAuth Token、配置环境变量、重启 Cursor。
具体配置位于仓库的.agents/docs/SLACK_MCP_SETUP.md,实际的 MCP 服务器声明则位于 .agents/mcp.json,本文会结合这两份文件与相关命令文档展开。
总体配置概览:六个步骤
| 步骤 | 层级 | 操作 | 产物 |
|---|---|---|---|
| Step 1 | 工作区(管理员) | 创建 Slack App | App ID |
| Step 2 | 工作区(管理员) | 配置 User Token Scopes | chat:write、channels:read、users:read、channels:history |
| Step 3 | 用户 | 安装 App 到工作区 | 授权关系 |
| Step 4 | 用户 | 获取 User OAuth Token | 以xoxp-开头的令牌 |
| Step 5 | 用户 | 配置.env.local与 MCP 声明 | SLACK_MCP_XOXP_TOKEN等环境变量 |
| Step 6 | 用户 | 重启 Cursor 并验证 | send-code-review-slack可用 |
其中 Step 1、Step 2 只需要做一次:App 创建并配置完成后,工作区所有用户都可以安装它,并各自取得属于自己的 User OAuth Token。
Step 1:创建 Slack App
这是工作区管理员的一次性操作,创建完成后整个工作区共用这一个 App:
- 进入 Slack API 的 Apps 管理页面;
- 点击"Create New App"→"From scratch";
- 为 App 命名(仓库示例命名为 "Opik Code Review");
- 选择目标工作区;
- 点击"Create App"完成创建。
Step 2:配置 User Token Scopes(关键区分点)
CRITICAL:Scope 必须添加到"User Token Scopes"(而不是其上方相邻的 "Bot Token Scopes"),否则页面不会出现 User OAuth Token,后续步骤将无法继续。
在 App 设置页面进入"OAuth & Permissions",滚动到"Scopes"区域,找到"User Token Scopes"小节(其描述为"Scopes that access user data and act on behalf of users that authorize them"——确认你在正确位置,这些 scope 让 App 以"你"的身份行动,而不是以 bot 身份),然后逐条添加以下 OAuth Scope:
| Scope | 用途 |
|---|---|
chat:write | 以你认证的用户账号发送消息 |
channels:read | 查看公共频道的基本信息 |
users:read | 读取用户信息(slack-mcp-server做缓存所需) |
channels:history | 查看公共频道中的消息(MCP 服务器做频道缓存所需) |
添加完成后点击"Save Changes"。
注意:
users:read与channels:history是ghcr.io/korotovsky/slack-mcp-server正确缓存、访问频道信息所必需的。缺失时日志中可能出现missing_scope错误,尽管基础的发送消息功能可能仍可用,仍建议按上表配齐以保证 MCP 服务器全功能运行。
Step 3:安装 App 到工作区
这是每位开发者各自执行的步骤,用于授权 App 并生成属于自己的 User OAuth Token:
- 回到"OAuth & Permissions"页面顶部;
- 点击"Install to Workspace"(若已安装过则点击"Reinstall to Workspace");
- 审阅权限并点击"Allow"。
说明:授权页面可能出现 "Send messages as [App Name]" 的字样,这只是 App 在请求权限。当你实际使用 User OAuth Token 时,消息将以你个人的账号发出,而不是以 App 名义发出。
Step 4:获取你的 User OAuth Token
安装/重新安装 App 之后:
- 停留在"OAuth & Permissions"页面(必要时刷新);
- 滚动到"OAuth Tokens for Your Workspace"区域;
- 找到"User OAuth Token"(注意不是"Bot User OAuth Token"):
- 如果只看到 "Bot User OAuth Token",说明 Scope 被误加到了 Bot Token Scopes,请回到 Step 2 修正,再回到此处点击"Reinstall to Workspace";
- User OAuth Token 应以
xoxp-开头(而不是xoxb-); - 点击"Show"/"Reveal"查看完整令牌并复制——这就是用于以你本人身份发消息的令牌。
Step 5:配置环境变量与 mcp.json
5.1 将令牌写入.env.local
在项目根目录创建或编辑.env.local,加入 User OAuth Token:
SLACK_MCP_XOXP_TOKEN=xoxp-your-user-oauth-token-here务必把xoxp-your-user-oauth-token-here替换为 Step 4 拿到的真实令牌(xoxp-开头,绝不是xoxb-)。令牌通过envFile从.env.local加载,从而不会直接写进mcp.json。
5.2 mcp.json 中的 Slack 服务器声明
仓库根目录的 .agents/mcp.json 中已经写好了 Slack MCP 服务器的完整声明(Cursor 通过make cursor将.cursor符号链接指向.agents后即可加载),核心片段如下:
{ "mcpServers": { "GitHub": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "-e", "GITHUB_TOOLSETS=repos,pull_requests,issues", "ghcr.io/github/github-mcp-server" ], "envFile": "${workspaceFolder}/.env.local" }, "slack": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "SLACK_MCP_XOXP_TOKEN", "-e", "LOG_LEVEL=error", "-e", "SLACK_MCP_ADD_MESSAGE_TOOL=true", "ghcr.io/korotovsky/slack-mcp-server:latest", "mcp-server", "--transport", "stdio" ], "envFile": "${workspaceFolder}/.env.local" } } }从中可以看到三个关键配置项:
mcp-server --transport stdio:必填。指定服务器通过 stdio 传输与 Cursor 走 MCP 协议通信;缺失时服务器会退化为启动 SSE 服务器,无法与 Cursor 的 MCP 集成协作。SLACK_MCP_ADD_MESSAGE_TOOL:必填,用于启用conversations_add_message工具(该工具默认关闭,属于安全设计)。取值规则:true或1:对所有频道与私聊(DM)启用;- 以逗号分隔的频道 ID(如
XXXXXXXX,YYYYYYYY):仅对这些频道启用; !XXXXXXXX:除指定频道外的所有频道启用。- 对本仓库的代码审查命令而言,使用
true以允许向#code-review发消息。
envFile:指向${workspaceFolder}/.env.local,其中存放SLACK_MCP_XOXP_TOKEN,保证令牌不进入mcp.json(也降低误提交风险)。
仓库还通过-e LOG_LEVEL=error降低 MCP 服务器日志噪音,便于聚焦真正的错误。
5.3 前置要求
- 本机已安装并正在运行 Docker;
- 首次使用时,Docker 会自动拉取镜像
ghcr.io/korotovsky/slack-mcp-server:latest; .env.local应加入.gitignore,防止令牌被提交进 Git 历史。
Step 6:重启 Cursor 并验证
- 完全关闭并重新打开 Cursor IDE(仅 Reload Window 不够,需彻底退出);
- 在 Cursor Settings > Features > MCP 中确认 Slack MCP 服务器已列出、无报错;
- 在存在已打开 PR 的分支上运行:
cursor send-code-review-slack若能收到发送成功确认,说明整条链路已打通。
命令如何使用这套 MCP 配置:源码级工作流
发送命令send-code-review-slack
.agents/commands/comet/send-code-review-slack.md 定义了完整执行模型:自动从 GitHub PR 提取信息,仅对缺失信息提问,按模板格式化后经 Slack MCP 发送。与本文 MCP 配置直接相关的环节包括:
- Preflight 阶段:命令会先调用 Slack MCP 的
channels_list工具(以limit: 1的最小参数调用,确保公共与私有频道都能返回)来探测 MCP 是否可用;若工具不可用,会提示按 .agents/docs/SLACK_MCP_SETUP.md 配置并重启 Cursor。这一探测依赖 Step 5 中mcp-server --transport stdio与SLACK_MCP_ADD_MESSAGE_TOOL=true的正确配置。 - 发送阶段:调用
conversations_add_message工具,参数为channel_id: #code-review、payload: <格式化后的完整消息>、content_type: text/markdown(可选,默认即此值)。命令文档明确要求服务器必须带mcp-server --transport stdio和SLACK_MCP_ADD_MESSAGE_TOOL=true,否则会遇到 "tool disabled" 错误。 - 失败处理:命令对常见错误给出了与本文 Troubleshooting 一一对应的提示,例如认证错误检查
SLACK_MCP_XOXP_TOKEN是否xoxp-开头、权限错误检查chat:write是否位于 User Token Scopes、Docker 错误检查镜像能否拉取等。
消息采用固定模板(greeting 后依次为 Jira 链接、PR 链接、PR size、测试环境链接、可选组件摘要),并且只有被提供或提取到的可选字段才会出现。典型输出形如:
Hi team, Please review the following PR: :jira_epic: jira link: https://comet-ml.atlassian.net/browse/OPIK-1234 :github: pr link: https://github.com/comet-ml/opik/pull/1234 :straight_ruler: pr size: 🟠 L :test_tube: test env link: https://test.opik.com :react: fe summary (optional): Added new metrics dashboard UI :java: be summary (optional): Implemented metrics aggregation endpoint :typescript: typescript summary (optional): Added TypeScript SDK support for metrics不发送消息的替代命令generate-code-review-slack-command
.agents/commands/comet/generate-code-review-slack-command.md 定义了孪生命令cursor generate-code-review-slack-command:信息提取与格式化逻辑完全相同,但它不依赖 Slack MCP、也不自动发送,而是生成一段可复制、可编辑的 Slack 消息。适合需要人工补充的场景:添加@提及、附带视频/媒体链接(Slack 不支持直接通过 MCP 发送视频,视频应放入 PR 描述后分享链接)、最终校对等。命令文档中明确建议:如需自动发送则用send-code-review-slack,如需先编辑再发送则用本命令。
PR size 字段的提取逻辑
消息模板中的:straight_ruler: pr size字段由两份文档共享的提取逻辑 .agents/docs/PR_SIZE_EXTRACTION.md 决定:优先读取 GitHub PR 的size/*标签(🔵 size/XS、🟢 size/S、🟡 size/M、🟠 size/L、🔴 size/XL),仅存储为{emoji} {BUCKET}(如🟠 L),不带行数统计;只有在标签缺失时才按additions + deletions计算回退,且回退使用的忽略清单与阈值必须与标签工作流保持一致(见 .github/workflows/labeler.yml 中的阈值:XS < 20、S ≤ 100、M ≤ 300、L ≤ 600、XL > 600)。
配置文件如何被 Cursor 加载
仓库 Makefile 中定义了make cursor(将.cursor符号链接指向.agents/)与make claude(将.agents同步为.claude/并生成.mcp.json)。也就是说,本文提到的mcp.json与命令/文档体系由.agents/目录统一管理,运行make cursor后 Cursor 即可识别全部 MCP 服务器与 Agent 命令。
安全注意事项
- 绝不把令牌提交进 Git:
.env.local必须加入.gitignore;mcp.json通过环境变量引用令牌,不直接存放令牌,但提交前仍需检查其中是否意外包含敏感内容。 - 令牌存储位置:
SLACK_MCP_XOXP_TOKEN只存放在.env.local(且已被.gitignore忽略),不直接写入mcp.json。 - 令牌类型:务必使用以
xoxp-开头的 User OAuth Token,而不是以xoxb-开头的 Bot Token,否则消息发送身份与预期不符。 - 仓库的 .agents/rules/security.mdc 还针对 Agent 交互场景定义了安全红线(如禁止执行危险命令、避免提交密钥等),配置 MCP 令牌时同样适用。
故障排查
MCP 服务器未出现在 Cursor 中
- 检查
mcp.json是否位于正确位置(.cursor/mcp.json或用户级~/.cursor/mcp.json,本仓库通过make cursor完成.cursor -> .agents链接); - 校验 JSON 语法是否合法(可使用 JSON 校验器);
- 彻底重启 Cursor(退出并重新打开,而非仅 Reload Window);
- 查看 Cursor Settings > Features > MCP 中的错误信息;
- 确认 Docker 已安装且运行中:
docker --version、docker ps。
Docker 命令错误(日志出现 "Usage: docker [OPTIONS] COMMAND")
- 确认 Docker 正在运行:执行
docker ps,失败则启动 Docker Desktop 或 Docker daemon; - 手动测试 MCP 服务器命令:
docker run -i --rm -e SLACK_MCP_XOXP_TOKEN=xoxp-your-token -e LOG_LEVEL=error ghcr.io/korotovsky/slack-mcp-server:latest正常应启动 MCP 服务器,失败时查看具体报错; 3.手动拉取镜像:
docker pull ghcr.io/korotovsky/slack-mcp-server:latest- 检查 mcp.json 结构:确保
args数组格式正确,每个参数都是独立的字符串元素(可对照 .agents/mcp.json 中slack节点的写法)。
认证错误
- 确认令牌以
xoxp-开头而非xoxb-(日志中出现xoxb-说明误用了 Bot Token,回到 Step 4 重新获取 User OAuth Token); - 确认 App 已安装到你的工作区;
- 确认 User Token Scopes 包含全部必需 scope:
chat:write(发消息必需)、channels:read(访问频道必需)、users:read(MCP 服务器缓存必需)、channels:history(完整功能推荐); - 确认 Docker 参数中用的是
SLACK_MCP_XOXP_TOKEN而非SLACK_BOT_TOKEN; - 检查实际
mcp.json中 Docker 参数里的令牌确实是xoxp-...; - 更新令牌后彻底重启 Cursor;
- 确认 Docker 运行中且能拉取镜像。
missing_scope 错误
- 从错误信息中确认具体缺失的 scope;
- 在 Slack App 的 "OAuth & Permissions" → "User Token Scopes" 中添加缺失 scope(常见缺失项:
users:read、channels:history); - 添加后重新安装 App到工作区;
- 若生成了新令牌,同步更新
mcp.json引用的令牌; - 重启 Cursor 重载 MCP 配置。
部分
missing_scope可能只是警告,不阻断基础功能(如发消息);但补齐全部推荐 scope 才能保证 MCP 服务器全功能可用。
权限错误
- 确认 User Token Scopes 中包含
chat:write; - 确认你对
#code-review频道有访问权限; - 确认自己是该频道成员;
- 使用 Docker 时,确认容器具备访问 Slack API 的网络能力。
小结
通过本文的六个步骤,你可以在工作区级一次性创建 Slack App 与 User Token Scopes,并以个人身份获取xoxp-开头的 User OAuth Token,配合.env.local与 .agents/mcp.json 中mcp-server --transport stdio、SLACK_MCP_ADD_MESSAGE_TOOL=true的关键配置,让 Cursor 中的cursor send-code-review-slack命令自动完成"提取 PR 信息 → 格式化消息 → 以你本人身份发送到#code-review"的完整代码审查通知流程。若需要人工编辑(添加@提及、视频链接等),generate-code-review-slack-command提供了不依赖 Slack MCP 的可复制方案。配置完成后,记得把.env.local纳入.gitignore,并妥善保管好你的 User OAuth Token。
如需进一步深入,可在仓库内继续阅读以下资源:
- Slack MCP 配置指南原文
- MCP 服务器声明文件
- 发送代码审查消息命令
- 生成可复制 Slack 消息命令
- PR size 提取共享逻辑
- PR size 标签工作流
【免费下载链接】comet-llmDebug, evaluate, and monitor your LLM applications, RAG systems, and agentic workflows with comprehensive tracing, automated evaluations, and production-ready dashboards.项目地址: https://gitcode.com/GitHub_Trending/co/comet-llm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考