paths-le-mcp
v2.4.1
Published
Extract file and directory paths from config files and code, with their kind and position.
Maintainers
Readme
paths-le-mcp
An MCP server that extracts file and directory paths from configuration, markup and code — the extraction engine behind the Paths-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 paths-le-mcp.
Claude Code
claude mcp add paths-le -- npx -y paths-le-mcpAnything with a JSON config — Cursor, Windsurf, Claude Desktop:
{
"mcpServers": {
"paths-le": {
"command": "npx",
"args": ["-y", "paths-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 extract_paths tool ships in a static Rust binary:
cargo install paths-le, then paths-le mcp
(crates.io). The two servers answer
identically — one fixture corpus runs against both and CI fails if they
diverge — so pick on runtime, not behaviour. The binary additionally
offers paths_le_audit, which resolves the paths it finds against the
filesystem; this server deliberately reads no files, which is what
lets an agent call it anywhere.
Prefer a global install to npx on every launch:
npm install -g paths-le-mcp{
"mcpServers": {
"paths-le": { "command": "paths-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 paths-le-mcpIf that prints the tool name, the server works.
The tool
extract_paths
| argument | type | |
|---|---|---|
| content | string | required. The document text to scan. |
| format | string | One of csv, tsv, toml, dotenv, javascript, typescript, json, html, css, yaml, markdown. Common extensions and aliases (ts, tsx, jsonc, scss, env, yml…) are accepted. Optional: with neither this nor filename, the content is scanned as text. |
| filename | string | Used to infer format when it is absent — tsconfig.json resolves to json, .env to dotenv, ci.yml to yaml. A name that resolves to nothing gets the text scan. |
| dedupe | boolean | Collapse repeats to the first occurrence. Default false. |
| maxResults | number | Default 500, ceiling 5000. |
Returns each path with its kind — file, relative, absolute or
url — and 1-based line and column, plus meta.truncated so a capped
result is never mistaken for a complete one. Columns count UTF-16 code
units, which is what an editor reports, so a position lines up with
the file open in front of you.
{
"ok": true,
"data": {
"paths": [
{"value": "./dist/index.js", "type": "relative", "line": 1, "column": 11},
{"value": "guide/setup.md", "type": "file", "line": 1, "column": 38}
],
"fileType": "json"
},
"diagnostics": [],
"meta": {
"tool": "extract_paths",
"count": 2,
"truncated": false
}
}Paths are reported as written. Nothing is resolved against a
workspace or the filesystem, and this server reads no files — that is
the property that lets an agent call it anywhere. If you want to know
whether a path still points at anything, that is the Rust CLI's
paths_le_audit tool, above.
Extraction is heuristic, and what it deliberately does not match is documented as carefully as what it does — see the extension README and the CLI's SPEC.md.
Also in the MCP registry
io.github.nolindnaidoo/paths-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>.
| Package | Tool | Extracts |
|---|---|---|
| urls-le-mcp | extract_urls | URLs, with protocol and position |
| colors-le-mcp | extract_colors | colors from stylesheets and code |
| dates-le-mcp | extract_dates | dates and timestamps |
| numbers-le-mcp | extract_numbers | numeric values |
| string-le-mcp | extract_strings | string values |
| regex-le-mcp | extract_patterns | regexes, with a ReDoS verdict |
| secrets-le-mcp | detect_secrets | credentials, masked — never the value |
| envsync-le-mcp | compare_env_files | dotenv key drift, names only |
| scrape-le-mcp | analyze_robots_txt | whether a path may be crawled |
Two of them also ship a Rust CLI, which carries the same MCP tool in a
static binary: cargo install paths-le
(crates.io) and
cargo install scrape-le
(crates.io).
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.
| | | | |---|---|---| | pixelcoords | Freeze your screen, mark regions, get pixel-exact coordinates and crops | site · crates.io · docs.rs | | pixelactions | Consume human-verified coordinates, perform the interaction, confirm it landed | site · crates.io · docs.rs | | paths-le | Find every path in a codebase and report whether it still points at anything | crates.io | | secrets-le | Find hardcoded credentials, and never print one | crates.io | | urls-le | Extract every URL from a codebase, with its protocol and exact position | crates.io | | regex-le | Find every regex in a codebase and report which can be driven into catastrophic backtracking | crates.io | | string-le | Get every string in a codebase out where a person can read them | crates.io | | numbers-le | Find every hardcoded number in a codebase so a person can check them | crates.io | | envsync-le | Compare the dotenv files in a tree and say which keys are missing from which | crates.io | | colors-le | Find every colour in a codebase, and say which are not in your palette | crates.io | | dates-le | Extract every date and timestamp, and the exact instant each one resolves to | crates.io | | scrape-le | Check whether a page is scrapeable before the scraper is written | crates.io |
Licence
MIT © Nolin Naidoo
