Nick Baumann(@nickbaumann_,OpenAI Codex 团队)在 X 上分享了 Codex 工具设计的核心方法论,获得 9.8 万次浏览、414 次转发。
核心原则:精确命令 > 原始 API
Codex 很擅长使用能表达为精确命令的工具。这听起来显而易见,但它改变了我每天给 Codex 提供访问权限的方式。
Connector/MCP server 适合:简单 API 访问(Slack、Linear、Sentry 等)。
定制 CLI 适合:数据源输出太大、太嘈杂、太别扭——不想把原始数据直接丢给 Codex 的场景。
好的 CLI 给 Codex 提供它本来就很擅长使用的东西:搜索、缩小范围、重试、管道输出、写大结果到文件、查看 --help、从上一个结果组合下一个命令。
三个真实案例
1. codex-threads
Codex 的旧会话存档太嘈杂——包含工具输出、部分尝试、只在那个时刻有用的上下文。直接让 Codex 读自己的线程可以,但频繁使用会变慢变噪。
解决方案:
codex-threads --json sync
保持本地可搜索索引(~/.codex/sessions),给 Codex 提供搜索、解析、读取旧线程的命令。
特别有用的场景:把一个会话变成 Skill。「找到这个效果很好的会话,然后保留这个模式」——很多好 Skill 就是这样来的。
2. slack-cli
Slack Connector 有用,但重复研究某个 buried 答案时,命令形状的工具更容易:
slack-cli search "app server auth" --all-pages --max-pages 3 --json
让 Codex 广泛搜索 → 解析准确线程 → 拉取附近上下文 → 引用重要消息。
关键点:slack-cli 仍然使用批准的 Codex apps gateway,不是权限绕过,是同样的访问模型,只是塑造成了 Agent 可组合的命令形状。
3. typefully-cli
用 Typefully 管理大量内容,但不需要 Codex 每次都重新学习完整 API——只需要几个常用操作:
typefully-cli --json drafts list --social-set <id> --limit 20
typefully-cli --json drafts read --social-set <id> <draft-id>
typefully-cli --json drafts create --social-set <id> --body-file draft.json
typefully-cli --json media upload --social-set <id> ./image.png
让 Codex 读 API 文档后构建 typefully-cli(Nick 用 Rust 编写),然后用 Skill 包装它——Skill 定义了边界权限:使用 JSON、默认创建草稿、shell 引用复杂时用 body file、除非明确要求否则不发布/不调度/不删除/不覆盖。
最后一条是关键:不需要每次都输入「不要发布这个」。
构建方法论
Nick 的判断标准很简单:
如果我不断给 Codex 同样的文档、导出、日志或 API 问题,我通常想停止解释,直接给它一个命令。
然后用 Skill 包装这个 CLI,这样 Codex 会记住如何使用它。
Playbook:
这篇文章的方法论和 Sam 之前强调的「文件系统作为 Agent 协作界面」思路一致——本质是给 Agent 提供结构化、可预测的接口,而不是暴露原始的、嘈杂的底层系统。Nick 说的「Skill wrapper 定义边界权限」是精髓:typefully-cli 的 Skill 里「不发布/不调度/不删除/不覆盖」这些约束不是在 prompt 里每次说,而是在 Skill 层面硬编码——这才是让 Agent 行为可预测的正确方式。另外值得注意的是 codex-threads 的设计:用本地可搜索索引让 Codex 查询自己的历史,而不是把整个会话历史直接塞进 context——这和 Claude Memory 的 Cognition Layer 思路异曲同工,都是在解决「Agent 自己产生的信息如何被未来 Agent 使用」的问题。对 Sam 的 Skill 开发来说,这个方法论可以直接应用:遇到重复给 Agent 解释同样的数据源/文档/接口时,应该停下来写一个 CLI + Skill 封装,而不是继续用 prompt 解释。