学习精选 · AI 工具
Codex

osFoundry 为什么让 Codex CLI 按资源用游标轮询,而不是推送变更?

DEV Community2026-11-12约 4 分钟读完AI 整理查看原文

作者用 Python 脚本实测 osFoundry 的 MCP 服务器,发现推送通道全部关闭,只剩一个只读的 poll_resource_events 工具。文章用数据解释了为什么客户端游标比服务器游标更适合 Codex CLI 的运行方式,并用模拟实验给出了轮询频率的最优策略。

今天就能做

  • 给 Codex 写 osFoundry 监控时,本地持久化每个资源的 after_sequence,每次请求都显式带上,不要依赖省略时的默认行为
  • 轮询间隔用按资源的指数退避:空轮询翻倍、收到事件重置,比固定频率在调用量和延迟之间平衡得多
  • 拉取积压事件时固定用 limit 100,减少工具调用回合数

三条推送通道全部走不通

  • initialize 声明 capabilities 里只有 tools 且 listChanged: false,工具列表变化也不会通知
  • resources/subscribe 直接返回 Method not found,对 MCP URL 发 GET 也只得到 405
  • 最终只剩一个只读工具 poll_resource_events:按 resource_type 和 resource_id 从某个事件序号之后拉取变更

为什么 Codex 适合轮询而不是推送

  • Codex CLI 不是常驻 daemon,跑完一轮就结束或等你输入,推送需要会话之间有东西在监听,笔记本上往往没有
  • 游标模式契合这种工作方式:客户端每个资源存一个整数,想回来时问一句这个序号之后发生了什么
  • 未认证请求的限流头显示 2000 次/约 61 秒,真正的瓶颈不是服务器负载,而是每次 poll 都要消耗模型的一个工具调用回合

客户端如何发现能查什么

  • list_granted_resources 不接受任何参数,schema 直接拒绝多传字段,语义是服务器告知你有什么
  • list_project_resources 必须指定 resource_type,没有一次列出项目全部内容的调用,完整盘点要按九种类型逐个调用,超过 50 条还要用 offset 分页
  • graph_session 只能 poll 不能 list,需要所有者先在桌面端分享后通过 list_graph_sessions 获取

游标为什么该归客户端管

  • 服务器端的 wait_for_messages 会替你存游标并支持最长 50 秒的 long polling,但 poll_resource_events 两者都没有,连 timeout_s 都被拒绝
  • 两个终端共用同一登录时,服务器游标会被互相推进:600 个事件两个终端各只看到约一半;客户端自带 after_sequence 则两边都能看全 600 个
  • schema 没有强制 after_sequence,省略时行为未定义,所以务必自己保存序号并每次都带上

轮询频率怎么选:模拟 8 小时 30 个资源

  • 固定每 30 秒查全部:每小时 3600 次调用,94.7% 是空的,但中位延迟只有 14.9 秒
  • 固定每 5 分钟:每小时仅 360 次,但所有资源都慢,中位延迟 150.9 秒
  • 按资源做指数退避(空轮询后间隔翻倍、收到事件即重置、上限 10 分钟):每小时约 502 次,中位延迟 34.9 秒,接近便宜方案的调用量加快速方案的延迟

清空积压事件的成本

  • limit 上限 100,一次导入后可能有几百个事件排队,要反复从上次序号拉到出现不满页为止
  • 350 个积压事件用 limit 100 需 4 次调用,limit 50 需 7 次,limit 20 需 18 次
  • 空页响应只占约 17 个 token,轮询的主要成本在回合数而非读取量,所以尽量请求 limit 100

原文:¿Por qué osFoundry hace que Codex CLI consulte un cursor por recurso en vez de enviarle los cambios?

来源:DEV Community · 2026-11-12

查看原文

本文由 AI 阅读原文后整理,未经人工逐字核对,内容以原文为准。

登录后可以点赞、查看和发表评论