| summary | Slack socket 模式或 HTTP webhook 模式的设置 |
|---|---|
| read_when | 设置 Slack 或调试 Slack socket/HTTP 模式 |
- 创建一个 Slack 应用并启用 Socket Mode。
- 创建一个 App Token(
xapp-...)和 Bot Token(xoxb-...)。 - 为 Moltbot 设置令牌并启动网关。
最小配置:
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-..."
}
}
}- 在 https://api.slack.com/apps 中创建一个 Slack 应用(从零开始)。
- Socket Mode → 切换开启。然后转到 Basic Information → App-Level Tokens → Generate Token and Scopes,范围为
connections:write。复制 App Token(xapp-...)。 - OAuth & Permissions → 添加 bot 令牌范围(使用下面的清单)。点击 Install to Workspace。复制 Bot User OAuth Token(
xoxb-...)。 - 可选: OAuth & Permissions → 添加 User Token Scopes(参见下面的只读列表)。重新安装应用并复制 User OAuth Token(
xoxp-...)。 - Event Subscriptions → 启用事件并订阅:
message.*(包括编辑/删除/线程广播)app_mentionreaction_added、reaction_removedmember_joined_channel、member_left_channelchannel_renamepin_added、pin_removed
- 邀请 bot 到您希望它阅读的频道。
- Slash Commands → 如果您使用
channels.slack.slashCommand,创建/clawd。如果您启用原生命令,为每个内置命令添加一个斜杠命令(与/help同名)。除非您设置channels.slack.commands.native: true(全局commands.native是"auto",这意味着 Slack 关闭),否则 Slack 的原生默认为关闭。 - App Home → 启用 Messages Tab,以便用户可以向 bot 发送私信。
使用下面的清单,以便范围和事件保持同步。
多账户支持: 使用 channels.slack.accounts 和每账户令牌以及可选的 name。参见 gateway/configuration获取共享模式。
通过环境变量设置令牌(推荐):
SLACK_APP_TOKEN=xapp-...SLACK_BOT_TOKEN=xoxb-...
或通过配置:
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-..."
}
}
}Moltbot 可以使用 Slack 用户令牌(xoxp-...)进行读操作(历史记录、固定、表情回应、emoji、成员信息)。默认情况下,这保持只读: 当存在用户令牌时,读取优先使用用户令牌,写入仍使用 bot 令牌,除非您明确选择加入。即使使用 userTokenReadOnly: false,当 bot 令牌可用时,写入仍优先使用 bot 令牌。
用户令牌在配置文件中配置(无环境变量支持)。对于多账户,设置 channels.slack.accounts.<id>.userToken。
包含 bot + app + user 令牌的示例:
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-...",
userToken: "xoxp-..."
}
}
}显式设置 userTokenReadOnly 的示例(允许用户令牌写入):
{
channels: {
slack: {
enabled: true,
appToken: "xapp-...",
botToken: "xoxb-...",
userToken: "xoxp-...",
userTokenReadOnly: false
}
}
}- 读操作(历史记录、表情回应列表、固定列表、emoji 列表、成员信息、搜索)在配置时优先使用用户令牌,否则使用 bot 令牌。
- 写操作(发送/编辑/删除消息、添加/删除表情回应、固定/取消固定、文件上传)默认使用 bot 令牌。如果
userTokenReadOnly: false且没有可用的 bot 令牌,Moltbot 回退到用户令牌。
channels.slack.historyLimit(或channels.slack.accounts.*.historyLimit)控制将多少最近的频道/群组消息包装到提示中。- 回退到
messages.groupChat.historyLimit。设置0禁用(默认 50)。
当您的网关可以通过 HTTPS 访问 Slack 时(典型于服务器部署),使用 HTTP webhook 模式。HTTP 模式使用 Events API + Interactivity + Slash Commands 和共享请求 URL。
- 创建一个 Slack 应用并禁用 Socket Mode(如果您只使用 HTTP,则可选)。
- Basic Information → 复制 Signing Secret。
- OAuth & Permissions → 安装应用并复制 Bot User OAuth Token(
xoxb-...)。 - Event Subscriptions → 启用事件并将 Request URL 设置为您的网关 webhook 路径(默认
/slack/events)。 - Interactivity & Shortcuts → 启用并将相同的 Request URL 设置为。
- Slash Commands → 为您的命令设置相同的 Request URL。
示例请求 URL:
https://gateway-host/slack/events
{
channels: {
slack: {
enabled: true,
mode: "http",
botToken: "xoxb-...",
signingSecret: "your-signing-secret",
webhookPath: "/slack/events"
}
}
}多账户 HTTP 模式: 设置 channels.slack.accounts.<id>.mode = "http" 并为每个账户提供唯一的 webhookPath,以便每个 Slack 应用可以指向自己的 URL。
使用此 Slack 应用清单快速创建应用(如果您愿意,可以调整名称/命令)。如果您计划配置用户令牌,请包括用户范围。
{
"display_information": {
"name": "Moltbot",
"description": "Slack connector for Moltbot"
},
"features": {
"bot_user": {
"display_name": "Moltbot",
"always_online": false
},
"app_home": {
"messages_tab_enabled": true,
"messages_tab_read_only_enabled": false
},
"slash_commands": [
{
"command": "/clawd",
"description": "Send a message to Moltbot",
"should_escape": false
}
]
},
"oauth_config": {
"scopes": {
"bot": [
"chat:write",
"channels:history",
"channels:read",
"groups:history",
"groups:read",
"groups:write",
"im:history",
"im:read",
"im:write",
"mpim:history",
"mpim:read",
"mpim:write",
"users:read",
"app_mentions:read",
"reactions:read",
"reactions:write",
"pins:read",
"pins:write",
"emoji:read",
"commands",
"files:read",
"files:write"
],
"user": [
"channels:history",
"channels:read",
"groups:history",
"groups:read",
"im:history",
"im:read",
"mpim:history",
"mpim:read",
"users:read",
"reactions:read",
"pins:read",
"emoji:read",
"search:read"
]
}
},
"settings": {
"socket_mode_enabled": true,
"event_subscriptions": {
"bot_events": [
"app_mention",
"message.channels",
"message.groups",
"message.im",
"message.mpim",
"reaction_added",
"reaction_removed",
"member_joined_channel",
"member_left_channel",
"channel_rename",
"pin_added",
"pin_removed"
]
}
}
}如果您启用原生命令,为要公开的每个命令添加一个 slash_commands 条目(匹配 /help 列表)。使用 channels.slack.commands.native 覆盖。
Slack 的 Conversations API 是类型范围的: 您只需要实际接触的对话类型的范围(channels、groups、im、mpim)。参见 https://docs.slack.dev/apis/web-api/using-the-conversations-api/ 了解概述。
chat:write(通过chat.postMessage发送/更新/删除消息) https://docs.slack.dev/reference/methods/chat.postMessageim:write(通过conversations.open为用户私信打开私信) https://docs.slack.dev/reference/methods/conversations.openchannels:history、groups:history、im:history、mpim:historyhttps://docs.slack.dev/reference/methods/conversations.historychannels:read、groups:read、im:read、mpim:readhttps://docs.slack.dev/reference/methods/conversations.infousers:read(用户查找) https://docs.slack.dev/reference/methods/users.inforeactions:read、reactions:write(reactions.get/reactions.add) https://docs.slack.dev/reference/methods/reactions.get https://docs.slack.dev/reference/methods/reactions.addpins:read、pins:write(pins.list/pins.add/pins.remove) https://docs.slack.dev/reference/scopes/pins.read https://docs.slack.dev/reference/scopes/pins.writeemoji:read(emoji.list) https://docs.slack.dev/reference/scopes/emoji.readfiles:write(通过files.uploadV2上传) https://docs.slack.dev/messaging/working-with-files/#upload
如果您配置 channels.slack.userToken,请在 User Token Scopes 下添加这些。
channels:history、groups:history、im:history、mpim:historychannels:read、groups:read、im:read、mpim:readusers:readreactions:readpins:reademoji:readsearch:read
mpim:write(仅当我们添加群组-私信打开/通过conversations.open启动私信)groups:write(仅当我们添加私人频道管理: 创建/重命名/邀请/归档)chat:write.public(仅当我们想发布到 bot 不在的频道) https://docs.slack.dev/reference/scopes/chat.write.publicusers:read.email(仅当我们需要来自users.info的电子邮件字段) https://docs.slack.dev/changelog/2017-04-narrowing-email-accessfiles:read(仅当我们开始列出/读取文件元数据)
Slack 仅使用 Socket 模式(无 HTTP webhook 服务器)。提供两个令牌:
{
"slack": {
"enabled": true,
"botToken": "xoxb-...",
"appToken": "xapp-...",
"groupPolicy": "allowlist",
"dm": {
"enabled": true,
"policy": "pairing",
"allowFrom": ["U123", "U456", "*"],
"groupEnabled": false,
"groupChannels": ["G123"],
"replyToMode": "all"
},
"channels": {
"C123": { "allow": true, "requireMention": true },
"#general": {
"allow": true,
"requireMention": true,
"users": ["U123"],
"skills": ["search", "docs"],
"systemPrompt": "Keep answers short."
}
},
"reactionNotifications": "own",
"reactionAllowlist": ["U123"],
"replyToMode": "off",
"actions": {
"reactions": true,
"messages": true,
"pins": true,
"memberInfo": true,
"emojiList": true
},
"slashCommand": {
"enabled": true,
"name": "clawd",
"sessionPrefix": "slack:slash",
"ephemeral": true
},
"textChunkLimit": 4000,
"mediaMaxMb": 20
}
}令牌也可以通过环境变量提供:
SLACK_BOT_TOKENSLACK_APP_TOKEN
确认表情回应通过 messages.ackReaction + messages.ackReactionScope 全局控制。使用 messages.removeAckAfterReply 在 bot 回复后清除确认表情回应。
- 出站文本分块到
channels.slack.textChunkLimit(默认 4000)。 - 可选换行分块: 设置
channels.slack.chunkMode="newline"在长度分块之前按空行(段落边界)分割。 - 媒体上传受
channels.slack.mediaMaxMb限制(默认 20)。
默认情况下,Moltbot 在主频道中回复。使用 channels.slack.replyToMode 控制自动线程:
| 模式 | 行为 |
|---|---|
off |
默认。 在主频道中回复。仅在触发消息已在线程中时才线程。 |
first |
第一次回复进入线程(在触发消息下),后续回复进入主频道。对于保持上下文可见同时避免线程混乱很有用。 |
all |
所有回复进入线程。保持对话包含,但可能降低可见性。 |
该模式适用于自动回复和代理工具调用(slack sendMessage)。
您可以通过设置 channels.slack.replyToModeByChatType 为每种聊天类型配置不同的线程行为:
{
channels: {
slack: {
replyToMode: "off", // 频道的默认值
replyToModeByChatType: {
direct: "all", // 私信始终线程
group: "first" // 群组私信/MPIM 线程第一次回复
},
}
}
}支持的聊天类型:
direct: 1:1 私信(Slackim)group: 群组私信 / MPIMs(Slackmpim)channel: 标准频道(公共/私人)
优先级:
replyToModeByChatType.<chatType>replyToMode- 提供程序默认值(
off)
旧版 channels.slack.dm.replyToMode 在没有设置聊天类型覆盖时仍被接受为 direct 的回退。
示例:
仅线程私信:
{
channels: {
slack: {
replyToMode: "off",
replyToModeByChatType: { direct: "all" }
}
}
}线程群组私信但保持频道在根目录:
{
channels: {
slack: {
replyToMode: "off",
replyToModeByChatType: { group: "first" }
}
}
}使频道线程,保持私信在根目录:
{
channels: {
slack: {
replyToMode: "first",
replyToModeByChatType: { direct: "off", group: "off" }
}
}
}对于细粒度控制,在代理响应中使用这些标签:
[[reply_to_current]]— 回复触发消息(启动/继续线程)。[[reply_to:<id>]]— 回复特定的消息 id。
- 私信共享
main会话(类似 WhatsApp/Telegram)。 - 频道映射到
agent:<agentId>:slack:channel:<channelId>会话。 - Slash 命令使用
agent:<agentId>:slack:slash:<userId>会话(前缀可通过channels.slack.slashCommand.sessionPrefix配置)。 - 如果 Slack 不提供
channel_type,Moltbot 从频道 ID 前缀(D、C、G)推断,默认为channel以保持会话键稳定。 - 原生命令注册使用
commands.native(全局默认"auto"→ Slack 关闭),可以通过每工作区的channels.slack.commands.native覆盖。文本命令需要独立的/...消息,可以通过commands.text: false禁用。Slack 斜杠命令在 Slack 应用中管理,不会自动删除。使用commands.useAccessGroups: false绕过命令的访问组检查。 - 完整命令列表 + 配置: 斜杠命令
- 默认:
channels.slack.dm.policy="pairing"— 未知私信发送者会收到配对代码(1 小时后过期)。 - 通过以下方式批准:
moltbot pairing approve slack <code>。 - 要允许任何人: 设置
channels.slack.dm.policy="open"和channels.slack.dm.allowFrom=["*"]。 channels.slack.dm.allowFrom接受用户 ID、@handles 或电子邮件(在令牌允许时在启动时解析)。向导在令牌允许的设置期间接受用户名并在可能时将其解析为 id。
channels.slack.groupPolicy控制频道处理(open|disabled|allowlist)。allowlist要求在channels.slack.channels中列出频道。- 如果您只设置
SLACK_BOT_TOKEN/SLACK_APP_TOKEN而从不创建channels.slack部分,运行时默认groupPolicy为open。添加channels.slack.groupPolicy、channels.defaults.groupPolicy或频道允许列表以锁定它。 - 配置向导接受
#channel名称并在可能时将其解析为 ID(公共 + 私人);如果存在多个匹配,它倾向于活动频道。 - 启动时,Moltbot 将允许列表中的频道/用户名称解析为 ID(当令牌允许时)并记录映射;未解析的条目保持输入状态。
- 要允许无频道,设置
channels.slack.groupPolicy: "disabled"(或保持空允许列表)。
频道选项(channels.slack.channels.<id> 或 channels.slack.channels.<name>):
allow: 当groupPolicy="allowlist"时允许/拒绝频道。requireMention: 频道的提及限制。tools: 可选的每频道工具策略覆盖(allow/deny/alsoAllow)。toolsBySender: 频道内可选的每发送者工具策略覆盖(键是发送者 id/@handles/emails;支持"*"通配符)。allowBots: 在此频道中允许 bot 撰写的消息(默认: false)。users: 可选的每频道用户允许列表。skills: 技能过滤器(省略 = 所有技能,空 = 无)。systemPrompt: 频道的额外系统提示(与主题/目的结合)。enabled: 设置false禁用频道。
将这些与 cron/CLI 发送一起使用:
user:<id>用于私信channel:<id>用于频道
Slack 工具操作可以通过 channels.slack.actions.* 限制:
| 操作组 | 默认 | 注意 |
|---|---|---|
| reactions | 启用 | 表情回应 + 列出表情回应 |
| messages | 启用 | 读/发送/编辑/删除 |
| pins | 启用 | 固定/取消固定/列出 |
| memberInfo | 启用 | 成员信息 |
| emojiList | 启用 | 自定义 emoji 列表 |
- 写入默认为 bot 令牌,因此状态更改操作保持在应用的 bot 权限和身份范围内。
- 设置
userTokenReadOnly: false允许在 bot 令牌不可用时使用用户令牌进行写操作,这意味着操作使用安装用户的访问权限。将用户令牌视为高度特权,并保持操作门和允许列表紧密。 - 如果您启用用户令牌写入,请确保用户令牌包含您期望的写入范围(
chat:write、reactions:write、pins:write、files:write),否则这些操作将失败。
- 提及限制通过
channels.slack.channels控制(设置requireMention为true);agents.list[].groupChat.mentionPatterns(或messages.groupChat.mentionPatterns)也算作提及。 - 多代理覆盖: 在
agents.list[].groupChat.mentionPatterns上设置每代理模式。 - 表情回应通知遵循
channels.slack.reactionNotifications(对allowlist模式使用reactionAllowlist)。 - Bot 撰写的消息默认被忽略;通过
channels.slack.allowBots或channels.slack.channels.<id>.allowBots启用。 - 警告: 如果您允许对其他 bot 的回复(
channels.slack.allowBots=true或channels.slack.channels.<id>.allowBots=true),使用requireMention、channels.slack.channels.<id>.users允许列表和/或在AGENTS.md和SOUL.md中设置明确的防护措施来防止 bot 到 bot 的回复循环。 - 对于 Slack 工具,表情回应删除语义在 /tools/reactions中。
- 附件在被允许且在大小限制内时下载到媒体存储。