Todo MCP服务器-Spring Boot实现
A完整 模型上下文协议(MCP)服务器 使用Spring Boot实现,演示了通过代理服务器使用Firebase进行OAuth2身份验证。该服务器提供Todo管理工具,可供MCP客户端使用,如VS Code、Claude Desktop和其他AI助手。
🚀 特性
- MCP服务器实现:使用Spring AI MCP框架的完全OAuth2保护的MCP服务器
- Firebase身份验证:通过Firebase Auth服务器代理进行基于JWT的安全身份验证
- 待办事项管理:使用用户隔离完成todo项的CRUD操作
- 多个配置文件:支持不同的MCP通信模式(SSE、Streamable、无状态)
- OAuth2发现:完全符合RFC的OAuth2元数据端点
- 用户上下文:基于经过身份验证的电子邮件的自动用户隔离
- 安全:全面的安全配置,具有适当的错误处理功能
🛠️ 技术栈
- Java 21 带弹簧靴3.5.7
- Spring Security 使用OAuth2资源服务器
- Spring AI MCP服务器 框架
- Firebase管理SDK 用于JWT验证
📋 先决条件
在运行此MCP服务器之前,您需要:
- Firebase身份验证服务器代理 在端口9000上运行
- 按照说明操作:https://github.com/muthuishere/mcp-firebase-auth-server
- 环境变量 (见配置部分)
- Java 17 已安装或更高
⚙️ 配置
环境变量
创建一个 .env 文件或设置这些环境变量:
# Firebase Configuration (same as your auth proxy)
FIREBASE_PROJECT_ID=your-firebase-project-id
FIREBASE_API_KEY=your-firebase-api-key
FIREBASE_SERVICE_ACCOUNT_KEY={"type":"service_account",...} # Your service account JSON
# MCP Server Configuration
MCP_SERVER_BASE_URL=http://localhost:8080
MCP_AUTH_SERVER_URL=http://localhost:9000🏃♂️ 运行服务器
1.标准运行
task dev🔧 MCP工具可用
此服务器公开了AI助手可以使用的以下MCP工具:
fetch-all-todos
- 描述:获取经过身份验证的用户的所有Todo项目
- 参数:无
- 退货:Todo对象列表
fetch-todo-by-id
- 描述:按ID获取特定的Todo项目
- 参数:
id(长)-待办事项的ID - 退货:可选Todo对象
make-todo
- 描述:创建新的Todo项目
- 参数:
- title (字符串)-待办事项的标题 - description (字符串)-Todo的描述 - completed (boolean)-待办事项完成了吗?
- 退货:TodoToolResponse,带有创建的todo和成功消息
change-todo
- 描述:更新现有Todo项目
- 参数:
- id (长)-要更新的待办事项的ID - title (字符串)-新标题 - description (字符串)-新描述 - completed (boolean)-新的完成状态
- 退货:可选的已更新Todo对象
remove-todo
- 描述:按ID删除待办事项
- 参数:
id(长)-要删除的待办事项的ID - 退货:boolean表示成功
🔐 认证流程
1.OAuth2发现端点
服务器为MCP客户端公开这些发现端点:
GET /.well-known/oauth-protected-resource
GET /.well-known/oauth-authorization-server
GET /.well-known/openid-configuration
GET /login/oauth2.令牌验证过程
- 提取JWT:来自
Authorization: Bearer头球 - 解析JWT:提取
firebase_tokenJWT有效载荷索赔 - 验证Firebase令牌:使用Firebase管理SDK
- 设置用户上下文:将用户电子邮件存储在
MCPContextHolder - 访问控制:所有待办事项都通过经过身份验证的用户电子邮件进行过滤
3.错误处理
返回正确 WWW-Authenticate 身份验证失败的标头:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer error="invalid_token",
error_description="The access token provided is expired, revoked, malformed, or invalid",
resource_metadata="http://localhost:8080/.well-known/oauth-protected-resource/mcp/"🗄️ 数据模型
所有实体
@Entity
public class Todo {
private Long id;
private String title;
private String description;
private boolean completed;
private String email; // User isolation
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}🧪 测试
1.运行测试
./gradlew test2.测试OAuth发现
# Test resource metadata
curl http://localhost:8080/.well-known/oauth-protected-resource
# Test auth server metadata
curl http://localhost:8080/.well-known/oauth-authorization-server
# Test protected endpoint (should return 401)
curl -v http://localhost:8080/mcp🔗 与MCP客户端集成
VS代码配置
- 安装MCP扩展
- 配置服务器URL:
http://localhost:8080/mcp - OAuth流将自动重定向到Firebase身份验证
📁 项目结构
src/main/java/tools/muthuishere/todo/
├── TodoApplication.java # Main Spring Boot application
├── config/
│ ├── FirebaseConfig.java # Firebase configuration
│ ├── FirebaseJwtDecoder.java # JWT token decoder
│ └── SecurityConfig.java # Security configuration
├── controller/
│ └── ResourceMetadataController.java # OAuth2 discovery endpoints
├── security/
│ └── McpAuthenticationEntryPoint.java # Auth error handling
├── todo/
│ ├── TodoTools.java # MCP tool implementations
│ ├── TodoService.java # Business logic
│ ├── TodoRepository.java # Data access
│ ├── MCPContextHolder.java # User context management
│ └── model/
│ ├── Todo.java # Todo entity
│ └── TodoToolResponse.java # Tool response model
└── utils/
└── Sampling.java # Utility classes🔄 开发工作流程
- 启动Firebase身份验证代理:确保身份验证服务器在端口9000上运行
- 设置环境变量:配置Firebase凭据
- 运行MCP服务器:使用
./gradlew bootRun或特定的配置文件任务 - 测试集成:使用MCP检查器或直接调用API
- 连接MCP客户端:配置VS代码
📄 许可证
此项目根据MIT许可证获得许可-有关详细信息,请参阅许可证文件。
______________________________________________________________________
备注:这是一个参考实现,演示了使用OAuth2身份验证的MCP服务器开发。根据您的特定用例调整配置和业务逻辑。
