Context Mode 新手教程
一个 MCP server + hooks 组合,替 AI 编程代理守住上下文窗口:工具的原始输出进沙箱和本地索引,上下文里只留答案。官方适配 17 个平台,Cursor 是其中的一等公民。
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 实测场景)。
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 拦截重定向 → 窗口里只进摘要。
整个体系由三块组成,对应三个支柱:
- 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 / KiloCode | TS 插件 | 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 存储 | 索引内容与缓存全部落本地,无网络依赖 |
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)。
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 暂不支持 |
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_search | BM25 搜索知识库,代码块原样返回 | 按需 |
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_EVERY | 10 | 每 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 KB | 299 B | 99% |
| GitHub Issues(20 个) | 58.9 KB | 1.1 KB | 98% |
| nginx 访问日志(500 请求) | 45.1 KB | 155 B | 100% |
| Analytics CSV(500 行) | 85.5 KB | 222 B | 100% |
| git log(153 次提交) | 11.6 KB | 107 B | 99% |
| vitest 输出(30 套件) | 6.0 KB | 337 B | 95% |
| 仓库研究(subagent) | 986 KB | 62 KB | 94% |
两个口径要分清: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 条款或联系作者。
14参考链接
| 资源 | 说明 |
|---|---|
| GitHub 仓库 | mksglu/context-mode,v1.0.169,22.9k+ stars |
| platform-support.md | 17 平台能力矩阵(MCP / hooks / SessionStart / 遵从率) |
| BENCHMARK.md | 21 场景基准数据与复现方法 |
| configs/ | 各平台配置模板(Cursor 的 hooks.json / mcp.json / .mdc 都在这里) |
| CONTRIBUTING.md | 开发与贡献流程(clone → npm install → npm test) |
| Issues | 问题反馈(当前 open issues 246) |