Discord REST API工具服务器

一个Rust实现的MCP服务器,将整个Discord REST API动态生成为工具,支持通过MCP客户端与Discord交互。

  • by craigeous
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 Craigeous/discord-mcp-rs

使用说明

不和谐mcp rs

铁锈 主控程序 暴露的服务器 整个Discord REST API 作为工具。连接任何MCP客户端(Claude Code、Claude Desktop等)以与Discord交互——服务器、通道、消息、成员、角色、Webhook、应用程序等——范围取决于你的机器人令牌能做什么。

这些工具是 由Discord官方动态生成 OpenAPI 3.1规范,因此覆盖率跟踪真实的API,而不是手动维护的子集。

运作原理

在启动时,服务器解析Discord的OpenAPI规范(嵌入在二进制文件中)并 将每个操作整合到一个MCP工具中:

  • 工具名称=操作的 operationId (例如。 create_message, get_guild, ban_user_from_guild).
  • 路径和查询参数 是顶级工具参数(例如。 channel_id, limit).
  • JSON请求体 单身去 body argument(一个与Discord模式匹配的JSON对象,内联到每个工具的输入模式中)。
  • 文件上传 拿 本地文件系统路径 --单身 file 字符串,或a files array——服务器读取并发送为 multipart/form-data.
  • 每次呼叫都会发送到Discord Authorization: Bot <token>; HTTP 429 使用以下命令自动重试响应 Retry-After.

每个工具都将原始Discord响应返回为:

{ "status": 200, "ok": true, "body": { /* Discord's JSON, or null for 204 */ } }

Discord API错误(400/401/403/404/…)作为工具结果返回,带有 "ok": false (不是MCP协议错误),因此模型可以读取错误并进行调整。

特性

  • 242工具 --全面报道Discord v10 REST API
  • 根据Discord的官方OpenAPI规范生成(没有手写包装)
  • 每个工具都有丰富、自包含的JSON模式(请求体类型内联在 $defs)
  • 按本地路径上传文件(附件、头像、贴纸/音板资产)
  • 自动速率限制(429)重试
  • stdio传输——适用于任何MCP客户端
  • 单个自包含二进制文件;规范在构建时嵌入

覆盖

按资源区域列出的所有242个Discord v10操作(103个GET、43个POST、39个DELETE、33个PATCH、24个PUT):

区域 工具 示例
公会 91 公会CRUD、成员、角色、禁令、公会频道、表情符号、贴纸、预定事件、自动审核、模板、小部件、欢迎屏幕、集成、修剪、虚荣URL
频道和消息 48 频道、消息、反应、线程、pin、权限覆盖、频道邀请、轮询、键入
应用程序 33 全局和公会应用程序(斜线)命令、权限、应用程序表情符号、角色连接元数据、活动实例、附件上传
Webhooks和交互 15 webhook CRUD,执行webhook,交互响应和跟进
大厅 15 游戏SDK大厅管理
用户 12 当前用户、用户查找、DM、连接、公会会员
邀请 5 获取/删除邀请
合作伙伴/嵌入式应用SDK 5 合作伙伴SDK端点
OAuth2 4 授权信息、令牌自检*
阶段实例 4 创建/获取/更新/删除
杂项 6 网关、SKU、贴纸包、独立贴纸、语音区域、默认音板声音

*OAuth2/合作伙伴SDK/需要 用户(持有者)令牌 不适用于bot令牌--请参阅 局限性.

要查看确切的工具列表,请使用MCP客户端的工具列表或在中运行握手 发现工具.

先决条件

环境变量

变量 必填 描述
DISCORD_TOKEN 是 机器人令牌,发送方式为 Authorization: Bot <token>.
DISCORD_OPENAPI_PREVIEW 否 如果属实(1/true/yes/on),使用嵌入式 预览 spec(不稳定/实验性特征)而不是稳定特征。
DISCORD_OPENAPI_SPEC 否 要加载的外部OpenAPI JSON文件的路径,而不是嵌入式规范(覆盖预览标志)。允许您在不重建的情况下交换更新的规范。

没有 DISCORD_APPLICATION_ID 变量。需要应用程序ID的工具需要 application_id 论证;从那里得到它 get_my_application,或使用接受的路由 @me 别名。

设置

1.创建Discord机器人

  1. 去 Discord开发者门户 并创建应用程序。
  2. 打开 Bot → 重置令牌 并复制令牌。
  3. 下 特权网关意图,启用 服务器成员意图 如果你需要列出公会成员(list_guild_members).
  4. 下 OAuth2→ URL生成器,选择 bot 然后使用生成的URL将机器人邀请到您的服务器。

2.安装

选项A——下载预构建的二进制文件(推荐)

从获取适用于您平台的最新二进制文件 发布:

平台 二进制
macOS(苹果硅) discord-mcp-rs-aarch64-apple-darwin
macOS(英特尔) discord-mcp-rs-x86_64-apple-darwin
Linux(x86_64) discord-mcp-rs-x86_64-unknown-linux-gnu
Linux(arm64) discord-mcp-rs-aarch64-unknown-linux-gnu
Windows(x86_64) discord-mcp-rs-x86_64-pc-windows-msvc.exe
# Example: macOS Apple Silicon
curl -L -o discord-mcp-rs \
  https://github.com/Craigeous/discord-mcp-rs/releases/latest/download/discord-mcp-rs-aarch64-apple-darwin
chmod +x discord-mcp-rs

选项B——从源代码构建

需要最近的稳定 锈 工具链(1.94+;板条箱使用2024版)。

git clone https://github.com/Craigeous/discord-mcp-rs.git
cd discord-mcp-rs
cargo build --release

二进制文件被写入 target/release/discord-mcp-rs.

3.配置您的MCP客户端

替换 /path/to/discord-mcp-rs 使用二进制文件的实际路径。

Claude 代码

使用CLI:

claude mcp add discord --env DISCORD_TOKEN=YOUR_TOKEN_HERE -- /path/to/discord-mcp-rs

或者将其添加到您的Claude Code MCP设置中(~/.claude/settings.json 或一个项目 .claude/settings.json):

{
  "mcpServers": {
    "discord": {
      "command": "/path/to/discord-mcp-rs",
      "env": { "DISCORD_TOKEN": "YOUR_TOKEN_HERE" }
    }
  }
}

克劳德桌面版

添加到您的Claude桌面配置(~/Library/Application Support/Claude/claude_desktop_config.json 在macOS上):

{
  "mcpServers": {
    "discord": {
      "command": "/path/to/discord-mcp-rs",
      "env": { "DISCORD_TOKEN": "YOUR_TOKEN_HERE" }
    }
  }
}

要使用预览规范,请添加 "DISCORD_OPENAPI_PREVIEW": "1" 到 env 块。

4.验证

询问您的MCP客户:

“机器人在哪个Discord服务器上?”

它应该呼叫 get_my_user 和 list_my_guilds 并返回机器人的信息和服务器列表。

用法

工具与Discord API一一对应。几个工作示例:

  • 列出公会的频道 — list_guild_channels 与 { "guild_id": "..." }
  • 发送消息 — create_message 与 { "channel_id": "...", "body": { "content": "Hello!" } }
  • 发送带有附件的消息 — create_message 与 { "channel_id": "...", "body": { "content": "See attached" }, "files": ["/abs/path/image.png"] }
  • 禁止会员 — ban_user_from_guild 与 { "guild_id": "...", "user_id": "...", "body": { "delete_message_seconds": 0 } }
  • 编辑机器人的个人资料 — update_my_user 与 { "body": { "username": "New Name" } }

提示

  • 雪花ID是字符串 --传递ID,如 "1234567890123456789".
  • 请求尸体进入 body --形状由每个工具的输入模式(Discord自己的字段名)描述。
  • 文件上传是本地路径 --服务器读取文件本身;尽可能通过绝对路径。
  • 权限和意图很重要 --如果机器人缺乏权限(或所需的特权意图),该工具将返回Discord错误 "ok": false阅读并调整。
  • 应用程序范围的工具 --通行证 application_id (从 get_my_application)如有需要。

发现工具

要在stdio上转储完整的工具列表,请执行以下操作:

printf '%s\n' \
  '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}' \
  '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
  '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
  | DISCORD_TOKEN="YOUR_TOKEN" ./target/release/discord-mcp-rs 2>/dev/null \
  | tail -1 | python3 -c 'import sys,json; print("\n".join(sorted(t["name"] for t in json.load(sys.stdin)["result"]["tools"])))'

局限性

  • 仅限Bot令牌身份验证。 每个请求都与 Authorization: Bot <token>.需要OAuth2的端点 用户/持有者 令牌(部分 oauth2, partner-sdk,以及 lobbies)将使用bot令牌失败。
  • 没有审核日志原因标头。 Discord的 X-Audit-Log-Reason header未公开(规范模型没有header参数)。
  • 预览规范不稳定。 DISCORD_OPENAPI_PREVIEW 暴露Discord可能会更改或删除的实验操作,恕不另行通知。
  • 该规范是Discord的公开预览版,可能与 文档 在某些地方;当他们意见不一致时,请遵循文件。

更新Discord API覆盖范围

保险范围完全来自供应商的规格 spec/ --没有手写的工具可以触摸。要更新,请执行以下操作:

  1. 转售商 spec/openapi.json 和 spec/openapi_preview.json 来自 不和谐/不和谐api规范 (将上游承诺记录在 spec/SOURCE.txt).
  2. 重建。新的/更改的操作会自动成为工具。

将规格更改推送到 main 触发发布工作流。

发展

cargo test        # spec parsing + schema generation sanity checks (offline)
cargo clippy      # lints
cargo build --release

项目布局:

  • spec/ --供应商提供的Discord OpenAPI规范(通过嵌入 include_str!)
  • src/openapi.rs --spec解析器:构建工具注册表和每个工具的JSON模式
  • src/server.rs — rmcp::ServerHandler 实施: list_tools / call_tool 派遣
  • src/main.rs --入口点、stderr日志记录、stdio传输

调试记录

RUST_LOG=debug DISCORD_TOKEN="YOUR_TOKEN" cargo run

日志会转到stderr,这样它们就不会干扰stdout上的MCP stdio传输。

许可证

麻省理工学院