如何把 Mastra 代理接入 Slack 让其响应频道消息并回写回复

发布时间:2026/9/13 21:39:20
如何把 Mastra 代理接入 Slack 让其响应频道消息并回写回复 如何把 Mastra 代理接入 Slack 让其响应频道消息并回写回复【免费下载链接】mastraMastra is the modern TypeScript framework for AI-powered applications and agents.项目地址: https://gitcode.com/GitHub_Trending/ma/mastra你的目标是把一个已有的 Mastra 代理接入 Slack有人在频道里 机器人或直接发消息时Mastra 通过正常代理管线处理消息并把回复写回 Slack 的会话频道消息会回复在线程中。整条路径是给代理挂上 Slack 通道适配器 → 在 Slack 侧创建应用并配置 webhook → 本地起开发服务器并用隧道暴露 → 在 Slack 里验证机器人能收发消息。适用前提你已有一个 Mastra 项目推荐框架代码放在src/mastra/下参考 Develop并且能在 Slack 工作区中创建应用。通道Channels功能自mastra/core1.22.0起可用Slack 适配器基于 Chat SDK具体指南见 Slack 通道文档 和 Channels 总览。安装适配器并给代理挂上 Slack 通道在项目里安装 Chat SDK 的 Slack 适配器npm install chat-adapter/slack然后在代理配置中加入createSlackAdapter()。以下示例放在src/mastra/agents/your-agent.ts模型用的是文档中解析后的示例值openai/gpt-5.6-sol可换成你自己的模型import { Agent } from mastra/core/agent import { createSlackAdapter } from chat-adapter/slack export const yourAgent new Agent({ id: your-agent, name: Your Agent, instructions: Help people plan tasks, answer questions, and coordinate work in Slack., model: openai/gpt-5.6-sol, channels: { adapters: { slack: createSlackAdapter(), }, }, })注意id: your-agentSlack webhook 路径会用这个id拼接后面配置 Slack 应用时要保持一致。使用openai/model格式的模型时需要设置对应提供商的环境变量例如 OpenAI 需要OPENAI_API_KEY。通道文档建议在Mastra实例上配置 storage如LibSQLStore让线程订阅、工具审批等通道状态在重启后保留本地验证阶段可先不加上线前建议补上。在 Slack 侧用 manifest 创建应用Slack 应用决定机器人的显示名、能力和接收的事件。最快的方式是在目标工作区用 manifest 直接创建这条路只适用于把代理加进自己的工作区不覆盖给其他工作区安装的 OAuth 流程打开api.slack.com/apps选择Create an app再选From a manifest选择机器人运行的工作区粘贴下面的 manifest 并选择Create。Slack 同时接受 JSON 和 YAML用创建弹窗里对应的标签页格式即可。{ display_information: { name: mastra-agent }, features: { app_home: { home_tab_enabled: false, messages_tab_enabled: true, messages_tab_read_only_enabled: false }, bot_user: { display_name: mastra-agent, always_online: true } }, oauth_config: { scopes: { bot: [ im:write, app_mentions:read, channels:history, channels:read, chat:write, users:read, im:read, im:history ] }, pkce_enabled: false }, settings: { event_subscriptions: { request_url: https://YOUR-PUBLIC-URL/api/agents/YOUR-AGENT-ID/channels/slack/webhook, bot_events: [app_mention, message.channels, message.im] }, interactivity: { is_enabled: true, request_url: https://YOUR-PUBLIC-URL/api/agents/YOUR-AGENT-ID/channels/slack/webhook }, org_deploy_enabled: false, socket_mode_enabled: false, token_rotation_enabled: false, is_mcp_enabled: false } }其中两处占位符YOUR-PUBLIC-URL是你的 Mastra 服务公网地址本地开发时就是隧道地址见下节YOUR-AGENT-ID是上面代码里 Agent 的id例如your-agent。创建应用时如果 Slack 不接受占位符可以先留空或用临时值后面统一回填真实 webhook URL。这份 manifest 各部分的用途display_information.name和bot_user.display_name机器人在 Slack 里的名字改完需要重装应用messages_tab_enabledmessages_tab_read_only_enabled允许从应用Messages标签页给机器人发私信oauth_config.scopes.bot允许机器人在它所在的频道发帖、读历史、读 提及和私信并做用户查询event_subscriptions告诉 Slack 把哪些消息事件发到 webhook这里订阅了app_mention被 、message.channels频道消息、message.im私信interactivity启用交互卡片并把卡片按钮动作发回同一个 webhook。应用创建后打开Install App选择Install to Workspace并批准请求的 scopes。配置 Slack 凭据Slack 会向你的 webhook 发请求Mastra 需要两样东西来完成验签和回写消息。在 Slack 应用设置里复制Basic Information App Credentials Signing SecretOAuth Permissions Bot User OAuth Token写入 Mastra 项目的.envSLACK_SIGNING_SECRETyour-signing-secret SLACK_BOT_TOKENxoxb-your-bot-tokenMastra 会自动读取这两个环境变量验签失败的请求会被适配器直接拒绝401。启动本地服务并用隧道暴露 webhookSlack 无法把事件发到localhost所以本地开发要先把 Mastra 开发服务器暴露出去在项目根目录启动开发服务器npx mastra dev服务默认监听http://localhost:4111src/mastra/下的改动会自动重启服务。另开终端用隧道暴露 4111 端口cloudflared或ngrok均可。这里用 cloudflarednpx cloudflared tunnel --url http://localhost:4111这条命令会在你的机器上启动一个公网隧道进程只要终端不关公网地址就能访问你本地的 4111 端口。把生成的隧道主机名作为YOUR-PUBLIC-URL得到完整 webhook URL例如https://abc123.trycloudflare.com/api/agents/your-agent/channels/slack/webhook路径格式是/api/agents/AGENT_ID/channels/slack/webhook这是 Mastra 为每个适配器自动注册的固定路由不需要你手写服务端代码。隧道地址只用于本地开发部署到正式服务器后要换成生产 URL因为隧道重启后地址会变。在 Slack 应用设置里回填 Request URL回到 Slack 应用设置把两处请求地址都改成上一步的 webhook URLEvent Subscriptions把Request URL替换为完整 webhook URL选择Save ChangesInteractivity Shortcuts把Request URL替换为同一个 webhook URL选择Save Changes如果 Slack 提示需要重装应用打开OAuth Permissions选择Reinstall to Workspace。注意顺序先启动本地服务并拿到隧道地址再保存 Slack 侧的 Request URL否则 Slack 校验 URL 时会连不上。在 Slack 中验证按 Slack 指南 的验证步骤私信验证。直接给 Slack 机器人用户发一条私信。manifest 里包含message.im事件和im:*scopes所以私信必须能走通。机器人应在线程/会话中回复回复内容取决于你给代理配置的模型、指令、记忆和工具文档不保证固定输出。频道验证。先用/invite your-bot-nameyour-bot-name换成你机器人的名字把机器人拉进目标频道然后在频道里 它your-bot-name What can you help me with?代理会回复在该消息的线程里。首次被 时Mastra 默认会从平台拉取该线程最近 10 条消息作为上下文之后订阅该线程并通过 Mastra 记忆保持完整历史不想要这个行为可以设置threadContext: { maxMessages: 0 }只影响非私信线程详见 Channels 总览。webhook 层的判断依据。Slack 期望在 3 秒内收到200确认投递失败或超时会重试最多重试 3 次所以“发出去但没回复”先看服务是否在 3 秒内回了200本地冷启动慢时第一次可能需要等一次重试。确认200之后 Slack 不再重试后续错误由 Mastra 处理默认行为是把 agent 运行失败的错误信息发到线程里。另外注意webhook 的200表示“已收到”不代表“已回答”两者要分开判断。访问控制与上线注意事项适配器本身没有用户白名单应用装好后工作区里任何人都可以通过私信或在它所在的频道 它来调用代理。Slack 用 signing secret 校验每个请求Mastra 对每条有效消息都会运行代理。主要控制手段是频道成员关系——机器人不在的频道收不到事件把机器人移出频道即可切断访问。需要更细粒度控制时每条请求的 request context 都带发送者的 Slack 用户 IDchannelkey 下可取userId等字段可以在 input processor 或工具里按用户 ID 放行/拒绝。共享频道Slack Connect会把外部工作区的人也放进会话等于把代理的工具和数据暴露给对方加机器人进共享频道前先确认工具和数据可以对外。部署到正式环境后把 Slack 应用设置里的两个 Request URL 都更新为生产 webhook URL隧道地址是临时的不能留在生产配置里。如果部署在 Vercel 这类 serverless 平台通道需要waitUntilVercel 从vercel/functions传入AWS Lambda 同理让函数在代理跑完前不被冻结并配置跨实例的共享 pub/sub如RedisStreamsPubSub来协调线程租约Cloudflare Workers 和 Netlify Functions 会自动检测不需要waitUntil。细节见 Channels 总览的 Serverless 一节。平台服务缩到空闲后Slack 的下一次事件会通过 webhook 把服务唤醒空闲后第一条回复会慢一些属于预期行为。完成上面验证私信有回复、频道 后线程内有回复即表示接入成功。要继续扩展可以按需配置 Channels reference 中列出的inlineMedia、threadContext、textFormat等选项或阅读 Channels 总览 了解工具审批卡片和自定义 action 处理。【免费下载链接】mastraMastra is the modern TypeScript framework for AI-powered applications and agents.项目地址: https://gitcode.com/GitHub_Trending/ma/mastra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考