Discord多服务器管理工具

Discord-ops是一款专业的Discord多服务器项目管理工具,提供消息路由、机器人管理、团队协作等功能,适用于多团队协作和技术运营场景。

  • by bookedsolidtech
  • TypeScript
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 bookedsolidtech/discord-ops

使用说明

不和行动

具有多公会项目路由的代理级Discord MCP服务器。

特性

  • 72个MCP工具 --消息传递、人物角色、民意调查、论坛、笔记、频道、审核、角色、webhooks、botops、审计日志、线程、公会、邀请、权限、搜索、23个模板、OG嵌入展开、项目内省
  • 项目说明板 --每个项目都有一份耐用的、有针对性的笔记日志;代理离开切换并在启动时读取它们,意识到其他并发会话
  • Webhook人物角色 --一个机器人,通过每条消息的用户名/头像覆盖无限制地发布身份;永远不要创建另一个bot应用程序
  • 本地民意调查 --结构化代理/人类共识,具有每个答案的投票人读取和机器人标记
  • 论坛工作队列 --将帖子作为任务,将标签作为状态标签,将存档关闭
  • 实时事件馈送 --可选 discord-ops listen sidecar将消息/反应流式传输到由以下人员读取的本地接收器 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_env
  • project.bot --项目的默认bot(除非被覆盖,否则所有渠道都使用此bot)
  • 频道 bot 以(权力)否决 --各个渠道可以使用不同的机器人: { "id": "...", "bot": "claire" }
  • default_profile --每个机器人工具配置文件(限制机器人在运行时可以使用哪些工具)
  • profile_add --在机器人之上加载其他工具 default_profile
  • profile_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。分辨率分为四层:

  1. 完全匹配别名 — "builds" 点击 builds 项目配置中的别名
  2. 模糊别名匹配 — "build" 或 "blds" 解析为最接近的别名
  3. Live Discord API查找 — "general" 即使没有配置别名也能解析
  4. 错误 --如果以上都没有找到匹配项

这意味着你可以通过 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传输身份验证的承载令牌(强烈建议)

令牌解析

  1. 渠道级机器人 --如果频道有 bot 覆盖,使用该机器人 token_env
  2. 项目级机器人 --如果项目有 bot,使用那个机器人 token_env
  3. 项目级别 token_env --项目自己的令牌env-var
  4. 默认令牌 — 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_env env变量(例如。, export ORG_A_TOKEN=...)
  • 通过设置默认令牌 DISCORD_TOKEN
  • 使用 DISCORD_OPS_TOKEN_ENV 指向自定义环境变量

机器人无法访问公会 如果项目使用 token_env 对于另一个机器人,必须邀请该机器人加入项目的公会。跑 discord-ops health 查看每个机器人可以访问哪些公会。

从单机器人迁移到多机器人

  1. 加 token_env 需要自己的机器人的项目
  2. 设置相应的环境变量
  3. 跑 discord-ops validate 验证
  4. 跑 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

许可证

麻省理工学院