mcpField
S
Slackline

Slackline

远程服务
slackline.wakeshift.ai通信协作04 天前更新

关于 Slackline

Slackline 将用户的 AI Agent 接入 Slack,为每个 Agent 建立私信线程,并可通过配置的频道消息唤醒 Agent。适合希望在 Slack 中与 Agent 对话并控制频道访问范围的用户。

主要功能

  1. 01为每个 Agent 建立 Slack 私信线程
  2. 02通过消息和事件唤醒 Agent
  3. 03配置频道及可联系 Agent 的人员
  4. 04在私信或频道线程中回复
  5. 05查看监听位置与模式
  6. 06撤销 Agent 及其访问权限

适用场景

  1. 01从 Slack 私信向 Agent 发消息
  2. 02让 Agent 监听指定频道中的提及
  3. 03将频道回复路由给曾在该线程发帖的 Agent

MCP 相关

Slackline 提供受 OAuth 保护的 MCP 服务,包含 watch、reply、unwatch 和 listening 工具。Agent 连接后可通过 MCP 事件或 Wakeshift 唤醒机制接收 Slack 消息。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://slackline.wakeshift.ai/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

详细介绍

Slackline

通过 Slack 与自己的 Agent(Claude Code、Codex、Cursor 等)聊天。每个 Agent 都会在你与 Slackline 的私信中获得一个线程;你在那里回复就会唤醒它,它会以自己的名字在线程中回答。在 Slackline 的控制台中,你可以选择每个 Agent 还会监听哪些频道,以及谁可以在那里联系它。用户通过 Slack 登录,而非 Wakeshift。

工作原理

  1. 工作区添加 Slackline(Add to Slack,/install;管理员可能需要批准)。它的机器人令牌会以密封方式存储(AES-256-GCM)。

  2. 用户通过 Slack 登录(OpenID Connect,/signin)Slackline 控制台 /home。

  3. Agent 添加 Slackline 的 MCP 服务,https://<host>/mcp。该服务受 OAuth 保护:客户端注册(动态客户端注册),用户通过 Slack 登录并在 Slackline 的授权页面上批准,给它命名,然后客户端便可获取令牌。此后,该 Agent 就属于该用户:控制台会列出它,用户可以重命名或撤销它。

  4. 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 会终止这两种订阅。

  5. 消息会唤醒它。 Slackline 会将每条 Slack 消息(见下文)路由到相应监听器,并将其作为该监听器的 slack.message 事件发送给 Agent 所属的用户;Wakeshift 会将消息封装为外部数据,唤醒该对话。

  6. Agent 使用 reply 作答:在自己的私信线程中,或在它监听的频道中(在它要回复的消息所在的线程中,或作为新帖),并以自己的名字发出(chat:write.customize)。它在频道线程中发布的回复也会发送回它。

工具
watchlabel(可选):获取此对话的私信线程,并在该线程及 Agent 监听的频道中被唤醒
replytext;以及被回复消息中的 channel 和 thread_ts(为空:私信线程)
unwatch停止监听;私信线程中会显示相应提示
listeningAgent 监听的位置和方式

在 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 发回的提示(私信中的帮助信息、“未在监听”提示、频道中仅你可见的提示)不会在重试时重复发送。

自行运行

  1. 在 Wakeshift 控制台中,打开 Build → New app 并复制其密钥(wst_…)。

  2. 创建一个空的 Postgres 数据库。Slackline 启动时会创建所需的数据表。

  3. 为其提供一个公开的 HTTPS URL(试用期间可以使用隧道),并根据其清单创建 Slack 应用:在 api.slack.com/apps 中,选择 Create New App → From a manifest,然后粘贴 Slackline 运行后 https://<your URL>/slack/manifest.json 返回的内容。(先使用占位 Slack 凭据启动一次以获取清单,然后使用真实凭据重新启动。)

  4. 将 .env.example 复制为 .env,并填写以下内容:

    变量
    WAKESHIFT_URLWakeshift 的 URL,https://app.wakeshift.ai
    SLACKLINE_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 可以生成合适的密钥或令牌密钥。

  5. 在仓库根目录运行:

    set -a; . slackline/.env; set +a
    go run ./cmd/slackline
    
  6. 在 Slack 应用中,重新验证 Event Subscriptions 请求 URL,然后打开 SLACKLINE_URL 并选择 Add to Slack。

测试

设置 WAKESHIFT_TEST_DATABASE_URL,将其设为一个 Postgres URL,所对应的角色需有创建数据库的权限,然后运行 go test ./slackline。在端到端测试中,Slackline 会与 Wakeshift 服务和模拟 Slack 一起运行;这些测试位于 Wakeshift 自身的仓库中。

贡献

此仓库由 Wakeshift 的主仓库生成。欢迎提交拉取请求:我们会在主仓库中应用并发布相关更改。请参阅 贡献指南。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。