用途:解决远程 Hermes 网关(容器、VPS、Docker、托管服务或消息机器人)添加需 OAuth 的远程 HTTP MCP 服务器时,内置 OAuth 流程失效的问题。内置客户端在 127.0.0.1:<port> 监听回调,用户浏览器会把该地址解析到本机而非远端容器,授权码无法送达。
适用条件:服务器需 OAuth 2.1 + PKCE 且支持 RFC 7591 动态客户端注册(如 Better Stack、Linear、Cloudflare、Datadog)。不支持 DCR 的(如 GitHub)不适用,应改用预注册 OAuth App 或 PAT。本地 CLI 或可用静态 Bearer 令牌的场景不要用本方案。
优先顺序:先尝试 Hermes Dashboard(独立进程,暴露 /api/mcp/servers、/api/mcp/status、/connectors 等登录保护端点),在用户浏览器中完成 OAuth 可绕开回调问题;可用 env | grep -iE "HERMES_DASHBOARD_PUBLIC_URL|RAILWAY_PUBLIC_DOMAIN|PUBLIC_URL|BASE_URL|DOMAIN" 查找公网地址(注意脱敏)。无浏览器会话时才做手动令牌写入。
主要步骤:确认远程环境;定位 HERMES_HOME 与 config.yaml;通过 RFC 9728 元数据发现授权服务器;用 registration_endpoint 做动态注册(token_endpoint_auth_method: none,redirect_uri 用 http://127.0.0.1:8765/callback);生成 code_verifier、code_challenge(S256)、state 并构造授权 URL(含 resource 参数,RFC 8707);用户授权后粘贴回调 URL;校验 state 后在 token_endpoint 换取令牌;按 HermesTokenStorage 结构写入 $HERMES_HOME/mcp-tokens/<server>.json 与 <server>.client.json(目录 0700、文件 0600);在 config.yaml 的 mcp_servers 下配置 url、auth: oauth、timeout、connect_timeout;用 initialize 请求做冒烟测试;最后执行 /reload-mcp。
限制与注意:请求需设置 User-Agent: python-httpx/0.27 以避开 Cloudflare 403;resource 值需与元数据完全一致(含尾斜杠);scopes_supported 为空时省略 scope;/reload-mcp 失败时无提示,需查日志并手动冒烟测试;熔断器可能跨 reload 存活,必要时重启进程;手动刷新遇 invalid_grant 说明 refresh token 已失效,只能重新授权。stdio 服务器与依赖 $HERMES_HOME/.env 凭据的场景不在本方案范围内。