colors-le-mcp
v2.5.0
Published
Extract colors from stylesheets and code, with their notation and position.
Maintainers
Readme
colors-le-mcp
An MCP server that extracts colors from stylesheets and code — the extraction engine behind the Colors-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 colors-le-mcp.
Claude Code
claude mcp add colors-le -- npx -y colors-le-mcpAnything with a JSON config — Cursor, Windsurf, Claude Desktop:
{
"mcpServers": {
"colors-le": {
"command": "npx",
"args": ["-y", "colors-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_colors tool ships in a static Rust
binary: cargo install colors-le, then colors-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 colors_le_scan, which walks a
tree and can check it against a palette; this server reads no files.
Prefer a global install to npx on every launch:
npm install -g colors-le-mcp{
"mcpServers": {
"colors-le": { "command": "colors-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 colors-le-mcpIf that prints the tool name, the server works.
The tool
extract_colors
| argument | type | |
|---|---|---|
| content | string | required. The document text to scan. |
| format | string | css, scss, less, stylus, html, javascript, typescript, svg, xml, json, yaml, toml, markdown or plaintext. Optional — anything else, or nothing, is read as raw text and reported as unknown. |
| filename | string | Used to infer format when it is absent — theme.scss resolves to scss. |
| dedupe | boolean | Collapse repeated colors to their first occurrence. Default false. |
| maxResults | number | Default 500, ceiling 5000. |
Returns each color as written, with its notation — hex, rgb, rgba,
hsl, hsla, hwb, lab, lch, oklab, oklch, color or named —
and 1-based line and column, plus meta.truncated so a capped result is
never mistaken for a complete one.
{
"ok": true,
"data": {
"colors": [
{"value": "#ff0000", "format": "hex", "line": 1, "column": 15},
{"value": "oklch(70% 0.1 200)", "format": "oklch", "line": 1, "column": 38}
],
"fileType": "css"
},
"diagnostics": [],
"meta": {
"tool": "extract_colors",
"count": 2,
"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/colors-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 |
| dates-le-mcp | extract_dates | dates and timestamps |
| paths-le-mcp | extract_paths | file and directory paths |
| 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 |
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
