关于 Slack
Slack MCP 服务使用浏览器中的会话令牌访问工作区,供 AI Agent 阅读、搜索和发送内容。它还按需汇总人员与频道关系,并通过外发安全检查控制发送操作。
主要功能
- 01读取收件箱、消息与工作区关系
- 02发送消息、文件和表情回应
- 03按需生成关系图视图
- 04扫描外发内容并设置审批门槛
- 05从浏览器提取会话令牌
适用场景
- 01汇总未读消息和提及
- 02了解成员在工作区中的关联
- 03发送经安全检查的消息或文件
- 04查看人员关系的静态图表
MCP 相关
该项目是 MCP 服务,向客户端提供 Slack 收件箱、消息、关系分析、发送、认证及文件等工具。使用浏览器会话令牌连接 Slack。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @aaronsb/slack-mcpSLACK_MCP_XOXC_TOKEN密钥Slack session token. Optional — the auth tool extracts it from your browser and stores it in the config file.SLACK_MCP_XOXD_TOKEN密钥Slack session cookie. Optional — the auth tool extracts it from your browser and stores it in the config file.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
11收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| value | string | 否 | 'select' 操作的值 — 浏览器名称(例如 'chrome')或配置文件目录名称(例如 'Default') |
| action | string | 否 | 操作:'next' 前进流程,'status' 检查状态,'select' 选择选项,'retry' 在失败或锁定后重试,'reset' 重新开始,'clear' 删除已存储的凭据 |
详细介绍
Slack MCP
MCP 服务使用会话令牌,让 AI Agent 能够访问你的 Slack 工作区。无需 OAuth 应用、机器人权限或管理员审批。
除了读取和发送消息,它还会累积工作区的持久化概况——随时间记录每个频道和用户的状态,离职信息会作为带日期的墓碑记录保留——并根据需要综合生成关系图:estate view='about' person='X' 会通过展示 X 的活动范围、人际圈和按相关性排序的阅读计划,回答“介绍一下 X”。关系图不会作为存储内容维护,而是根据查询从两个不包含消息内容的小型本地账本中即时计算得出(设计说明)。添加 render='graph',即可将某个视图绘制为可在本地打开的静态 HTML 页面。
工作原理
Slack MCP 使用你现有的浏览器会话令牌(xoxc/xoxd)代表你与 Slack 交互。默认情况下,它会隐秘地读取内容——只有 mark-read 工具会触发已读回执。其他操作对其他用户不可见。
令牌提取功能已内置于二进制文件中。如果你已在 Chrome 或 Firefox 中登录 Slack,设置流程可以自动提取令牌,无需从 DevTools 复制粘贴。
前提条件
你需要在浏览器中拥有有效的 Slack 会话。运行设置前,请在 Chrome、Chromium、Edge 或 Firefox 中登录 app.slack.com 的工作区。
安装
Claude Code
claude mcp add slack-mcp -- npx -y @aaronsb/slack-mcp
然后让 Claude 运行 auth 工具。它会引导你选择浏览器和配置文件,并自动提取令牌。
Claude Desktop
从最新发布版本下载适用于你平台的 .mcpb 文件:
| 平台 | 文件 |
|---|---|
| macOS(Apple Silicon) | slack-mcp-darwin-arm64.mcpb |
| macOS(Intel) | slack-mcp-darwin-x64.mcpb |
| Linux(x64) | slack-mcp-linux-x64.mcpb |
| Linux(ARM) | slack-mcp-linux-arm64.mcpb |
| Windows(x64) | slack-mcp-windows-x64.mcpb |
打开该文件(双击或拖入 Claude Desktop)。出现令牌提示时,你可以:
- 留空,连接后使用
auth工具 - 如果已有令牌,则粘贴令牌
独立二进制文件
从发布版本下载适用于你平台的二进制文件,然后:
# Extract tokens from your browser (interactive)
./slack-mcp setup
# Run as MCP server (stdio, default)
./slack-mcp
# Run as MCP server (SSE, for remote/shared access)
./slack-mcp --transport sse
npm(全局安装)
npm install -g @aaronsb/slack-mcp
slack-mcp setup
令牌设置
获取 Slack 令牌有以下三种方式,从最简单到最手动依次排列:
自动方式(Chrome/Edge)
auth MCP 工具或 slack-mcp setup CLI 命令将会:
- 检测已安装的浏览器
- 让你选择 Slack 所在的浏览器和配置文件
- 打开浏览器、导航至 Slack,并通过 Chrome DevTools Protocol 提取令牌
- 验证并保存令牌
提取前必须完全关闭 Chrome——重新打开时,标签页会恢复。
半自动方式(Firefox)
设置流程会将临时浏览器扩展写入临时目录,然后引导你通过 about:debugging 在 Firefox 中加载该扩展。扩展会提取令牌并将其发送到本地回调服务。Firefox 关闭时,扩展会自动移除。
手动操作
运行 slack-mcp setup,或使用 auth 工具。如果未检测到浏览器,或自动提取失败,系统会回退到本地主机网页,并提供逐步的 DevTools 操作说明。
你也可以直接通过环境变量设置令牌:
export SLACK_MCP_XOXC_TOKEN="xoxc-..."
export SLACK_MCP_XOXD_TOKEN="xoxd-..."
./slack-mcp
设置取自 MCP 客户端配置提供的环境。工作目录中的 .env 文件只能设置 SLACK_MCP_PERSONALITY 和 SLACK_MCP_NO_BROWSER,且不会覆盖环境中已设置的变量。如果 .env 设置了任何其他环境中尚未设置的键,服务将拒绝启动并指出该键;请改为在客户端配置中设置。
生命周期
通过 stdio 运行时,客户端退出后服务会正常退出:stdin 关闭、收到终止信号(SIGTERM、SIGINT、SIGHUP),或父进程退出。每次退出都会刷新缓存并释放账本锁,因此下一个实例不会处于只读状态。在 Windows 上,npm 包装器的 child.kill 会强制终止服务,因此不会执行正常关机流程。
远程部署(实验性)
远程部署目前仍处于实验阶段,尚未在真实 SSH 会话中测试过。服务是否支持远程使用,以及以何种形式支持,仍未确定(参见 #102)。除非设置 SLACK_MCP_DEPLOYMENT=remote,否则以下内容均不适用。
连接卡住(例如 SSH 会话半开)时,管道会保持打开,但无人读取。只有空闲超时能检测到这种情况,而且仅在可能发生此情况的部署方式下才适用,因此服务会根据部署方式设置超时:
| 部署方式 | SLACK_MCP_IDLE_TIMEOUT |
|---|---|
| stdio,本地 | 不允许。stdio 客户端不会在服务退出后重新启动它,因此空闲但健康的会话会导致客户端断开连接。 |
| stdio,远程(通过 SSH) | 默认为 2h。设置时长(90m)可更改超时时间,或设置为 off 以禁用。 |
| SSE | 不允许。每个会话都会在连接结束时清理。 |
除非明确声明,否则部署方式为 local。服务不会自动检测:SSH_CONNECTION 仅表示某个祖先进程通过 SSH 登录(例如在 SSH 会话中运行 claude,或使用 VS Code Remote-SSH),并不表示 MCP 管道经过 SSH。只有启动服务的 MCP 客户端配置知道这一点,因此请在通过 SSH 启动服务的对应配置项中声明 remote。ssh 不会转发你的环境,因此请通过远程命令行使用 env 传递变量:
{
"mcpServers": {
"slack": {
"command": "ssh",
"args": ["host", "env", "SLACK_MCP_DEPLOYMENT=remote", "slack-mcp"]
}
}
}
(ssh 会将参数合并为一条远程命令行,因此这会在主机上运行 env SLACK_MCP_DEPLOYMENT=remote slack-mcp。在客户端的 env 块中设置不起作用,因为该设置只会传递给本地 ssh 进程。)在不允许设置超时的部署方式下设置超时,或设置无法解析的值,都会导致服务在启动时停止,并在 stderr 中说明原因。
工具
| 工具 | 类型 | 功能 |
|---|---|---|
inbox | 名词 | 需要你处理的内容:view='new'(自上次清除后)、'unreads'、'mentions' |
messages | 名词 | 对话内容:target= 完整读取,+around= 读取上下文,+since= 指定时间范围,query= 原始 Slack 搜索语法(按原样传递),以及已解析的筛选条件 in、from、after、before、has(链接、置顶、:emoji:)、thread;scheduled=true 会按时间从近到远列出待发送的定时消息,不会列出尚未发送的撰写草稿(ADR-016) |
estate | 名词 | 工作区结构及关系:view='about'|'families'|'person'|'initiatives'|'convergence'|'people'|'channels';about/person 可设置 render='graph',同时生成静态 HTML 图表页面(batch 中不可用) |
batch | 执行器 | 在一次调用中运行一组暂存的读取操作:commands=[{tool, params}...];可通过 save=/run=/list=/delete= 管理操作手册 |
say | 动词 | 发布内容(在 Slack 中可见):消息(线程回复也可通过 broadcast=true 同时发送到频道)、来自交换目录的文件(files=['report.pdf'],仅限文件名,最多 10 个;作为一条消息共享,并以 text 作为评论),或表情回应;at= 可安排稍后向 Slack 发送消息(2 分钟至 120 天;未指定时区偏移的时间按你的 Slack 个人资料时区解释,若此机器的时区与之不一致则会拒绝);cancel=<handle> 可撤回一条定时消息(ADR-016);发送或安排发送前都会扫描机密信息并经过审批门控,审批涵盖发送时间(ADR-013) |
dismiss | 动词 | 将收件箱项目标记为已处理——仅更新私有水位标记,Slack 中不可见 |
mark-read | 动词 | 发送已读回执——唯一公开可见的已读信号;隔离目的地会拒绝此操作,且绝不会打开私信 |
auth | 动词 | 交互式令牌设置(仅限 localhost) |
download | 动词 | 将共享文件下载到交换目录(filename= 只能是文件名,不能是路径;若名称已被占用,则保存为 name (n).ext,并在结果中说明) |
put | 动词 | 在交换目录中新建文件,供 say files= 附加;适用于文件工具无法访问服务端文件系统的客户端:name=(仅限文件名),并且必须且只能设置 content=(文本)或 base64=(标准字母表,可选填充)之一;最多 5 MiB;绝不覆盖已有文件(若名称已被占用,则保存为 name (n).ext),不会读取、列出或删除文件(ADR-012) |
unlock | 动词 | 在浏览器中打开本地页面,以检查并解除隔离状态和限制锁定;页面会清除相应状态,工具不会返回链接,也绝不会报告清除了什么(ADR-013) |
动词表示效果,名词表示领域,参数表示范围(ADR-009);batch 执行器表示组合而非效果,且只允许读取类名词(ADR-010)。每个名词都会回显其生效参数,并对达到上限的列表进行分页。
出站安全
此服务发布的所有内容都会归属于你的账户,而 Agent 会读取工作区中任何人都能写入的文本。因此,每次 say 都必须按固定顺序通过检查,之后内容才会到达 Slack,或打开任何私信(ADR-013):
- 限制锁定 — 被拦截次数过多后,所有
say和mark-read都会被拒绝,直到你解除锁定(通过 CLI 或unlock页面)。 - 交换目录 — 文件名必须是该目录中的纯文件名(ADR-012)。
- 隔离 — 被拦截操作封锁的目的地会拒绝
say和mark-read;读取仍可继续。 - 机密信息扫描器 — 扫描发送的文本、表情回应中的 emoji,以及每个文件的名称和字节内容,包括 base64、十六进制、URL 编码、gzip 和 zlib 内容。匹配到内容即会拦截:不会发送任何内容,并会告知 Agent 命中的类别和字段,但绝不会透露具体值。
- 审批门控 — 组织之外的目的地,或(在
strict模式下)从其他对话下载的文件,会作为待处理请求等待你审批。获得批准前不会发送任何内容。
MCP 客户端配置中的两个设置会影响此行为(ADR-014);.env 无法设置它们:
| 设置项 | 可选值 | 默认值 | 效果 |
|---|---|---|---|
SLACK_MCP_IDENTITY | human、agent | human | 指明这是哪个身份的账户:Agent 代表你发言,或以自身身份发言。此项会设置 say 的描述、服务说明,以及被拦截的消息所发布的通知:“[automated] 此账户发送的消息被安全过滤器拦截。”或“我不能分享这条内容。” |
SLACK_MCP_SAFETY | strict、soft | strict | strict 会在首次拦截时隔离,并在累计两次违规时锁定。soft 会在首次拦截时发出警告,从第二次起隔离,累计三次违规时锁定,并允许下载的文件在对话之间转移,但会发出警告。 |
拦截会在被隔离的对话中发布通知,绝不会发往组织外部的目的地,也绝不会发给没有 DM 的人员。拦截、待处理请求和获准发送分别记录为 outbound-safety: BLOCKED、PENDING 和 TRUSTED 行(包括目的地、ID、类别、次数,绝不包含内容)。当状态需要你处理时,inbox、messages、estate 和 batch 的结果会以横幅开头。
如果拦截记录无法写入隔离文件,该服务进程会在内存中暂停所有 say 和 mark-read,并发出解除请求(lift=strikes)。修复文件后,批准该请求或运行 slack-mcp quarantine clear strikes;两种方式都会清除所有已记录的违规次数。只有在暂停生效时文件可读,且此后未被替换或编辑,清除操作才会解除暂停;否则请批准该请求。重启也会解除暂停,但未记录的违规次数会丢失。如果下载来源信息无法记录,下载会失败,文件也会被删除(如果删除也失败,结果会说明这一点);如果来源信息无法读取或包含格式错误的行,那么在 strict 模式下,没有记录的附件需要审批;请求(及其 PENDING 日志行中的 provenance=…)会提示修复 provenance.jsonl。反应名称必须是 emoji 名称([a-z0-9_+'-],可选后缀为 ::skin-tone-2…6)。
你可以在终端中作出答复:
slack-mcp approve # list pending requests
slack-mcp approve p7k2 # let the next matching call through once
slack-mcp deny p7k2
slack-mcp quarantine list
slack-mcp quarantine clear '#general' # or @handle, or strikes
slack-mcp trust add '#partner' --case external --for 30d
slack-mcp trust list
slack-mcp trust remove '#partner'
对于声明支持 MCP 协议 2026-07-28 或更高版本且在调用时声明支持 elicitation 的客户端,系统也会在带内请求你批准一次、拒绝,或(在 soft 模式下)批准并信任;其他所有客户端以及每个 SSE 会话都使用 CLI。Elicitation 绝不会解除隔离或锁定。
如果没有终端(如 Claude Desktop 和其他桌面客户端),请让 Agent 清除锁定状态。它会调用 unlock,在浏览器中打开 127.0.0.1 上的页面,列出每个被隔离的人员或对话以及违规次数锁定,并显示扫描器发现的内容(机密类型、字段、发送目的地和时间;绝不显示机密值)。勾选要清除的项目并按 清除,或按 完成 关闭页面而不清除;两种操作都会关闭页面,链接也会失效。如果加载页面后锁定状态发生变化,按“清除”不会执行任何操作,并会重新显示锁定项。页面在十五分钟内无人加载或响应时会关闭。页面执行的清除会记录为 by=web,CLI 执行的则记录为 by=cli。Agent 永远看不到页面链接;如果无法打开浏览器(或设置了 SLACK_MCP_NO_BROWSER),unlock 会拒绝操作并提示使用 CLI。设置 SLACK_MCP_DEPLOYMENT=remote 或通过 SSE 使用时,此功能也不可用,因为页面会在未必属于你的主机上打开。
该页面只能增加操作阻力,并不能构成屏障:能够操控你浏览器的 Agent 可以点击“清除”。对于无人值守的 Agent,请在客户端权限中禁止它使用 unlock 工具和任何浏览器自动化功能,这样就只有 CLI 能执行清除操作。
状态文件与 estate 台账存放在同一目录下,即 $XDG_DATA_HOME/slack-mcp/ledger/<team>/(quarantine.jsonl、pending.jsonl、trust.jsonl、provenance.jsonl,权限均为 0600)。这些文件采用只追加的 JSON 行格式,运行中的服务会在每次受控调用时重新读取它们,因此编辑或删除某一行会立即生效;建议使用 CLI,以保留历史记录。
隐私
- 默认隐身 — 读取不会触发已读回执;只有
mark-read会触发 - 使用频道名称,而非 ID — AI 永远看不到 Slack 内部标识符
- 令牌保留在本地 — 存储在
~/.config/slack-mcp/config.json中,权限为0600 - 日志是私有的,不含凭据 — 使用 stdio 时,日志写入
$XDG_STATE_HOME/slack-mcp/slack-mcp.log(默认路径为~/.local/state/slack-mcp/),目录权限为0700,文件权限为0600;在 MCP 客户端配置中设置SLACK_MCP_LOG_FILE可更改日志位置。日志会记录工作区和用户名,但绝不记录令牌或 Cookie;写入前会对任何看起来像令牌或 Cookie 的内容进行脱敏 - 台账不含消息内容 — 持久化的实体台账存储实体事实(名称、生命周期、墓碑);注意力台账存储
{user, conversation, day}形式的交互记录,保留 90 天;两者均存放在 XDG 目录下,权限为0600,删除它们即可删除关系图 - 仅记录你自己的小时级活动 — 同事的活动按天汇总,这是有意为之
- 关系图报告是本地私有文件 —
estate render='graph'会在$XDG_DATA_HOME/slack-mcp/reports/(默认路径为~/.local/share/slack-mcp/reports/)生成独立的 HTML 页面,目录权限为0700,文件权限为0600,每个视图和每个人对应一份报告;每次渲染都会替换旧报告。报告包含关系数据——与视图中显示的名称和计数相同,不含 ID 或同事的小时级活动——因此请像对待台账一样妥善保管;删除该目录即可移除报告。页面不会从网络加载任何内容(内置 Cytoscape.js,并采用严格的 Content-Security-Policy),也不会为你提供服务或自动打开 - 文件只通过交换目录传递 —
say files=只从该目录读取,download和put只会写入$XDG_DATA_HOME/slack-mcp/exchange/(默认路径为~/.local/share/slack-mcp/exchange/,也可在 MCP 客户端配置中通过SLACK_MCP_EXCHANGE_DIR指定),目录权限为0700,文件权限为0600,绝不覆盖文件。文件参数只能是裸文件名,不能是路径,因此注入的文本无法让工具访问~/.ssh或自动启动文件夹;请使用自己的工具将文件复制到该目录以便附加,下载后再复制出去;如果客户端的工具无法访问该目录(例如运行在另一台机器上的沙盒),可使用put写入文件;该工具绝不覆盖、读取、列出或删除文件(ADR-012) - 除 Slack 外不产生网络流量 — 二进制文件只连接 Slack 主机(
slack.com和*.slack.com);任何指向其他主机的上传地址或重定向,都会在发送任何字节前遭到拒绝 - 不从浏览器下载 — 使用已安装的浏览器,绝不从 CDN 获取二进制文件
开发
make build # Build for current platform
make test # Run tests
make build-all-platforms # Cross-compile (6 platforms)
make release TAG=v2.1.1 # Tag and push (CI handles the rest)
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。