Reddit交互服务器

一个通过官方API实现与Reddit交互的模型上下文协议服务器,支持读取和发布帖子、评论及图片,并具备完整的OAuth2认证功能。

  • by Securiteru
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 Securiteru/reddit-mcp

使用说明

Reddit MCP服务器

模型上下文协议(MCP)服务器,使Claude能够通过官方API与Reddit进行交互。使用完整的OAuth2身份验证读写帖子、评论和图像。

特性

📖 阅读工具(6)

  • reddit_get_post -按ID获取包含完整详细信息的帖子
  • reddit_get_评论 -获取带有回复的嵌套评论线程
  • reddit_search_post -在Reddit或特定子版块内搜索
  • reddit_get_subreddit_post -从任何子版块获取热门/新/热门帖子
  • reddit_get_subreddit_info -获取subreddit详细信息和统计数据
  • reddit_get_user_content -获取用户的帖子和评论

✍️ 写作工具(7)

  • reddit_submit_post -创建文本、链接或图像帖子(上传本地文件!)
  • reddit_提交_评论 -回复帖子或其他评论
  • reddit_编辑内容 -编辑您的帖子和评论
  • reddit_delete_content -删除您的内容
  • reddit_注意 -投票赞成、投票反对或取消投票
  • reddit_save -保存帖子和评论
  • reddit_unsave -不安全内容

🖼️ 图像上传支持

  • 上传本地图片:直接提供base64编码的图像
  • 免费主机:使用Catbox.moe(无权限)或ImgBB(免费API密钥)
  • 自动工作流程:本地文件→ 托管→ Reddit帖子
  • 支持格式:JPG、PNG、GIF、webp

快速开始

1.创建Reddit应用程序

  1. 首选https://www.reddit.com/prefs/apps
  2. 点击“创建另一个应用程序…”
  3. 选择 “脚本” 类型
  4. 设置重定向URI: http://localhost:8080 (必需但未使用)
  5. 保存您的客户ID和密码

重要:您的Reddit帐户必须具有2FA 残疾的 用于OAuth密码授权。

2.配置环境

cp .env.example .env

编辑 .env 使用您的凭据:

# Reddit API Credentials
REDDIT_CLIENT_ID=your_client_id_here
REDDIT_CLIENT_SECRET=your_client_secret_here
REDDIT_USERNAME=your_reddit_username
REDDIT_PASSWORD=your_reddit_password
REDDIT_USER_AGENT=mcp:reddit-mcp:1.0.0 (by /u/your_username)

# Optional: ImgBB API key for image hosting fallback
# If not provided, will use Catbox.moe (permissionless, free)
# Get free API key at: https://api.imgbb.com/
IMGBB_API_KEY=

3.安装和构建

npm install
npm run build

4.运行服务器

npm start

Docker部署

构建图像

docker build -t reddit-mcp:latest .

运行容器

docker run --rm \
  -e REDDIT_CLIENT_ID=your_client_id \
  -e REDDIT_CLIENT_SECRET=your_secret \
  -e REDDIT_USERNAME=your_username \
  -e REDDIT_PASSWORD=your_password \
  -e REDDIT_USER_AGENT="mcp:reddit-mcp:1.0.0 (by /u/your_username)" \
  reddit-mcp:latest

Docker MCP网关

此服务器旨在与 Docker MCP网关。配置可在 reddit-mcp-catalog.yaml.

使用示例

阅读Reddit

从subreddit获取热门帖子:

{
  "tool": "reddit_get_subreddit_posts",
  "arguments": {
    "subreddit": "programming",
    "sort": "top",
    "time": "week",
    "limit": 10
  }
}

搜索Reddit:

{
  "tool": "reddit_search_posts",
  "arguments": {
    "query": "machine learning",
    "sort": "relevance",
    "time": "month",
    "limit": 25
  }
}

给Reddit写信

创建文本帖子:

{
  "tool": "reddit_submit_post",
  "arguments": {
    "subreddit": "test",
    "title": "Hello from Reddit MCP!",
    "text": "This is a test post created via the MCP server.",
    "nsfw": false,
    "spoiler": false
  }
}

创建链接帖子:

{
  "tool": "reddit_submit_post",
  "arguments": {
    "subreddit": "technology",
    "title": "Interesting Article",
    "url": "https://example.com/article",
    "nsfw": false
  }
}

创建图片帖子(从URL):

{
  "tool": "reddit_submit_post",
  "arguments": {
    "subreddit": "pics",
    "title": "Check out this image!",
    "image_url": "https://example.com/image.jpg",
    "nsfw": false
  }
}

创建图像帖子(从本地文件):

{
  "tool": "reddit_submit_post",
  "arguments": {
    "subreddit": "pics",
    "title": "My photo",
    "image_data": "iVBORw0KGgoAAAANS...base64data...CYII=",
    "image_filename": "photo.jpg",
    "nsfw": false
  }
}

发表评论:

{
  "tool": "reddit_submit_comment",
  "arguments": {
    "parent": "t3_abc123",
    "text": "Great post! Here's my comment."
  }
}

投票和保存

为帖子投票:

{
  "tool": "reddit_vote",
  "arguments": {
    "id": "t3_abc123",
    "dir": 1
  }
}

保存帖子:

{
  "tool": "reddit_save",
  "arguments": {
    "id": "t3_abc123"
  }
}

图像上传工作流

服务器支持通过无缝的E2E工作流将本地图像上传到Reddit:

  1. 客户端提供base64图像:Claude发送编码为base64的图像数据
  2. 上传到免费主机:服务器上载到Catbox.moe(或带有API密钥的ImgBB)
  3. 获取公共URL:托管服务返回一个永久URL
  4. 创建Reddit帖子:服务器创建带有托管映像的链接帖子

代管服务

初级:Catbox.moe

  • ✅ 完全免费
  • ✅ 不需要API密钥
  • ✅ 无需注册
  • ✅ 永久文件托管
  • ✅ 合理使用无费率限制

回退:ImgBB

  • ✅ 免费套餐可用
  • ✅ 需要API密钥(免费https://api.imgbb.com/)
  • ✅ 慷慨的限制
  • ✅ 高可靠性

支持的图像格式

  • PNG(.png)
  • JPEG(.jpg, .jpeg)
  • GIF(.gif)
  • WebP(.webp)

速率限制

服务器实现令牌桶速率限制:

  • 默认:每分钟60个请求
  • 可配置的:设置 RATE_LIMIT_PER_MINUTE 在 .env
  • 自动排队:请求等待可用令牌
  • 符合Reddit标准:尊重Reddit的API指南

错误处理

  • 自动重试:失败的请求以指数回退重试
  • 令牌刷新:OAuth令牌过期时自动刷新
  • 速率限制检测:服务器检测并处理429个响应
  • 详细错误:清除错误消息以进行故障排除

安全

  • ✅ 通过Reddit进行OAuth2身份验证
  • ✅ 通过环境变量获取凭据
  • ✅ 代码或Docker镜像中没有秘密
  • ✅ 容器隔离
  • ✅ 安全令牌管理

项目结构

reddit-mcp/
├── src/
│   ├── auth/
│   │   └── reddit-auth.ts        # OAuth2 authentication
│   ├── tools/
│   │   ├── read.ts               # Reading operations
│   │   └── write.ts              # Writing operations
│   ├── utils/
│   │   ├── rate-limiter.ts       # Token bucket rate limiting
│   │   ├── error-handler.ts      # Error handling & retry
│   │   └── image-upload.ts       # Image hosting integration
│   ├── types/
│   │   └── reddit.ts             # TypeScript definitions
│   └── index.ts                  # MCP server entry point
├── dist/                          # Compiled JavaScript
├── Dockerfile                     # Container definition
├── package.json                   # Dependencies
├── tsconfig.json                  # TypeScript config
├── .env.example                   # Environment template
└── tools.json                     # Tool definitions for MCP registry

发展

构建

npm run build

观看模式

npm run dev

测试

# Install dependencies
npm install

# Create .env file with your credentials
cp .env.example .env

# Test reading from Reddit
npx tsx test-mcp-subreddit.ts

# Test posting with images
npx tsx post-scenester.ts

故障排除

身份验证错误

错误: invalid_grant

  • 确保2FA 残疾的 在您的Reddit帐户上
  • 验证用户名和密码是否正确
  • 检查应用程序类型是否为 “脚本” 不是“web应用程序”

错误: 403 Forbidden

  • 检查您的用户代理格式是否匹配: platform:app_id:version (by /u/username)
  • 确保凭据正确
  • 如果速率受限,请等待10-15分钟

图像上传问题

上传失败,超时:

  • 检查您的互联网连接
  • 再试一次-免费服务可能会出现临时问题
  • 如果使用ImgBB,请验证您的API密钥

图像太大:

  • Reddit对帖子有大小限制
  • 上传前考虑调整图像大小
  • 大多数托管服务都限制文件大小

API 参考

工具:reddit_submit_post

向subreddit提交新帖子(文本、链接或图像)。

参数:

  • subreddit (字符串,必填):子文件夹名称
  • title (字符串,必填):帖子标题
  • text (字符串,可选):发布正文(用于文本帖子)
  • url (字符串,可选):链接的URL(用于链接帖子)
  • image_url (字符串,可选):下载和发布的URL(用于远程图像)
  • image_data (字符串,可选):Base64编码图像数据(用于本地文件)
  • image_filename (字符串,可选):带扩展名的文件名(image_data需要)
  • nsfw (布尔值,可选):标记为NSFW
  • spoiler (布尔值,可选):标记为扰流板

退货:

{
  "id": "abc123",
  "name": "t3_abc123",
  "url": "https://www.reddit.com/r/test/comments/abc123/..."
}

许可证

MIT许可证-有关详细信息,请参阅许可证文件

贡献

欢迎投稿!此服务器是 Docker MCP注册表.

支持

  • Reddit API状态: https://www.redditstatus.com/
  • Reddit API文档: https://www.reddit.com/dev/api
  • MCP协议: https://modelcontextprotocol.io/
  • Docker MCP网关: https://docs.docker.com/desktop/features/mcp/

更新日志

v1.2.0(最新)

  • ✨ 添加了本地文件图像上传支持
  • ✨ 集成免费图像托管(Catbox.moe、ImgBB)
  • ✨ MCP的Base64图像数据支持
  • 🐛 简化的图片发布(链接帖子与媒体API)
  • 📝 更新文件

v1.1.0版本

  • ✨ 添加了图像URL上传支持
  • 🐛 修复了身份验证问题
  • 📝 改进了错误消息

v1.0.0

  • 🎉 初始版本
  • ✅ 13个Reddit互动工具
  • ✅ OAuth2身份验证
  • ✅ 速率限制
  • ✅ Docker支持