Skip to main content
远程 MCP 服务器通常需要授权。Inspector 在三个客户端中均实现了完整的授权流程,并将生成的令牌共享存储在磁盘上,因此只需登录一次即可在所有地方使用。

端到端的流程

1

连接,并收到拒绝

Inspector 连接到服务器 URL。服务器返回 401。当响应包含 WWW-Authenticate 标头时,其中会指向受保护资源元数据 URL (resource_metadata),以及请求所需的作用域(如果有)。
2

发现授权服务器

Inspector 获取服务器的受保护资源和 授权服务器 元数据, 以了解端点和支持的授权授予类型。
3

注册或识别客户端

Inspector 通过已配置的机制向授权服务器标识自身:包括动态客户端 注册、 预注册的静态客户端(--client-id / --client-secret)、客户端 ID 元数据 文档--client-metadata-url),或企业管理的 IdP
4

在浏览器中授权

Inspector 打开授权 URL。您登录并同意授权。
5

接收回调

授权服务器重定向到 Inspector 的回调 URL,并携带授权码。
6

交换并重试

授权码被交换为令牌,令牌会被持久化保存,原始连接(或对于会话中途的挑战, 被拒绝的请求)会自动重试。

OAuth 流程完成后的连接信息:授权状态、动态注册的客户端以及已授予的作用域。

回调 URL

Web 应用在其自身的 URL 上监听 OAuth 回调,而 CLI 和 TUI 则有意共享第二个 URL: 在使用 CLI 或 TUI 之前,请在任何要求预先注册重定向 URI 的 IdP 上注册 http://127.0.0.1:6276/oauth/callback。可预测的默认值正是其意义所在:注册一次,重复使用。 使用 --callback-urlMCP_OAUTH_CALLBACK_URL 覆盖。
回调 URL 必须绑定回环主机localhost127.0.0.0/8[::1]。监听器通过明文 http 接收授权码,因此非回环主机会被拒绝并返回错误,且没有任何标志可覆盖此限制。如果浏览器运行在另一台机器上,请将回调端口转发到该机器;--print-handoff(如下所述)会打印现成的 portForwardCmd
重定向 URI 必须与注册信息完全匹配。对于授权服务器而言,http://localhost:6276/...http://127.0.0.1:6276/... 是不同的 URI,尽管它们会到达同一个监听器。同一时间只能有一个进程占用默认端口;第二个并发流程会因 EADDRINUSE 失败。为每个实例使用不同的固定端口;当你的授权服务器支持动态重定向 URI 注册时,也可以使用 http://127.0.0.1:0/oauth/callback,让操作系统分配临时端口。

凭据存放位置

oauth.json 的路径按以下顺序解析:MCP_INSPECTOR_OAUTH_STATE_PATH,然后是 <MCP_STORAGE_DIR>/oauth.json(参见环境变量),最后是上述默认路径。三个客户端均以相同方式解析该路径。命令行中的 --client-id / --client-secret / --client-metadata-url 会覆盖 client.json

会话中途重新授权

服务器可以在会话中途使用 401403 insufficient_scope 拒绝某个请求,而 Inspector 会在不中断连接的情况下处理这两种情况:
  • 重新授权:令牌已过期或被撤销。Inspector 解析 WWW-Authenticate 挑战并重新执行授权流程,然后重试失败的请求。
  • 升级授权:请求需要当前令牌未包含的作用域。Inspector 会针对当前已持有作用域与所需作用域的并集重新授权,因此新令牌将覆盖旧令牌的全部作用域,并包含新要求的作用域。
Web 客户端中,这会显示为重新授权横幅。在 CLI 中,则会在 stderr 上提示:
回答 y 以继续。只要输入以换行符结尾或 stdin 关闭,管道输入也可以正常工作(echo y | ...)。输入 N,或未作答即遇到 EOF,都会拒绝授权。非 TTY stdin 在 5 秒内没有发送任何内容时,会以 auth_required 失败;这与明确拒绝是不同的情况。企业管理的升级授权会静默地重新签发令牌,不显示提示。

非交互式运行和 CI 运行

交互式 OAuth 要求 stdin 或 stderr 上有 TTY,或设置 MCP_AUTO_OPEN_ENABLED=true。将 stderr 重定向到管道(例如 2>&1 | tee)仍然有效,因为 stdin 仍是 TTY。当两者都不满足时(这正是 CI 中的常见情况),CLI 会快速失败并返回 auth_required,而不是等待长达十五分钟,去等待一个不会有人完成的回调。 对于 CI,请明确指定:
--stored-auth-only 永远不会启动交互式 OAuth 或升级验证,不会打开浏览器;如果共享存储中存在令牌,则使用该令牌,否则立即失败。

从 Web 客户端切换到 CLI

常见情况:用户已在此计算机上的 Web Inspector 中完成 OAuth,现在脚本需要使用该令牌。 典型的远程 VM 流程:
交接信息块中的 deepLink 会将浏览器直接导航到一个_已连接_的 Inspector;请参阅深层链接
由于已存储的条目不记录过期时间,因此每次运行 --use-stored-auth 时都会使用已存储的刷新令牌。对于轮换型(单次使用)刷新令牌,这会产生两个较小的故障窗口:针对同一状态文件的两个并发调用可能会争抢令牌,而在刷新成功与回写之间发生崩溃,则会导致轮换后的令牌未被保存。两种情况都不太可能发生;重新在 Web 客户端中进行授权即可恢复。

检查身份验证状态

  • Web:连接信息面板显示发现结果、已注册的客户端、已授予的作用域和令牌状态,并提供针对当前服务器的清除 OAuth 状态功能。
  • TUI身份验证选项卡(a)显示相同的字段,并以相同方式清除状态。
  • CLI--list-stored-auth 显示磁盘上的内容,而 --relogin 丢弃这些内容并重新开始。