架构微服务MCP+OAuth2
基于Spring Boot 3.4.0和Spring AI 1.0.1的具有OAuth2安全性的MCP(模型上下文协议)的完整微服务架构。
建筑
┌─────────────────┐
│ Keycloak │ Port 9000
│ (Auth Server) │
└────────┬────────┘
│
│ OAuth2 JWT
│
┌────┴────┐
│ │
┌───▼───┐ ┌──▼────┐
│ MCP │ │ MCP │
│Server │ │Client │ Ports 8080, 8081
└───────┘ └───────┘组件
- 钥匙斗篷 :授权服务器OAuth2(端口9000)
- mcp服务器 :受OAuth2资源服务器保护的MCP服务器(端口8080)
- mcp客户端 :具有OAuth2客户端和LLM集成的MCP客户端(端口8081)
先决条件
- Java 21+
- Maven 3.9+
- Docker与Docker编写
- OpenAI API密钥(用于MCP客户端)
配置密钥斗篷
1.启动KeyCloak
docker run -p 9000:8080 \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:26.0 start-dev2.领域配置
- 访问http://localhost:9000
- Se连接器avec
admin/admin - 创建新领域:
mcp-realm
3.客户端配置
- 在领域
mcp-realm,进去 客户 - 创建新客户端:
- 客户端ID : mcp-client - 客户端身份验证 : ON - 有效的重定向URI : http://localhost:8081/* - 网络起源 : http://localhost:8081
- 在选项卡中 凭证复印机 客户端密钥 :
secret - 在选项卡中 客户端范围,添加:
- mcp:read - mcp:write
4.范围配置
- 进去 客户端范围
- 创建范围
mcp:read - 创建范围
mcp:write - 将它们添加到客户端
mcp-client
本地启动
选项1:Docker Compose(推荐)
# Définir la clé API OpenAI
export OPENAI_API_KEY=your-api-key-here
# Démarrer tous les services
docker-compose up -d
# Vérifier les logs
docker-compose logs -f选项2:手动启动
1.启动KeyCloak
docker run -p 9000:8080 \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:26.0 start-dev2.启动MCP服务器
cd mcp-server
mvn spring-boot:run3.启动MCP客户端
cd mcp-client
export OPENAI_API_KEY=your-api-key-here
mvn spring-boot:run配置
环境变量
mcp服务器
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI:授权服务器URI(默认值:http://localhost:9000/realms/mcp-realm)
mcp客户端
OPENAI_API_KEY:OpenAI API密钥(必需)SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_AUTHSERVER_ISSUER_URI:授权服务器URISPRING_AI_MCP_CLIENT_STREAMABLE_HTTP_CONNECTIONS_MATH_SERVER_URL:MCP服务器的URL
使用
测试MCP服务器
# Obtenir un token JWT depuis Keycloak
curl -X POST http://localhost:9000/realms/mcp-realm/protocol/openid-connect/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=mcp-client" \
-d "client_secret=secret" \
-d "grant_type=client_credentials" \
-d "scope=mcp:read mcp:write"
# Utiliser le token pour appeler le serveur MCP
curl -X POST http://localhost:8080/mcp \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'测试员客户端MCP
# Poser une question via l'API
curl "http://localhost:8081/api/ask?question=What%20is%202%20plus%202?"微服务架构
mcp服务器
终点:
POST /mcpMCP主端点(受保护)
可用工具:
add:添加两个数字(范围:mcp:read)subtract:两个数字的减法(范围:mcp:read)multiply:两个数字的乘法(范围:mcp:write)divide:两个数字的除法(范围:mcp:write)power:数字的幂(范围:mcp:write)
安全:
- 具有JWT验证的OAuth2资源服务器
- 观众验证
- 工具的精细授权
@PreAuthorize
mcp客户端
终点:
GET /api/ask?question=...:使用MCP工具向LLM提问
功能:
- 使用OAuth2身份验证自动连接到MCP服务器
- 磁通混合:
authorization_code对于用户请求,client_credentials对于系统调用 - LLM(OpenAI)与自动MCP工具的集成
安全
Flux OAuth2混合
MCP客户端使用混合流:
- 授权码 :对于用户验证的请求
- 客户端证书 :用于启动时的系统调用
范围验证
MCP工具受作用域保护:
mcp:read:读取操作(添加、子字段)mcp:write:写入操作(多重、分割、功率)
审计验证
MCP服务器验证JWT的受众,以确保令牌用于正确的服务。
测试
执行测试
# Tous les tests
mvn test
# Tests du serveur uniquement
cd mcp-server && mvn test
# Tests du client uniquement
cd mcp-client && mvn test发展
项目结构
mcp-microservices/
├── pom.xml # POM parent
├── docker-compose.yml # Orchestration Docker
├── mcp-server/ # Microservice serveur MCP
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ └── resources/
│ │ └── test/
│ └── Dockerfile
└── mcp-client/ # Microservice client MCP
├── src/
│ ├── main/
│ │ ├── java/
│ │ └── resources/
│ └── test/
└── Dockerfile添加新的MCP工具
在 mcp-server/src/main/java/com/mcp/server/service/MathTools.java :
@McpTool(description = "Your tool description")
@PreAuthorize("hasAuthority('SCOPE_mcp:write')") // Optionnel
public ReturnType yourMethod(@McpToolParam ParamType param) {
// Implémentation
}故障排除
OAuth2连接问题
- 检查KeyCloak是否已启动:
curl http://localhost:9000/health - 检查KeyCloak中的客户端配置
- 检查日志:
docker-compose logs mcp-server或docker-compose logs mcp-client
令牌问题
- 验证令牌是否包含必要的范围
- 检查令牌的到期时间
- 检查观众验证
MCP连接问题
- 检查MCP服务器是否可访问:
curl http://localhost:8080/actuator/health - 检查客户端中的URL配置
- 验证日志
技术
- Spring Boot 3.4.0
- Java 21
- 春季AI 1.0.1
- Spring Security OAuth2
- 钥匙斗篷 26.0
- OpenAI API (通过Spring AI)
- 梅文 3.9+
- 码头工人 &Docker编写
许可证
本项目作为使用OAuth2的MCP架构的示例提供。
