哈希引用文件编辑服务

一个通过短内容哈希精确引用行号进行原子化文件编辑的MCP服务器,解决传统LLM编辑工具的脆弱性问题,适用于代码协作和AI辅助开发场景。

  • by ck0i
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 ck0i/hashline-mcp

使用说明

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 build

claude代码集成

添加到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和代码更改之间进行调解的工具——而不是模型本身——是人工智能辅助开发的真正瓶颈。本文演示了行哈希引用极大地提高了跨模型的编辑成功率,同时减少了令牌的使用。

许可证

麻省理工学院