From 4b924674a3a2ac75e96960a52390c47773a63a6e Mon Sep 17 00:00:00 2001 From: ringo Date: Thu, 10 Sep 2026 11:36:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(plugin):=20Codex=20=E4=BE=A7=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=20OAuth=20=E6=B5=8F=E8=A7=88=E5=99=A8=E7=99=BB?= =?UTF-8?q?=E5=BD=95=EF=BC=88v0.2.0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - .mcp.json 移除 bearer_token_env_var:401 后由 Codex 自动进入 OAuth 2.1 授权流程 (服务端 https://deta.city 提供 discovery/DCR/PKCE/token/refresh/revoke) - 安装流程改为 codex plugin add + codex mcp login deta(浏览器里完成账号登录) - 保留登录助手与 DETA_TOKEN 路径,供 dsh/脚本/CI 使用(README 分节说明) - 插件版本 0.1.0 -> 0.2.0(市场按版本刷新缓存) --- README.md | 23 +++++++--- plugins/deta/.codex-plugin/plugin.json | 2 +- plugins/deta/.mcp.json | 3 +- plugins/deta/README.md | 58 ++++++++++++++++++-------- 4 files changed, 59 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index cac3649..e9e95c8 100644 --- a/README.md +++ b/README.md @@ -16,10 +16,6 @@ DETA 领域能力在各类 Agent harness 上的分发仓:**一份产物,多 ## 安装(Codex) ```bash -# 先登录(一次性,需要 deta.city 账号):换取 DETA_TOKEN -node ~/Dev/ant/deta-agent-plugins/plugins/deta/bin/deta-login.mjs -source ~/.deta/env # 让 DETA_TOKEN 进入当前 shell 环境 - # 从 Git(分发用) codex plugin marketplace add https://git.deta.city/deta/deta-agent-plugins.git @@ -28,10 +24,25 @@ codex plugin marketplace add ~/Dev/ant/deta-agent-plugins codex plugin list codex plugin add deta@deta + +# 登录(一次性):打开浏览器完成 deta.city 账号登录 +codex mcp login deta ``` -未登录(环境里没有 `DETA_TOKEN`)时,MCP 端点会返回 **401**——含义是 -「当前环境没有可用的 deta.city 登录态」,重新执行上面的登录两步即可。 +`codex mcp login deta` 走 OAuth 2.1(授权码 + PKCE S256 + 动态客户端注册):终端给出 +`https://deta.city/oauth/authorize?...`,在浏览器里用 deta.city 账号登录并授权即可, +随后 Codex 自行保管令牌并按 refresh token 自动续期。退出登录用 `codex mcp logout deta`。 + +不支持 OAuth 的宿主(dsh / 脚本 / CI)改用登录助手换取 `DETA_TOKEN`: + +```bash +node ~/Dev/ant/deta-agent-plugins/plugins/deta/bin/deta-login.mjs +source ~/.deta/env # 让 DETA_TOKEN 进入当前 shell 环境 +``` + +未登录时 MCP 端点返回 **401**,并带 OAuth 发现提示头 +(`WWW-Authenticate: Bearer resource_metadata="https://deta.city/.well-known/oauth-protected-resource/mcp-api/mcp"`)—— +标准 MCP 客户端据此自动进入浏览器授权流程,含义是「当前环境没有可用的 deta.city 登录态」。 ## 内容 diff --git a/plugins/deta/.codex-plugin/plugin.json b/plugins/deta/.codex-plugin/plugin.json index dce24f6..e1e4f0f 100644 --- a/plugins/deta/.codex-plugin/plugin.json +++ b/plugins/deta/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "deta", - "version": "0.1.0+codex.20260910023121", + "version": "0.2.0", "description": "DETA \u5efa\u7b51\u6027\u80fd\u8bbe\u8ba1\u63d2\u4ef6\uff1a\u4ee5 AML \u4e3a\u552f\u4e00\u4e8b\u5b9e\u6e90\u7f16\u8f91\u5efa\u7b51\u6a21\u578b\uff0c\u7ecf GSA \u7f16\u8bd1\u4e3a\u5efa\u7b51\u6a21\u578b\u5e76\u505a\u89c4\u5219\u6821\u9a8c\u3002", "author": { "name": "DETA", diff --git a/plugins/deta/.mcp.json b/plugins/deta/.mcp.json index 1731cac..6aa8014 100644 --- a/plugins/deta/.mcp.json +++ b/plugins/deta/.mcp.json @@ -2,8 +2,7 @@ "mcpServers": { "deta": { "type": "streamable-http", - "url": "https://deta.city/mcp-api/mcp", - "bearer_token_env_var": "DETA_TOKEN" + "url": "https://deta.city/mcp-api/mcp" } } } diff --git a/plugins/deta/README.md b/plugins/deta/README.md index 3514045..f6a0ef9 100644 --- a/plugins/deta/README.md +++ b/plugins/deta/README.md @@ -9,40 +9,62 @@ DETA 领域能力(AML 建筑模型读写、编译校验、围护结构统计 | 项 | 值 | |----|-----| | 端点 | `https://deta.city/mcp-api/mcp`(MCP Streamable HTTP) | -| 凭据来源 | **deta.city 账号**(令牌经 `POST https://deta.city/prod-api/login` 换取) | -| 传参方式 | 环境变量 `DETA_TOKEN`(Codex 侧 `bearer_token_env_var`;dsh 侧 `Authorization: Bearer ${DETA_TOKEN}`) | +| 凭据来源 | **deta.city 账号**;两种取得方式:OAuth 浏览器登录(推荐)或换令牌后手工传 | +| Codex 侧 | OAuth 2.1(授权码 + PKCE S256,动态客户端注册),由 `codex mcp login deta` 发起;令牌由 Codex 保管并自动续期,无需手工配置 | +| dsh / 脚本 | 环境变量 `DETA_TOKEN`,作为 `Authorization: Bearer` 或 `X-API-Key` 发送 | 端点除探活接口(服务端 `GET /health`,经 Nginx 前缀对外为 `/mcp-api/health`)外**全部需要鉴权**: -- 请求未带凭据、凭据失效/过期 → **401**(响应体为可读提示,不回显凭据)。 - 401 的含义是「当前环境没有可用的 deta.city 登录态」,不是工具或模型出错; - 重新执行 `node bin/deta-login.mjs` 并 `source ~/.deta/env` 即可。 +- 无凭据 / 凭据失效 → **401**,且响应带 OAuth 发现提示: + `WWW-Authenticate: Bearer resource_metadata="https://deta.city/.well-known/oauth-protected-resource/mcp-api/mcp", scope="mcp"` + 标准 MCP 客户端据此**自动进入浏览器授权流程**(Codex 走的就是这条),无需手工配令牌。 + 401 的含义是「当前环境没有可用的 deta.city 登录态」,不是工具或模型出错。 - 服务端认证服务不可用(`ANT_ADMIN_SERVER` 未配置或不可达)→ 500,同样不放行。 账号的工作区在服务端按账号隔离(`<工作区根>/<账号 ID>`), 不同账号的设计源码互不可见;同一账号的新会话继续使用自己的工作区。 -## 安装(Codex) +## 安装与登录(Codex) ```bash -# 1. 先登录(一次性;需要 deta.city 账号) -node ~/Dev/ant/deta-agent-plugins/plugins/deta/bin/deta-login.mjs -# → 写入 ~/.deta/credentials.json 与 ~/.deta/env(均 0600) - -# 2. 让 DETA_TOKEN 进入当前 shell 环境 -source ~/.deta/env - -# 3. 安装插件 +# 1. 添加市场并安装插件 codex plugin marketplace add https://git.deta.city/deta/deta-agent-plugins.git codex plugin add deta@deta + +# 2. 登录(一次性):浏览器里完成 deta.city 账号登录 +codex mcp login deta ``` -登录助手选项: +`codex mcp login deta` 会打印一条形如 +`https://deta.city/oauth/authorize?response_type=code&client_id=…&code_challenge=…` 的地址并打开浏览器; +页面上用 deta.city 账号登录(支持「账号密码」与「邮箱验证码」两个入口),点「登录并授权」后 +浏览器提示 `Authentication complete`,终端输出 `Successfully logged in to MCP server 'deta'`。 + +登录态由 Codex 保存,access token 有效期 1 小时并用 refresh token 自动续期; +换机器或换 `CODEX_HOME` 需重新 `codex mcp login deta`。退出登录: ```bash -node bin/deta-login.mjs -u <用户名|已验证邮箱|已验证手机号> # 免交互输入标识 -node bin/deta-login.mjs --email-code <邮箱> # 邮箱验证码登录(未设密码的账号用) -node bin/deta-login.mjs --base-url https:// # 自建/预发环境 +codex mcp logout deta # 撤销并删除本地凭据 +``` + +插件默认走 OAuth。若要把令牌固定为环境变量(自动化、容器、CI),装好后改为: + +```bash +codex mcp remove deta +codex mcp add deta --url https://deta.city/mcp-api/mcp --bearer-token-env-var DETA_TOKEN +export DETA_TOKEN=<管理端签发的 API Key 或门户登录令牌> +``` + +### 登录助手(dsh / 脚本 / 预发环境) + +OAuth 之外仍保留令牌方式,供不支持 OAuth 的宿主与脚本使用: + +```bash +node bin/deta-login.mjs # 交互式:读标识与密码,写 ~/.deta/* +node bin/deta-login.mjs -u <用户名|已验证邮箱|已验证手机号> # 免交互输入标识 +node bin/deta-login.mjs --email-code <邮箱> # 邮箱验证码登录(未设密码的账号用) +node bin/deta-login.mjs --base-url https:// # 自建/预发环境 +source ~/.deta/env # 导出 DETA_TOKEN ``` **标识(identifier)填门户登录页上用的那一个**:用户名、已验证邮箱、已验证手机号,服务端都会解析到同一账号。