对 aos mcp serve 两种审批,TaoToken 与本地桥怎么分
2026/9/18 12:34:16 网站建设 项目流程

1. 先拆职责:aos mcp serve 两种审批与 TaoToken 模型鉴权不是一回事

如果你在 Claude Code 或 Codex 里挂过aos mcp serve,大概率见过两种审批界面交替出现:一种是 MCP 客户端里的受控表单,另一种是 macOS AppKit、Windows 原生对话框或 Linux Pinentry 的本地弹窗。很多人第一次配置时会把模型 API Key 填进审批桥,结果发现本地桥只接受布尔值和固定枚举,根本不收任意字符串。这里要先拆职责:模型鉴权走 TaoToken,审批交互走本地桥。TaoToken 的 Key 和 Base URL 在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=approval_intro 获取,Base URL 填https://taotoken.net/api

AOS Community Edition 把 Agent 当成操作系统里的用户态进程来管,aos mcp serve是它对外暴露的 MCP 边缘,Codex、Claude、Grok 都可以共用。这个边缘最值得注意的安全设计,就是把“谁有权调用模型”和“这次动作要不要放行”拆成了两条完全独立的链路。

  • 模型鉴权链路:由 TaoToken 负责。客户端拿到 API Key 后,把请求发到https://taotoken.net/api,TaoToken 完成鉴权、路由和计量。Token 消耗方是触发审批的那个 Agent。
  • 审批交互链路:由aos mcp serve负责。根据客户端能力不同,走 MCP 受控表单,或者走本地 AOS 决策面。审批桥只输出 allow、deny、timeout 这类固定结果,不接触模型凭据。

这两条链路一旦混在一起,就会出现很典型的故障:审批弹窗正常,但模型调用 401;或者审批桥日志里出现了不该出现的 Key 字段,导致配置直接失效。下面先把两种审批分支讲清楚,再给可复制的 Claude Code、Codex 配置,最后用日志对照帮你判断请求到底走了哪条路。

组件职责输入输出是否持有模型 Key
TaoToken API模型鉴权、路由、计量YOUR_API_KEY模型响应是,在服务端
aos mcp serveMCP 边缘、审批调度审批请求allow / deny / timeout
MCP 受控表单客户端内交互审批请求表单结果
本地 AOS 决策面无表单时兜底审批请求系统对话框结果

这张表的核心结论只有一句:审批桥永远不拿 Key,模型 Key 永远只放在模型客户端的配置里。TaoToken 负责“你是谁、你还能用多少”,本地桥负责“这次动作能不能做”。职责分开之后,审计日志、权限轮换和故障排查都会简单很多。

2. 审批分支 A:MCP 受控表单的触发条件与配置样例

当 MCP 客户端声明自己支持表单请求时,aos mcp serve会走第一条审批分支:在客户端内部持续弹出受控审批表单。用户看到的是 MCP 客户端自己的界面,而不是操作系统弹窗。这个分支适合已经支持 MCP 表单能力的客户端,交互链路短,审批结果也能直接回传给 Agent。

触发条件并不复杂:客户端能力探测返回form_request=trueaos mcp serve就会优先使用受控表单。默认的--interaction auto模式会自己做选择;如果你明确知道客户端支持表单,也可以保留 auto,让 AOS 按能力探测结果走。

在 Claude Code 里,可以用settings.json同时配置模型鉴权和 MCP 服务。注意ANTHROPIC_*只属于 Claude Code 这一侧,不要写到 Codex 的config.toml里。

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-3-5-sonnet-latest" }, "mcpServers": { "aos": { "command": "aos", "args": ["mcp", "serve", "--interaction", "auto"] } } }

如果你更习惯用环境变量启动 Claude Code,也可以这样导出:

export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY" export ANTHROPIC_MODEL="claude-3-5-sonnet-latest"

在 Codex 里则使用config.toml,模型供应商配置走model_providers,MCP 服务配置走mcp_servers。Codex 不认ANTHROPIC_*,所以不要混用。

model = "gpt-5" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat" [mcp_servers.aos] command = "aos" args = ["mcp", "serve", "--interaction", "auto"]

对应环境变量:

export TAOTOKEN_API_KEY="YOUR_API_KEY"

当客户端支持表单时,审批日志会围绕approval_form_*展开。典型流程是:approval_form_requested出现,用户提交表单,approval_form_result返回 allow 或 deny,最后 Agent 继续或挂起。整个过程中,表单只收集审批决策,不收集 API Key、密码型字段或 URL。TaoToken 的 Key 仍然只在ANTHROPIC_AUTH_TOKENTAOTOKEN_API_KEY里。

如果你用 CC Switch 管理多套环境,建议把 Claude Code 和 Codex 拆成两个 profile。Claude Code 的三件套是:

  • ANTHROPIC_BASE_URL=https://taotoken.net/api
  • ANTHROPIC_AUTH_TOKEN=YOUR_API_KEY
  • ANTHROPIC_MODEL=claude-3-5-sonnet-latest

Codex 的三件套是:

  • base_url=https://taotoken.net/api
  • env_key=TAOTOKEN_API_KEY
  • model=gpt-5

在 CC Switch 里切换时,只切换对应 profile,不要把 Claude Code 的环境变量复制到 Codex 配置里。需要创建 Key 的话,可以直接去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=cc_switch_three 进入控制台,再选择 API Keys 页面。

3. 审批分支 B:本地桥只收布尔值与固定枚举

当 MCP 客户端不支持表单请求时,--interaction auto会走第二条审批分支:本地 AOS 决策面。macOS 上是 AppKit,Windows 上是原生对话框,Linux 上是 Pinentry。你看到的不再是客户端内表单,而是操作系统级别的弹窗或终端里的密码输入界面。

这个分支的安全设计非常克制:本地桥只接受单个布尔值或固定的 AOS 审批枚举,不会收集任意字符串、密码型字段或 URL。换句话说,它只回答“放行还是拒绝”,不回答“你的 API Key 是什么”。所以不要把 TaoToken 的 Key 往审批桥里塞,塞了也不会被识别,还可能让配置校验失败。

本地桥分支不需要在 MCP 配置里额外加 Key 字段。Claude Code 和 Codex 的mcp_servers.aos配置可以保持不变,仍然使用:

{ "command": "aos", "args": ["mcp", "serve", "--interaction", "auto"] }

如果你在 Linux 上发现审批弹不出来,先检查 Pinentry 是否安装并能在当前终端会话中启动。例如:

command -v pinentry pinentry --version

如果命令不存在,需要先安装对应发行版的 Pinentry 包。macOS 上如果 AppKit 弹窗没有出现,检查当前运行环境是否有图形会话权限,比如是否通过 SSH 连接却没有转发图形界面。Windows 上则检查原生对话框是否被安全策略拦截。这些都属于本地决策面的运行条件,和 TaoToken 的模型鉴权无关。

本地桥的日志关键字是local_bridge_decision。典型成功日志如下:

[aos.mcp.serve] client_capability: form_request=false [aos.mcp.serve] local_bridge_decision surface=pinentry decision=allow [aos.mcp.serve] agent_resume id=appr_7f3a

这里surface表示实际使用的决策面:macOS 可能是appkit,Windows 可能是native_dialog,Linux 可能是pinentrydecision只会是 allow、deny 或 timeout。日志里不会出现api_keytokenpassword这类字段。如果出现了,说明配置层把不该传的东西传进了审批桥,需要立即拆开。

审批通过之后,Agent 才会带着自己的模型配置去调用 TaoToken。也就是说,Token 消耗发生在模型调用阶段,审批桥只负责在动作执行前加一道闸门。

4. 完整配置:Claude Code、Codex 与 CC Switch 三件套

这一节把配置集中到一处,方便直接复制。先明确原则:Claude Code 用settings.jsonANTHROPIC_*,Codex 用config.tomlmodel_providers,两者不交叉。CC Switch 只做 profile 切换,不改变底层字段含义。

Claude Code 的settings.json可以这样写:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-3-5-sonnet-latest" }, "mcpServers": { "aos": { "command": "aos", "args": ["mcp", "serve", "--interaction", "auto"] } } }

保存后可以用下面的命令检查 JSON 是否合法:

python -m json.tool ~/.claude/settings.json

如果你把配置放在项目目录,路径换成实际文件即可。注意YOUR_API_KEY要替换成你在 TaoToken 控制台创建的 Key,不要保留占位符。

Codex 的config.toml可以这样写:

model = "gpt-5" model_provider = "taotoken" model_reasoning_effort = "high" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat" [mcp_servers.aos] command = "aos" args = ["mcp", "serve", "--interaction", "auto"]

然后设置环境变量:

export TAOTOKEN_API_KEY="YOUR_API_KEY"

如果你使用 CC Switch,建议建立两个 profile:

Claude Code profile:

ANTHROPIC_BASE_URL=https://taotoken.net/api ANTHROPIC_AUTH_TOKEN=YOUR_API_KEY ANTHROPIC_MODEL=claude-3-5-sonnet-latest

Codex profile:

base_url=https://taotoken.net/api env_key=TAOTOKEN_API_KEY model=gpt-5

切换 profile 后,记得重启对应的客户端,让新的环境变量和 MCP 服务配置生效。aos mcp serve本身不需要重启整个 AOS,但客户端如果缓存了能力探测结果,重启一次更稳妥。

这里再强调一次:不要把ANTHROPIC_*写进 Codex 的config.toml,也不要把 Codex 的env_key写成 Claude Code 的ANTHROPIC_AUTH_TOKEN。字段名不同,读取逻辑也不同。混用的结果通常是模型调用 401,而审批弹窗却看起来完全正常,很容易误判成 AOS 的问题。

TaoToken 的官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=full_config,需要看可用模型或创建 Key 时可以从这里进入。

5. 日志对照:审批通过、拒绝、超时分别怎么排查

审批分支和模型鉴权分开之后,日志也会分成两类:审批日志和模型调用日志。排查时先看审批日志,确认 Agent 是否被放行;再看模型调用日志,确认 TaoToken 鉴权是否成功。

MCP 受控表单分支的通过日志:

[aos.mcp.serve] client_capability: form_request=true [aos.mcp.serve] approval_form_requested id=appr_7f3a action=fs.write path=/tmp/demo.txt [aos.mcp.serve] approval_form_result id=appr_7f3a decision=allow [aos.mcp.serve] agent_resume id=appr_7f3a

本地桥分支的通过日志:

[aos.mcp.serve] client_capability: form_request=false [aos.mcp.serve] local_bridge_decision surface=pinentry decision=allow [aos.mcp.serve] agent_resume id=appr_7f3a

拒绝日志:

[aos.mcp.serve] approval_form_result id=appr_7f3a decision=deny [aos.mcp.serve] agent_suspend id=appr_7f3a reason=user_denied

超时日志:

[aos.mcp.serve] local_bridge_decision surface=appkit decision=timeout [aos.mcp.serve] agent_suspend id=appr_7f3a reason=approval_timeout

从这些日志里可以读出几个关键判断:

  • 出现approval_form_*:走了 MCP 受控表单分支。客户端支持表单,审批在客户端内完成。
  • 出现local_bridge_*:走了本地 AOS 决策面。客户端不支持表单,审批在操作系统层完成。
  • decision=allow:Agent 继续执行,随后才会发生模型调用和 Token 消耗。
  • decision=deny:Agent 被挂起,不会继续调用模型。
  • decision=timeout:Agent 同样被挂起,需要重新发起审批或调整超时策略。

如果审批通过但模型调用失败,先检查模型客户端的配置,而不是审批桥。Claude Code 侧重点看:

echo $ANTHROPIC_BASE_URL echo $ANTHROPIC_AUTH_TOKEN

Codex 侧重点看:

echo $TAOTOKEN_API_KEY

同时确认config.toml里的base_urlhttps://taotoken.net/apienv_key指向的环境变量名和实际导出的变量名一致。常见错误是env_key = "TAOTOKEN_API_KEY",但环境变量只导出了ANTHROPIC_AUTH_TOKEN,Codex 自然读不到。

如果本地桥不弹窗,排查顺序可以按下面走:

  1. 确认aos mcp serve进程还在运行。
  2. 确认客户端能力探测结果,日志里form_request=false才会走本地桥。
  3. Linux 检查pinentry是否可用;macOS 检查 AppKit 图形权限;Windows 检查原生对话框策略。
  4. 检查是否有其他审批代理抢先处理了请求。
  5. 查看agent_suspend原因,区分 deny 和 timeout。

整个排查过程中,审批桥不会打印 API Key。如果你在审批相关日志里看到 Key 片段,说明 Key 被错误地传到了审批层,需要立刻回到配置文件里把模型鉴权和审批交互拆开。

6. 安全边界:为什么 TaoToken 和本地桥必须分开

把 TaoToken 和本地桥分开,不只是为了配置整洁,而是为了安全边界清晰。审批桥的设计目标非常窄:它只回答“这次动作是否放行”。本地桥只接受布尔值或固定 AOS 审批枚举,不收集任意字符串、密码型字段或 URL。这意味着它天然不适合、也不应该承载模型 API Key。

如果硬把 Key 塞进审批桥,会带来几个问题:

  • 配置校验失败:本地桥不接受任意字符串,Key 传进去也无法生效。
  • 审计日志污染:审批日志可能记录表单字段,敏感信息会进入日志系统。
  • 权限扩散:审批桥一旦持有 Key,所有经过审批的 Agent 都可能间接获得模型调用权限。
  • 轮换困难:Key 和审批策略耦合后,无法单独轮换 Key 或调整审批规则。

更合理的做法是:

  1. Key 只放在模型客户端的环境变量或配置文件中,例如 Claude Code 的ANTHROPIC_AUTH_TOKEN,Codex 的TAOTOKEN_API_KEY
  2. 审批桥只传 allow、deny、timeout,不传凭据。
  3. 审批日志和模型调用日志分开存储,前者关注动作权限,后者关注 Token 消耗。
  4. 使用 CC Switch 时,Claude Code profile 和 Codex profile 各自独立,不要复制粘贴字段。
  5. 定期在 TaoToken 控制台轮换 Key,轮换后只更新模型客户端配置,不需要动审批桥。

从 Token 消耗角度看,触发审批的 Agent 才是消耗方。审批通过后,Agent 使用模型客户端里的 Key 调用https://taotoken.net/api,TaoToken 记录用量。审批桥不参与计量,也不应该参与计量。这样拆分之后,你既能审计“谁批准了动作”,也能审计“谁消耗了 Token”,两个问题互不干扰。

如果你需要进一步收紧权限,可以把不同项目拆成不同的 TaoToken Key,再通过 CC Switch 切换 profile。审批策略仍然由aos mcp serve统一管理,模型权限则由 Key 的权限范围控制。一个管动作,一个管模型,边界清楚,排障也快。

安全边界相关配置和 Key 管理入口可以走 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=security_boundary,进入控制台后创建或轮换 API Key。

7. 文末 CTA:按路径拿 Key 并接入

如果你已经理解两种审批分支,接下来按顺序完成接入即可。

  1. 先看模型对话页,确认可用模型和基础调用方式:
    https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=cta_chat

  2. 如果需要更稳定的 Coding 额度,查看 Coding Plan:
    https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=cta_plan

  3. 创建 API Key,替换配置里的YOUR_API_KEY
    https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=cta_keys

  4. 查看 Claude Code 接入文档,核对settings.jsonANTHROPIC_*写法:
    https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=cta_claude_doc

  5. 官网总入口:
    https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=cta_home

最后再回到本篇的核心结论:aos mcp serve的两种审批分支,一种走 MCP 受控表单,一种走本地 AOS 决策面;TaoToken 负责模型鉴权,Base URL 填https://taotoken.net/api;本地桥只收布尔值和固定枚举,不碰 API Key。Token 消耗方是触发审批的 Agent。把这三件事分清楚,审批弹窗、模型调用和日志审计就能各归其位,排障时也不会再把 401 和审批超时混为一谈。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询