> Context Mode:一个 MCP 服务器,用沙箱隔离、会话记忆和"用代码思考"三板斧,把 AI 编程助手的上下文消耗砍掉 94%。
## 你一定经历过这个时刻
你用 Claude Code 写代码,写了半小时,一切顺利。突然,它停下来问你:
> "我需要确认一下——我们刚才在修改哪个文件来着?"
你愣住了。**它刚才就在改那个文件。**
更让人崩溃的是,当系统自动压缩对话来腾空间的时候,它会忘记你正在做什么任务、改了哪些文件、解决了哪些错误。就像一个失忆症患者,每隔一段时间就"重启"一次。
这不是模型不够聪明。这是上下文窗口管理的结构性缺陷。
一个土耳其开发者 mksglu 用一个 MCP 插件解决了这个问题。二月底创建,四月份逼近一万星,登上了 Hacker News 第一名。Microsoft、Google、Meta、Amazon、ByteDance、Stripe、GitHub、Supabase、Notion、Canva……这些公司的团队都在用。
它叫 **Context Mode**。
## 问题到底出在哪?
AI 编程助手每次调用工具,都会把原始数据塞进上下文窗口:
- 一个 Playwright 页面快照:**56 KB**
- 20 条 GitHub Issues:**59 KB**
- 一份 nginx 访问日志:**45 KB**
30 分钟后,**40% 的上下文窗口已经被工具输出占满了**。留给实际思考和代码生成的空间越来越少。
而当上下文快满时,系统会自动"压缩"对话——把旧消息总结成更短的版本。这个过程会丢失关键信息:正在编辑的文件、进行中的任务、已解决的错误、你的偏好设置。
Context Mode 从三个维度同时解决这个问题。
## 第一板斧:沙箱隔离——把数据关在门外
Context Mode 提供了 6 个"沙箱工具",替代原始的 Bash、Read、WebFetch:
| 工具 | 做什么 | 效果 |
|------|--------|------|
| `ctx_execute` | 在隔离子进程中执行代码,只有 stdout 进入上下文 | 56 KB → 299 B |
| `ctx_execute_file` | 在沙箱中处理文件,原始内容永远不离开 | 45 KB → 155 B |
| `ctx_batch_execute` | 一次调用执行多个命令+搜索多个查询 | 986 KB → 62 KB |
| `ctx_index` | 把 Markdown 分块存入 FTS5 全文索引 | 60 KB → 40 B |
| `ctx_search` | 按需检索索引内容 | 按需获取 |
| `ctx_fetch_and_index` | 抓取 URL、分块索引,24 小时缓存 | 60 KB → 40 B |
核心思想极其简单:**代码在沙箱里跑,结果只有一行摘要回到上下文。**
举个例子。你想分析一个 500 行的 nginx 访问日志,找出访问量最高的 5 个 IP。传统方式是 `Read` 整个文件(45 KB 全部进入上下文),然后让 LLM 自己分析。
用 Context Mode,你写一段 JavaScript:
```javascript
const fs = require('fs');
const log = fs.readFileSync('/var/log/nginx/access.log', 'utf8');
const ips = {};
log.split('\n').forEach(line => {
const match = line.match(/^(\S+)/);
if (match) ips[match[1]] = (ips[match[1]] || 0) + 1;
});
const top5 = Object.entries(ips).sort((a,b) => b[1]-a[1]).slice(0, 5);
console.log('Top 5 IPs:', JSON.stringify(top5));
```
输出只有一行:`Top 5 IPs: [["192.168.1.1",342],["10.0.0.5",287],...]]`
**45 KB 的原始数据变成了 155 字节的答案。** 节省了 99.7%。
这就是 Context Mode 的核心哲学——**"用代码思考"(Think in Code)**:
> LLM 应该编程来分析数据,而不是自己当数据处理器。写一个脚本让它去数,`console.log()` 只输出结果。一个脚本替代十个工具调用,节省 100 倍上下文。
## 第二板斧:会话记忆——压缩也不怕
光省上下文还不够。当对话最终被压缩时,Context Mode 通过 4 个 Hook 协同工作来保证会话连续性:
| Hook | 作用 |
|------|------|
| **PreToolUse** | 在工具执行前拦截,强制路由到沙箱工具 |
| **PostToolUse** | 在工具执行后捕获事件(文件编辑、Git 操作、错误、任务状态) |
| **PreCompact** | 在压缩前构建快照,保存当前工作状态 |
| **SessionStart** | 在压缩后或恢复会话时,从 SQLite 数据库重建状态 |
每个工具调用都会被 PostToolUse Hook 捕获并结构化存储:
- **文件操作**:读、写、编辑、搜索(P1 优先级)
- **任务状态**:创建、更新、完成
- **规则文件**:CLAUDE.md / GEMINI.md 的路径和内容
- **用户决策**:你的纠正和偏好("用 X 而不是 Y")
- **错误信息**:失败的工具调用和错误消息
- **Git 操作**:commit、push、branch 切换
所有数据存入 **SQLite FTS5** 全文索引数据库。当对话被压缩后,Context Mode 不会把所有历史数据重新塞回上下文——而是通过 **BM25 搜索**只检索与当前任务相关的信息。
**模型从上次中断的地方继续,不会问你"我们刚才在做什么"。**
搜索系统还做了几个精巧的优化:
- **双策略融合(RRF)**:Porter 词干匹配 + Trigram 子串匹配,用 Reciprocal Rank Fusion 合并结果
- **邻近重排**:多词查询中,词距近的结果排名更高
- **模糊纠错**:Levenshtein 距离自动纠正拼写错误("kuberntes" → "kubernetes")
- **智能片段**:不是截断前 N 个字符,而是围绕匹配位置提取窗口
## 第三板斧:用代码思考——范式转换
Context Mode 最激进的设计决策是:**把"用代码思考"变成强制范式。**
在工具描述中,它直接告诉模型:
> **MANDATORY**: Use for any command where output exceeds 20 lines.
>
> THINK IN CODE: When you need to analyze, count, filter, compare, or process data — write code that does the work and console.log() only the answer. Do NOT read raw data into context to process mentally. **Program the analysis, don't compute it in your reasoning.**
这不是建议,是强制。通过 PreToolUse Hook,Context Mode 会在模型尝试用原始 Bash/Read 工具时拦截并重定向到沙箱工具。
支持 11 种语言:JavaScript、TypeScript、Python、Shell、Ruby、Go、Rust、PHP、Perl、R、Elixir。自动检测 Bun 运行时,JS/TS 执行速度提升 3-5 倍。
## 实测数据
| 场景 | 原始大小 | 上下文消耗 | 节省 |
|------|---------|-----------|------|
| Playwright 页面快照 | 56.2 KB | 299 B | **99%** |
| 20 条 GitHub Issues | 58.9 KB | 1,139 B | **98%** |
| nginx 访问日志 | 45.1 KB | 155 B | **100%** |
| 500 行分析 CSV | 85.5 KB | 222 B | **100%** |
| 150+ 条 Git 日志 | 11.6 KB | 107 B | **99%** |
| React useEffect 文档 | 5.9 KB | 261 B | **96%** |
**完整调试场景**:177.1 KB → 10.2 KB,节省 94% 的上下文。原本占用 22.7% 的上下文窗口,现在只占 1.3%。
## 跨平台支持
Context Mode 支持 12 个 AI 编程平台:
- **完整会话连续性**:Claude Code、Gemini CLI、VS Code Copilot
- **高连续性**:OpenCode、KiloCode、OpenClaw、Pi Coding Agent
- **部分支持**:Cursor、Codex CLI、Kiro
- **仅 MCP 工具**:Antigravity、Zed
Claude Code 的集成最深——通过插件市场一键安装,自动注册所有 Hook 和工具,无需手动配置。
## 工程师的实用指南
### 快速安装(Claude Code)
```
/plugin marketplace add mksglu/context-mode
/plugin install context-mode@context-mode
```
重启后运行 `/context-mode:ctx-doctor` 验证安装。
### 日常使用模式
1. **分析日志/数据**:用 `ctx_execute_file` 而不是 `Read`
2. **查阅文档**:用 `ctx_index` + `ctx_search` 而不是直接粘贴
3. **批量操作**:用 `ctx_batch_execute` 一次执行多个命令
4. **抓取网页**:用 `ctx_fetch_and_index` 而不是 `WebFetch`
### 注意事项
- 首次使用需要适应"写代码来分析"的范式,但一旦习惯,效率会显著提升
- 搜索结果的质量取决于索引内容的质量——确保 `source` 参数准确
- 24 小时 TTL 缓存意味着频繁抓取同一 URL 不会重复消耗网络资源
- 14 天自动清理旧索引数据库,无需手动维护
## 开源了,你可以自己玩
- **GitHub**: [mksglu/context-mode](https://github.com/mksglu/context-mode)
- **npm**: `npm install -g context-mode`
- **许可证**: ELv2(Elastic License 2.0)
- **语言**: TypeScript,125 个测试全部通过
- **Star**: 接近 10,000(2026 年 4 月)
代码结构清晰,核心文件:
- `src/server.ts` — MCP 服务器主入口,工具注册和安全策略
- `src/executor.ts` — 多语言沙箱执行器
- `src/store.ts` — SQLite FTS5 全文索引和 BM25 搜索
- `src/session/` — 会话跟踪和连续性管理
- `hooks/` — 各平台的 Hook 脚本
## 我的思考
Context Mode 让我重新思考了一个问题:**AI 编程助手的瓶颈到底在哪里?**
过去一年,模型能力突飞猛进——Claude、GPT、Gemini 的编码能力都在快速提升。但上下文窗口的管理方式几乎没有变化。我们还在用"把所有数据塞进上下文,让模型自己看"的原始方式。
Context Mode 的核心洞察是:**上下文窗口不应该当数据库用。**
数据库负责存储和检索,上下文窗口负责思考和生成。让专业的事归专业的工具做。
这和人类的工作方式高度一致——你不会把整个代码库加载到工作记忆里再开始编程。你会用 `grep` 搜索、用 `git log` 查历史、用 IDE 的索引跳转。Context Mode 本质上是在给 AI 编程助手装上这些"外部记忆"工具。
"用代码思考"这个范式尤其值得深思。它不仅仅是节省上下文——它是在改变 AI 的工作方式。让 AI 从"数据处理器"变成"代码生成器",这可能是 AI 编程助手走向真正实用的关键一步。
---
**项目信息**
- **名称**: Context Mode — The other half of the context problem
- **作者**: mksglu(土耳其开发者)
- **GitHub**: [github.com/mksglu/context-mode](https://github.com/mksglu/context-mode)
- **官网**: [mksg.lu](https://mksg.lu/)
- **Hacker News**: [#1 570+ points](https://news.ycombinator.com/item?id=47193064)
- **社区讨论**: [anthropics/claude-code#24677](https://github.com/anthropics/claude-code/issues/24677)
- **Star 历史**: [star-history.com/#mksglu/context-mode](https://star-history.com/#mksglu/context-mode&Date)
登录后可参与表态
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!