Cloudflare 一周拆了 Agent 的两堵墙:Code Mode MCP 与 Agent Memory
摘要
Code Mode MCP 把 1.17M tokens 的 API 压成 1K,Agent Memory 把对话历史压成可索引的结构化记忆。两个公告分开看是产品发布,放一起看是同一个判断 - agent 跑不动了,得重新设计存储层。
如果你最近在做 agent,大概率撞过这两堵墙。
第一堵是工具太多。一个稍大点的 API 用 MCP 暴露出来,光工具描述就能塞掉几万 token。Cloudflare 自己的 API 有 2500+ 个端点,全部展开是 1.17M token - 光读完描述模型就懵了,更别提还要带着这堆描述完成实际任务。
第二堵是记忆太短。模型每开一个 session 是张白纸。前一天调好的口味、上周纠正过的代码风格、团队约定俗成的命名规范,统统不存在。你只能要么把所有事情往 system prompt 里塞(很快满),要么每次重新解释一遍(累),要么自己造一个外挂记忆系统(重)。
这周 Cloudflare 发了两个东西,正好一边拆一堵。Code Mode MCP 把 1.17M token 的工具描述压成 1K,Agent Memory 把对话历史压成可索引的结构化记忆。
分开看是两个产品发布。放在一起看,是 Cloudflare 在写一篇统一的论文 - context 不够用了,我们得重新设计 agent 的存储层。
Code Mode MCP
先说工具墙这边。
传统 MCP 服务器的做法是把每个 API 端点暴露成一个工具,每个工具都带 name、description、input schema。模型在选择工具时,需要把所有候选的描述都看一遍。当 API 很大(Cloudflare 2500+,AWS、Stripe、GitHub 这种规模都类似),这个清单就大到塞不进 context。
Cloudflare 的解法叫 Code Mode,思路是:不把每个端点当工具,把整个 API 当代码用。MCP 服务器只暴露两个工具:
search(query) # 在 OpenAPI spec 里搜端点
execute(code) # 在沙箱里跑一段 JavaScript,调那些端点
模型不再 “select tool then fill args”,而是 “write code that calls APIs”。比如要帮一个域名打开 DDoS 防护,agent 的执行流程大致是:
// 1. 先 search 找到 WAF 和 ruleset 相关端点
const waf = await search("WAF ruleset")
// 2. 看看 schema 里有什么 phase 可选
const phases = await search("ruleset phase")
// 3. 用 execute 把这几步串起来
await execute(`
const ruleset = await api.createRuleset({ phase: "ddos_l7", ... })
await api.attachRuleset({ zone_id, ruleset_id: ruleset.id })
`)
99.9% 的 token 节省(1.17M → ~1K)就是这么来的:模型不需要预先看到 2500 个端点描述,它需要的时候自己去 search。execute 那一步在 V8 isolate 里跑,没有文件系统访问、没有环境变量泄漏、外网请求默认禁、按需开放。
这里有几个值得停一下看的设计选择。
沙箱选 V8 isolate 不是容器。 Cloudflare 的 Workers 本来就跑在 V8 isolate 上,这个选型省了启动时间(容器冷启 100ms+,isolate <1ms),同时把每个 agent 调用隔离开。是 Cloudflare 把自家既有 serverless 基础设施直接拿来当 agent 基础设施 - 不是新搭一套。
OAuth 2.1 + downscoped token。 模型生成的代码能调的端点,是用户授权的子集。不是 “给模型一个全权 token 然后祈祷它别犯傻”,是协议层面把权限扎死。
方向指向 MCP Server Portals。 Cloudflare 计划把 Code Mode 这层扩展到其他 MCP 服务器 - Stripe、Twilio、GCP 都可能用同一种 search+execute 接口暴露。如果这件事跑通,“MCP 工具列表” 作为一种暴露 API 的形式可能会被取代,更像是 OpenAPI 加沙箱执行器的组合。
Agent Memory
再说记忆墙。
现在主流的记忆做法大致三种:
- 塞 system prompt - 简单粗暴,很快撞 context 上限
- 塞 vector store - RAG 风格,做 embedding 加相似度查 - 对结构化的事实和时间相关的查询都不准
- 造一个 memory framework - Mem0、Letta、自家造轮子 - 组件多、维护重、跟 agent 框架耦合死
Agent Memory 的设计是把记忆当一个托管服务调用,agent 框架不变。它有四个操作:
ingest(conversation) # 上下文压缩时,把对话提取成结构化记忆
remember(fact) # 模型直接记一个事
recall(query) # 检索相关记忆
forget / list # 管理
提取出来的记忆有四类:
- Facts - 稳定的原子知识(“用户偏好 TypeScript 不喜欢 JavaScript”)
- Events - 时间相关的事件(“2026-05 用户切换到 pnpm”)
- Instructions - 流程性知识(“提交前要跑 lint”)
- Tasks - 暂时的工作项(“修一下这个 bug”)
这个分类比简单的 fact 列表细致,因为四类的检索语义不一样。Facts 适合 key-lookup,Events 适合时间范围查,Instructions 适合根据当前任务模糊匹配,Tasks 适合按 active 状态过滤。
最有意思的是检索那一边。Recall 不是单一通道的 vector search,是五路并行:
- 全文搜索
- Fact-key 精确查找
- 原始消息搜索
- 向量检索
- HyDE (Hypothetical Document Embeddings) - 让模型先生成一个 “如果有相关文档应该长什么样” 的假设文档,再用这个假设文档做向量查
五路并行查,结果用 RRF (Reciprocal Rank Fusion) 合并。RRF 是个老 IR 算法,对每个候选按它在每路结果里的排名做 reciprocal 加权求和 - 简单但是稳。Cloudflare 把它和 HyDE、四类 memory 合到一起,等于把信息检索领域过去十年的经验完整搬到 agent memory 上。
底下的存储栈是熟人:
Durable Objects ← 单 agent / 单租户的隔离 + 一致性
Vectorize ← 向量索引
Workers AI ← 提取、verify、classify 的模型推理
SQLite ← 持久化结构化数据
每一层都不是新东西。新的是把这堆原本服务通用工作负载的 serverless primitive 对准 agent memory 这个用例。和 Code Mode 选 V8 isolate 一样,是把现有积木搭新房子,不是再造一个全栈。
还有一个被低估的设计点:memory profile 可以共享。一个工程团队的所有人可以挂同一个 memory profile - 一个人的 coding agent 学到的 “我们这边 import 顺序怎么排”,后面其他人的 agent 直接能用。这把 agent memory 从 “个人助手记忆” 升到 “团队知识资产”。是不是一定真有人这么用还要看,但至少这是 Cloudflare 给的一个升级路径。
一个共同的判断
把 Code Mode 和 Agent Memory 摆在一起,能看出 Cloudflare 在写一份统一的备忘录:
Agent 不是 chatbot,是分布式系统。
chatbot 的世界里,所有上下文塞 prompt,response 出来就忘。这个心智模型支撑了过去三年的工具开发 - prompt engineering、RAG、function calling 都是在这个框架下打补丁。
agent 的世界里,状态是分布式的。工具描述不在上下文,在另一个 service (Code Mode 的 search)。记忆不在上下文,在另一个 service (Agent Memory 的 recall)。模型本身只负责判断 “我现在需要什么” 加 “拿到之后怎么用”。
这个心智模型上了,许多设计选择就自然了:
- 沙箱选 isolate 不选容器,因为 agent 调用频率高、隔离要轻
- 检索做多通道并行,因为单一相似度查在结构化加时间相关 memory 上 fail mode 太多
- 权限走 OAuth 加 downscoped,因为 agent 写的代码不可信
- memory 当托管服务,因为每家自己造一遍意味着每家都做不好
是不是只有 Cloudflare 能做这件事?不是。Anthropic、OpenAI、Letta、Mem0 都在做记忆侧;Anthropic、Vercel、Replit 都在做沙箱侧。但 Cloudflare 的优势很具体 - 它本来就在卖 serverless primitive,Agent Memory 和 Code Mode 是把同一组积木换个组合方式继续卖。这种 “复用既有基础设施做新形态” 比从零搭一套的胜率高。
给 builder 的几个提醒
如果你正在做 agent,从这两个公告能拿走的不只是 “等一下试试 Cloudflare 这两个产品”。下面这几条更通用。
不要指望 200K context 窗口拯救你。 即便窗口翻倍翻三倍,工具描述加历史消息加文档片段照样能塞满。把 token economy 当作一个独立的优化维度去设计 - 工具列表能不能压缩、记忆能不能外存、文档能不能按需检索 - 比假设上下文够用要稳。
Tool 设计开始考虑 token 经济学。 你设计的每个 MCP 工具,都在抢模型的 context budget。一个 description 超过 200 token 的工具,要问自己:“这个工具是不是可以拆成 search + execute?” “是不是可以让模型按需访问 schema 而不是预先全展开?” 这是工具设计的新约束。
Memory 不该和 agent 框架强耦合。 如果你现在的 agent 把记忆逻辑写在框架内部,用框架自己的 vector store - 换框架的代价会很大。Memory 当作一个独立服务(Cloudflare 这个、Mem0、Letta、自己用 Pinecone 加一层结构化)能让你在 agent 框架变化时少痛。
多路检索很有必要。 如果你之前的 RAG 只是 “embedding + cosine similarity”,看看 Cloudflare 这五通道。多通道并行加 RRF 合并的工程量不大,但 recall 上限高很多 - 尤其是 fact-style queries 和时间敏感 queries 那一类。
相关文章
2026年5月9日
Cloudflare 给 agent 发了张能刷的卡
Cloudflare 这周让 agent 能自己开账号、注册域名、付费、部署。听起来像把控制权交了出去,但其实没有 - 它把控制点从 agent 的执行边缘挪到了协议层。这是个完全不一样的 agent 安全哲学,也是把 agent 当成 first-class 客户类别的开始。
2026年2月21日
Cloudflare 的 Code Mode:用两个工具替代 2500 个端点
当 API 有 2500 个端点时,传统 MCP 方案要吃掉 117 万 token。Cloudflare 的 Code Mode 只用两个工具把这个数字压到 1000。背后的思路比技术本身更值得看。
2026年3月27日
用 Cloudflare Workers 部署 MCP 服务器
MCP 服务器不一定要跑在本地。这篇手把手教你用 Cloudflare Workers 部署一个远程 MCP 服务器,支持 SSE 传输,全球边缘节点加速。
合作伙伴
CompeteMap — 英国及爱尔兰学生竞赛一站式搜索
数学、编程、科学、写作等各类竞赛信息汇总,支持按年龄和科目筛选,再也不错过报名截止日。