使用说明
# MCP Auth Proxy (Go)
基于 docs/mcp-gateway-auth-design.md 实现的 Go 版本地 MCP Auth Proxy,用于给第三方智能体提供一个带 OAuth2 PKCE 登录、Token 缓存/刷新、MCP 请求转发能力的本地代理。
已实现能力
- 暴露本地
POST /mcp - 暴露
GET /auth/callback - 暴露
GET /auth/status - 暴露
POST /auth/login - 暴露
POST /auth/logout - 使用
Authorization Code + PKCE - 自动拉起浏览器登录
- 本地保存 Token,并在 Windows 上用 DPAPI 加密落盘
- Access Token 过期前自动刷新
- 上游网关返回
401 token_expired时自动刷新并重试一次 - 支持从
.env配置文件读取代理配置 - 内置可独立运行的 mock 鉴权中心
环境变量
MCP_PROXY_CONFIG_FILE:可选,读取.env配置文件MCP_PROXY_LISTEN_ADDR:默认127.0.0.1:8765MCP_PROXY_UPSTREAM_MCP_URL:必填,远端网关POST /mcp地址MCP_PROXY_AUTHORIZE_URL:必填,鉴权中心授权地址MCP_PROXY_TOKEN_URL:必填,鉴权中心 Token 地址MCP_PROXY_CLIENT_ID:必填,本地代理注册的client_idMCP_PROXY_SCOPE:默认mcp.invoke mcp.readMCP_PROXY_REDIRECT_URL:默认按监听地址生成,例如http://127.0.0.1:8765/auth/callbackMCP_PROXY_CALLBACK_PATH:默认/auth/callbackMCP_PROXY_TOKEN_FILE:Token 本地存储文件路径MCP_PROXY_AUTO_OPEN_BROWSER:默认trueMCP_PROXY_REFRESH_SKEW:默认60sMCP_PROXY_LOGIN_STATE_TTL:默认10mMCP_PROXY_TOKEN_TIMEOUT:默认15s
运行方式
$env:MCP_PROXY_UPSTREAM_MCP_URL="http://gateway.example.com/mcp"
$env:MCP_PROXY_AUTHORIZE_URL="http://auth.example.com/oauth2/authorize"
$env:MCP_PROXY_TOKEN_URL="http://auth.example.com/oauth2/token"
$env:MCP_PROXY_CLIENT_ID="local-mcp-proxy"
go run ./cmd/mcp-proxy
或使用配置文件:
$env:MCP_PROXY_CONFIG_FILE="configs/proxy.env.example"
go run ./cmd/mcp-proxy
Mock 鉴权中心
仓库内新增了一个可独立运行的 mock OAuth2 鉴权中心:
- 入口:
cmd/mock-auth-center - 授权端点:
GET /oauth2/authorize - Token 端点:
POST /oauth2/token - Introspect 端点:
POST /oauth2/introspect
Mock 鉴权中心环境变量:
MOCK_AUTH_CONFIG_FILE:可选,读取.env配置文件MOCK_AUTH_LISTEN_ADDR:默认127.0.0.1:18080MOCK_AUTH_ISSUER:默认http://127.0.0.1:18080MOCK_AUTH_CLIENT_ID:默认local-mcp-proxyMOCK_AUTH_DEFAULT_USER_ID:默认u12345MOCK_AUTH_DEFAULT_USER_NAME:默认zhangsanMOCK_AUTH_DEFAULT_SCOPE:默认mcp.invoke mcp.readMOCK_AUTH_ACCESS_TTL:默认5mMOCK_AUTH_REFRESH_TTL:默认12hMOCK_AUTH_CODE_TTL:默认2mMOCK_AUTH_INTERACTIVE:默认falseMOCK_AUTH_AUTO_APPROVE:默认true
说明:
GET /、GET /health使用统一响应信封POST /oauth2/token、POST /oauth2/introspect保持 OAuth/OIDC 兼容响应- OAuth 错误响应会额外附带
display_message、trace_id、timestamp
运行示例:
$env:MOCK_AUTH_CONFIG_FILE="configs/mock-auth.env.example"
go run ./cmd/mock-auth-center
本地联调
- 启动 mock 鉴权中心:
go run ./cmd/mock-auth-center - 启动代理:
go run ./cmd/mcp-proxy - 访问
http://127.0.0.1:8765/auth/status检查登录状态 - 向
POST http://127.0.0.1:8765/auth/login发请求,或直接让智能体请求/mcp - 浏览器完成回调后,再次发起 MCP 请求
说明:configs/proxy.env.example 里的 MCP_PROXY_UPSTREAM_MCP_URL 仍需指向你的真实网关或本地 mock 网关。
第三方智能体接入
把 MCP 地址配置为:
http://127.0.0.1:8765/mcp
首次访问若未登录,代理会返回结构化错误并自动拉起浏览器;完成登录后重试同一个 MCP 请求即可。
接口规范
- 统一接口设计稿:
docs/proxy-api-design.md