hledit-mcp
Exposes hash-anchored file edits to MCP-compatible AI coding agents, enabling safe read and write operations with stale edit detection.
README
hledit-mcp
hledit-mcp is an MCP server exposing hledit's hash-anchored file edits to any MCP-compatible AI coding agent — Claude Code, Claude Desktop, Cursor, and others.
Same idea as pi-hledit (the Pi-native integration), but over MCP instead of Pi's extension API, so it reaches every MCP host, not just Pi.
Instead of asking an agent to reproduce old text exactly, hledit read annotates each line with a stable anchor:
5#HY:func main() {
6#MX: fmt.Println("hello")
7#NP:}
Write commands reference anchors such as 6#MX. Before changing the file, hledit recomputes the hash at that line. If the file changed since it was read, the anchor is rejected and no write happens — the agent gets a stale error and a remap hint instead of silently corrupting the wrong line.
Why MCP, separately from pi-hledit
pi-hledit and hledit-mcp share the same tool contract (core.ts in this repo — arg-building, batch translation, result formatting) and the same underlying hledit CLI. Only the registration/execution glue differs: pi-hledit wires that contract into Pi's registerTool, this wires it into @modelcontextprotocol/sdk's McpServer. MCP has no equivalent of Pi's renderCall/renderResult terminal rendering, so this package doesn't have one either — that layer is genuinely Pi-specific chrome, not part of the portable tool contract.
Requirements
- Go 1.21+ to install the
hleditCLI (or a prebuilt binary onPATH) - Node.js 18+
- An MCP-compatible client
Install
Install the hledit CLI first:
go install github.com/dabito/hledit@latest
Then configure your MCP client to run hledit-mcp. For Claude Code:
claude mcp add hledit npx hledit-mcp
Or add it manually to your client's MCP server config:
{
"mcpServers": {
"hledit": {
"command": "npx",
"args": ["hledit-mcp"]
}
}
}
Configuration
| Variable | Default | Description |
|---|---|---|
HLEDIT_BIN |
hledit (on PATH) |
Path to the hledit binary, if not on PATH. |
HLEDIT_CWD |
server's process.cwd() |
Working directory hledit resolves relative paths against. |
Tool
hledit
One tool, three operations, matching pi-hledit's contract exactly:
op |
Purpose |
|---|---|
read |
Annotate lines with LN#HASH anchors |
edit |
Apply a single replace/insert/delete/replace-range |
batch |
Apply multiple anchor-referenced edits in one call |
| Name | Type | Required | Description |
|---|---|---|---|
op |
string | ✓ | "read", "edit", or "batch" |
path |
string | ✓ | File path |
offset |
number | 1-indexed starting line (read) |
|
limit |
number | Max lines to return (read) |
|
grep |
string | Filter lines by substring (read) |
|
action |
string | replace, insert, delete, or replace-range (edit) |
|
anchor |
string | for edit/batch |
LN#HASH anchor, e.g. 12#NK |
end_anchor |
string | End anchor for replace-range/range delete |
|
content |
string | Replacement/inserted content; empty = delete | |
after |
boolean | For action:"insert", insert after the anchor |
|
edits |
string | for batch |
JSON array of batch edit ops |
Workflow: read to get anchors → edit (single change) or batch (multiple). If an edit returns stale, re-read to get fresh anchors before retrying — the anchor's line moved or changed since it was read.
Development
npm install
npm test # typecheck + build + unit/e2e tests + lint
npm run build # compile index.ts+core.ts to dist/index.js
npm start # run the server directly from source via tsx (stdio transport)
Unit tests in core.test.ts cover the same contract as pi-hledit's test suite, minus the Pi-specific rendering assertions (there's no render layer here). e2e.test.ts drives the built dist/index.js over a real MCP stdio handshake with @modelcontextprotocol/sdk's own Client/StdioClientTransport — the same artifact npx hledit-mcp runs, not just the TypeScript source.
The published bin/main point at dist/index.js, built with esbuild (build.mjs) and run via plain node — this keeps the >=18 Node requirement honest. Running index.ts directly with node (no tsx) only works on Node ≥22.6, which has built-in TypeScript type-stripping; older LTS versions have no such support at all.
Related packages
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.