使用说明
不和行动
具有多公会项目路由的代理级Discord MCP服务器。
特性
- 72个MCP工具 --消息传递、人物角色、民意调查、论坛、笔记、频道、审核、角色、webhooks、botops、审计日志、线程、公会、邀请、权限、搜索、23个模板、OG嵌入展开、项目内省
- 项目说明板 --每个项目都有一份耐用的、有针对性的笔记日志;代理离开切换并在启动时读取它们,意识到其他并发会话
- Webhook人物角色 --一个机器人,通过每条消息的用户名/头像覆盖无限制地发布身份;永远不要创建另一个bot应用程序
- 本地民意调查 --结构化代理/人类共识,具有每个答案的投票人读取和机器人标记
- 论坛工作队列 --将帖子作为任务,将标签作为状态标签,将存档关闭
- 实时事件馈送 --可选
discord-ops listensidecar将消息/反应流式传输到由以下人员读取的本地接收器get_events,每次轮询零个API调用 - 多公会项目路由 —
send_message({ project: "my-app", channel: "builds" })而不是原始通道ID - 代理间协调 --代理发布任务,同行回复和反应,发起人通过以下方式读回结果
get_replies/get_reactions--不和谐是一种持久的协调总线 - 通知路由 --地图通知类型(
ci_build,deploy,error)每个项目的频道 - 所有者ping --配置项目所有者,以便发布、错误和警报自动提及正确的人
- 机器人角色 --具有身份元数据、每个通道的机器人分配和每个机器人工具配置文件的命名机器人
- 多机器人支持 --使用每个项目的令牌从单个MCP服务器管理多个Discord机器人
- 刀具轮廓 --只加载代理需要的工具;使用精简配置文件将架构开销减少85%
- 智能通道分辨率 --通道参数接受通道名称或雪花ID,具有4层模糊回退
- send_message的自动嵌入 --默认情况下,每条消息都会有一个品牌嵌入;
raw: true对于纯文本 - OG元数据展开 —
send_embed在服务器端获取Open Graph元数据并呈现丰富的链接预览 - 灵活的令牌配置 --可配置的默认令牌env-var,所有项目使用每个项目令牌时的可选默认值
- 配置验证 —
discord-ops validate在未连接到Discord的情况下检测到重复的公会、丢失的令牌、无效的通道引用 - HTTP/SSE+stdio传输 --用于Claude Code的stdio,用于远程MCP客户端的HTTP/SSE
- HTTP传输身份验证 --通过承载令牌进行身份验证
DISCORD_OPS_HTTP_TOKEN具有恒定时间比较 - 干运行模式 -在不调用Discord API的情况下模拟破坏性操作
- 交互式设置向导 —
discord-ops setup实时发现公会/频道,配置单/多机器人路由和协调板,并编写项目.mcp.json对于一个命令安装 - 安全强化 --速率限制、飞行前权限检查、雪花ID验证、自我保护警卫
- 延迟登录 --Discord连接前会枚举工具;第一次工具调用触发登录
- Zod验证 --执行前验证所有输入
- 错误清理 --从错误输出中删除令牌、webhook URL和雪花ID
- 审计日志 --记录到stderr的每个工具调用
快速开始
# Install
npm install -g discord-ops
# Interactive setup — connects to your bot, discovers guilds/channels, and
# writes ~/.discord-ops.json + a project .mcp.json (so Claude Code loads it)
discord-ops setup
# Or manual setup
export DISCORD_TOKEN="your-bot-token"
discord-ops health
# Start MCP server (stdio)
discord-ops
# Start MCP server (HTTP/SSE)
discord-ops serve --port 3000
Claude代码集成
添加到您的项目 .mcp.json.使用 npx 与 @latest 因此,每个会话都会自动使用最新发布的版本——没有它,npx可能会无限期地提供过时的缓存版本:
{
"mcpServers": {
"discord-ops": {
"command": "npx",
"args": ["-y", "discord-ops@latest"],
"env": {
"DISCORD_TOKEN": "${DISCORD_TOKEN}"
}
}
}
}
这 ${VAR} 语法是ClaudeCode的原生env-var插值——它在启动时从shell环境中读取值。将您的机器人令牌导出到 ~/.zshrc (或 .bashrc)它将可用于所有项目,而无需在任何文件中硬编码。
多组织设置(每个项目令牌)
当每个项目都有自己的bot时,传递所有令牌env变量并让 ~/.discord-ops.json 处理哪个项目使用哪个:
{
"mcpServers": {
"discord-ops": {
"command": "npx",
"args": ["-y", "discord-ops@latest"],
"env": {
"ORG_A_DISCORD_TOKEN": "${ORG_A_DISCORD_TOKEN}",
"ORG_B_DISCORD_TOKEN": "${ORG_B_DISCORD_TOKEN}"
}
}
}
}
每个项目 ~/.discord-ops.json 宣布 "token_env": "ORG_A_DISCORD_TOKEN" 不和谐行动会自动路由。无违约 DISCORD_TOKEN 当所有项目都有 token_env 集。
单一组织简写
如果你的所有项目共享一个机器人,只需传递该令牌:
{
"mcpServers": {
"discord-ops": {
"command": "npx",
"args": ["-y", "discord-ops@latest"],
"env": {
"DISCORD_TOKEN": "${DISCORD_TOKEN}"
}
}
}
}
自定义令牌环境变量名称
如果另一个工具已经声明 DISCORD_TOKEN,使用 DISCORD_OPS_TOKEN_ENV 指向另一个名称:
{
"mcpServers": {
"discord-ops": {
"command": "npx",
"args": ["-y", "discord-ops@latest"],
"env": {
"DISCORD_OPS_TOKEN_ENV": "MY_BOT_TOKEN",
"MY_BOT_TOKEN": "${MY_BOT_TOKEN}"
}
}
}
}
项目路线
杀手级功能:按项目名称和通道别名而不是原始ID路由消息。
全局配置(~/.discord-ops.json)
{
"projects": {
"my-app": {
"guild_id": "123456789012345678",
"channels": {
"dev": "CHANNEL_ID",
"builds": "CHANNEL_ID",
"alerts": "CHANNEL_ID",
"releases": "CHANNEL_ID"
},
"default_channel": "dev"
}
},
"default_project": "my-app",
"notification_routing": {
"ci_build": "builds",
"deploy": "builds",
"release": "releases",
"error": "alerts",
"dev": "dev"
}
}
每个项目的机器人代币
项目可以通过以下方式指定自己的机器人令牌 token_env:
{
"projects": {
"org-a": {
"guild_id": "111111111111111111",
"channels": { "dev": "CHANNEL_ID" },
"default_channel": "dev",
"token_env": "ORG_A_DISCORD_TOKEN"
},
"org-b": {
"guild_id": "222222222222222222",
"channels": { "dev": "CHANNEL_ID" },
"default_channel": "dev",
"token_env": "ORG_B_DISCORD_TOKEN"
}
}
}
当所有项目都有 token_env,默认值 DISCORD_TOKEN 是可选的。每个项目都与自己的机器人连接。
机器人角色
为机器人提供名称、角色和每个通道的分配。当您的Discord服务器运行多个具有不同角色的机器人时(例如,社区助手与技术运营机器人),这是理想的。
{
"bots": {
"claire": {
"name": "Claire",
"role": "Community helper",
"description": "Handles support and community channels",
"token_env": "CLAIRE_TOKEN",
"default_profile": "messaging"
},
"courier": {
"name": "Clarity Courier",
"role": "Technical operations",
"token_env": "COURIER_TOKEN",
"default_profile": "full",
"profile_add": ["send_template"],
"profile_remove": []
}
},
"projects": {
"clarity-house": {
"guild_id": "123456789012345678",
"bot": "courier",
"channels": {
"general": "111111111111111111",
"support": { "id": "222222222222222222", "bot": "claire" },
"dev-ops": "333333333333333333",
"ai-testing": { "id": "444444444444444444", "bot": "claire" }
},
"default_channel": "dev-ops",
"tool_profile": "full"
}
}
}
它是如何工作的:
bots--带有身份元数据的命名机器人定义token_envproject.bot--项目的默认bot(除非被覆盖,否则所有渠道都使用此bot)- 频道
bot以(权力)否决 --各个渠道可以使用不同的机器人:{ "id": "...", "bot": "claire" } default_profile--每个机器人工具配置文件(限制机器人在运行时可以使用哪些工具)profile_add--在机器人之上加载其他工具default_profileprofile_remove--从机器人中排除的工具default_profile- 令牌解析 --频道机器人→ 项目机器人→ 项目
token_env→ 默认DISCORD_TOKEN - 路由中的机器人角色 --已解决的目标包括
bot: { name, role }代理上下文的元数据 - 向后兼容的 —
bots是可选的;频道接受两者"ID"和{ "id": "ID", "bot": "name" }格式
使用 list_bots 查看所有已配置的机器人、它们的项目分配、通道覆盖和连接状态。
所有者ping
配置项目所有者,以便自动预置发布、错误和警报 @mentions这确保了在关键事件中始终呼叫正确的人,而不会在每条消息中硬编码提及。
{
"projects": {
"my-app": {
"guild_id": "123456789012345678",
"channels": { "releases": "CHANNEL_ID", "alerts": "CHANNEL_ID" },
"owners": ["820027414902079548"],
"notify_owners_on": ["release", "error", "alert"]
}
}
}
notify_owners_on 值: 任何通知类型(release, error, alert, ci_build, deploy等等)
安全: "dev" 被硬编码为无论配置如何都不会触发所有者ping——dev噪声保持安静。
当a send_message 或 send_embed 调用使用匹配 notification_type,所有者提到的内容会自动添加到消息前面。不需要其他更改。
智能通道分辨率
这 channel param在需要通道的任何地方接受通道名称或雪花ID。分辨率分为四层:
- 完全匹配别名 —
"builds"点击builds项目配置中的别名 - 模糊别名匹配 —
"build"或"blds"解析为最接近的别名 - Live Discord API查找 —
"general"即使没有配置别名也能解析 - 错误 --如果以上都没有找到匹配项
这意味着你可以通过 channel: "general" 它甚至适用于不在您配置中的通道。您还可以直接传递原始雪花ID-- channel: "1234567890" 完全绕过别名解析。
根据项目配置(.discord-ops.json 在回购根目录中)
{
"project": "my-app",
"notification_routing": {
"ci_build": "builds",
"deploy": "builds"
}
}
用法
# By project + channel alias
send_message({ project: "my-app", channel: "builds", content: "Build passed!" })
# By notification type (auto-routed to channel, owner pinged if configured)
send_message({ project: "my-app", notification_type: "release", content: "v1.0.0 shipped" })
# Direct channel ID (always works)
send_message({ channel_id: "123456789", content: "Hello" })
# Channel by name (live lookup — no alias needed)
send_message({ project: "my-app", channel: "general", content: "Hello" })
消息传递
自动嵌入
send_message 自动将消息包装在带有颜色条、描述和时间戳的精美嵌入中。通过 raw: true 改为发送纯文本。
# Branded embed (default)
send_message({ project: "my-app", channel: "dev", content: "Deploy complete" })
# Plain text
send_message({ project: "my-app", channel: "dev", content: "pong", raw: true })
send_embed——OG元数据展开
send_embed 从任何URL获取Open Graph服务器端元数据,并呈现丰富的预览嵌入。所有OG字段都可以被覆盖。
send_embed({
url: "https://www.npmjs.com/package/discord-ops/v/0.23.0",
project: "my-app",
channel: "releases",
title: "discord-ops v0.23.0",
description: "Owner pings, smart channel resolution, category editing",
color: 5763719,
footer: "Released April 3, 2026"
})
可用于共享GitHub PR、npm发布、博客文章或任何具有丰富预览的URL——机器人会获取元数据,这样Discord的CDN就不会缓存崩溃的客户端展开。
代理人之间的协调
不协调操作同时也是多智能体系统的协调总线。一个代理将任务作为消息发布,对等代理(或人类)进行回复和反应,发起代理读取回复和反应。因为交换存在于Discord中,所以它在会话之间是持久的,在不共享内存的代理进程之间工作,并且服务器中的人可以观察到每一步。
循环包含四个工具调用:
# Agent A posts a task and records the returned message ID
send_message({ project: "my-app", channel: "engineering", content: "TASK: verify the staging deploy", raw: true })
→ { "id": "333333333333333333" }
# Agent B claims it with a reaction, then replies
add_reaction({ project: "my-app", channel: "engineering", message_id: "333333333333333333", emoji: "👀" })
send_message({ project: "my-app", channel: "engineering", reply_to: "333333333333333333", content: "RESULT: verified, all checks green", raw: true })
# Agent A collects results at its next task boundary
get_replies({ project: "my-app", channel: "engineering", message_id: "333333333333333333" })
get_reactions({ project: "my-app", channel: "engineering", message_id: "333333333333333333" })
三个读取端工具关闭循环: get_message 获取一条消息及其回复、线程和反应状态; get_reactions 报告谁对什么做出了反应; get_replies 收集对特定消息的回复。 get_messages 包括 reply_to 在每条消息上,扫描代理都可以重建对话结构。对于超过一次往返的交换, create_thread 来自原始消息的消息保持频道干净。
看 文档/代理协调.md 对于完整的协议——反应词汇表、线程、轮询指导、多项目设置和反模式。不和谐行动新手? 文档/项目登录.md 是将其作为团队协调总线的从头到尾的演练——项目设置、共享留言板、人物角色、民意调查和论坛,以及最低权限配置文件。
工具
消息传递(16个工具)
| 工具 | 说明 |
|---|---|
send_message |
发送带有项目路由的消息(默认情况下自动嵌入) |
send_embed |
从URL获取OG元数据并发布丰富的嵌入 |
get_messages |
获取最近的消息(支持ISO 8601时间戳) |
get_message |
获取一条包含回复、线程和反应状态的消息 |
get_reactions |
列出对消息的反应以及每个用户的详细信息 |
get_replies |
收集对特定消息的回复 |
edit_message |
编辑机器人消息 |
delete_message |
删除消息 |
add_reaction |
对消息作出反应 |
pin_message |
在通道中固定消息 |
unpin_message |
不愉快的消息 |
search_messages |
按内容、作者或日期范围搜索邮件 |
send_template |
使用内置模板发送样式化嵌入 |
list_templates |
列出具有所需变量的可用模板 |
notify_owners |
基于通知类型的Ping项目所有者 |
forward_message |
将消息快照转发到另一个通道 |
人物角色(3个工具)
一个机器人,无限制的发布身份——角色身份是每条消息的webhook用户名/化身覆盖,因此不需要新的Discord机器人或开发人员门户工作。
| 工具 | 说明 |
|---|---|
create_persona |
确保一个通道有一个支持角色的webhook(令牌永远不会暴露) |
send_as |
以任何角色名称/头像发布;返回消息id |
list_personas |
列出每个频道或公会的人物角色网络钩子 |
民意调查(3个工具)
| 工具 | 说明 |
|---|---|
send_poll |
创建本地民意调查(2-10个答案,多选,最多32天) |
get_poll_results |
用机器人标志读取计票结果和每个答案的选民 |
end_poll |
立即完成投票(幂等) |
论坛(3个工具)
论坛通道作为持久的工作队列:帖子是一项任务,标签是状态标签,归档会关闭它。
| 工具 | 说明 |
|---|---|
create_forum_post |
创建带有初始消息的标记论坛帖子 |
list_forum_posts |
列出帖子,可按标签名称过滤 |
update_forum_post |
替换标签和/或存档(关闭)帖子 |
植物学(5种工具)
通过API管理机器人应用程序本身-无开发人员门户round-tips。(创建 新 机器人应用程序仍然是Discord设计的门户;使用人物角色。)
| 工具 | 说明 |
|---|---|
set_bot_nick |
设置或清除机器人的每个公会昵称 |
update_application |
编辑当前应用程序的描述、图标、标签和安装参数 |
list_app_emojis |
列出应用程序拥有的表情符号 |
create_app_emoji |
上传应用程序表情符号;退货 add_reaction-就绪标识符 |
delete_app_emoji |
删除应用程序表情符号 |
频道(9个工具)
| 工具 | 说明 |
|---|---|
list_channels |
列出公会频道 |
get_channel |
获取频道详细信息 |
create_channel |
创建频道 |
edit_channel |
编辑频道名称、主题、类别或位置(文本、语音和类别) |
delete_channel |
删除频道 |
purge_messages |
批量删除邮件(最多100封,<14天) |
set_slowmode |
设置或禁用慢速模式 |
move_channel |
将频道移动到其他类别或位置 |
set_permissions |
为角色或成员设置频道权限覆盖 |
适度(4个工具)
| 工具 | 说明 |
|---|---|
kick_member |
从公会中踢出一名成员 |
ban_member |
禁止用户加入公会 |
unban_member |
取消阻止用户 |
timeout_member |
成员超时(静音) |
角色(5个工具)
| 工具 | 说明 |
|---|---|
list_roles |
列出公会角色 |
create_role |
创建新角色 |
edit_role |
编辑角色属性 |
delete_role |
删除角色 |
assign_role |
在成员中添加或删除角色 |
Webhooks(6个工具)
| 工具 | 说明 |
|---|---|
create_webhook |
在频道上创建webhook |
get_webhook |
获取webhook详细信息 |
list_webhooks |
列出公会或频道的webhooks |
edit_webhook |
编辑webhook属性 |
delete_webhook |
删除webhook |
execute_webhook |
通过webhook发送消息 |
审计(1个工具)
| 工具 | 说明 |
|---|---|
query_audit_log |
使用过滤器查询公会审核日志 |
行业协会和会员(6个工具)
| 工具 | 说明 |
|---|---|
list_guilds |
列出机器人公会 |
get_guild |
获取公会详细信息 |
get_invites |
获取公会的所有有效邀请 |
create_invite |
为频道创建邀请链接 |
list_members |
列出公会成员 |
get_member |
获取会员详细信息 |
螺纹(3个工具)
| 工具 | 说明 |
|---|---|
create_thread |
创建一个线程 |
list_threads |
列出活动线程 |
archive_thread |
存档(并可选择锁定)线程 |
注释(4个工具)
一个持久的、定向的笔记日志——每个项目一个板通道——代理在启动时读取并用于跨并发会话的切换。看 文档/项目登录.md.
| 工具 | 说明 |
|---|---|
leave_note |
给会话、角色或 all)在董事会上 |
get_notes |
阅读公告板,按收件人、发件人、标签或未解析进行筛选 |
resolve_note |
标记已处理的笔记(✅) 带有可选回复 |
list_sessions |
从笔记活动中查看项目中哪些会话处于活动状态 |
系统(4个工具)
| 工具 | 说明 |
|---|---|
health_check |
机器人状态、版本、连接的公会和权限审核 |
list_projects |
列出所有带有公会映射、令牌状态和验证的项目 |
list_bots |
列出所有带有项目分配和渠道覆盖的机器人角色 |
get_events |
读取由编写的本地实时事件提要 discord-ops listen |
工具配置文件
只加载代理需要的工具。对于狭窄的用例,将模式令牌开销减少高达85%。
内置配置文件
| 配置文件 | 工具 | 描述 |
|---|---|---|
full |
72 | 所有工具(默认) |
monitoring |
17 | get_message、get_message、get_replys、get_actions、send_message、send_as、add_reaction、create_thread、send_poll、get_poll_results、leave_note、get_notes、resolve_note,list_sessions、health_check、list_projects、list_bots |
readonly |
13 | 获取消息、获取消息、接收消息、接收操作、接收结果、列表人员、列表论坛帖子、列表频道、列表成员、获取构建、健康检查、列表项目、列表节点 |
moderation |
7 | get_message、kick_member、ban_member、timeout_member,delete_message,purge_message,query_audit.log |
messaging |
10 | 添加_响应、删除_消息、编辑_消息、转发_消息、获取_消息、接收_消息、发送_响应、发送_消息 |
channels |
7 | create_channel、delete_channel、edit_channel、get_channel、list_channels、purge_message、set_slowmode |
webhooks |
6 | create_webhook、delete_webhood、edit_webhoot、execute_webhoog、get_webhook、list_webhooks |
使用配置文件
# Via CLI flag
discord-ops --profile monitoring
# Load specific tools
discord-ops --tools "send_message,send_template,health_check"
# Combined (profile as base + add tools)
discord-ops --profile readonly --tools "send_message"
根据项目配置文件配置
可以在中为每个项目设置配置文件 ~/.discord-ops.json 因此,每个代理只得到它需要的东西:
{
"projects": {
"my-app": {
"guild_id": "123456789012345678",
"channels": { "dev": "CHANNEL_ID", "alerts": "CHANNEL_ID" },
"tool_profile": "monitoring",
"profile_add": ["send_message"],
"profile_remove": ["list_members"]
}
}
}
tool_profile--用于此项目的基本配置文件profile_add--添加基础配置文件中未包含的工具profile_remove--从基础配置文件中删除工具
命令行界面
discord-ops Start MCP server (stdio transport)
discord-ops serve Start MCP server (HTTP/SSE transport)
discord-ops run <tool> --args '{…}' Run any tool directly (no AI/MCP required)
discord-ops init Scaffold a per-project .discord-ops.json
discord-ops setup Interactive setup wizard (single + multi-bot)
discord-ops health Run health check + permission audit
discord-ops validate Validate config without connecting to Discord
discord-ops --profile Load a built-in tool profile (monitoring/readonly/moderation/full)
discord-ops --tools Load specific tools by name (comma-separated)
discord-ops --dry-run Simulate destructive operations
discord-ops --help Show help
discord-ops --version Show version
run --调用任何没有AI代理的工具
这 run 子命令直接从shell执行任何不协调操作工具——没有MCP客户端,没有AI。通过以下方式将所有工具输入作为单个JSON字符串传递 --args.
# Send a plain message
npx discord-ops@latest run send_message \
--args '{"project":"my-app","channel":"general","content":"Deployment complete."}'
# Send a rich release announcement
npx discord-ops@latest run send_template \
--args '{
"project": "my-app",
"channel": "releases",
"template": "release",
"vars": {
"name": "my-app",
"version": "v1.2.0",
"author_name": "My Org",
"highlights": "• New feature A\n• Bug fix B",
"npm": "my-app@latest",
"npm_url": "https://www.npmjs.com/package/my-app",
"link": "https://github.com/my-org/my-app/releases/tag/v1.2.0",
"footer": "Published 2026-04-03"
}
}'
MCP服务器接受的任何工具名称都可以在这里使用-- send_message, send_template, send_embed, list_channels等等。相同的输入模式适用;验证错误与字段路径和退出代码1一起打印。
init --脚手架a按项目配置
这 init 子命令创建 .discord-ops.json 每个项目配置的当前目录中的文件。
discord-ops init --project my-app --guild-id 123456789012345678
# With channels and custom token env var
discord-ops init --project my-app --guild-id 123456789012345678 \
--token-env MY_APP_TOKEN \
--channel builds=987654321098765432 \
--channel releases=111222333444555666
# Overwrite existing and mark as default project
discord-ops init --project my-app --guild-id 123456789012345678 --force --default
旗帜:
| 标志 | 必填 | 说明 |
|---|---|---|
--project <name> |
是 | 项目名称 |
--guild-id <snowflake> |
是 | Discord公会/服务器雪花ID |
--token-env <VAR> |
无 | 机器人令牌的Env-var(默认值: DISCORD_TOKEN) |
--channel <alias>=<id> |
否 | 通道别名映射,可重复 |
--force |
否 | 覆盖现有 .discord-ops.json |
--default |
否 | 将此项目标记为 default_project 在配置中 |
serve 旗帜
这 serve 子命令接受HTTP传输配置的其他标志:
| 标志 | 描述 |
|---|---|
--port <port> |
HTTP端口(默认值:3000) |
--allowed-origin <origin> |
允许的CORS源(默认值: http://localhost) |
--allow-unauthenticated |
无需启动 DISCORD_OPS_HTTP_TOKEN (不安全,显示警告) |
环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
DISCORD_TOKEN |
否* | 默认Discord机器人令牌(*必需,除非所有项目都有 token_env) |
DISCORD_OPS_TOKEN_ENV |
否 | 覆盖哪个env var持有默认令牌(默认值: DISCORD_TOKEN) |
<PROJECT>_TOKEN |
否 | 每个项目的机器人令牌(通过配置 token_env 在项目配置中) |
DISCORD_OPS_CONFIG |
否 | 全局配置文件的路径,或内联JSON字符串(默认值: ~/.discord-ops.json) |
DISCORD_OPS_LOG_LEVEL |
没有 | debug, info, warn, error (默认值: info) |
DISCORD_OPS_DRY_RUN |
否 | 启用干运行模式(任何真实值) |
DRY_RUN |
否 | 启用模拟运行模式(任何真实值,别名) |
DISCORD_OPS_HTTP_TOKEN |
否 | HTTP传输身份验证的承载令牌(强烈建议) |
令牌解析
- 渠道级机器人 --如果频道有
bot覆盖,使用该机器人token_env - 项目级机器人 --如果项目有
bot,使用那个机器人token_env - 项目级别
token_env--项目自己的令牌env-var - 默认令牌 —
DISCORD_TOKEN(或通过定制DISCORD_OPS_TOKEN_ENV)
如果 DISCORD_OPS_TOKEN_ENV 其值命名为持有默认令牌的env-var(例如。, DISCORD_OPS_TOKEN_ENV=MY_BOT_TOKEN 读取 MY_BOT_TOKEN).如果所有项目都有 token_env 或 bot 设置后,不需要默认令牌。
CI/CD集成
使用 discord-ops run 在GitHub Actions(或任何CI)中,在发布、部署或构建后发布丰富的Discord通知——不需要人工智能代理。
CI的配置形状
在CI中,您通常有一个机器人令牌和一个项目。通过以下方式将最小配置作为内联JSON字符串传递 DISCORD_OPS_CONFIG。无需写入文件。
当存储为GitHub机密时,缩小到一行 --多行字符串破解秘密注入。形状(印刷精美,便于阅读):
{
"projects": {
"my-app": {
"guild_id": "123456789012345678",
"channels": {
"releases": "987654321098765432",
"builds": "111222333444555666"
},
"default_channel": "releases"
}
},
"default_project": "my-app"
}
- 不
token_env需要--省略它意味着项目使用DISCORD_TOKEN(默认设置)。 owners和notify_owners_on是可选的——如果你想让所有者对错误进行ping,可以包括它们。- 通道值是Discord雪花ID。频道名称(别名)解析为这些ID。
GitHub操作示例
在仓库中存储两个秘密:
BOOKED_DISCORD_BOT_TOKEN--您的bot令牌DISCORD_OPS_CONFIG--配置JSON 缩小为单行 (多行字符串破解GitHub机密)
{"projects":{"my-app":{"guild_id":"123456789012345678","channels":{"releases":"987654321098765432"},"default_channel":"releases"}},"default_project":"my-app"}
- name: Notify Discord
run: |
npx discord-ops@latest run send_template --args '{
"project": "my-app",
"channel": "releases",
"template": "release",
"vars": {
"name": "my-app",
"version": "${{ steps.version.outputs.version }}",
"author_name": "My Org",
"highlights": "${{ steps.changelog.outputs.highlights }}",
"npm": "my-app@latest",
"npm_url": "https://www.npmjs.com/package/my-app",
"link": "${{ steps.release.outputs.url }}",
"footer": "Published ${{ steps.date.outputs.date }}"
}
}'
env:
DISCORD_TOKEN: ${{ secrets.BOOKED_DISCORD_BOT_TOKEN }}
DISCORD_OPS_CONFIG: ${{ secrets.DISCORD_OPS_CONFIG }}
DISCORD_TOKEN 是默认的令牌变量,不需要额外的配置。您的秘密中的机器人令牌将直接使用。
HTTP传输安全
跑步时 discord-ops serve,默认情况下,HTTP端点未经身份验证,并发出响亮的启动警告。集 DISCORD_OPS_HTTP_TOKEN 要要求承载身份验证,请执行以下操作:
DISCORD_OPS_HTTP_TOKEN=your-secret-token discord-ops serve --port 3000
所有请求必须包括:
Authorization: Bearer your-secret-token
健康终点(GET /health)始终免于身份验证——负载均衡器和Docker健康检查可以在没有令牌的情况下访问它。
令牌比较使用恒定时间比较来防止定时攻击。
干运行模式
启用干式运行以模拟破坏性操作(删除、禁止、踢等),而无需实际调用Discord API:
# Via CLI flag
discord-ops --dry-run
# Via environment variable
DISCORD_OPS_DRY_RUN=1 discord-ops
# Via env alias
DRY_RUN=true discord-ops
在干运行模式下,破坏性工具会返回一个模拟的成功响应,显示会发生什么。
消息模板
23个内置模板,具有尖端的Discord功能。使用 send_template 项目路线。
所有模板的功能:
- 作者品牌 --每个模板都有一个可配置的
author_name+author_icon在顶端 - 链接按钮 --嵌入下面的可点击按钮(查看日志、打开PR、Runbook等)
- 不一致时间戳 --日期通过实时倒计时自动转换为每个用户的时区
- 本地民意调查 --带有进度条和投票跟踪的真实Discord民意调查
- 多嵌入式仪表板 --服务状态板每条消息最多可嵌入10个
- 页脚图标 --页脚文本旁边的状态指示器图标(绿色/红色)
- 可点击的标题 --嵌入标题直接链接到URL
- 语法突出显示的代码 --带有特定语言高亮显示的代码示例
- 进度条 --可视化Unicode块进度指示器
DevOps模板(11)
| 模板 | 说明 | 主要功能 |
|---|---|---|
release |
带有安装+链接按钮的版本发布 | 作者、链接按钮、可点击标题 |
deploy |
使用日志按钮部署成功/失败 | 页脚图标、视图/日志按钮 |
ci_build |
CI结果,带构建链接按钮 | 页脚图标,可点击标题 |
incident |
带有严重性颜色的事件警报 | 不一致时间戳、状态页面按钮 |
incident_resolved |
使用验尸按钮解决问题 | 时间戳不一致,验尸链接 |
maintenance |
实时时区倒计时维护 | 不一致时间戳、倒计时、状态按钮 |
status_update |
服务状态(运行/降级/停机) | 页脚图标、仪表板按钮 |
review |
带有差异统计和PR按钮的PR审核 | 可点击的标题、添加/删除 |
dashboard |
多嵌入服务状态板(最多9 svc) | 多嵌入,每种服务颜色卡 |
oncall |
带轮班时间戳的随叫随到切换 | Discord时间戳,runbook按钮 |
alert |
可配置的警报(信息/警告/错误/严重) | 基于级别的颜色、度量阈值 |
团队和社区模板(12)
| 模板 | 说明 | 主要功能 |
|---|---|---|
celebration |
用图片庆祝胜利 | 作者、缩略图、图片 |
welcome |
使用入职按钮欢迎会员 | 不一致时间戳、手册/入职链接 |
shoutout |
使用头像缩略图识别作品 | 缩略图、提名归因 |
quote |
阻止引用励志文本 | 阻止引用格式,作者头像 |
announcement |
带有截止日期倒计时的公告 | 不一致时间戳、倒计时、链接按钮 |
changelog |
变更日志有7个部分类型 | 弃用、性能、安全部分 |
milestone |
目标日期倒计时里程碑 | 不一致时间戳,进度跟踪 |
tip |
带有语法高亮代码的专业提示 | 特定语言的代码块,doc按钮 |
poll |
带有投票跟踪的Native Discord民意测验 | Native poll API,多选,持续时间 |
progress |
带有截止日期的视觉进度条 | Unicode进度条,倒计时 |
standup |
每日站立总结 | 昨天/今天/阻断器部分 |
retro |
Sprint回顾 | 进展顺利/改进/行动、速度 |
例子
发布公告:
send_template({
template: "release",
vars: {
version: "v0.23.0",
name: "discord-ops",
highlights: "• Owner pings\n• Smart channel resolution\n• Category channel editing",
npm: "npm install discord-ops@0.23.0",
npm_url: "https://www.npmjs.com/package/discord-ops/v/0.23.0",
link: "https://github.com/bookedsolidtech/discord-ops/pull/20",
footer: "Released April 3, 2026",
author_name: "Booked Solid Technology"
},
project: "my-app",
channel: "releases"
})
本地Discord民意调查:
send_template({
template: "poll",
vars: {
question: "Best language for MCP servers?",
options: "TypeScript|Rust|Go|Python",
duration: "48",
multiselect: "true"
},
project: "my-app",
channel: "dev"
})
多嵌入式状态仪表板:
send_template({
template: "dashboard",
vars: {
services: "API|Database|CDN|Auth|Queue",
statuses: "operational|operational|degraded|operational|outage",
title: "Production Status",
url: "https://status.example.com"
},
project: "my-app",
channel: "alerts"
})
随叫随到切换:
send_template({
template: "oncall",
vars: {
outgoing: "alice",
incoming: "bob",
shift_start: "2026-04-04T09:00:00Z",
notes: "Payment service latency elevated — watch grafana/d/payments",
active_incidents: "INC-342: elevated error rate on /checkout",
runbook_url: "https://wiki.example.com/oncall",
mention: "<@BOB_USER_ID>"
},
project: "my-app",
channel: "team-chat"
})
所有模板都支持项目路由(project, channel, notification_type, channel_id)以及作者品牌(author_name, author_icon).
高级配置参考
满的 ~/.discord-ops.json 具有所有选项的架构:
{
"bots": {
"my-bot": {
"name": "My Bot",
"role": "General purpose",
"description": "Handles all operations",
"token_env": "MY_BOT_TOKEN",
"default_profile": "full",
"profile_add": [],
"profile_remove": []
}
},
"projects": {
"my-app": {
"guild_id": "123456789012345678",
"token_env": "MY_APP_DISCORD_TOKEN",
"bot": "my-bot",
"channels": {
"dev": "CHANNEL_ID",
"builds": "CHANNEL_ID",
"releases": "CHANNEL_ID",
"alerts": "CHANNEL_ID",
"support": { "id": "CHANNEL_ID", "bot": "my-bot" }
},
"default_channel": "dev",
"owners": ["USER_SNOWFLAKE_ID"],
"notify_owners_on": ["release", "error", "alert"],
"tool_profile": "full",
"profile_add": [],
"profile_remove": []
}
},
"default_project": "my-app",
"notification_routing": {
"ci_build": "builds",
"deploy": "builds",
"release": "releases",
"error": "alerts",
"dev": "dev"
}
}
全局字段:
| 字段 | 描述 |
|---|---|
bots |
命名机器人角色 name, role, description, token_env, default_profile, profile_add, profile_remove |
default_project |
未使用时使用的项目 project 提供了参数 |
notification_routing |
全局通知类型→ 通道别名路由 |
项目领域:
| 字段 | 描述 |
|---|---|
guild_id |
Discord服务器(公会)雪花ID |
token_env |
此项目bot令牌的Env-var名称 |
bot |
此项目的默认机器人角色(引用 bots) |
channels |
别名→ 通道ID或 { id, bot } 地图; channel: "builds" 先在这里解决 |
default_channel |
未使用时使用的频道 channel 提供了参数 |
owners |
在匹配通知类型时要提及的用户雪花ID |
notify_owners_on |
触发所有者ping的通知类型("dev" 从不ping) |
tool_profile |
此项目的基础工具配置文件(full, monitoring等等)——在运行时强制执行 |
profile_add |
在基础轮廓顶部加载其他工具 |
profile_remove |
从基础配置文件中排除的工具 |
notification_routing |
仅限每回购配置(.discord-ops.json),不是全局配置中的项目字段 |
每个项目的配置文件在运行时强制执行——所有工具都在MCP服务器上注册,但当解析的项目或机器人设置了配置文件时,工具调用会被过滤。这意味着代理可以通过MCP模式发现所有工具,但每个项目的限制都适用于每次调用。
多组织故障排除
正在验证您的配置
跑 discord-ops validate 在不连接到Discord的情况下检查您的配置。它检测到:
- 缺失
token_env值(未设置环境变量) - Bot引用(
project.bot,频道bot)指向未定义的机器人 - 无效
default_profile或tool_profile价值观 - 丢失的机器人
token_env环境变量 - 使用不同代币的项目之间存在重复的公会ID
default_channel引用一个不存在的别名default_project指向一个不存在的项目- 通知路由到不存在的通道别名
常见问题
“项目X没有可用令牌” 该项目需要一个令牌。要么:
- 设置其
token_envenv变量(例如。,export ORG_A_TOKEN=...) - 通过设置默认令牌
DISCORD_TOKEN - 使用
DISCORD_OPS_TOKEN_ENV指向自定义环境变量
机器人无法访问公会
如果项目使用 token_env 对于另一个机器人,必须邀请该机器人加入项目的公会。跑 discord-ops health 查看每个机器人可以访问哪些公会。
从单机器人迁移到多机器人
- 加
token_env需要自己的机器人的项目 - 设置相应的环境变量
- 跑
discord-ops validate验证 - 跑
discord-ops health测试连接
代币轮换
更新env-var值并重新启动MCP服务器。无需更改配置-- token_env 在运行时从环境中读取。
频道未找到
通道解析按顺序尝试4层:精确别名→ 模糊别名→ 实时Discord名称查找→ 错误。如果仍然找不到频道,请验证机器人是否可以访问该频道,并 list_channels 返回它。
发展
git clone https://github.com/bookedsolidtech/discord-ops.git
cd discord-ops
npm install
npm run build
npm test
# Local CI
./scripts/act-ci.sh --local
许可证
麻省理工学院