具有动态注册功能的MCP客户端
MCP(模型上下文协议)客户端的概念验证实现,支持根据 MCP授权规范.
特性
✅ 动态客户端注册 (RFC 7591)
- 首次使用时自动向MCP服务器注册
- 无需预先配置
✅ OAuth 2.0的资源指标 (RFC 8707)
- 包含
resource所有OAuth请求中的参数 - 自动规范URI规范化
- 零配置资源URI提取
✅ 延迟注册
- 仅在实际访问资源时注册
- 高效的多服务器管理
✅ OAuth 2.0与PKCE (RFC 7636)
- 安全授权码流
- 支持PKCE以增强安全性
✅ 自动令牌刷新
- 检测过期令牌
- 使用刷新令牌自动刷新
- 如果刷新失败,则返回完整的OAuth流
✅ 授权服务器发现
- 获取用于授权服务器发现的受保护资源元数据(RFC 9728)
- 获取授权服务器元数据(RFC 8414)
- 解析
WWW-Authenticate401错误处理的标头
✅ 多服务器会话管理
- 每台服务器独立的令牌管理
- 线程安全的内存令牌存储
- 自动范围检测和持久性
建筑
┌─────────────────────┐
│ MCP Client │
│ (mcp_client.py) │
└──────────┬──────────┘
│
├─→ Registration Client
│ ├─ Parse WWW-Authenticate
│ ├─ Fetch server metadata
│ └─ Dynamic registration
│
├─→ OAuth Client
│ ├─ PKCE generation
│ ├─ Authorization code flow
│ └─ Token refresh
│
└─→ Token Store
└─ In-memory token management文件结构
mcp-client-dynamic/
├── mcp_client.py # Main MCP client orchestrator
├── registration_client.py # Dynamic client registration (RFC 7591)
├── oauth_client.py # OAuth 2.0 + PKCE client (RFC 7636)
├── token_store.py # Thread-safe token management
├── resource_utils.py # RFC 8707 resource URI utilities
├── scopes.py # Scope configuration per server type
├── mock_auth_server.py # Mock OAuth authorization server
├── mock_resource_server.py # Mock MCP resource server
├── test_flow.py # End-to-end test suite (5 tests)
├── README.md # This file
安装
需求
python3 -m venv grounded
source grounded/bin/activate
pip install flask requestsPython 版本
- Python 3.9+
快速开始
1.启动模拟授权服务器
1号航站楼:
python mock_auth_server.py这将在上启动OAuth服务器 http://localhost:5000 与:
- 服务器元数据端点
- 动态客户端注册
- 令牌端点(支持刷新)
2.启动模拟资源服务器
2号航站楼(Slack):
python mock_resource_server.py slack 50013号航站楼(Jira):
python mock_resource_server.py jira 50024号航站楼(GitHub):
python mock_resource_server.py github 50033.运行测试
5号航站楼:
python test_flow.py这将运行5个综合测试:
- 基本流程:动态注册→ OAuth→ 资源访问
- 延迟注册:按需注册多个服务器
- 令牌重用:用于后续请求的缓存令牌
- 令牌刷新:过期令牌自动刷新
- 多服务器独立性:每个服务器单独管理的令牌
工作原理:流程图
1. Client calls resource
↓
2. No credentials? → Register dynamically
├─ Fetch Protected Resource Metadata (RFC 9728)
├─ Discover authorization server from metadata
├─ Fetch Authorization Server Metadata (RFC 8414)
└─ Register client dynamically (RFC 7591)
↓
3. No token? → OAuth flow with PKCE
├─ Generate PKCE code verifier/challenge (RFC 7636)
├─ Get authorization code with state (CSRF protection)
├─ Exchange code for tokens (includes resource parameter)
└─ Store tokens
↓
4. Token expired? → Refresh
├─ Use refresh_token (with resource parameter)
└─ Get new access_token
↓
5. Make authenticated request
└─ Include Bearer token in Authorization header关键组件
1.MCPClient (mcp_client.py)
- 协调整个流程
- 具有自动服务器类型检测的延迟注册
- 自动令牌刷新
- 多服务器管理
2.注册客户 (registration_client.py)
- 获取用于授权服务器发现的受保护资源元数据(RFC 9728)
- 获取授权服务器元数据(RFC 8414)
- 动态注册客户端(RFC 7591)
- 解析
WWW-Authenticate401错误处理的标头
3.OAuthClient (oauth_client.py)
- 生成PKCE代码验证器/质询(RFC 7636)
- 完成授权码流
- 使用资源参数处理令牌刷新
4.资源工具 (resource_utils.py)
- 根据RFC 8707规范化URI
- 从服务器URL中自动提取资源URI
- 验证并格式化资源参数
5.代币被销毁 (token_store.py)
- 线程安全内存存储
- 使用60秒缓冲区跟踪令牌过期
- 使用每台服务器的作用域管理客户端凭据
- 每个服务器URL独立存储令牌
使用Stytch和Cloudflare进行真实世界测试
为了根据生产OAuth提供程序验证MCP客户端,使用Stytch进行身份验证,将一个真正的MCP资源服务器部署到Cloudflare Workers。
设置
MCP资源服务器 (stytch-mcp-server/)
- 部署到Cloudflare Workers:
https://stytch-mcp-server.usama-mcp.workers.dev - 实现MCP资源端点(
/mcp/tools,/mcp/resources) - 返回RFC 9728受保护资源元数据
- 使用Stytch(
https://six-acoustic-0961.customers.stytch.dev)作为OAuth提供者
基于浏览器的OAuth流
- 自动检测生产服务器与模拟服务器(通过检查身份验证端点是否为localhost)
- 模拟服务器:使用程序化POST流进行自动化测试
- 生产服务器:启动浏览器,在上启动本地回调服务器
localhost:8080 - 实现具有状态验证的完整PKCE流
结果
✅ 动态注册已验证
📝 Registering new client at https://six-acoustic-0961.customers.stytch.dev/v1/oauth2/register
Requested scope: openid profile email offline_access
✅ Client registered successfully
Client ID: connected-app-test-809b099f-ae04-4b8b-a331-00a84b7dd79a✅ 发现和元数据工作
- 已成功获取受保护资源元数据(RFC 9728)
- 发现Stytch为授权服务器
- 已检索OAuth元数据(RFC 8414)
- 已验证所有必需的端点
✅ 浏览器流已实现
- 本地HTTP服务器接收OAuth回调
- 浏览器自动打开以进行用户授权
- CSRF保护状态参数验证
- 从回调中提取授权码
⚠️ 发现限制
- Stytch测试项目需要自定义授权端点实现吗?
- 动态注册成功,但完整的OAuth流程需要生产OAuth提供者
- TODO:使用生产OAuth提供程序(Auth0、Okta等)或实现自定义身份验证UI
使用Stytch OAuth使用Cloudflare部署的MCP服务器测试MCP客户端
python test_stytch_production.py # Test script for production validation