Skip to content

MCP 技能支持 OAuth 授权,由节点上的 CLI 完成登录 - #131

Merged
wxkingstar merged 1 commit into
mainfrom
claude/mcp-oauth-login
Oct 12, 2026
Merged

wxkingstar merged 1 commit into
mainfrom
claude/mcp-oauth-login

Conversation

@wxkingstar

Copy link
Copy Markdown
Owner

背景

有的远程 MCP 服务只能 OAuth 登录,例如 Figma 官方 MCP(https://mcp.figma.com/mcp)。按设计稿高还原写代码需要它的设计上下文、变量和 Code Connect。实测下来:

  • CoreMan 去它的动态客户端注册接口登记,一律返回 403,回调地址无论填网页还是本机都一样。Figma 只放行官方名单里的客户端。
  • Codex 和 Claude Code 在名单里。它们的 mcp login --no-browser 会打印授权链接,同时在本机回环端口等待回调。在无界面的服务器节点上,把浏览器停住的回调地址交回去,就能完成登录。
  • 两个 CLI 都按「服务名 + 地址」保存令牌:同一地址换个服务名,就是另一份登录。

所以授权交给 AI 员工所在实例上的 CLI 完成,令牌留在 CLI 自己的凭据存储里,CoreMan 不保存令牌。

改动

  • 标记:新增 skills.mcp_oauth(迁移 0063),只能用于 http/sse 服务。技能编辑器加了「需要 OAuth 授权」开关;仓库同步时,没有 headers 的远程服务自动打上这个标记。
  • 按员工命名:带标记的技能安装时,以 <技能名>-<员工 ID 前 8 位> 写入 .mcp.json,并删掉同名旧条目。这样同一节点上的员工各用各的授权;Codex 下的挂载名是 skill_<该名字>。
  • 节点操作 mcp-login-start / mcp-login-complete / mcp-logout,节点通过 ping 返回 mcp_oauth: 1 表示支持:
    • CLI 在 pty 里运行:Claude 要求输入端是终端;终端宽度设大,避免链接被折行。Claude Code 会先把同名、同配置的服务登记到项目的 local 作用域,因为 claude mcp login 不接受未经交互批准的 .mcp.json 服务。
    • 收到回调地址时,只接受本次会话的回环地址,主机、端口、路径和 state 都要一致。只把查询串送到 CLI 的回环端口,成败看 CLI 的退出码。
    • 会话 10 分钟后过期,到期会主动结束 CLI 进程。登录不占用实例的操作锁。
    • 撤销授权时,Codex 在没有系统钥匙串的 Linux 上默认注销会失败,这时改用文件存储模式再试一次。
  • 接口:POST|DELETE /api/admin/bots/{bot}/skills/{skill}/mcp-login,以及 POST …/mcp-login/complete,仅限员工创建者和员工管理员调用。授权成功后记录授权人、时间和实例(bot_skills.mcp_authorized_*),并写审计 skill.mcp_authorized、skill.mcp_revoked。授权码不进审计。节点版本过旧时,提示先升级。
  • 前端:员工技能列表显示「未授权 / 已由 X 授权 / 需重新授权(员工换了运行时)」,并提供「授权」「撤销授权」按钮。授权对话框引导用户打开链接,再把回调地址粘贴回来。界面文案有中、日、英三种。

验证

  • Python 全量测试 3059 通过(另有 2 个跳过);mypy、ruff 无报错。新增测试:
    • 节点侧 19 个:用假 CLI 跑通完整流程;回调被篡改时拒绝;会话绑定到员工;不支持 OAuth 的服务;跳转到非本机地址;注销回退;不占实例锁;到期清理;按员工命名安装。
    • API 8 个:按员工命名安装;授权、记录与撤销;换实例后需重新授权;旧节点提示升级;节点原因透传;权限与状态校验;编辑器校验。
    • 同步 1 个:无请求头的远程服务自动标记 OAuth。
  • Web:lint、类型检查通过,vitest 58 个文件 324 个测试全过,新增授权流程和换实例两个用例。
  • 用本机真实的 Codex 0.156 和 Claude Code 2.1.293 跑节点代码:两者都拿到了 Figma 的授权链接,CLI 也在回环端口监听。Codex 在服务器节点上已用真实 Figma 账号完成过一次授权。
  • 还没做真实端到端验证:在管理台完成授权后,员工在对话里实际调用 Figma 工具。要等发布、节点升级之后再验。

发布

需要迁移 0063。运行时节点要升级。节点升级后,已安装的 OAuth 技能需要点「升级」或重新安装,才会换成按员工命名的服务名。

🤖 Generated with Claude Code

Figma 官方 MCP 等远程服务只认 OAuth,且只放行登记过的客户端(Codex、Claude Code),
CoreMan 自己注册会被拒。改为让员工所在实例的 CLI 登录,令牌留在 CLI 的凭据存储:

- skills.mcp_oauth 标记需要 OAuth 的远程 MCP;仓库同步时无请求头的远程服务自动标记
- 标记的技能按员工命名写入 .mcp.json(<技能名>-<员工 ID 前 8 位>),同节点员工各自授权
- 节点新增 mcp-login-start / complete / logout:pty 里运行 mcp login --no-browser,
  取回授权链接;回调地址校验主机、端口、路径和 state 后送到 CLI 的回环端口
- 员工技能列表显示授权状态,授权对话框引导打开链接、粘贴回调地址;换实例需重新授权
- 迁移 0063

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@wxkingstar
wxkingstar merged commit 8b7adb3 into main Oct 12, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant