/api/mcp MCP 服务器的访问权限。它实现了:
- RFC 7591 — 动态客户端注册
- RFC 7636 — PKCE(必需,仅 S256)
- RFC 8414 — 授权服务器元数据
- RFC 9728 — 受保护资源元数据
- RFC 9207 — 授权服务器颁发者标识
发现端点
每个传输路径都有各自的文档:客户端只有在其调用的 URL 位于所公布
resource 路径之下时才会接受该 resource。401 质询指向客户端实际调用路径所对应的文档。自行拼接该 URL(而非跟随质询)的客户端可以在此找到它;两份文档同时提供,已发现源站范围文档的客户端不受影响。
/.well-known/oauth-protected-resource 目前公布公共资源作用域 mcp。Pro 授权码授权返回内部作用域值 mcp_pro。遗留 API-key 授权与 client_credentials 返回 mcp。
端点
POST /api/oauth/register
动态客户端注册。返回 client_id(公共客户端,无 secret)。
请求:
http://localhost:<port> / http://127.0.0.1:<port>(任意端口),或与 MCP 服务器 → Redirect URI 允许列表 中托管 MCP 客户端回调地址完全一致。任何其他条目都会使整个注册返回 400 invalid_redirect_uri。
每次注册最多 8 个 redirect_uris;超出返回 400 invalid_request。
速率限制:5 次注册 / 60 秒 / IP。
客户端 TTL:90 天滑动窗口(每次成功的令牌交换都会刷新)。
GET /api/oauth/authorize
启动 OAuth 流程。它会渲染同意页并重定向到 Clerk 登录,随后签发与调用方账户绑定的授权码。该流程的 Pro 登录分支由相邻的 GET /oauth/authorize-pro 提供(客户端不会直接调用):Pro 订阅者与已确认的免费账户均可完成授权;服务方确认付费覆盖期已经结束时,账户会转入同一受限免费账户路径,保留 OAuth 身份并仅能使用按免费额度计量的 free-account 工具。无法校验的状态返回可重试的 503;不具备免费账户资格的非免费权益不足或已停用权益仍会被拒绝。
必填 query 参数:
response_type=codeclient_id— 来自 DCRredirect_uri— 必须与已注册的相匹配code_challenge— PKCE S256code_challenge_method=S256state— 不透明值scope(可选)
redirect_uri,携带 code、state(请求中提供时)与 iss。iss 为发起流程的主机 AS 元数据中的 issuer(RFC 9207);元数据公布 authorization_response_iss_parameter_supported: true。
Code TTL:10 分钟。一次性使用(交换时原子 GETDEL)。
POST /api/oauth/token
用授权码换取访问令牌,或刷新已有令牌。
Grant type: authorization_code:
refresh_token:
client_credentials 按 client_secret 哈希,有 client_id 时(authorization_code 与 refresh_token)按 client_id,两者均不可用时才回退到调用方 IP。三种授权类型在限流器未配置或抛错时均失败开放;此时响应带有 X-RateLimit-Mode: degraded(已列入 Access-Control-Expose-Headers),以便运营方与跨域客户端区分健康限流放行与降级放行。Redis 存储故障时令牌持久化仍失败关闭。
令牌 TTL:
- Access token:1 小时
- Refresh token:7 天
Cache-Control: no-store, Pragma: no-cache。
使用令牌
在每次 MCP 请求中携带访问令牌:free-account 工具;不具备免费账户资格的非免费权益不足或已停用权益仍会被拒绝。
错误响应
依据 RFC 6749 §5.2:invalid_request、invalid_client、invalid_grant、unsupported_grant_type、invalid_scope。