【免费下载链接】coding-tools-mcp
Give any AI agent the ability to code
coding-tools-mcp 是一个让任何 AI 聊天客户端都能安全读写代码仓库的 MCP 编程运行时。相比同类工具,它最独特的设计是「为上下文窗口精打细算」:每一次工具结果在返回给模型之前,都会经过摘要、分页与截断三重处理。官方在确定性 dogfood 基准上实测,序列化结果字节相比上一版本下降了37%,而任务完成率保持不变。🎯
下面拆解这套设计哲学的三个核心原则。
上下文窗口正在被工具结果悄悄吃满
先理解问题所在:AI agent 的每轮对话都在消耗上下文窗口,而工具调用结果是消耗大户。
- 读一个大文件,可能一次性塞进几万行;
- 跑一次
pytest -v,输出动辄上千行; git log、构建日志、依赖树……每一轮都在叠加。
上下文被"噪音"挤掉之后,模型会开始"失忆"——忘掉了任务目标、之前的约束,回答质量下降,token 费用也同步上涨。更隐蔽的是:这些浪费的字节,大部分是重复传输的(比如把完整 JSON 再镜像一份给模型看)或模型根本用不到的(比如一屏之外的日志)。
coding-tools-mcp 的回答是:与其事后压缩,不如在设计上就让结果"小而准"。
设计原则一:摘要优先,模型只读它需要的
这个项目的每个工具返回都拆成两层(见 docs/tools-and-schemas.md):
| 层 | 给谁用 | 形态 |
|---|---|---|
content文本 | 模型 | 按工具定制的摘要,硬上限 16 KiB |
structuredContent | 程序/客户端 | 完整结构化数据,不做冗余镜像 |
关键点在于:content不是 JSON 的镜像,而是每个工具单独设计的"人话版摘要"(渲染逻辑集中在 tool_results.py):
read_file:返回Showing lines 1-2000 of 5832加实际内容,并附带revision版本号,模型无需重复读全文就能定位;exec_command:Status: exited | exit code 0 | 120 ms——决策关键字段(状态、退出码、耗时)前置,模型不用再从输出里"猜"成功与否;apply_patch:只回一句Patch applied to 3 files (+12 -4),外加每个受影响文件的 revision,而不是把整份 diff 再发一遍;- 错误信息:带
Retryable: yes/no和修复建议,避免模型反复重试一个注定失败的调用; view_image:图片 base64 在整个结果中只出现一次,结构化元数据里不再重复。
一句话:重复传输的 JSON、diff、base64,一分钱上下文都不花。💰
设计原则二:分页,让长内容"按需续读"
截断不等于丢失。coding-tools-mcp 的每个被截断的结果,都附带一个"下一页"的现成调用参数,模型可以像翻书一样继续读:
- 文件读到底了吗?结果里直接给出
continue with read_file(path=..., start_line=4001)(见 tool_results.py); - 命令输出被截断?用返回的
output_ref按字节偏移分页:read_output(output_ref="command:abc:stdout", offset=...); - 搜索结果过多?返回
… showing 50 of 327 matches; narrow the query or raise max_results,同时告诉模型"收窄查询"或"提高上限"两条路(见 tool_results.py); - 交互命令默认只等 10 秒就交还控制权,长任务带着
command_id继续跑,模型用write_stdin跨轮次轮询,不会为了"盯着看"而空转上下文。
分页的本质是把"一次性倾倒"变成"取多少给多少",上下文窗口里永远只有当前这一页。📄
设计原则三:截断是最后一道防线,且永不失控
前两层依赖工具自觉,第三层是制度保障——双级上限,外加一道全局安全天花板:
- 单次调用上限:文本输出默认按「2000 行 / 50 KB」截断(见 textutils.py),行、字节两个维度谁先到就按谁截,并如实报告
truncated_by: lines/bytes; - 保头保尾策略:命令流保留最早的"头段"加滚动更新的"尾部",中间超预算的字节被淘汰,并通过
evicted_gap_bytes、omitted_bytes元数据如实报告丢失了多少,不假装数据完整(见 processes.py); - 全局安全天花板:任何工具发给模型的文本都有约 2 MiB 的兜底上限(见 tool_results.py),作为"防御纵深"存在——哪怕某个条目(比如一整行超长 minified 代码)意外巨大,也不会击穿窗口。
配合 docs/tools-and-schemas.md 的建议:预期输出超预算时,把日志重定向到文件,再用read_file/search_text分页读——把"流式盯梢"换成"检索式阅读"。
用数据说话:结果字节下降 37%
这不是拍脑袋的优化,项目用确定性 dogfood 基准(同一 runner、同一任务集、同一机器,各跑 5 次)验证了效果(见 reports/benchmark/dogfood-v0.1-v0.2.md):
| 指标 | 0.1.7 | 0.2.0 | 变化 |
|---|---|---|---|
| 任务完成率 | 100% | 100% | 0.0% |
| 工具调用次数 | 18 | 18 | 0.0% |
| 结果字节(中位) | 18,898 | 11,853 | -37.28% |
| 端到端耗时(中位) | 1876 ms | 1881 ms | +0.30% |
结论很干净:任务没变少一步、没变慢一秒,模型每轮要吞的结果字节少了 37%。这正是"省上下文窗口"最直接的证据。📉
三个原则一张表
| 原则 | 做什么 | 对上下文窗口的收益 |
|---|---|---|
| 摘要 | 模型文本与完整 JSON 分离,按工具定制 | 不重复传输 JSON / diff / base64 |
| 分页 | 每个截断处附带"下一页"参数 | 长文件、长输出按需续读 |
| 截断 | 行/字节双上限 + 全局安全天花板 | 任何单次结果都不会失控 |
如何开始使用
省上下文的优化是默认开启的,无需任何额外配置。一行命令即可启动,并接入 Claude Desktop、Cursor、VS Code 等任何 MCP 客户端(完整配置见 docs/quickstart.md 与 docs/mcp-client-config.md):
uvx coding-tools-mcp --stdio --workspace /path/to/repo接入后对它说一句"跑一下测试,把第一个失败修了"——你会发现它读文件、打补丁、跑测试时,上下文窗口始终清爽。✨
延伸阅读
- 工具清单与结果信封规范:docs/tools-and-schemas.md
- 运行时契约(规范性文档):docs/runtime-contract-v0.3.md
- 结果渲染实现:coding_tools_mcp/tool_results.py
- 文本截断实现:coding_tools_mcp/textutils.py
- 已知限制(输出保留策略等):docs/limitations.md
- 基准报告总览:reports/benchmark/
【免费下载链接】coding-tools-mcp
Give any AI agent the ability to code
相关推荐
Sandcastle 用量上报设计:为什么只暴露原始 Token 计数而非上下文窗口百分比
Sandcastle 用量上报设计:为什么只暴露原始 Token 计数而非上下文窗口百分比 IterationResult.usage 是 Sandcastle
为什么数据科学项目需要标准化结构:Cookiecutter Data Science(CCDS)的设计哲学与实践解析
为什么数据科学项目需要标准化结构:Cookiecutter Data Science(CCDS)的设计哲学与实践解析 数据科学代码的质量,归根结底只有两个词:
开发工具CLIgh_mirrors/to/tools代码格式化哲学:为什么一致性如此重要
gh_mirrors/to/tools代码格式化哲学:为什么一致性如此重要 在现代软件开发中,代码格式化往往被视为一种"锦上添花"的工作,而非核心需求。然而,对
开发工具Lint格式化前端构建编译器代码质量编辑器
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考