Cursor 省 Token 实战:Rules 分层与 mcp.json 按需加载降一半无效上下文
开了 Agent 跑一整午,额度像水表——很多人不是模型选贵了,而是每一轮都在重复塞进不该常驻的上下文。Rules 越写越长、MCP 一挂一排、只问个 API 却开了能改文件的 Agent:账单斜率就这样被抬起来。
本文给出4条可立刻改的操作:Rules 分层(含可复制 front matter)、@精确喂上下文、Ask / Agent / Manual 分流、以及mcp.json按需加载。读完对照场景表自检;官方在 harness 侧减系统税,你仍要管「点发送时塞进去的东西」。
摘要
省 Token 的本质是缩小常驻层、缩短工作集、减少无效回合。Always Apply 只留铁律;路径规则用 glob;问答走 Ask;MCP 少挂备而不用的服务器。据 Cursor 官方博客,MCP 改为动态上下文后,在实际调用了 MCP 的会话上内部测算总 Token 可显著下降(文内约46.9%,勿外推到你的每一笔账单)。
结论:先砍固定前缀,再谈换更便宜的模型。
结论卡 / 对比表
| 杠杆 | 贵的原因 | 抓手 |
|---|---|---|
| Rules | 无关规范每轮进前缀 | alwaysApply极简;其余 glob / 描述 / 手动@ |
@引用 | 模型满仓库翻 | 先圈定 2~5 个文件再提问 |
| 模式 | 低风险问答开高权限 Agent | 只问用 Ask;要改再用 Agent |
| MCP | 工具定义 + 刷屏输出成固定税 | 少挂常驻;卸掉一小时没用过的 |
背景与边界
长任务花费往往不在「最后几行生成」,而在:每轮重传的系统提示/工具定义/Rules;会话历史滚雪球;没有@时的全局搜索与整文件 Read。
边界:本稿不承诺具体省额百分比;不讲套餐比价;Ask vs Agent 的决策细节见同日《模式选择》实战,本文只给省 Token 视角的分流。
原理
可以把一次 Agent 回合拆成三层成本:
- 常驻前缀:系统提示、已加载工具 schema、Always Rules;
- 工作集:你
@的文件、最近工具输出; - 探索税:无锚点的搜索、失败重试、重复粘贴。
官方方向是工具按需加载与缓存复用;你能控的是:Always 层能否一屏读完、MCP 是否备而不用、模式是否匹配风险。
步骤 + 代码
步骤 1:Rules 分层——只让「永远为真」alwaysApply
目的:把跨任务铁律留下,把领域 Wiki 从每轮前缀里挪走。
在项目下创建.cursor/rules/,拆成多份短规则:
<!-- 文件:.cursor/rules/00-core.mdc --> --- description: 全仓库铁律(尽量短) alwaysApply: true --- - 禁止把密钥、Token、私钥写入代码或提交 - 默认使用仓库已有包管理器,不擅自换 yarn/pnpm - 改动后说明如何本地验证(命令级)<!-- 文件:.cursor/rules/payments.mdc --> --- description: 支付域改动规范 globs: - src/payments/** - src/billing/** alwaysApply: false --- - 金额计算使用整数分,禁止浮点直接运算 - 任何写库变更必须带对应测试路径<!-- 文件:.cursor/rules/release-checklist.mdc --> --- description: 发版检查清单(手动 @ 时再用) alwaysApply: false --- - 确认 CHANGELOG 与版本号同步 - 确认迁移脚本可回滚易错点
- 把整本架构 Wiki 放进
alwaysApply: true; - 写了
globs却从不在对应目录改文件验证是否触发; - 多条 Always 互相矛盾,模型每轮都在「调解规则」。
步骤 2:@引用——先圈地再提问
目的:用显式锚点换掉宽泛搜索回合。
@src/auth/session.ts @tests/auth.test.ts 登录成功后 refresh 仍返回 401。 请只改 session 续期逻辑并补测试;不要重构无关模块。 验收:相关单测通过,且说明复现步骤。对比差句式:「帮我看看登录怎么坏的」(无文件、无验收 → 探索税暴涨)。
易错点
@了package-lock.json等巨型无关文件;- 同一长线程反复粘贴整文件,不如新开话题 + 最小
@集; - 一次
@十几份「也许相关」的文件,工作集一样膨胀。
步骤 3:Ask / Agent / Manual 分流
目的:用模式匹配风险,避免「解释正则」也走全工具编排。
| 模式 | 适合 | Token 侧写 |
|---|---|---|
| Ask | 解释、对比方案、读报错 | 改动面小,通常更省 |
| Agent | 跨文件实现、跑测修复 | 回合多、工具多 |
| Manual | 逐段审补丁、关键路径 | 人控步数,减少返工 |
建议顺序:Ask 问清边界 → 短任务书 → Agent 执行 → 关键路径 Manual 确认。
步骤 4:精简mcp.json,按需加载
目的:去掉备而不用的 MCP,降低工具目录与历史回灌。
项目级配置示例(只保留当天要用的):
{"mcpServers":{"github":{"command":"npx","args":["-y","@modelcontextprotocol/server-github"],"env":{"GITHUB_PERSONAL_ACCESS_TOKEN":"${env:GITHUB_TOKEN}"}}}}全局~/.cursor/mcp.json适合「人在多仓库复用」的工具;同名时项目级覆盖全局。当天不做浏览器自动化,就不要同时挂浏览器类服务器。
需要临时禁用时,可从mcpServers删掉条目后Reload Window,或在 MCP 面板断开,而不是留着红灯重试刷日志。
易错点
- 把 MCP 当插件收藏夹,十几个服务器常绿;
- 密钥写死在 JSON 并提交 Git(应用
${env:NAME}); - 改完配置不重载窗口,以为「没生效就是包名错了」。
步骤 5:用「短任务书 + 新开对话」切断历史税
目的:长跑任务按阶段结算上下文,避免第 30 轮还在回读第 2 轮的失败日志。
上一阶段结论(≤10行): - 根因:... - 已改文件:... - 测试结果:... 本阶段目标:... @文件1 @文件2 验收:... 禁止重做:已否决的方案 A/B实践上,每个阶段结束就总结 → 新开 → 只带结论与最小@。看起来「多开了几次对话」,账单往往低于「一条脏线程熬到底」。
易错点
- 总结写成又一篇长文,把噪声原样搬运;
- 新开后忘记
@,模型重新全局搜索; - 阶段目标与上一阶段重叠,重复付费。
步骤 6:.cursorignore与巨型生成物
目的:减少 Agent 误读dist/、coverage/、快照目录的概率(从而少烧探索税)。
dist/ build/ coverage/ **/*.min.js **/node_modules/ **/__snapshots__/配合@使用:忽略不是「模型完全看不见」,而是降低默认检索命中;关键文件仍应显式@。
易错点
- 把源码目录误加进 ignore;
- 以为 ignore 能替代密钥管理;
- 忽略后仍手动
@巨型产物。
验证
| 场景 | Rules | @ | 模式 | MCP |
|---|---|---|---|---|
| 问清函数行为 | 极简 Always | 该文件 | Ask | 通常不需要 |
| 单文件 bug | glob 命中 | 文件+测试 | Agent | 按需 |
| 跨模块重构 | 架构规则手动@ | 分批模块 | 先 Ask 再 Agent | 仅仓库/CI |
| 查 Issue/PR | 流程规则手动@ | 相关本地文件 | Agent | 临时启用 GitHub |
| 长跑多小时 | 铁律 Always,其余剔除 | 每阶段重置工作集 | Agent 分期验收 | 阶段切换卸载 |
今晚勾选:
- Always Apply 是否一屏内可读完?
- 最近三次 Agent 是否都用了
@? - 只读问题是否误开 Agent?
- 当前挂着的 MCP,过去一小时几个没用过?
踩坑
- 官方 46.9% 被当成个人承诺:口径是「调用了 MCP 的会话」内部测算,仓库与任务长度不同,斜率不同。
- 新开对话恐惧症:沉重工具输出留在同一线程,比「再买一档额度」更伤。
- Rules 写了却无验收:省 Token 的同时要抽查关键约束是否仍被遵守。
下一步
- 把 always-on Rules 砍到一半,其余改 glob 或手动
@; - 同一 bug 对比「无
@Agent」与「有@Agent」回合数; - 卸掉两个备而不用的 MCP,观察后续会话是否更干净。
注意:Token 百分比指向公开测算口径;落地效果因模型、仓库与任务长度而异。稿为草稿,发布前请再对当前 Cursor 设置项名称。