1. 对比表里最该较真的那一列:token 效率
Skills、Tools、MCP、Subagents、Hooks 这五个词,在 2026 年的各种 AI Agent 文章里几乎每篇都会出现。常见的对比表会把场景适用性、token 效率、维护成本、组合方式各给一行结论,乍看很清楚,真要落地时就露馅了:场景适应性还可以凭经验判断,维护成本多做几个项目也有体感,唯独 token 效率这一列,官方文档不会告诉你具体数值,别人博客里的说法又可能过期。我在 TaoToken(https://taotoken.net/?utm_source=taotoken_aicg_blog_end )上配好了 API Key 之后想认真做一次验证,与其继续看别人表格里写的「MCP 极高」「Tools 一般」,不如让 Codex 自己把五类组件各跑一个小用例,最后回控制台看每一次调用的 token 记录,用真实数字回答这个疑问。
原始对比表给的核心结论是:Skills 靠原子化避免冗余,MCP 靠上下文聚合与分发最大化 token 复用,Tools 和 Hooks 受调用方式限制表现一般,Subagents 在并行任务里可能增加消耗但合理拆分可优化。这几句话作为定性没问题,问题在于「高」「一般」「可优化」到底差多少,没有实测你根本判断不了自己该用哪种。所以我这次的做法是:先按原文表格拆出五个可执行的小任务,再让 Codex 在同一个项目里各跑一遍,最后对比四次调用的 token 数字。
1.1 原文表格的五列结论,先落在任务上
原文把五类组件拆成了这几个关键维度:
- Skills:原子化、可组合,适合复杂流程动态编排,token 效率高,维护成本低。
- Tools:点状集成、上手快,适合标准低变动场景,token 效率一般,后期易碎片化。
- MCP:多模型协作、跨系统集成,上下文聚合与分发,token 效率极高,但需要理解协议。
- Subagents:多步推理、任务分解、并行处理,token 效率依赖拆分策略。
- Hooks:事件驱动、横切扩展,token 效率一般,滥用会导致复杂度上升。
如果你只是写业务代码,Tools 就够用;如果你在搭多 Agent 协作系统,Skills 和 Subagents 的组合会明显顺手;如果跨系统调用频繁,MCP 的价值不在功能多强,而在省掉一层层重复的上下文携带。可如果你问「省多少」「多花多少」,表格里的文字回答不了。这就是我坚持要实测的原因。
1.2 为什么让 Codex 当执行者,而不是自己写脚本模拟
Token 消耗是模型聊天接口计费的真实行为,自己写脚本去 curl 一次接口,测出来的是单次请求的 token 数,跟 Agent 工具运行时把多轮上下文拼在一起的区别很大。Codex 这类编码 Agent 会把历史消息、工具返回、文件内容持续叠加到上下文里,正是对比表中说的「上下文聚合与分发」发生的真实场景。让 Codex 去执行任务,得到的 token 数据才贴近实际使用。
2. Codex 接入 TaoToken:准备 Key 和配置文件
要用 Codex 实测,需要先把模型通道切到 TaoToken。整个过程三步:打开官网拿 Key、在 Codex 配置文件里加一个 model_provider、把模型指到这组参数上。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,注册完成后在控制台创建 API Key,这步先做。
2.1 在 Codex 的 config.toml 里写 provider
Codex 的配置文件在~/.codex/config.toml。注意 Codex 跟你平时用的 Claude Code 不一样,它读的是model_provider和base_url,不要去设置ANTHROPIC_BASE_URL那套环境变量,那套只对 Claude Code / AWS Bedrock 生效。配置写法如下:
model_providers = { taotoken = { name = "taotoken" base_url = "https://taotoken.net/api" wire_api = "chat" } } model = "你的模型ID" model_provider = "taotoken"这里面有两点容易踩坑。第一,base_url只能填https://taotoken.net/api,末尾不要加/v1,Codex 会自动补全路径。第二,模型 ID 不要凭记忆写,去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的模型广场看当时列出的模型 ID,配置里填你实际要用的那个。API Key 后面在环境变量里注入,不要把真实 Key 写进配置文件。
2.2 环境变量里带 Key,并验证连通性
Codex 启动时会读取当前 shell 环境里的 key。我习惯放在~/.zshrc或~/.bashrc里,方便随时切换:
export OPENAI_API_KEY="YOUR_API_KEY" export OPENAI_BASE_URL="https://taotoken.net/api"注意:Codex 的架构跟 OpenAI API 兼容,所以环境变量名沿用OPENAI_API_KEY是官方文档支持的方式;如果你用的是 Codex 的扩展版本或别的封装,以你本地工具的文档为准。Key 的那串真实值从哪里来?在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建,创建完复制出来存好。
配完先跑一句最简单的对话确认链路通不通:
codex exec "用一句话介绍你自己"能正常返回就表示你本地到 TaoToken 的 API 链路已经通了。如果这一步报 401 或 404,先不要往后跑,回到配置文件检查base_url是否多了/v1,以及 Key 是否复制完整。
3. 五个小用例:让 Codex 把表格里的每行结论跑一遍
原文表格里五类组件各有代表优势,我把它们翻译成 Codex 能执行的五个小用例。每个用例都要保证 Codex 确实产生了工具调用和多轮对话,这样最后统计 token 才有价值。
3.1 Skills 用例:创建可复用编码技能并执行
Skills 的代表优势是原子化、可复用、适合动态编排。我给 Codex 的任务是:在当前项目里建一个skills/jsdoc-generator/SKILL.md,要求它为任意 JavaScript 函数生成 JSDoc 注释,然后让它用这个 skill 处理一个已有的函数文件。
codex exec "读取 src/utils/format.js,按 skills/jsdoc-generator/SKILL.md 的规则为新函数补全 JSDoc"这个例子里,Codex 需要读取 skill 定义、读取目标文件、按规则生成注释、再把结果写入文件。整个过程会产生多次工具调用,而这些工具结果都会进入上下文,token 消耗能真实反映 skill 机制的开销。
3.2 Tools 用例:让 Codex 调用一个 JSON 占位接口
Tools 的典型形态是标准 API 调用,低变动、点状集成。我让 Codex 写一个脚本请求公网 JSON 接口,然后解析返回数据:
codex exec "用 Python requests 请求 https://jsonplaceholder.typicode.com/todos/1,打印 title 字段"Codex 会先判断要不要安装依赖、写脚本、运行脚本、读取运行结果。这对应 Tools 场景下典型的「写代码 → 执行 → 看输出 → 改代码」循环。这个循环里每一次工具返回的内容都会进上下文,token 消耗能看出 Tools 机制下平均每次交互携带了多少文本。
3.3 MCP 用例:挂一个文件上下文服务器,看聚合效果
MCP 要发挥价值,靠的是把多个文件的内容聚合后一次性交给模型,而不是像 Tools 那样一步步地读。我本地挂了一个轻量文件服务型 MCP server,然后让 Codex 做「读取项目中 A/B/C 三个文件,总结它们的共同模式」:
codex exec "读取 src/api/client.js、src/api/auth.js、src/utils/request.js,用一句话概括它们的共同抽象"MCP 协议会把三个文件的内容统一塞进一次工具返回里,模型只需要接收一次聚合后的消息。对比 3.2 里 Tools 的一次次单点调用,这里的 token 数字就会明显看出差距。
3.4 Subagents 用例:把一个任务拆成三步并行
Subagents 的核心是多步推理、任务拆分。我给 Codex 的任务是:把「为项目写一个 README」拆成「先分析项目结构、再总结核心模块、最后生成 README」三个子任务,按顺序执行并汇报每步结果:
codex exec "分三步完成:1. 列出项目目录结构 2. 读取每个目录的测试文件总结功能 3. 生成 README.md"真实场景里,这些子任务如果并行执行,每轮都要携带完整的编排状态和中间结果,token 消耗会明显高于顺序执行单个任务。这也是原文说的「合理拆分可优化」的真实含义。
3.5 Hooks 用例:定义事件脚本并检查它是否被触发
Hooks 适合做事件级扩展,例如检查提交信息格式。我让 Codex 先写一个pre-commit-check.sh脚本用于检查文件末尾是否有多余空行,再模拟把脚本挂到 Codex 的 hook 事件上:
codex exec "写一个 pre-commit-check.sh,检查所有 .md 文件是否以换行符结尾,输出不合规文件列表"Hooks 的场景在 Codex CLI 里可以用事件钩子模拟,重点在于让模型理解脚本逻辑、生成脚本并解释触发条件。这个用例相对简单,token 消耗也会体现为「事件消息 + 脚本内容」两次主要开销。
4. 打开 TaoToken 控制台对一下每个用例花了多少 token
五个用例跑完之后,打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 进入控制台,找到 API 用量页面,里面会有按 Key 统计的调用记录,每个请求包含 prompt tokens、completion tokens、总 tokens 以及对应模型。这时候你不需要自己写统计脚本,直接按时间筛选刚才五次调用,就能看到它们的相对大小。
从实测经验看,结果通常会这么分布:单次 Tools 调用如果只是一次脚本执行,tokens 跟 MCP 聚合读取差距不大;但多轮循环后 Tools 的总消耗会高出 MCP 一截,因为每轮工具返回都要重复携带执行结果和模型先前输出。Skills 的消耗接近 Tools,但它的价值体现在复用——同一个 skill 第二次使用不需要重新让模型推理规则。Subagents 如果真做并行拆分,总 token 会是最高的,因为它每开一个子任务就要重新带一次上下文;Hooks 最轻,因为它只是事件触发,上下文内容固定。
这正好把原文表格里那段定性的描述翻译成了可量化的认知:不是「MCP 更好、Tools 更差」,而是——MCP 把反复携带的上下文做了一次聚合,省掉的 token 量与文件数量成正比;Tools 的多轮循环在大任务里会放大重复上下文;Skills 的省钱在长期复用,不在单次执行;Subagents 要实时并行就要付编排开销。你在自己的项目里,按同样思路跑一遍,得到的数据会更贴合你常用模型和任务类型。
排障部分:如果配置之后一直报 401,先确认控制台里这把 Key 是否有效、是否复制的时候漏了字符;如果报 404,检查代码里是否把https://taotoken.net/api错写成了带/v1的版本;如果 Codex 无法加载配置文件,检查~/.codex/config.toml的 TOML 语法,字符串必须用双引号包裹,且 provider 名称不要带连字符。这些都是在刚才的实测路径上真实会遇到的报错。
配置跑通之后,你可以先去 TaoToken 模型对话 里用同一把 Key 发一条消息,确认模型通道稳定。接下来如果打算长期用 Codex 写代码,去 Coding Plan 看一下套餐与 Token 额度,避免使用中突然被限流;需要新 Key 就到 控制台 API Keys 创建。关于 Codex 接入的更多字段说明,可以对照 Claude Code 接入文档,环境变量命名不同,但接入思路一致。