使用说明
使用承载令牌身份验证对MCP服务器进行Discord
一个安全的Discord MCP(模型上下文协议)服务器,为Discord集成工具提供JWT承载令牌身份验证。
🔐 安全功能
- 承载令牌身份验证 使用JWT令牌
- Discord令牌保护 -令牌嵌入在JWT声明中,不作为参数传递
- 审核日志记录 -所有工具调用都会记录用户信息
- 临时机器人连接 -没有持久的Discord机器人实例
- RSA密钥对加密 用于令牌签名和验证
📋 可用工具
| 工具 | 说明 |
|---|---|
send_message |
向Discord频道发送消息 |
get_messages |
从频道获取最近的消息 |
get_channel_info |
获取频道元数据和信息 |
search_messages |
搜索包含关键字的邮件 |
moderate_content |
从频道中删除特定消息 |
🚀 设置和安装
先决条件
- Python 3.8+
- 使用适当权限对机器人令牌进行Discord
- 虚拟环境(推荐)
安装
-
安装依赖项 (已安装在您的venv中):
pip install discord.py fastapi fastmcp uvicorn python-dotenv PyJWT -
创建Discord机器人 并获取您的bot令牌:
- 首选 Discord开发者门户
- 创建新的应用程序和机器人
- 复制机器人令牌
- 以必要的权限邀请机器人到您的服务器
-
设置环境变量 (可选):
# Create .env file echo "DISCORD_TOKEN=your_discord_bot_token_here" > .env
🏃♂️ 运行服务器
启动服务器
python app.py
服务器将于启动 http://localhost:8000 并显示:
- 可用工具
- 认证信息
- 令牌生成说明
生成访问令牌
替换 YOUR_DISCORD_TOKEN 使用您的实际Discord机器人令牌:
python -c "from app import generate_access_token; print(generate_access_token('YOUR_DISCORD_TOKEN'))"
🔧 使用服务器
认证
所有请求都必须在Authorization标头中包含JWT Bearer令牌:
Authorization: Bearer <your_jwt_token>
进行工具调用
端点: POST /mcp/v1/tools/invoke
标头:
Authorization: Bearer <your_jwt_token>
Content-Type: application/json
请求格式:
{
"method": "tool_name",
"params": {
"parameter1": "value1",
"parameter2": "value2"
}
}
例子
获取频道信息
curl -X POST http://localhost:8000/mcp/v1/tools/invoke \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"method": "get_channel_info",
"params": {
"channel_id": "1234567890123456789"
}
}'
发送信息
curl -X POST http://localhost:8000/mcp/v1/tools/invoke \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"method": "send_message",
"params": {
"channel_id": "1234567890123456789",
"message": "Hello from MCP server!"
}
}'
搜索邮件
curl -X POST http://localhost:8000/mcp/v1/tools/invoke \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"method": "search_messages",
"params": {
"channel_id": "1234567890123456789",
"query": "hello",
"limit": 10
}
}'
🧪 测试
使用提供的测试脚本验证您的设置:
# Update YOUR_DISCORD_TOKEN in test_server.py first
python test_server.py
📊 监控和日志
- 审计日志 写信给
audit.log - 服务器日志 显示在控制台中
- 每次工具调用都会记录用户ID、参数和成功/失败状态
🏗️ 建筑
身份验证流程
- 令牌生成:JWT声明中嵌入了Discord令牌
- 请求身份验证:JWT使用RSA公钥进行验证
- 令牌提取:从已验证的JWT中提取Discord令牌
- 工具执行:已创建临时Discord机器人连接
- 清理:操作后Bot连接已正确关闭
证券收益
- 无代币风险:不一致标记从不出现在请求参数中
- 集中式身份验证:所有工具的单一身份验证点
- 审计跟踪:完整记录所有经过身份验证的操作
- 临时连接:没有持久的机器人实例减少攻击面
🔒 安全考虑
开发vs生产
- 发展:使用生成的RSA密钥对(当前设置)
- 生产:应使用外部OAuth 2.1提供程序或IdP
令牌安全
- JWT令牌过期 1小时后(可配置)
- Discord代币 嵌入在JWT声明中,在请求中不可见
- RSA加密 确保令牌完整性
最佳实践
- 定期旋转令牌 生产中
- 使用HTTPS 用于所有通信
- 安全地存储Discord令牌 (环境变量、机密管理器)
- 监控审核日志 不寻常的活动
- 实施速率限制 如有需要
🤝 与MCP客户端集成
此服务器遵循MCP规范,可用于:
- 克劳德桌面 与MCP集成
- 自定义MCP客户端
- API测试工具 (邮差、卷发等)
📚 参考文献
🐛 故障排除
常见问题
-
“在身份验证中找不到Discord令牌”
- 验证您的JWT令牌在声明中是否包含Discord令牌
- 使用正确的Discord机器人令牌检查令牌生成
-
“Bot没有权限”
- 确保Discord机器人在服务器中具有必要的权限
- 具体检查频道权限
-
“无法访问服务器”
- 验证服务器是否在localhost:8000上运行
- 检查端口冲突
-
“无效令牌”
- 令牌可能已过期(默认1小时)
- 生成新令牌
- 验证授权标头中的令牌格式
