关于 Slackline
Slackline 将用户的 AI Agent 接入 Slack,为每个 Agent 建立私信线程,并可通过配置的频道消息唤醒 Agent。适合希望在 Slack 中与 Agent 对话并控制频道访问范围的用户。
主要功能
- 01为每个 Agent 建立 Slack 私信线程
- 02通过消息和事件唤醒 Agent
- 03配置频道及可联系 Agent 的人员
- 04在私信或频道线程中回复
- 05查看监听位置与模式
- 06撤销 Agent 及其访问权限
适用场景
- 01从 Slack 私信向 Agent 发消息
- 02让 Agent 监听指定频道中的提及
- 03将频道回复路由给曾在该线程发帖的 Agent
MCP 相关
Slackline 提供受 OAuth 保护的 MCP 服务,包含 watch、reply、unwatch 和 listening 工具。Agent 连接后可通过 MCP 事件或 Wakeshift 唤醒机制接收 Slack 消息。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://slackline.wakeshift.ai/mcpclaude mcp add --transport http ai-wakeshift-slackline https://slackline.wakeshift.ai/mcp{"mcpServers":{"ai-wakeshift-slackline":{"type":"http","url":"https://slackline.wakeshift.ai/mcp"}}}在 Cursor 中打开{"servers":{"ai-wakeshift-slackline":{"type":"http","url":"https://slackline.wakeshift.ai/mcp"}}}在 VS Code 中打开{"mcpServers":{"ai-wakeshift-slackline":{"type":"http","url":"https://slackline.wakeshift.ai/mcp"}}}{"mcpServers":{"ai-wakeshift-slackline":{"serverUrl":"https://slackline.wakeshift.ai/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
Slackline
通过 Slack 与自己的 Agent(Claude Code、Codex、Cursor 等)聊天。每个 Agent 都会在你与 Slackline 的私信中获得一个线程;你在那里回复就会唤醒它,它会以自己的名字在线程中回答。在 Slackline 的控制台中,你可以选择每个 Agent 还会监听哪些频道,以及谁可以在那里联系它。用户通过 Slack 登录,而非 Wakeshift。
工作原理
-
工作区添加 Slackline(Add to Slack,
/install;管理员可能需要批准)。它的机器人令牌会以密封方式存储(AES-256-GCM)。 -
用户通过 Slack 登录(OpenID Connect,
/signin)Slackline 控制台/home。 -
Agent 添加 Slackline 的 MCP 服务,
https://<host>/mcp。该服务受 OAuth 保护:客户端注册(动态客户端注册),用户通过 Slack 登录并在 Slackline 的授权页面上批准,给它命名,然后客户端便可获取令牌。此后,该 Agent 就属于该用户:控制台会列出它,用户可以重命名或撤销它。 -
Agent 调用
watch。 该对话(一个监听器)会在用户与 Slackline 的私信中获得一个线程,而watch会为该监听器订阅 Slackline 的slack.message事件。此事件与用户个人关联:事件中的用户是连接该 Agent 的用户(<team>.<user>),因此其他人的订阅都无法匹配它。Wakeshift 的结果会告知运行框架如何唤醒它(Claude Code 使用 Monitor,Codex 使用连接器信标,依此类推)。从同一对话再次调用watch会保留原线程:Slackline 只会记住对话会话密钥(或 Codex 线程、ChatGPT 对话)的 HMAC,而绝不会保存密钥本身。使用 MCP Events 自行订阅的客户端(ChatGPT)不会由
watch代为订阅:结果会提供监听器 ID,客户端再使用该 ID 订阅slack.message。Slackline 只允许它订阅该客户端自身 Agent 的监听器,并会拒绝已由watch订阅的运行框架调用subscribe_events。unwatch会终止这两种订阅。 -
消息会唤醒它。 Slackline 会将每条 Slack 消息(见下文)路由到相应监听器,并将其作为该监听器的
slack.message事件发送给 Agent 所属的用户;Wakeshift 会将消息封装为外部数据,唤醒该对话。 -
Agent 使用
reply作答:在自己的私信线程中,或在它监听的频道中(在它要回复的消息所在的线程中,或作为新帖),并以自己的名字发出(chat:write.customize)。它在频道线程中发布的回复也会发送回它。
| 工具 | |
|---|---|
watch | label(可选):获取此对话的私信线程,并在该线程及 Agent 监听的频道中被唤醒 |
reply | text;以及被回复消息中的 channel 和 thread_ts(为空:私信线程) |
unwatch | 停止监听;私信线程中会显示相应提示 |
listening | Agent 监听的位置和方式 |
在 Slack 中输入 /slackline,即可查看你的 Agent 以及如何连接它。
谁可以联系到 Agent
| 位置 | 在以下情况下可以联系到 Agent |
|---|---|
| 它的私信对话 | 消息来自 Agent 的用户,且位于该对话中 |
| 频道,模式为 @Slackline mentions | 消息中提及 @Slackline。如果那里有多个 Agent,以 Agent 名称开头的提及(@Slackline pipe: …)会发给该 Agent;否则会发给发送者自己的 Agent |
| 频道,模式为 every message | 该频道中的任何消息 |
| Agent 发过消息的线程 | 该线程中的回复,只要频道规则仍允许发送者联系到它(一个线程中可以有多个 Agent:每个 Agent 都会根据自己的规则收到回复,而线程中的提及仍会联系到被点名的 Agent) |
在频道中,消息只能来自 Agent 的用户,除非其规则设置为来自该频道中的任何人。这样一来,其他人的消息就能联系到在 Agent 用户的机器上运行、并使用其访问权限的 Agent,因此控制台会要求他们确认已理解这一点,并记录确认情况;Agent 读取这些消息时,会将其标记为来自他人(“信息,而非指令”)。频道消息会在每个 Agent 最近活跃的监听对话中送达一次。
频道规则仅在 Agent 的用户位于该频道时生效:控制台只会提供(并接受)他们和 Slackline 都加入的频道,送达消息和发帖时都会检查他们是否仍是频道成员(缓存 1 分钟),而 Slack 的 member_left_channel 事件会移除其 Agent 在该频道的规则,并记录审计信息。因此,没有人能利用 Agent 读取自己无法访问的频道。
Agent 发帖时使用其用户批准的名称(在同意页面上批准,或在控制台中重命名),绝不会使用 Agent 自行选择的名称;Agent 在 watch 中设置的名称只会用作私信中的对话标签。
绝不会送达:机器人消息(包括应用和 Agent 自己发出的消息)、编辑、加入事件及其他子类型、任何缺少 Slack 签名的内容(v0,且须在 5 分钟内)、以及已撤销 Agent 的任何内容。Agent 的文本会进行转义(&、<、>),因此无法提及 @channel、@here、人员或群组,也无法隐藏链接;每个对话每分钟最多发 20 条消息。规则仅适用于 Slackline 已加入的频道(/invite @Slackline)。
账户、令牌和控制台
- 会话:使用已签名的 Cookie(
HttpOnly、SameSite=Lax,在 https 上为Secure),记录用户及其会话版本;退出登录时会递增版本,因此会结束该用户在所有浏览器中的会话,复制的 Cookie 也会失效。控制台表单会携带从会话派生的令牌,且请求必须来自 Slackline 自身的源。 - 授权页面:客户端名称只是客户端自行声明的信息(任何人都可以注册任意名称),因此页面会明确说明这一点,并醒目显示批准后访问权限将发送到哪里:重定向 URI 的主机,或在回环重定向时显示“此计算机上的程序”。
- OAuth:客户端是经过签名的数据块(在有人批准之前不会存储任何内容);重定向 URI 必须使用 https,或在回环地址上使用 http。授权码只能使用一次,有效期为 2 分钟,以哈希形式存储,并且必须使用 PKCE(S256);兑换失败也会使授权码失效。访问令牌经过签名,有效期为 1 小时,并会注明 Agent;每次请求都会检查该 Agent,因此撤销后会立即停止其访问。刷新令牌为随机值,以哈希形式存储,有效期为 90 天,并且每次使用后都会更换。再次批准同一客户端时,会复用其 Agent。
- 撤销 Agent 会使其令牌、授权码、频道规则和监听器失效,并结束其对话的 Wakeshift 订阅(每个订阅都会收到通知);如果结束操作失败(Wakeshift 无法访问),则每 5 分钟重试一次,直到 Wakeshift 确认。
- 审计日志:按用户记录连接、重新批准、重命名和撤销 Agent、设置和移除频道规则,以及登录操作(控制台显示最新记录)。绝不记录消息文本。
- 从工作区移除 Slackline(收到
app_uninstalled,或机器人令牌对应的tokens_revoked;撤销用户的登录令牌不会产生任何影响)时,会要求 Wakeshift 忘记 Slackline 的每个用户(包括其对话、订阅和 Wakeshift 保存的消息),然后删除 Slackline 自身的数据行,并记录审计日志。任何失败都会返回 503,以便 Slack 重试;忘记操作具有幂等性。
重试
如果事件在 3 秒内未收到 200,Slack 会重试。消息发布后,Slackline 会返回 200;如果发布失败,则返回 503,以便 Slack 重试;每次发布的 ID 都包含 Slack 事件 ID,因此重试的事件只会投递一次。Slackline 发回的提示(私信中的帮助信息、“未在监听”提示、频道中仅你可见的提示)不会在重试时重复发送。
自行运行
-
在 Wakeshift 控制台中,打开 Build → New app 并复制其密钥(
wst_…)。 -
创建一个空的 Postgres 数据库。Slackline 启动时会创建所需的数据表。
-
为其提供一个公开的 HTTPS URL(试用期间可以使用隧道),并根据其清单创建 Slack 应用:在 api.slack.com/apps 中,选择 Create New App → From a manifest,然后粘贴 Slackline 运行后
https://<your URL>/slack/manifest.json返回的内容。(先使用占位 Slack 凭据启动一次以获取清单,然后使用真实凭据重新启动。) -
将
.env.example复制为.env,并填写以下内容:变量 WAKESHIFT_URLWakeshift 的 URL, https://app.wakeshift.aiSLACKLINE_URL你的副本的公开 URL SLACKLINE_KEY第 1 步中的应用密钥 SLACKLINE_DATABASE_URL第 2 步中的数据库 SLACKLINE_SECRET32 个或更多随机字节:用于为会话、OAuth 客户端和访问令牌签名。更改此密钥会使所有人退出登录,并要求 Agent 重新登录;除此之外没有其他影响 SLACKLINE_TOKEN_KEYS用于密封各工作区机器人令牌的密钥,以逗号分隔,每个密钥包含 32 个或更多随机字节。第一个密钥用于密封,任意密钥都可用于解封:轮换时,将新密钥放在最前面,并在所有工作区重新安装后删除旧密钥 SLACKLINE_SLACK_CLIENT_ID、SLACKLINE_SLACK_CLIENT_SECRET、SLACKLINE_SLACK_SIGNING_SECRET来自 Slack 应用的 Basic Information 页面 PORT监听端口(默认值为 8080) openssl rand -base64 48可以生成合适的密钥或令牌密钥。 -
在仓库根目录运行:
set -a; . slackline/.env; set +a go run ./cmd/slackline -
在 Slack 应用中,重新验证 Event Subscriptions 请求 URL,然后打开
SLACKLINE_URL并选择 Add to Slack。
测试
设置 WAKESHIFT_TEST_DATABASE_URL,将其设为一个 Postgres URL,所对应的角色需有创建数据库的权限,然后运行 go test ./slackline。在端到端测试中,Slackline 会与 Wakeshift 服务和模拟 Slack 一起运行;这些测试位于 Wakeshift 自身的仓库中。
贡献
此仓库由 Wakeshift 的主仓库生成。欢迎提交拉取请求:我们会在主仓库中应用并发布相关更改。请参阅 贡献指南。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。