使用说明
断开MCP服务器
模型上下文协议(MCP)服务器,使AI代理能够使用Discord REST API v9与Discord交互。该服务器采用Dedalus MCP框架构建,提供用于发送消息、读取频道历史、管理服务器等的工具。所有API调用都使用Dedalus MCP ctx.dispatch 自动身份验证处理机制。
先决条件
- Python 3.10或更高版本
- Discord应用程序和机器人令牌
- 对Discord机器人设置的基本了解
Discord Bot设置
在使用此MCP服务器之前,您需要创建一个Discord应用程序并配置一个机器人。请参阅官方的Discord Developer文档:
快速设置步骤
-
创建Discord应用程序
- 去 Discord开发者门户
- 点击“新建应用程序”并为其命名
- 导航到 机器人 标签
-
创建和配置您的Bot
- 点击“添加机器人”或“重置令牌”以生成机器人令牌
- 安全地保存您的机器人令牌 -你需要它
.env文件
-
启用特权网关意图 ⚠️ 重要
在 机器人 选项卡,在“特权网关意图”下,您 必须 启用以下意图:
- ✅ 存在意图 -接收状态更新事件所需
- ✅ 服务器成员意图 -接收GUILD_MEMBERS事件所需
- ✅ 消息内容意图 -在大多数消息中接收消息内容所必需的
注: 一旦你的机器人达到100台或更多服务器,这些意图将需要Discord的验证和批准。
-
配置授权流 (可选)
- 公共机器人:如果您希望其他人能够将您的机器人添加到他们的服务器上,请启用
- 需要OAuth2代码授权:如果您的应用程序需要多个作用域,请启用
-
邀请您的机器人到服务器
- 首选 OAuth2>URL生成器
- 选择
bot范围 - 重要:选择以下权限:
- ✅ 查看频道 -需要
list_channels工具 - ✅ 发送消息 -需要
send_message工具 - ✅ 读取消息历史记录 -需要
read_messages工具 - ✅ 管理邮件 -需要
delete_message工具 - ✅ 添加反应 -需要
add_reaction工具
- ✅ 查看频道 -需要
- 复制生成的URL并邀请机器人到您的服务器
- 备注:工具描述中提到了OAuth2作用域,如
guilds.channels.read,但对于bot令牌,这些是通过bot权限处理的。确保机器人具有上面列出的所需权限。
安装
-
克隆存储库:
git clone <repository-url> cd discord-mcp -
安装依赖项 (可编辑安装,模式与 mcp模板 API重点项目):
pip install -e .或者:
uv pip install -e . -
环境变量
cp .env.example .env集
DISCORD_TOKEN用于本地运行和测试。在Dedalus上,秘密名称必须匹配SecretKeys(token="DISCORD_TOKEN")在src/main.py。参见.env.example对于可选的Dedalus URL和PORT/HOST.
运行服务器
启动MCP服务器:
python -m src.main
或者控制台脚本: discord-mcp
服务器正在监听 PORT (默认值 8080)以及 HOST (默认值 0.0.0.0).
可用工具
Discord MCP服务器提供以下工具:
send_message-向Discord频道发送消息。长度超过2000个字符的消息会自动拆分为多条消息。read_messages-从频道读取最近的消息(需要messages.read范围)。返回一个字典count,messages(消息字典列表),可选error现场。list_servers-列出机器人所在的所有Discord服务器。返回服务器字典列表id,name,icon,owner,以及permissions.get_server_info-获取有关Discord服务器的详细信息。返回一个包含服务器详细信息的字典,包括id,name,description,member_count,features等等。list_channels-列出服务器中的所有频道(需要guilds.channels.read范围)。返回一个字典count,channels(频道字典列表),可选error现场。add_reaction-在消息中添加反应表情符号delete_message-从频道中删除消息get_user_info-获取有关Discord用户的信息。返回一个包含用户详细信息的字典,包括id,username,discriminator,global_name,bot,以及avatar_url.list_members-列出服务器中的成员(需要guilds.members.read范围)。返回一个字典count,members(成员字典列表),可选error现场。discord_smoke-烟雾测试工具,通过调用验证Discord身份验证/users/@me.退货success,error,以及body领域。
响应格式
所有工具都返回扁平的JSON可序列化字典(没有嵌套的Pydantic模型),以确保与托管的MCP服务器的兼容性。可能失败的读取操作包括可选操作 error 响应中的字段用于优雅的错误处理。
配置
环境变量
| 变量 | 描述 | 必填 | 来源 |
|---|---|---|---|
DISCORD_TOKEN |
您的Discord机器人令牌 | 是 | 通过连接机制从Dedalus作为秘密传递 |
PORT |
MCP服务器的端口(默认:8080) | 否 | 本地 .env 文件或环境 |
DEDALUS_AS_URL |
授权服务器URL(默认值:https://as.dedaluslabs.ai) | 否 | 环境变量 |
重要:
DISCORD_TOKEN在部署到托管的MCP服务器时,必须作为机密从Dedalus传递。- Connection定义需要具有确切名称的密钥:
DISCORD_TOKEN. - 身份验证通过Dedalus MCP自动处理
ctx.dispatch机制-令牌由框架根据Connection定义注入。 - 连接名称为
"discord"并使用auth_header_format="Bot {api_key}"用于Discord API身份验证。
频道权限
确保你的机器人在你想使用它的频道中拥有必要的权限:
- 查看频道 -需要查看频道
- 发送消息 -需要发送消息
- 读取消息历史记录 -需要阅读消息
- 管理邮件 -需要删除邮件
- 添加反应 -需要添加反应
特性
自动消息分块
这 send_message 该工具通过将长消息拆分为多条消息来自动处理Discord的2000个字符限制。这在发送长篇议程或格式化内容时特别有用。
- 如果可能的话,消息会在行边界上拆分
- 如果需要,很长的线很难分开
- 每个块都作为单独的消息发送
- 该工具返回最后发送的消息的ID
平面JSON模式
所有工具都返回扁平的JSON可序列化字典,以确保与托管的MCP服务器的兼容性,并避免模式验证问题。这意味着:
- 响应中没有嵌套的Pydantic模型
- 所有值都是JSON基元(str、int、bool、list、dict)
- 可选字段被省略,而不是设置为null
- 错误信息包含在可选的
error领域
Dedalus MCP集成
此服务器使用Dedalus MCP框架,并遵循推荐的模式:
- 基于连接的身份验证:用途
Connection定义与name="discord"和auth_header_format="Bot {api_key}" - 基于调度的API调用:所有Discord API调用都使用
ctx.dispatch("discord", HttpRequest(...))而不是直接的HTTP库 - 自动代币注入:框架自动从Connection定义中注入令牌
- 服务器配置:
authorization_server,streamable_http_stateless=True,以及http_security=TransportSecuritySettings(enable_dns_rebinding_protection=False)(与Dedalus MCP API密钥模板一致) - 模块级工具集合:在模块级别收集工具,以确保在部署验证期间服务器准备就绪
增强的错误处理
- 带有特定Discord错误代码的详细错误消息
- 用于调试的完整错误响应日志记录
- 读取操作中的优雅错误处理(响应中返回的错误,未引发)
- 常见错误的具体处理(400、401、403、404、429)
测试
1.连接+令牌(无服务器) -与mcp-template API密钥相同的模式 client.py:
python -m src.client --test-connection
需要 DISCORD_TOKEN 在环境中(例如来自 .env).呼叫Discord GET /users/@me 通过 ConnectionTester.
2.运行服务器+MCP客户端
python -m src.main # terminal 1
python -m src.client # terminal 2 (default URL `http://127.0.0.1:8080/mcp`)
3.可选:烟雾脚本 — python scripts/test_deploy.py 启动服务器,探测 /mcp,并运行客户端。
您还可以从Python调用工具函数(用于即席调试):
import asyncio
from src.tools import send_message, read_messages, list_channels
# Test sending a message
asyncio.run(send_message("channel_id", "Hello, Discord!"))
# Test reading messages
asyncio.run(read_messages("channel_id", limit=10))
# Test listing channels
asyncio.run(list_channels("server_id"))
项目结构
discord-mcp/
├── src/
│ ├── main.py # MCPServer, Connection (API key / bot token), tool collection
│ ├── tools.py # @tool definitions
│ ├── discord_api.py # Discord REST v9 via ctx.dispatch("discord", ...)
│ └── client.py # --test-connection and MCPClient smoke tests
├── scripts/
│ └── test_deploy.py # Optional local deploy smoke (server + /mcp + client)
├── .env.example # Copy to .env for local dev
├── pyproject.toml # Dependencies and hatchling package layout
├── API_V9.md
├── AUTHENTICATION.md
└── README.md
关键文件
src/main.py:定义MCPServer,Connection(name=“discord”),并在模块级别收集所有工具src/tools.py:包含所有用以下装饰的Discord交互工具@toolsrc/discord_api.py:使用的低级Discord API函数ctx.dispatch("discord", ...)用于经过身份验证的请求
故障排除
常见问题
-
403禁止/丢失访问(特别是
list_channels)- 用于托管MCP服务器:确保机器人令牌在被邀请到服务器时具有所需的权限
- 检查机器人角色在服务器中是否具有“查看频道”权限
- 转到服务器设置>角色>[您的机器人角色],验证是否启用了“查看频道”
- 如果机器人在没有适当权限的情况下被邀请,请使用所有必需的权限重新邀请它(请参阅Discord bot Setup中的步骤5)
- 适用于dedaluslabs.ai上的托管服务器:验证
DISCORD_TOKEN在服务器的环境变量中正确配置 - 错误响应将包括有关缺少哪些权限的详细信息
-
401未经授权
- 验证
DISCORD_TOKEN正确且未过期 - 检查您的令牌周围是否没有多余的空格或引号
.env文件 - 对于托管的MCP服务器,确保令牌通过连接/秘密值机制正确传递
- 如果需要,在Discord开发者门户中重新生成令牌
- 验证
-
消息太长(400/表单正文无效)
- Discord每条消息的长度限制为2000个字符
- 这
send_message该工具会自动将长度超过2000个字符的消息拆分为多条消息 - 如果您仍然看到此错误,请查看错误消息以了解错误的详细信息
- 错误响应现在包括完整的验证详细信息,以便于调试
-
读取托管MCP服务器中的工具返回错误字段
- 所有阅读工具(
list_channels,read_messages,list_members等)可以返回error响应中的字段 - 这通常表示权限问题(403)或身份验证问题(401)
- 检查
error响应字典中的字段以获取具体详细信息 - 验证机器人在目标服务器中是否具有所需的权限
- 确保bot令牌有效,并在托管环境中正确配置
- 代理商应检查
error在响应中输入字段,并优雅地处理错误
- 所有阅读工具(
-
SSL证书错误
- 服务器使用Dedalus MCP的调度机制,自动处理SSL
- 不需要额外的SSL配置
-
意图不起作用
- 确保您已在Discord开发人员门户中启用了所需的特权网关意图
- 启用意图后重新启动机器人
-
速率限制(429)
- 如果您发送的消息太多太快,Discord可能会限制请求的速率
- 错误消息将包括重试定时信息
- 在处理429错误时,在代理中实现退避逻辑
托管MCP服务器问题
在托管平台(例如dedaluslats.ai)上使用此MCP服务器时:
-
凭据配置
DISCORD_TOKEN必须通过连接机制作为秘密从Dedalus传递- 中的连接定义
main.py需要带名称的秘密"DISCORD_TOKEN" - 身份验证通过以下方式自动处理
ctx.dispatch-无需手动访问令牌 - 验证令牌是否过期或无效
- 使用
discord_smoke测试身份验证的工具
-
权限错误
- 托管服务器使用相同的机器人令牌,因此在邀请机器人时必须授予权限
- 如果
list_channels403失败,机器人需要服务器中的“查看频道”权限 - 如果需要,以适当的权限重新邀请机器人
-
错误可见性
- 所有读取工具在
error他们回应的领域 - 代理商应检查
response.get("error")查看详细的错误消息 - 错误消息包括如何修复权限问题的具体指导
- 记录完整的错误响应以进行调试(有关详细信息,请查看服务器日志)
- 所有读取工具在
-
消息分块
- 长消息(>2000个字符)会自动拆分为多条消息
- 每个块都作为单独的消息发送
- 该工具返回最后发送的消息的ID
- 这可以防止400个消息长度违规错误
API文档
此服务器使用Discord REST API版本9。有关API的详细文档,请参阅:
- Discord API参考 -完整的API参考
- Discord API v9文档 -API v9特定文档
- 身份验证指南 -身份验证设置指南
许可证
MIT许可证-请参阅 许可证 详细信息文件
贡献
欢迎投稿!请随时提交拉取请求。
支持
关于以下问题:
- 不和谐API:请参阅 Discord开发者文档
- 本项目:在存储库上打开一个问题
重要提示: 别忘了启用 特权网关意图 如Discord开发者门户所示,在您的Discord机器人设置中设置(存在意图、服务器成员意图和消息内容意图)!
