MCP注册表OAuth客户端-概念证明
一个基于Go-的概念验证客户端,它演示了完整的OAuth 2.1授权流程,带有动态客户端注册(DCR),用于访问MCP注册表API。
注意:整个repo都是用Claude Code生成的。该代码尚未经过彻底的安全审查。请勿在生产环境中使用。仅与本地运行的服务器一起使用。
特性
- 完全支持OAuth 2.1:使用PKCE实现完整的授权代码流(S256)
- 动态客户端注册:使用RFC 7591自动向OAuth服务器注册
- OAuth发现:通过RFC 8414发现授权服务器元数据
- 本地回拨服务器:处理上的OAuth回调
localhost:3000 - MCP注册API:通话
/v0/servers具有承载令牌身份验证的端点 - 安全:实现CSRF保护的状态参数PKCE,并遵循MCP授权规范
建筑
.
├── main.go # CLI orchestration and main flow
├── oauth/
│ ├── pkce.go # PKCE code verifier/challenge generation
│ ├── discovery.go # OAuth server discovery (RFC 8414)
│ ├── client.go # OAuth client with DCR and token exchange
│ └── callback.go # Local HTTP server for OAuth callbacks
└── registry/
└── client.go # MCP Registry API client需求
- 转到1.21或更高版本
- OAuth服务器正在运行
http://localhost:8080与:
- /.well-known/oauth-authorization-server 或 /.well-known/openid-configuration - 动态客户端注册端点 - S256方法支持PKCE - mcp-registry:read 范围
构建
go build -o mcp-registry-client跑
./mcp-registry-clientOAuth流
应用程序执行以下步骤:
- 发现:从已知端点获取OAuth服务器元数据
- PKCE 一代:创建加密随机码验证器(128个字符)和S256挑战
- 客户注册:使用RFC 7591动态注册为OAuth客户端
- 回拨服务器:在端口3000上启动本地HTTP服务器
- 授权:打开浏览器,使用PKCE和状态参数访问授权URL
- 用户授权:用户进行身份验证并授予同意
- 回调:通过回调接收授权码,验证状态参数
- 代币交换:使用PKCE验证器交换访问令牌的授权码
- API调用:通话
/v0/servers持票人代币 - 输出:将JSON响应打印到stdout并退出
配置
此PoC的所有配置都是硬编码的:
- 注册表URL:
http://localhost:8080 - 回拨端口:
3000 - 回拨路径:
/callback - 范围:
mcp-registry:read
要修改这些值,请在中编辑常量 main.go:
const (
registryURL = "http://localhost:8080"
callbackPort = 3000
callbackPath = "/callback"
scope = "mcp-registry:read"
)安全功能
- PKCE(S256):使用SHA-256进行代码交换的强制证明密钥
- 状态参数:回调时验证随机CSRF令牌
- 持有者令牌:访问令牌仅在Authorization标头中发送(从不在URL中发送)
- 资源参数:在授权和令牌请求中包含规范注册表URI
- 精确重定向URI匹配:验证回调URL是否与注册匹配
MCP授权规范合规性
此实施遵循 MCP授权规范:
- ✓ 具有强制PKCE的OAuth 2.1(S256方法)
- ✓ RFC 8414 OAuth授权服务器元数据发现
- ✓ RFC 7591动态客户端注册
- ✓ RFC 8707资源指示器(
resource参数) - ✓ CSRF保护状态参数
- ✓ 公共客户端(无客户端秘密)
- ✓ 承载令牌身份验证
输出示例
MCP Registry OAuth Client PoC
==============================
Registry URL: http://localhost:8080
Scope: mcp-registry:read
Step 1: Discovering OAuth authorization server...
✓ Found authorization server: http://localhost:8080
- Authorization endpoint: http://localhost:8080/oauth/authorize
- Token endpoint: http://localhost:8080/oauth/token
- Registration endpoint: http://localhost:8080/oauth/register
Step 2: Generating PKCE challenge...
✓ Generated PKCE challenge (method: S256)
Step 3: Registering OAuth client...
✓ Client registered with ID: abc123def456
...
Results:
========
{
"servers": [
{
"server": { ... },
"_meta": { ... }
}
],
"metadata": {
"count": 10
}
}故障排除
浏览器不会自动打开
如果浏览器无法打开,应用程序将打印授权URL。手动复制并粘贴到浏览器中。
端口3000已在使用中
更改 callbackPort 常数in main.go 并重建。
找不到OAuth服务器
确保注册表正在运行 http://localhost:8080 并公开OAuth发现端点。
许可证
这是一个概念验证演示。请自行决定使用。
