OAuth客户端自注册演示

演示使用OAuth 2.0动态客户端注册的MCP客户端实现,支持授权码流程与PKCE安全机制。

  • by huachen1101-dev
  • Java
  • 本地部署
  • 更新于
在 GitHub 查看 huachen1101-dev/mcp

使用说明

MCP客户端自我注册和OAuth演示

本项目演示了一个MCP(模型上下文协议)客户端,该客户端使用OAuth 2.0动态客户端注册(RFC 7591)向MCP服务器进行自我注册,然后使用协商的 client_id 用于使用PKCE的OAuth 2.1授权代码流。

架构概述

该演示包含两个Spring Boot应用程序:

  1. MCP服务器 (mcp-demo-server)-处理客户端注册、OAuth授权,并公开MCP工具/资源
  2. 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包装)

运行服务器

  1. 导航到服务器目录:

    cd mcp-demo-server
    
  2. 构建并运行服务器:

    ../gradlew bootRun
    

    或者从根目录:

    ./gradlew :mcp-demo-server:bootRun
    

    服务器将于启动 http://localhost:8080

  3. OAuth登录的默认凭据:

    • 用户名: user
    • 密码: password

运行客户端

  1. 在新终端中,导航到项目根目录:

    cd /path/to/mcp-demo
    
  2. 构建并运行客户端:

    ./gradlew :mcp-demo-client:bootRun
    

    或者从客户端目录:

    cd mcp-demo-client
    ../gradlew bootRun
    

    客户端将开始 http://localhost:8081

  3. 启动时,客户端将自动向服务器注册。

  4. 打开浏览器并导航到 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 UI
  • GET /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范围进行限制

演示工具

服务器提供三个演示工具:

  1. 计算 -执行基本的数学运算(加、减、乘、除)
  2. lookup_user -按用户ID查找用户信息
  3. 反向振铃 -反转给定的字符串

演示资源

服务器提供两个演示资源:

  1. 用户文件 (mcp://demo/user_profile)-当前已验证用户的个人资料信息
  2. 系统状态 (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的参考。

参考文献