一句话:你每次让Cursor或Claude Code读一个文件、跑一条命令,背后都有一笔隐形的token税。三个MCP server的工具定义就能吃掉40-50%的上下文窗口;跑个npm run build,847行报错输出全部塞进prompt。lean-ctx的做法是——在你和AI之间插一个Rust写的「认知压缩层」,文件重读只花13个token,shell输出自动压掉95%,跨会话记忆永不丢失。但它只有6周大,早期版本还丢过状态。
01 问题:MCP的「token税」比你想象的更狠
1.1 工具定义就是上下文黑洞
MCP(Model Context Protocol)是Anthropic 2024年底发布的开放协议,目的是让AI Agent统一对接外部工具。到2026年Q1,Cursor、Claude Desktop、Windsurf等主流工具都已支持。
协议设计得很干净,但有一个工程问题越来越痛:工具描述吃掉的token太多了。
Stacklok的实测数据:
| MCP Server | 工具数 | Schema Token占用 |
|---|---|---|
| GitHub | 23 | ~8,200 |
| Slack | 15 | ~5,100 |
| 数据库 | 31 | ~11,400 |
接5个MCP Server、87个工具,每次请求不管用不用得到,全量Schema都得塞进上下文。 跑了两天,token账单直接翻4倍。
Merge CTO Gil Feig的说法更直白:「工具元数据占40-50%可用上下文。」
更夸张的是,Stacklok测试了一个场景——用户只说了声"hello",114个工具的元数据全部注入,消耗46,800个token。你没看错,打个招呼,烧了将近5万token。
1.2 Shell输出:另一个沉默的杀手
工具定义是静态开销,shell输出是动态黑洞。
你让AI跑npm run build,构建失败,847行报错输出原封不动塞进prompt。每一行ERROR in ./src/components/...都是token。AI读完这847行,可能只需要知道「第312行有个类型不匹配」。
你让AI跑git log --oneline -50,50行commit历史全部进去。AI可能只需要知道「最近3次提交改了哪些文件」。
你让AI跑docker ps,10个容器的完整状态表全部进去。AI可能只需要知道「前端服务有没有在跑」。
传统做法:AI自己总结,或者你手动告诉它「只看前10行」。但这既不自动,也不可靠。
1.3 会话冷启动:每次都从零开始
更隐蔽的浪费是「重复读取」。
你在Cursor里开了一个3小时的编码session,AI已经读了你的package.json、tsconfig.json、核心组件文件。你关IDE吃了个饭,回来 reopen project——AI全部重新读一遍。
同样的文件,同样的内容,同样的token开销。没有任何记忆机制告诉AI:「这些文件上午已经读过了,没变化。」
02 lean-ctx:一个Rust二进制文件的野心
2.1 项目背景
- 作者:Yves Gugger,瑞士苏黎世
- GitHub:https://github.com/yvgude/lean-ctx
- 当前数据:1,800+ stars(4个月)、190+ forks、181 releases、29+ AI agents支持
- 定位:Lean Cortex——轻量级认知层,管理代码和AI之间的每一个token
2.2 三层架构
┌─────────────────────────────────────────────────────────┐
│ Layer 1: Compression(压缩)— 即时价值 │
│ ├── 文件读取:10种模式(full/map/signatures/diff/lines:N-M)│
│ ├── Shell输出:56+压缩模式,270条规则 │
│ └── Tree-sitter AST:21种语言的结构理解 │
├─────────────────────────────────────────────────────────┤
│ Layer 2: Memory(记忆)— 粘性价值 │
│ ├── Session记忆(CCP):跨会话持久化任务/事实/决策 │
│ ├── 知识图谱:时序事实+情景记忆+程序记忆 │
│ └── 属性图:多边形代码图(import/call/export/type_ref) │
├─────────────────────────────────────────────────────────┤
│ Layer 3: Governance & Observability(治理)— 企业价值 │
│ ├── Context Manager:浏览器仪表板,实时token追踪 │
│ ├── Budgets & SLOs:按agent/角色/项目分配token预算 │
│ └── Context Proof:加密验证,4层验证引擎 │
└─────────────────────────────────────────────────────────┘
2.3 核心设计哲学
lean-ctx不是「选择性加载工具」(像MCP Optimizer或Dynamic Toolsets那样),而是**「加载了也压缩,读了也缓存,输出了也过滤」**。
它的工作方式:
AI Agent → 调用工具/命令 → lean-ctx拦截 → 压缩/缓存/过滤 → AI看到精简版
这就像一个同声传译员,不是阻止你说话,而是把你冗长的发言精简成要点。
03 第一层:Compression——把token浪费堵在源头
3.1 文件读取:10种模式按需压缩
lean-ctx用ctx_read替代AI原生的文件读取工具,提供10种读取模式:
| 模式 | 说明 | 场景 |
|---|---|---|
| full | 完整文件 | 小文件、关键配置 |
| map | 文件地图(函数/类/结构列表) | 快速浏览大文件结构 |
| signatures | 仅函数签名 | 看接口定义 |
| diff | 与上次读取的差异 | 追踪修改 |
| lines:N-M | 指定行范围 | 只看相关代码段 |
缓存重读:文件一旦读过,下次再读(如果mtime没变)只花**~13个token**——不是重新传输文件内容,而是告诉AI「这个文件没变,参考之前的版本」。
这解决了一个核心痛点:AI在长篇对话中反复读取同一个package.json,每次都花2000token。有了lean-ctx,第二次开始每次13token。
3.2 Shell输出:56+压缩模式
lean-ctx的shell hook拦截常见命令输出,用预定义模式压缩:
| 命令类型 | 压缩策略 | 效果 |
|---|---|---|
| git status/status/log | 精简格式,去掉冗余空格/分隔符 | 95%+节省 |
| npm/cargo/build | 错误聚合,去重,仅保留关键行 | 90%+节省 |
| docker ps/logs | 表格精简,去掉无关列 | 80%+节省 |
| kubectl/terraform | 结构化摘要,替代原始YAML | 85%+节省 |
关键设计:不是盲目截断(truncation),而是模式化压缩。比如npm构建输出,lean-ctx识别错误模式,聚合同类错误,去掉重复路径前缀,只保留「错误类型+文件+行号+关键信息」。
3.3 Tree-sitter AST:结构级理解
21种语言的Tree-sitter解析,让lean-ctx不只是「文本压缩」,而是「语义压缩」。
例子:AI问「这个函数被哪些地方调用了」。传统做法是grep或者让AI读整个代码库。lean-ctx的属性图已经预先构建了call边,直接返回调用者列表——不需要AI自己搜索。
04 第二层:Memory——会话不再「冷启动」
4.1 CCP:Cross-Context Protocol
这是lean-ctx最独特的功能,也是其他竞品(context-mode、MCP Optimizer)没有的。
问题:你关IDE、重开项目,AI从零开始。上午已经讨论过的架构决策、已经确认过的API设计,全部丢失。
CCP的做法:
- 每个session的关键事实、决策、任务状态被持久化
- 下次session开始时,lean-ctx自动注入「记忆摘要」
- 结构化恢复查询在压缩后依然存活
效果:不是「AI记得你」,而是「AI记得这个项目」——即使换了一个session、换了一台机器,记忆还在。
4.2 知识图谱:三种记忆类型
| 类型 | 说明 | 例子 |
|---|---|---|
| 时序事实(Temporal Facts) | 带有效期窗口的事实 | 「本周 sprint 目标」「临时API密钥」 |
| 情景记忆(Episodic) | 发生过的事件记录 | 「上次重构时踩了X坑」 |
| 程序记忆(Procedural) | 操作步骤和最佳实践 | 「部署流程」「代码规范」 |
4.3 属性图:代码的关系网络
属性图跟踪代码的多边关系:
- import边:谁依赖谁
- call边:谁调用了谁
- export边:谁导出了什么
- type_ref边:类型引用关系
这有什么用?
- AI问「改了这个接口会影响哪些地方?」→ lean-ctx直接返回影响分析,不需要AI读所有文件
- AI搜索「哪里用了User类型?」→ 属性图直接定位,不需要grep整个代码库
05 第三层:Governance——让token开销可见、可控
5.1 Context Manager:浏览器仪表板
lean-ctx dashboard打开一个web界面,实时显示:
- 当前session的token消耗
- 每次工具调用的token开销
- 压缩比率(原始token vs 实际传输token)
- 利用率仪表盘
核心意义:大多数开发者根本不知道自己烧了多少token在工具定义和shell输出上。Context Manager让浪费可见——这是改变行为的第一步。
5.2 Budgets & SLOs
- 按agent分配token预算(Cursor 100K/session,Claude Code 200K/session)
- 按角色分配(前端开发、后端开发、DevOps)
- 超预算时自动节流或告警
5.3 Context Proof:加密验证
4层验证引擎,确保压缩后的内容没有被篡改。对于需要审计的场景(如金融、医疗),这提供了压缩和安全之间的平衡。
06 竞品对比:lean-ctx在光谱上的位置
| 方案 | 核心思路 | 压缩对象 | 是否有记忆 | 是否有治理 |
|---|---|---|---|---|
| 无工具 | 原生AI调用 | 无 | 无 | 无 |
| 手动规则 | 静态prompt规则 | 低(静态) | 无 | 无 |
| context-mode(1.2万星) | 代码模式,LLM写代码调用工具 | 工作流外置 | 无 | 无 |
| MCP Optimizer(ToolHive) | 智能工具选择 | Schema过滤 | 无 | 无 |
| Dynamic Toolsets(Speakeasy) | 动态加载+语义搜索 | Schema按需 | 无 | 无 |
| Claude Praetorian | 结构化增量快照 | 对话历史 | 有限 | 无 |
| lean-ctx | 三层压缩+记忆+治理 | 文件+Shell+Schema+对话 | CCP跨会话 | 仪表板+预算 |
6.1 context-mode:不同的哲学
context-mode 1.2万星,思路是**「code mode」**——让LLM写代码来调用MCP server,而不是在上下文窗口里做自然语言编排。
好处:工作流外置,上下文只保留代码和最终结果。
局限:需要LLM有代码生成能力;调试复杂度增加;不是所有任务都适合代码化。
lean-ctx不替代MCP调用方式,而是在调用链路上压缩。两者可以共存:context-mode负责「怎么调用」,lean-ctx负责「调用结果的token效率」。
6.2 MCP Optimizer / Dynamic Toolsets:选择性加载
ToolHive的MCP Optimizer和Speakeasy的Dynamic Toolsets都走「选择性加载」路线——只把相关的工具schema放进上下文。
lean-ctx不一样:它假设所有工具都可能被用到,但把每次调用的结果压缩到最小。
这不是竞争关系,是互补:
- 工具很多(>20个)→ 用MCP Optimizer减少schema开销
- 工具调用频繁 → 用lean-ctx减少每次调用的结果开销
- 两者结合 → 最小化总token消耗
07 实测数据与效果
7.1 lean-ctx官方数据
| 场景 | 原始token | lean-ctx后 | 节省 |
|---|---|---|---|
| 文件首读 | 依文件大小 | 10种模式选择最优 | 60-95% |
| 文件缓存重读 | 依文件大小 | ~13 tokens | 99% |
| Shell输出(git/npm等) | 原始输出 | 模式压缩 | 60-95% |
| Tree-sitter AST查询 | 搜索+读取 | 属性图直接返回 | 80-90% |
7.2 行业数据对比
| 方案 | 宣称节省 |
|---|---|
| lean-ctx | 60-99% |
| MCP Optimizer(ToolHive) | 64-85%(Schema过滤) |
| Dynamic Toolsets(Speakeasy) | 96%输入token(Schema按需) |
| Claude Praetorian | 90%+(对话快照) |
注意:这些数字不可直接比较,因为它们优化的对象不同:
- lean-ctx优化「文件+Shell+工具调用结果」
- MCP Optimizer优化「工具Schema」
- Dynamic Toolsets优化「工具Schema」
- Claude Praetorian优化「对话历史」
7.3 一个计算示例
假设一个典型编码session:
- 读取10个文件(平均每个500行)→ ~50K tokens
- 运行20次shell命令(git/npm/test)→ ~30K tokens
- 工具定义(3个MCP server,50个工具)→ ~20K tokens
原始总开销:~100K tokens
lean-ctx优化后:
- 文件:10种模式优化首读 → ~25K(50%节省)
- 文件缓存重读(假设5次重读)→ 5×13 = 65 tokens(vs 5×5K = 25K)
- Shell压缩 → ~6K(80%节省)
- 工具定义:lean-ctx不直接优化,但缓存调用结果 → ~10K
优化后总开销:~41K tokens → 节省59%
08 泼一盆冷水:6周大项目的现实
8.1 早期版本的状态丢失问题
lean-ctx 181个releases,4个月。这个发布频率意味着:
- 每天1-2个release
- 快速迭代,但也意味着API不稳定
- 早期版本有过状态丢失问题——session记忆在某些情况下没有正确持久化
用户提到的「状态丢失」可能是:
- CCP记忆在session crash后没有恢复
- 属性图在大repo上的增量更新失败
- Docker容器中的项目标识冲突(
.lean-ctx-id文件缺失导致数据合并)
8.2 适用边界
lean-ctx官方也承认:
适合:
- 中大型repo(50+文件)
- Shell-heavy的workflow(频繁git/test/build)
- 多session长期项目
- 需要token可视化的团队
不适合:
- 单文件脚本或微型项目(overhead不值得)
- 原始日志分析场景(需要完整未过滤输出)
- 一次性的简单prompt
8.3 学习曲线
虽然lean-ctx setup是一键配置,但要真正发挥三层架构的价值,需要:
- 理解10种文件读取模式的选择逻辑
- 配置shell压缩规则(或依赖默认的56+模式)
- 管理CCP记忆的生命周期(哪些事实要保留、哪些要过期)
- 设置token预算和SLO
这不是「安装即忘」的工具,是「安装后需要运营」的基础设施。
09 追问与展望
9.1 lean-ctx与MCP Optimizer的结合
如果同时用MCP Optimizer(减少schema开销)和lean-ctx(减少调用结果开销),总节省是多少?
假设:
- Schema开销从20K降到4K(MCP Optimizer 80%节省)
- 调用结果从60K降到20K(lean-ctx 67%节省)
原始100K → 优化后24K → 总节省76%
这比单独用任何一种方案都好。但两者的集成复杂度:需要同时维护两套配置,MCP Optimizer的智能选择可能和lean-ctx的缓存策略冲突。
9.2 CCP记忆的「隐私」边界
CCP跨session持久化记忆,这意味着:
- 项目A的session记忆可能被项目B读到(如果配置错误)
- 敏感信息(如临时API密钥、内部决策)被持久化到磁盘
- 团队共享的lean-ctx实例,个人session记忆可能被他人访问
lean-ctx的文档提到「40+安全加固修复」(v3.5.16),但隐私和访问控制是长期挑战。
9.3 29+ AI agents的兼容性承诺
支持29个agents是一个巨大的兼容性负担。每个agent的MCP实现略有不同:
- Claude Code截断MCP server指令到2048字符
- Cursor/Windsurf的规则文件格式不同
- VS Code Copilot和GitHub Copilot CLI的config key不同
lean-ctx通过lean-ctx init --agent <name>为每个agent生成特定配置。但agent更新时(如Claude Code新版本改了MCP行为),lean-ctx需要跟进。181个releases的部分原因可能是agent兼容性修复。
10 总结:token效率是工程问题,不是模型问题
MCP token浪费的来源与lean-ctx的解法
┌─────────────────────────────────────────────────────────┐
│ 浪费来源 lean-ctx解法 │
├─────────────────────────────────────────────────────────┤
│ 工具Schema全量加载 ← 不直接解决(配合MCP Optimizer)│
│ 文件重复读取 ← 10种读取模式 + 缓存(~13token)│
│ Shell输出膨胀 ← 56+压缩模式,270条规则 │
│ 代码搜索低效 ← Tree-sitter属性图 │
│ Session冷启动 ← CCP跨会话记忆 │
│ 浪费不可见 ← Context Manager仪表板 │
│ 开销不可控 ← Budgets & SLOs │
└─────────────────────────────────────────────────────────┘
一句话收尾:MCP让AI Agent连接世界的能力爆发式增长,但每一次连接都在默默消耗上下文窗口。lean-ctx的核心洞察是——token效率不是模型的问题,是工程的缺口。文件怎么读、命令输出怎么压、session记忆怎么存、开销怎么可视化——这些都是可以工程化解决的问题。lean-ctx用三层架构把这些问题打包成一个Rust二进制文件,一键安装,29个agents通用。但它只有6周大,还在快速迭代中。如果你每天烧掉几万token在重复读取和冗长输出上,它值得试试。如果你只是偶尔写个单文件脚本,它可能overkill。
参考
- 项目:https://github.com/yvgude/lean-ctx
- 官方文档:https://leanctx.com/docs/getting-started
- MCP token优化策略:https://thenewstack.io/how-to-reduce-mcp-token-bloat/
- MCP Optimizer(ToolHive):https://stacklok.com/blog/cut-token-waste-from-your-ai-workflow-with-the-toolhive-mcp-optimizer/
- Dynamic Toolsets(Speakeasy):https://www.speakeasy.com/blog/how-we-reduced-token-usage-by-100x-dynamic-toolsets-v2
- MCP token战争(掘金):https://juejin.cn/post/7621644374128640027
#tag #leanctx #MCP #token优化 #上下文压缩 #AI编码助手 #ContextEngineering #Rust #小凯
讨论回复
1 条回复推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。