hashline mcp
用于精确、哈希引用文件编辑的MCP服务器。与其复制精确的内容或依赖脆弱的行号,不如通过短内容哈希对引用行进行建模,使编辑具有原子性、可验证性和抗状态漂移性。
问题
当前的LLM编辑工具以可预测的方式损坏:
- 补丁格式 在大多数型号上发生灾难性故障(在微调环境之外的故障率超过50%)
- 字符串替换 需要完美再现包括空格在内的内容——此时“找不到字符串”错误实际上是一个模因
- 完整文件重写 工作但浪费代币,在大文件上崩溃
所有这些方法都迫使模型回忆他们已经看到的确切文件内容,这从根本上来说是错误的抽象。
想法
用简短的内容哈希标记每一行。模型参考线 line:hash 而不是再现内容:
12:a3|function hello() {
13:f1| return "world";
14:0e|}要编辑第13行,模型只需说“替换” 13:f1 随着 return "hello";“--不需要完全回忆原始字符串,不需要对空格敏感,也不需要对匹配的出现产生歧义。
如果文件自模型上次读取以来发生了变化,哈希值将不匹配,编辑将彻底失败。重新读取,重试。简单。
工具
hashline_read
读取文件并返回标记为的每一行 lineNumber:hash|content,其中哈希是行内容SHA-256的前2个十六进制字符。
{
"path": "src/index.ts",
"range": { "start": 1, "end": 50 }
}hashline_edit
使用以下命令应用一个或多个操作 line:hash 参考文献所有哈希值都会预先验证——如果有任何不匹配的地方,整个编辑都会被拒绝(原子全有或全无)。从下到上应用操作以保留行号。
支持的操作:
| 操作 | 描述 |
|---|---|
replace | 用新内容替换单行或范围 |
insert_after | 在引用的行后插入内容 |
insert_before | 在引用行之前插入内容 |
delete | 删除一行或一个范围 |
{
"path": "src/index.ts",
"operations": [
{ "type": "replace", "target": "12:a3", "content": "function greet() {" },
{ "type": "delete", "target": "20:b7", "end_target": "25:c1" },
{ "type": "insert_after", "target": "30:d4", "content": "// new section\nconst x = 1;" }
]
}成功编辑后,响应包括一个上下文窗口(每次编辑周围±5行),其中包含更新的哈希值,因此模型可以继续编辑而无需完全重新读取。
设置
需要节点18+。
npm install
npm run buildclaude代码集成
添加到MCP配置(~/.claude/settings.json 或项目级别):
{
"mcpServers": {
"hashline": {
"command": "node",
"args": ["path/to/hashline-mcp/dist/index.js"]
}
}
}发展
npm run dev # runs with tsx, no build step needed设计决策
- 2节哈希:足够短,不会使上下文膨胀,足够长,可以捕获过时的状态。冲突在理论上是可能的,但实际上无关紧要——目标是检测文件更改,而不是加密唯一性
- 自下而上的应用程序:当多个操作针对不同的行时,从下往上应用意味着早期操作不会为后期操作更改行号
- 重叠拒绝:拒绝单个编辑调用中的重叠范围——强制显式分离并防止意图模糊
- 全有或全无验证:一个错误的哈希值会导致整个编辑失败。无部分突变,无损坏状态
技术栈
- TypeScript+Node.js
@modelcontextprotocol/sdk用于MCP服务器/传输zod用于模式验证- stdio传输(适用于任何MCP客户端)
灵感
hashline概念的灵感来自 可以 部分的文章 *线束问题*,它认为在LLM和代码更改之间进行调解的工具——而不是模型本身——是人工智能辅助开发的真正瓶颈。本文演示了行哈希引用极大地提高了跨模型的编辑成功率,同时减少了令牌的使用。
许可证
麻省理工学院
