此 MCP 服务器实现是由 systemprompt.io 赞助的——他们创建了世界上第一个原生移动 MCP 客户端,适用于 iOS 和 Android,并完全免费开源提供给社区。
如果您发现这个项目有用,请考虑:
您的支持有助于我们继续为 AI 社区创造有价值的开源工具!
🚀 了解更多:要了解此实现的交互式演示并进行实时 SDK 测试,请访问 systemprompt.io/mcp-server
这是一个生产就绪的模型上下文协议(MCP)服务器,展示了完整的 MCP 规范,包括 OAuth 2.1、采样、激发、结构化数据验证和实时通知。
此实现使用 Reddit 作为现实世界的示例来展示 OAuth 2.1 流程和高级 MCP 功能,但架构设计易于适应任何需要 OAuth 认证的 API。
此服务器可与任何支持高级功能(如采样和通知)的 MCP 兼容客户端一起工作。
此服务器完全兼容MCP Inspector,提供对以下内容的支持:
自行测试:npm run inspector
此实现使用Reddit 的 API 作为现实世界的示例来展示如何在 MCP 服务器中构建完整的 OAuth 2.1 流程。选择 Reddit 是因为:
注意:虽然此服务器使用 Reddit,但 OAuth 实现和架构模式设计为易于适应任何基于 OAuth 的 API(如 GitHub、Google、Slack 等)。
此存储库作为 MCP 服务器实现的黄金标准,展示了:
立即使用 Docker 运行服务器——无需安装:
在 reddit.com/prefs/apps 创建 Reddit 应用
http://localhost:3000/oauth/reddit/callback创建初始 .env 文件:
cat > .env << EOF
REDDIT_CLIENT_ID=your_reddit_client_id
REDDIT_CLIENT_SECRET=your_reddit_client_secret
JWT_SECRET=any_random_string_here
EOF
# 使用 Docker 运行(自动拉取镜像)
docker run -it --rm \
-p 3000:3000 \
--env-file .env \
--name mcp-reddit \
node:20-slim \
npx @systemprompt/systemprompt-mcp-server
http://localhost:3000# 停止容器(Ctrl+C)
# 将 OAuth 令牌添加到您的 .env 文件中
echo "OAUTH_ACCESS_TOKEN=your_oauth_token_here" >> .env
# 使用令牌重新启动
docker run -it --rm \
-p 3000:3000 \
--env-file .env \
node:20-slim \
npx @systemprompt/systemprompt-mcp-server
现在您可以使用经过身份验证的会话使用所有 Reddit 工具!
# 通过 npm
npm install -g @systemprompt/systemprompt-mcp-server
# 通过 npx(无需安装)
npx @systemprompt/systemprompt-mcp-server
# 克隆以进行开发
git clone https://github.com/systempromptio/systemprompt-mcp-server.git
cd systemprompt-mcp-server
npm install
npm run build
创建 Reddit 应用:reddit.com/prefs/apps
http://localhost:3000/oauth/reddit/callback设置环境变量:
在项目根目录创建一个 .env 文件:
# Reddit API 所需
REDDIT_CLIENT_ID=your_reddit_client_id
REDDIT_CLIENT_SECRET=your_reddit_client_secret
JWT_SECRET=your_jwt_secret # JWT 签名密钥
# 可选
PORT=3000 # 服务器端口(默认:3000)
OAUTH_ISSUER=http://localhost:3000 # OAuth 发行者 URL
REDIRECT_URL=http://localhost:3000/oauth/reddit/callback # OAuth 重定向
REDDIT_USER_AGENT=linux:systemprompt-mcp-reddit:v2.0.0 # Reddit 用户代理
REDDIT_USERNAME=your_reddit_username # 您的 Reddit 用户名(可选)
LOG_LEVEL=debug # 日志级别(debug, info, warn, error)
注意:环境变量对于本地开发和 Docker 部署都是必需的。
# 构建 TypeScript 代码
npm run build
# 运行构建的服务器
node build/index.js
# 开发模式下的监视模式
npm run watch
# 在另一个终端中:
node build/index.js
# 使用 Docker
npm run docker
此实现遵循干净架构原则,各层之间有明确的分离:
┌─────────────────────────────────────────────────────────┐
│ 客户端应用程序 │
│ (systemprompt.io) │
└────────────────────────┬────────────────────────────────┘
│ MCP 协议
┌────────────────────────┴────────────────────────────────┐
│ MCP 服务器层 │
│ ┌─────────────┐ ┌─────────────┐ ┌────────────────┐ │
│ │ OAuth 2.1 │ │ 会话 │ │ 通知 │ │
│ │ 处理程序 │ │ 管理器 │ │ 管理器 │ │
│ └─────────────┘ └─────────────┘ └────────────────┘ │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────┴────────────────────────────────┐
│ 处理程序层 │
│ ┌─────────────┐ ┌─────────────┐ ┌────────────────┐ │
│ │ 工具 │ │ 资源 │ │ 采样 │ │
│ │ 处理程序 │ │ 处理程序 │ │ 处理程序 │ │
│ └─────────────┘ └─────────────┘ └────────────────┘ │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────┴────────────────────────────────┐
│ 服务层 │
│ ┌─────────────┐ ┌─────────────┐ ┌────────────────┐ │
│ │ Reddit │ │ 认证 │ │ 获取 │ │
│ │ 服务 │ │ 服务 │ │ 服务 │ │
│ └─────────────┘ └─────────────┘ └────────────────┘ │
└─────────────────────────────────────────────────────────┘
src/server.ts:主要 HTTP 服务器设置和 Express 配置src/server/:核心服务器基础设施(MCP、OAuth、认证管理)src/handlers/:工具、提示、资源和采样的请求处理程序src/services/:业务逻辑和 Reddit API 集成src/constants/:工具定义、服务器配置和模式src/types/:TypeScript 类型定义和接口此服务器实现了完整的 MCP OAuth 2.1 规范:
初始 401 响应(src/server/oauth.ts)
WWW-Authenticate: Bearer realm="MCP Reddit 服务器"
资源元数据(src/server/oauth.ts)
{
"authorization_server": "http://localhost:3000/.well-known/oauth"
}
授权服务器元数据(src/server/oauth.ts)
授权请求(src/server/oauth.ts)
Reddit OAuth 回调(src/server/oauth.ts)
令牌交换(src/server/oauth.ts)
认证请求(src/server/middleware.ts)
search_reddit跨 Reddit 搜索,带过滤器(src/handlers/tools/search-reddit.ts)
{
"query": "typescript MCP",
"subreddit": "编程", // 可选特定子版块
"sort": "相关性",
"时间": "周",
"限制": 10
}
get_post获取特定帖子及其评论(src/handlers/tools/get-post.ts)
{
"id": "post_id_here" // Reddit 帖子 ID
}
get_channel获取子版块帖子(src/handlers/tools/get-channel.ts)
{
"subreddit": "编程",
"sort": "热门" // "热门", "新", 或 "争议"
}
get_notifications获取用户通知和消息(src/handlers/tools/get-notifications.ts)
{
"filter": "未读", // "全部", "未读", "消息", "评论", "提及"
"限制": 25,
"markRead": false
}
get_comment获取特定评论(src/handlers/tools/get-comment.ts)
{
"id": "comment_id_here",
"includeThread": true // 包含完整的评论线程
}
elicitation_example演示用户输入收集(src/handlers/tools/elicitation-example.ts)
{
"type": "输入", // "输入", "确认", "选项"
"prompt": "输入您的选择",
"options": ["选项1", "选项2"] // 对于选项类型
}
sampling_example演示 AI 辅助内容生成(src/handlers/tools/sampling-example.ts)
{
"prompt": "生成一个代码示例",
"maxTokens": 1_000,
"temperature": 0.7
}
structured_data_example演示结构化数据处理(src/handlers/tools/structured-data-example.ts)
{
"format": "json", // "json", "表格", "markdown"
"data": { "key": "value" }
}
validation_example演示输入验证(src/handlers/tools/validation-example.ts)
{
"test_string": "示例",
"test_number": 42,
"test_enum": "选项1"
}
mcp_logging请求服务器记录消息(src/handlers/tools/logging.ts)
{
"level": "info", // "debug", "info", "警告", "错误"
"message": "调试消息",
"data": { "附加": "上下文" }
}
采样实现(src/handlers/sampling.ts)遵循完整的 MCP 规范:
// 1. 客户端请求 AI 协助
await client.callTool("sampling_example", {
prompt: "分析这个子版块并提出行动建议",
maxTokens: 1000,
temperature: 0.7
});
// 2. 服务器启动