使用说明
MCP客户端自我注册和OAuth演示
本项目演示了一个MCP(模型上下文协议)客户端,该客户端使用OAuth 2.0动态客户端注册(RFC 7591)向MCP服务器进行自我注册,然后使用协商的 client_id 用于使用PKCE的OAuth 2.1授权代码流。
架构概述
该演示包含两个Spring Boot应用程序:
- MCP服务器 (
mcp-demo-server)-处理客户端注册、OAuth授权,并公开MCP工具/资源 - MCP客户端 (
mcp-demo-client)-在服务器上自我注册,为用户处理OAuth流,并与MCP服务器交互
技术栈
- Java 25
- Spring Boot 3.4.1
- Spring Security 支持OAuth2授权服务器和客户端
- JSON-RPC 2.0 (MCP协议基础)
- 百里香叶 (用于web UI)
- Gradle 8.14.3(用于依赖关系管理)
特性
服务器功能
- 支持PKCE的OAuth2授权服务器
- 动态客户端注册(RFC 7591)端点
- MCP协议实现(JSON-RPC 2.0)
- 演示工具:
calculate,lookup_user,reverse_string - 演示资源:
user_profile,system_status - 使用OAuth2资源服务器保护端点
客户端功能
- 启动时自动注册
- 动态OAuth2客户端配置
- 使用PKCE的OAuth 2.1授权码流
- 用于与MCP工具和资源交互的Web UI
- 实时工具执行和资源查看
入门指南
先决条件
- JDK 25
- Gradle 8.14.3或更高(或使用附带的Gradle包装)
运行服务器
-
导航到服务器目录:
cd mcp-demo-server -
构建并运行服务器:
../gradlew bootRun或者从根目录:
./gradlew :mcp-demo-server:bootRun服务器将于启动
http://localhost:8080 -
OAuth登录的默认凭据:
- 用户名:
user - 密码:
password
- 用户名:
运行客户端
-
在新终端中,导航到项目根目录:
cd /path/to/mcp-demo -
构建并运行客户端:
./gradlew :mcp-demo-client:bootRun或者从客户端目录:
cd mcp-demo-client ../gradlew bootRun客户端将开始
http://localhost:8081 -
启动时,客户端将自动向服务器注册。
-
打开浏览器并导航到
http://localhost:8081
API终点
服务器端点
POST /register-动态客户端注册(RFC 7591)GET /.well-known/oauth-authorization-server-OAuth2授权服务器元数据(RFC 8414)GET /oauth2/authorize-OAuth2授权终结点POST /oauth2/token-OAuth2令牌终结点POST /mcp-MCP协议端点(JSON-RPC 2.0)
客户端端点
GET /-主web UIGET /api/tools-列出可用工具POST /api/tools/call-执行工具GET /api/resources-列出可用资源GET /api/resources/read?uri={uri}-阅读资源
项目结构
.
├── mcp-demo-server/
│ ├── src/main/java/com/example/mcp/server/
│ │ ├── config/
│ │ │ └── OAuth2ServerConfig.java
│ │ ├── controller/
│ │ │ ├── AuthorizationServerMetadataController.java
│ │ │ ├── ClientRegistrationController.java
│ │ │ └── McpServerController.java
│ │ ├── mcp/
│ │ │ ├── model/
│ │ │ └── service/
│ │ ├── model/
│ │ └── service/
│ └── pom.xml
├── mcp-demo-client/
│ ├── src/main/java/com/example/mcp/client/
│ │ ├── config/
│ │ │ └── OAuth2ClientConfig.java
│ │ ├── controller/
│ │ │ └── DemoController.java
│ │ ├── mcp/
│ │ │ └── model/
│ │ ├── model/
│ │ └── service/
│ ├── src/main/resources/
│ │ └── templates/
│ └── pom.xml
└── README.md
何时以及如何使用这种方法
何时使用
- 构建需要与外部工具安全、标准化集成的AI应用程序
- 在客户需要动态注册的情况下实施多租户系统
- 创建联合MCP服务器网络
- 需要对MCP资源进行基于OAuth2的授权的场景
- 不希望手动客户预注册的系统
安全考虑
- PKCE:OAuth 2.1和MCP规范要求-防止授权代码被拦截
- 客户端密钥存储:在生产中,使用安全保管库(例如HashiCorp保管库、AWS Secrets Manager)
- 超文本传输安全协议:始终在生产环境中使用HTTPS进行安全通信
- 令牌验证:服务器在处理MCP请求之前验证所有令牌
- 基于范围的访问:资源和工具可以根据OAuth范围进行限制
演示工具
服务器提供三个演示工具:
- 计算 -执行基本的数学运算(加、减、乘、除)
- lookup_user -按用户ID查找用户信息
- 反向振铃 -反转给定的字符串
演示资源
服务器提供两个演示资源:
- 用户文件 (
mcp://demo/user_profile)-当前已验证用户的个人资料信息 - 系统状态 (
mcp://demo/system_status)-当前系统状态和健康信息
故障排除
客户端注册失败
- 确保服务器正在上运行
http://localhost:8080 - 检查服务器的
/register端点可访问 - 验证客户端和服务器之间的网络连接
OAuth流失败
- 确保您使用的是正确的默认凭据(
user/password) - 检查客户端注册中的重定向URI是否与配置的重定向URI匹配
- 验证是否启用了PKCE(应在Spring Security中自动启用)
MCP请求失败
- 确保您已完成OAuth登录流程
- 检查您的访问令牌是否有效且未过期
- 验证服务器的
/mcp端点已正确保护且可访问
发展
从源头构建
# Build all projects
./gradlew build
# Build server only
./gradlew :mcp-demo-server:build
# Build client only
./gradlew :mcp-demo-client:build
运行测试
# Run all tests
./gradlew test
# Server tests only
./gradlew :mcp-demo-server:test
# Client tests only
./gradlew :mcp-demo-client:test
许可证
这是一个示范项目。作为使用OAuth2动态客户端注册实现MCP的参考。