envsync-le-mcp
An MCP server that compares dotenv files and reports
which keys are missing from which — names only, never values — the comparison
engine behind the
EnvSync-LE
editor extension, exposed as a tool an agent can call.
No dependencies, no network calls, no filesystem access. Content goes in,
structured results come out.
Use it
Point any MCP host at npx envsync-le-mcp.
Claude Code
claude mcp add envsync-le -- npx -y envsync-le-mcp
Anything with a JSON config — Cursor, Windsurf, Claude Desktop:
{
"mcpServers": {
"envsync-le": {
"command": "npx",
"args": ["-y", "envsync-le-mcp"]
}
}
}
VS Code needs nothing here. Install the extension instead — it
carries this server and registers it for you:
VS Code Marketplace
· Open VSX
No Node? The same compare_env_files tool ships in a static Rust
binary: cargo install envsync-le, then envsync-le mcp
(crates.io). The two servers answer
identically — one fixture corpus runs against both and CI fails if they
diverge. The binary additionally offers envsync_le_check, which
discovers the dotenv files in a directory; this server reads no files,
which is what lets an agent call it anywhere.
Prefer a global install to npx on every launch:
npm install -g envsync-le-mcp
{
"mcpServers": {
"envsync-le": { "command": "envsync-le-mcp" }
}
}
No environment variables, no API key, no configuration of its own. To check it
before wiring it into anything:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y envsync-le-mcp
If that prints the tool name, the server works.
The tool
compare_env_files
files | object[] | required. The dotenv files to compare, each { "path": ".env", "content": "…" }. |
mode | string | auto (the default) compares every file against the union of all keys, so nothing can be extra; template compares every file against one. |
templatePath | string | Which file is the template. Required when mode is template. |
caseSensitive | boolean | Compare key names case-sensitively. Default true. |
maxResults | number | Default 500, ceiling 5000. |
Returns the overall status — in-sync, missing-keys, extra-keys or
parse-error — each file with its key count, and the keys missing from each
file (and, in template mode, extra in it) by name only. A value never
leaves the tool. maxResults caps the mismatches returned, and
meta.truncated says whether any were dropped.
{
"ok": true,
"data": {
"status": "missing-keys",
"files": [
{"path": ".env", "type": "base", "keyCount": 2},
{"path": ".env.example", "type": "example", "keyCount": 1}
],
"missingKeys": [
{
"filepath": ".env.example",
"keys": ["DB_HOST"],
"reference": ".env"
}
],
"extraKeys": []
},
"diagnostics": [],
"meta": {
"tool": "compare_env_files",
"count": 1,
"truncated": false
}
}
Extraction is heuristic, and what it deliberately does not match is
documented as carefully as what it does — see the
extension README.
Also in the MCP registry
io.github.nolindnaidoo/envsync-le —
registry.modelcontextprotocol.io
Nine more like it
One tool each, same shape: content in, structured data out, no network and no
filesystem. Every one is on npm as <name>-mcp and in the MCP registry as
io.github.nolindnaidoo/<name>.
Every tool in the family, one page: letools.dev
Built by
Nolin Naidoo — Chief Engineer, AI/ML & Platform
Architecture. nolindnaidoo.com ·
GitHub ·
LinkedIn
Also from the same workshop
Twelve Rust tools built the same way: small, single-purpose, and driven by a
machine rather than a person. pixelcoords and pixelactions make up one loop —
pixelcoords answers where, pixelactions acts there. The ten LE crates are
the terminal half of the extensions they sit in: the same detection, held to
the extension's own corpus, and an exit code instead of a results editor.
Licence
MIT © Nolin Naidoo