Context Mode 新手教程

Context Mode 新手教程

一个 MCP server + hooks 组合,替 AI 编程代理守住上下文窗口:工具的原始输出进沙箱和本地索引,上下文里只留答案。官方适配 17 个平台,Cursor 是其中的一等公民。

Node.js 22.5+ 17 平台适配 98% 上下文节省 v1.0.169 Elastic License 2.0 GitHub 仓库
22.9k+
GitHub Stars
98%
全会话上下文节省
17
适配平台 / 宿主
12
沙箱支持语言
125
自动化测试全过

1这是什么

Context Mode(作者 mksglu / Mert Koseoğlu,TypeScript 编写)解决的是 AI 编程代理的「上下文问题另一半」。

每次 Agent 调工具,工具都会把原始数据整包塞进上下文窗口:一次 Playwright 页面快照 56 KB、20 个 GitHub issues 59 KB、一份 500 行的 nginx 访问日志 45 KB。半小时下来,40% 的窗口没了;再触发一次自动压缩(compact),Agent 就忘了自己正在改哪个文件、任务进行到哪、你最后一句要求是什么。

Context Mode 的做法是三件套:沙箱让原始数据根本不进窗口,本地索引(SQLite FTS5 + BM25)把大内容存起来按需查,hooks 路由在工具调用前后程序化拦截。官方基准:一整段会话 315 KB 原始输出压到 5.4 KB 进窗口,节省 98%(条件:带 hooks 的平台,数据来自 README 实测场景)。

一句话:窗口里只放「答案」,原始数据留在沙箱和本地数据库里,Agent 想要细节时用 ctx_search 按需取。

它不做什么(反向界定)

  • 不管文风。第四支柱就叫「No prose-style enforcement」——它只管数据去哪,模型回答简短还是啰嗦,由你自己的 AGENTS.md / CLAUDE.md 决定。
  • 不上传数据。无遥测、无云服务,全部存在本机 SQLite。
  • 不是普通压缩器。它不摘要全文完事,而是「路由 + 沙箱 + 索引」:需要精确代码示例时走 ctx_index + ctx_search,代码块原样返回(基准测试中 100% 保留)。
  • 不能在无 hooks 的平台强制拦截。MCP-only 平台(Zed、Antigravity IDE 等)只能靠指令文件自觉,官方实测约 60% 遵从率。

2为什么需要

在它之前,你已经用过至少三种「省上下文」的办法,但每个都各有失败姿势。

常见做法问题失败现场
等自动压缩 /compact压缩丢细节,且压缩前那一波大输出已经把窗口吃掉了compact 后 Agent 忘了正在编辑的文件、进行中的任务、你最后的要求
在 AGENTS.md 里写「少读点」纯靠模型自觉,没有程序化拦截无 hooks 平台实测只有约 60% 的调用遵守路由指令
人肉挑着贴代码 / 截图手工成本高,覆盖不全半小时后 40% 上下文照样没了,该 compact 还是 compact

核心洞察:上下文问题的另一半,不是「窗口不够大」,而是原始数据根本不该进窗口。分析一个 200 行文件统计函数行数,1 个脚本胜过 10 次工具调用——把「读数据」变成「编程算数据」,这就是项目说的 Think in Code:

// Before: 47 次 Read() ≈ 700 KB 进上下文
// After:  1 次 ctx_execute() ≈ 3.6 KB,只有 stdout 进窗口
ctx_execute("javascript", `
  const files = fs.readdirSync('src').filter(f => f.endsWith('.ts'));
  files.forEach(f => console.log(f + ': ' + fs.readFileSync('src/'+f,'utf8').split('\\n').length + ' lines'));
`);

3核心流程

三步:Agent 想读数据 → hook 拦截重定向 → 窗口里只进摘要。

1 发起工具调用→ 2 Hook 拦截重定向→ 3 只留答案进窗口
Agent 调工具 Read / Shell / WebFetch preToolUse Hook 拦截并给出路由引导 沙箱 + FTS5 索引 原始数据进本地 SQLite 上下文 只有 stdout 摘要 56.2 KB 页面快照 → 299 B 进窗口;要细节时 ctx_search 按需取回 Agent 调工具 Read / Shell / WebFetch preToolUse Hook 拦截并给出路由引导 沙箱 + FTS5 索引 原始数据进本地 SQLite 上下文窗口 只有 stdout 摘要 56 KB 快照 → 299 B 细节用 ctx_search 按需取

整个体系由三块组成,对应三个支柱:

  • Context Saving(沙箱):ctx_execute / ctx_execute_file / ctx_batch_execute 在隔离子进程里跑代码,脚本之间内存不互通,只有 stdout 进上下文。支持 12 种语言(JS/TS/Python/Shell/Ruby/Go/Rust/PHP/Perl/R/Elixir/C#),有 Bun 时自动提速 3–5 倍。输出超过 5 KB 且带意图说明时,自动转「意图驱动过滤」——索引全文、按相关段返回。
  • Session Continuity(会话记忆):hooks 抓取文件编辑、git 操作、任务、错误、用户决策存进 SQLite;压缩前生成 ≤2 KB 快照,新会话启动时注入 <session_knowledge>。不 --continue 时上次会话数据立即删除。
  • Routing(路由强制):hooks 是程序,能阻断或重定向工具调用;指令文件只能引导。这正是有 hooks 平台 ~98% 节省、无 hooks 平台只有 ~60% 的原因。

4安装:全局装 + 按宿主接线

无论哪个宿主,第一步都一样:npm install -g context-mode。第二步「接线」因宿主而异。

npm install -g context-mode   # Node >= 22.5.0,装完得到 context-mode 命令

容易混淆的两条路:MCP-only(只注册 MCP server,模型「自愿」用,无 hooks 平台走这条)和 MCP + Hooks(工具调用被程序化拦截,效果拉满)。能用 hooks 就一定配 hooks。

宿主接线方式配置落点Hooks
Claude Code插件市场(推荐)/plugin marketplace add mksglu/context-mode✅ 全套
Cursor / Cursor CLI本地插件 或 手动(见第 6 节)~/.cursor/ 与项目 .cursor/✅ 3–5 个事件
Codex CLI插件市场 + 特性开关~/.codex/config.toml + hooks.json✅ 需 hooks=true
Gemini CLI手动单文件~/.gemini/settings.json✅ 全套
OpenCode / KiloCodeTS 插件opencode.json 加 "plugin": ["context-mode"]✅
Zed / Antigravity IDE仅 MCP各自 settings / mcp_config.json❌ ~60% 遵从

MCP 层 100% 可移植——17 个平台全部支持;差异全在 hooks。完整矩阵见官方 platform-support.md。

5环境自检

装之前花一分钟确认这四件事,能避开绝大多数安装失败。

node -v                      # 必须 >= 22.5.0
npm -v
context-mode --version       # 全局安装成功则输出版本号
npx context-mode doctor      # 装好后跑一次,全绿即接线成功
依赖 / 条件要求说明
Node.js≥ 22.5.0(package.json engines)关键分水岭:≥22.5 自动用内置 node:sqlite,免原生编译
老版本 Node< 22.5 则需编译 better-sqlite3要 gcc / make / python3;CentOS 用 gcc-toolset-10,Alpine 用 apk add build-base
Bun(可选)装了自动启用沙箱执行提速 3–5 倍,SQLite 后端切 bun:sqlite
npm / npx必需插件 hook 命令用 npx -y context-mode,依赖 npm 在 PATH
磁盘本机 SQLite 存储索引内容与缓存全部落本地,无网络依赖
二选一决策:能升 Node ≥ 22.5 就升——绕开 better-sqlite3 原生编译,是 Linux 老发行版和 Windows 上最常见报错的根治方案。

6第一次实战:Cursor / Cursor CLI 集成

这是本文的重点。Cursor 是 context-mode 官方「一等适配器」(native hooks v1),配置分插件版和手动版两条路。

6.1 先弄清配置体系

Cursor 的 hooks 与 MCP 配置位于 ~/.cursor/(用户级,全局生效)和项目 .cursor/(项目级)。Cursor 桌面端 Agent 与 Cursor CLI(cursor-agent)共用这套配置目录——官方文档按「Cursor 平台」适配,不区分 IDE / CLI;context-mode 用 CURSOR_TRACE_ID、CURSOR_CLI 等环境变量识别当前运行在哪种上下文里。CLI 会话里 hooks 是否触发,装完用 doctor + 实测确认(见 6.5)。

~/.cursor/mcp.json MCP server 注册 ~/.cursor/hooks.json hook 拦截 · 3 个事件 .cursor/rules/*.mdc 路由规则 · alwaysApply Cursor 平台 桌面 Agent / CLI context-mode MCP + hook 统一入口 hook 统一入口:context-mode hook cursor <event> ~/.cursor/mcp.json MCP server 注册 ~/.cursor/hooks.json hook 拦截 · 3 个事件 .cursor/rules/*.mdc 路由规则 · alwaysApply Cursor 平台 桌面 Agent / CLI context-mode MCP + hook 统一入口 hook 统一入口: context-mode hook cursor <event>

6.2 推荐:手动配置(CLI 用户首选)

Cursor 插件市场版还在审核中。手动配置最稳、全局安装后无 npx 冷启动(插件版冷启动约 4–5 秒):

# 1. 全局安装
npm install -g context-mode
// 2. 用户级 MCP 注册:~/.cursor/mcp.json(项目级则放 .cursor/mcp.json)
{
  "mcpServers": {
    "context-mode": {
      "command": "context-mode"
    }
  }
}
// 3. 用户级 hooks:~/.cursor/hooks.json(项目级则放 .cursor/hooks.json)
// 官方手动版注册 3 个事件;sessionStart 被 Cursor 校验器拒绝,故不写
{
  "version": 1,
  "hooks": {
    "preToolUse": [
      {
        "command": "context-mode hook cursor pretooluse",
        "matcher": "Shell|Read|Grep|WebFetch|mcp_web_fetch|mcp_fetch_tool|Task|MCP:ctx_execute|MCP:ctx_execute_file|MCP:ctx_batch_execute|MCP:(?!ctx_)"
      }
    ],
    "postToolUse": [
      {
        "command": "context-mode hook cursor posttooluse"
      }
    ],
    "stop": [
      {
        "command": "context-mode hook cursor stop"
      }
    ]
  }
}
# 4. 项目级路由规则(关键!Cursor 的 additional_context 注入有 bug,
#    .mdc 规则是当前最可靠的路由引导通道)
MDC="$(npm root -g)/context-mode/configs/cursor/context-mode.mdc"
mkdir -p .cursor/rules
cp "$MDC" .cursor/rules/context-mode.mdc

# 5. 诊断验证
npx context-mode doctor

.mdc 规则带 alwaysApply: true,内容是给模型的硬规矩:分析/统计/过滤数据一律写代码走 ctx_execute;禁止用 Read 做分析(Read 只留给 Edit 前定位);禁止终端 curl/wget,抓网页走 ctx_fetch_and_index;文件创建修改必须用原生编辑工具,沙箱只做分析不做写入。

6.3 备选:本地插件(一键注册)

不想手写 JSON,可以从仓库直接装本地插件(自动注册 MCP + hooks + 规则 + skills):

# macOS / Linux:symlink 到 Cursor 本地插件目录
git clone https://github.com/mksglu/context-mode.git
ln -s "$PWD/context-mode" ~/.cursor/plugins/local/context-mode

# Windows 不跟 symlink,用 robocopy 镜像(官方 README 提供完整命令)
# 重启 Cursor → Settings → Plugins 出现 "Context Mode (Local)"
# 注册内容:1 个 MCP server + 7 个 skills + 5 个 hooks

注意:插件版 hook 命令是 npx -y context-mode hook cursor <event>(免全局安装但冷启动 4–5 秒);插件注册 5 个事件(多 sessionStart、afterAgentResponse),但 sessionStart 实际会被 Cursor 校验器拒绝。插件版与手动版二选一——两份同时存在时每个事件会触发两次,doctor 会警告 duplicate hook registrations。

6.4 验证

npx context-mode doctor
# 期望输出包含:
#   MCP server registered: pass
#   Hooks configured: 3/3(手动版)或 5/5(插件版)

然后在 Cursor CLI 会话里实测:让它「统计 src 目录下每个文件的行数」。接线正确的话,它应该调 ctx_execute 跑一段脚本而不是连发十几次 Read,结束时用 ctx stats 能看到真实的节省字节数。

6.5 Cursor 平台的三个已知坑(装前必读)

坑现状对策
sessionStart 被拒Cursor 官方 hooks 校验器直接拒绝该事件类型(Cursor 论坛 #149566)手动版不注册它;会话恢复暂不可用,路由引导靠 .mdc 规则补
additional_context 不注入postToolUse / sessionStart 返回的上下文被接受但不进模型(论坛 #155689 / #156157,Cursor 上游 bug).mdc 规则 + MCP 工具描述是当前主路由通道,等上游修复
preCompact 缺席v1 有意不发布该事件压缩前快照依赖 SessionStart 的平台才有;Cursor 暂不支持
即便三个坑全中,MCP 层照常工作(工具描述会引导模型用沙箱工具),只是从「程序化拦截」降级为「强引导」——这也是 6.2 里坚持要拷 .mdc 规则的原因。

7装完之后:数据都在哪

全部数据落本机,按平台隔离,随时可删。

路径 / 内容用途
~/.context-mode/content/默认存储根:sessions/ 会话库 + content/ 索引内容(可用 CONTEXT_MODE_DIR 改)
平台隔离目录如 ~/.claude/context-mode、~/.codex/context-mode、~/.omp/context-mode/,各宿主互不串数据
SQLite + FTS5会话事件(文件编辑/git/任务/决策/错误)与索引内容都在里面,BM25 检索
TTL 缓存ctx_fetch_and_index 抓的网页默认缓存 24 小时,14 天后清理

设计上,存储是「可抛弃的」:删掉目录只会丢索引和会话记忆,重装不丢任何项目代码。ctx purge 一键清空重来。

8怎么用:工具表与命令

装好后你几乎不用「手动」用它——hooks 会引导模型自己调用沙箱工具。但工具表值得过一遍。

MCP 工具作用官方基准
ctx_execute沙箱跑代码(12 种语言),只有 stdout 进上下文56 KB → 299 B
ctx_execute_file同上,输入从工作区文件读;限项目根内(containment)45 KB → 155 B
ctx_batch_execute一次跑多条命令 + 多组搜索,自动索引986 KB → 62 KB
ctx_index文本按标题分块进 FTS5 知识库60 KB → 40 B(指针)
ctx_searchBM25 搜索知识库,代码块原样返回按需
ctx_fetch_and_index抓 URL → 转 Markdown → 索引,TTL 缓存60 KB → 40 B
ctx_stats / ctx_doctor / ctx_upgrade / ctx_purge / ctx_insight统计 / 诊断 / 升级 / 清库 / 面板—

会话里可以对模型说 ctx stats、ctx doctor;终端里则直接跑 CLI:

context-mode doctor                                     # 诊断运行时 + hooks 健康度
context-mode index . --source project:my-app            # 把当前项目建入索引
context-mode search "authentication middleware" --source project:my-app
context-mode stats                                      # 看节省了多少
context-mode upgrade                                    # 应用待应用的修复

选型心法(对应官方 Tool Decision Matrix):要精确代码(文档、API 参考、skills 提示词)→ ctx_index + ctx_search;要统计结论(日志、测试输出、CSV、构建输出)→ ctx_execute_file;输出超过 100 KB 自动外置成 FTS5 指针,不丢数据。

会发生 vs 不会发生:

  • ✅ 会发生:Agent 把「读大文件做分析」改写成 ctx_execute 脚本;抓网页自动走 ctx_fetch_and_index;compact 后能恢复任务上下文(有 SessionStart 的平台);ctx stats 显示真实节省。
  • ❌ 不会发生:不改模型文风;不自动改写工具参数(updatedInput 上游未支持,Codex 平台 PreToolUse 只能 deny);不上传任何数据;在无 hooks 平台不强制拦截。

9进阶:安全与调参

默认配置已经够安全,这三件套是给要上生产环境的人准备的。

权限白名单/黑名单

{
  "permissions": {
    "deny": ["Bash(sudo *)", "Bash(rm -rf /*)", "Read(.env)", "Read(**/.env*)"],
    "allow": ["Bash(git:*)", "Bash(npm:*)"]
  }
}

沙箱有项目边界(containment):ctx_execute_file 只许碰项目根内文件,越界拒绝;确有需要(如读系统日志)用 Read(/var/log/**) 类 allow 规则显式放行。抓网页默认只走 http/https、禁元数据 IP;设 CTX_FETCH_STRICT=1 再禁掉私有网段。工具入参里的凭证字段持久化前会被红字遮罩。

并发调参

多 URL 抓取、多 API 调用属于 I/O 密集,concurrency 给 4–8;跑测试、构建、lint 或共享状态(端口、锁文件)保持 1。GitHub API 类 gh 调用封顶 4(rate limit)。

环境变量速查

变量默认用途
CONTEXT_MODE_DIR按平台自定义存储根(绝对路径)
CTX_FETCH_STRICT未启用设 1 禁止抓私有网段
CONTEXT_MODE_EXTERNAL_MCP_NUDGE_EVERY10每 N 次工具调用重新注入一次沙箱引导
CONTEXT_MODE_PLATFORM自动探测探测歧义时手动固定平台(如 codex)

10不止是「省 token」

名字叫 Context Mode,但下面这些场景才是它真正的用武之地。

  • 深度仓库研究:一次 subagent 级研究 986 KB → 62 KB(94%),多仓库对比不再是窗口杀手。
  • 网页抓取 / 浏览器自动化:Playwright 快照 99% 节省,配合 ctx_fetch_and_index 抓文档站不爆窗。
  • 大 JSON API 消费:20 个 GitHub issues 59 KB → 1.1 KB,格式化输出只留关键字段。
  • 文档与代码块精确检索:ctx_search 返回完整代码块而非摘要——「useEffect 清理函数」连代码带依赖数组原样回来。
  • 会话连续性:compact / 新会话后先 ctx_search(sort: "timeline") 再干活,不用重新交代背景(Cursor 等 sessionStart 受限平台暂不可用)。
  • 跨平台统一工作流:17 个平台同一套工具名、同一个 CLI 调度器(context-mode hook <platform> <event>),换宿主不改习惯。

11性能与成本

官方 BENCHMARK.md 的 21 个场景,fixture 全部来自真实工具调用(Playwright、GitHub、nginx、vitest 等),不是合成数据。

场景原始进上下文节省
Playwright 页面快照56.2 KB299 B99%
GitHub Issues(20 个)58.9 KB1.1 KB98%
nginx 访问日志(500 请求)45.1 KB155 B100%
Analytics CSV(500 行)85.5 KB222 B100%
git log(153 次提交)11.6 KB107 B99%
vitest 输出(30 套件)6.0 KB337 B95%
仓库研究(subagent)986 KB62 KB94%

两个口径要分清:ctx_execute_file 摘要型 95–100% 节省(数据变成 1–2 行结论);ctx_index + ctx_search 精确型 50–93%(返回完整原文块,代码示例 100% 原样保留,是为「能写代码」服务)。

一次完整调试会话的全景:7 类工具调用合计 177.1 KB → 10.2 KB,约 45,300 tokens → 2,600 tokens,窗口占用 22.7% → 1.3%(200K 窗口模型)。成本上相当于同样的任务预算下多出约 94% 的窗口给真正的问题。会话时长从「30 分钟后 40% 上下文没了」延长到官方宣称的约 3 小时。125 个自动化测试(执行器 55 / FTS5 34 / MCP 集成 22 / 生态基准 14)全过,可 npm run test:all 复现。

12FAQ / 踩坑

每条都给可执行的解法,来源为官方文档与 issue 讨论。

Cursor 里 sessionStart 报 "unknown hook type"?

Cursor 的 hooks 校验器当前拒绝 sessionStart(论坛帖 #149566)。对策:手动版 hooks.json 不写这个事件(官方就是这么发的);会话恢复功能在 Cursor 上暂缺,路由引导由 .mdc 规则承担。等 Cursor 上游修复后再补。

hooks 返回的 additional_context 模型看不到?

Cursor 上游 bug(论坛 #155689 / #156157):hook 响应被接受并记录,但内容不注入模型上下文。对策:把路由引导放进 .mdc 规则(alwaysApply)+ 依赖 MCP 工具自描述;这也是 6.2 第 4 步存在的原因。

doctor 警告 duplicate hook registrations?

本地插件和手动 .cursor/hooks.json 同时注册了 context-mode,每个事件会触发两次。对策:二选一——要么删掉手动配置只留插件,要么卸掉本地插件只留手动版。

Linux 老发行版 npm install 编译失败?

老 glibc 环境编译 better-sqlite3 缺工具链。对策(根治):升 Node ≥ 22.5,自动切内置 node:sqlite 免编译。兜底:CentOS/RHEL 用 gcc-toolset-10,Alpine 用 apk add build-base python3 py3-setuptools。Windows 缺 binding 的情况 postinstall 会自动修复,无需手动 npm rebuild。

插件版 hook 每次冷启动 4–5 秒?

插件 hook 命令用 npx -y context-mode(免全局安装但每次解析包)。对策:npm i -g context-mode 后插件 manifest 会自动拾取全局二进制;或直接走 6.2 手动配置,hook 命令直接用全局 context-mode。

Codex CLI 上 hooks 不生效或行为受限?

三步检查:~/.codex/config.toml 里 [features] hooks = true(旧别名 codex_hooks 仍接受);PreToolUse 仅支持 deny(additionalContext 在 PreToolUse 不被支持,上下文注入走 PostToolUse / SessionStart);参数改写需要上游 updatedInput(openai/codex#18491 跟踪中)。

数据安全吗?会出我的机器吗?

不出。无遥测、无云服务,全部本机 SQLite。认证 CLI(gh / aws / gcloud / kubectl / docker)的凭证透传给沙箱进程但不暴露进上下文;tool_input 持久化前遮罩凭证字段。隐私敏感环境再叠加 CTX_FETCH_STRICT=1。

沙箱能用来写文件吗?

不能,也不该。官方规则明确:ctx_execute / ctx_execute_file 只用于分析和计算;文件创建与修改一律走原生编辑工具(Edit/apply_patch),避免绕过 diff 审查。

13许可与合规

Elastic License 2.0(ELv2)——对个人和公司内部使用完全开放,但有一条红线。

  • ✅ 可以:自由使用、修改、分发,集成进自己的开发工作流,公司内部部署。
  • ❌ 不可以:把它作为托管服务提供给他人(managed service),或移除 / 规避许可声明。
  • 对个人开发者与团队内部工具链无任何影响;若你做的是面向第三方的 SaaS 化产品并打算内嵌它,需要先过一遍 ELv2 条款或联系作者。

Context Mode 新手教程