mcpField
C
Colors-LE

Colors-LE

本地服务
letools.dev开发工具1今天更新

关于 Colors-LE

Colors-LE 是面向开发者的颜色提取工具,可从代码和样式文件中识别颜色并报告写法与位置。它也支持分析配色、检查对比度,并可通过 MCP 提供提取能力。

主要功能

  1. 01提取多种格式的颜色值
  2. 02报告颜色写法及行列位置
  3. 03分析配色分布并聚类相近颜色
  4. 04检查 WCAG AA/AAA 对比度
  5. 05扫描工作区或文件夹中的颜色

适用场景

  1. 01盘点项目中使用的颜色
  2. 02查找颜色近似值和重复值
  3. 03验证颜色的无障碍对比度

MCP 相关

MCP 服务提供 extract_colors 工具,接收文本内容并返回颜色、写法及行列位置。服务通过 stdio 通信,不读取文件,也不自行发起网络请求。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"nolindnaidoo-colors-le": {
"command": "npx",
"args": [
"-y",
"colors-le-mcp"
]
}
}
}
启动命令npx -y colors-le-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmcolors-le-mcp2.5.0

工具

1

收录的工具列表 · 更新于 3 周前

参数类型必填说明
dedupeboolean否重复颜色仅保留首次出现的颜色。
formatenum否文档格式。可选——无法识别或未指定格式时,将按原始文本读取并报告为 "unknown"。css | scss | less | stylus | html | javascript | typescript | svg | xml | json | yaml | toml | markdown | plaintext
contentstring是要扫描的文档文本。
filenamestring否当 `format` 未指定时,用于推断格式的文件名,例如 "theme.scss"。
maxResultsinteger否返回颜色数量上限(默认值为 500)。meta.truncated 会报告是否有颜色被省略。

详细介绍

Colors-LE 徽标

Colors-LE:轻松提取颜色

按下一个快捷键,即可提取当前文件中的所有颜色
CSS、SCSS、LESS、Stylus、HTML、JavaScript、TypeScript 和 SVG

从 VS Code Marketplace 安装 Open VSX 下载量 npm 上的 colors-le-mcp npm 上的 colors-le crates.io 上的 colors-le LE Tools


VS Code 中的 Colors-LE

觉得有用? 点赞或评分能帮助其他开发者发现它 — ★ GitHub · ★ Open VSX · ★ Marketplace

功能介绍

打开文件,运行 Colors-LE: Extract Colors,文档中的所有颜色就会出现在新的编辑器中,你可以在其中对颜色进行去重、排序、转换、筛选、分析或验证。适用于 VS Code 及基于 VS Code 的编辑器,例如 Cursor 和 VSCodium(可从 Open VSX 安装)。

  • 调色板审查 — 提取样式表、标记和代码中的所有十六进制颜色、rgb()/rgba()、hsl()/hsla()、hwb()、lab()/lch()、oklab()/oklch()、color() 和命名颜色
  • 设计系统审查 — 分析颜色分布、聚类相似颜色、查找近似重复项
  • 无障碍检查 — 通过 Validate 命令,根据 WCAG AA/AAA 检查对比度

安装

平台功能安装
VS Code在编辑器中提取、转换、分析和验证Marketplace
Cursor、VSCodium、Windsurf相同的扩展Open VSX
终端或 CI 步骤对整个目录树进行相同的提取,并返回退出码npx colors-le · npm 或 cargo install colors-le · crates.io
任何 MCP Agent,通过 Node 使用通过 stdio 调用 extract_colorsnpx colors-le-mcp · npm

在 AI Agent 中使用

相同的引擎也以 MCP 服务的形式运行,因此 Agent 可以直接调用它,而无需你运行命令。

编辑器方法
VS Code 1.101+无需安装 — 此扩展会在 Agent 模式下注册 extract_colors
Claude Codeclaude mcp add colors-le -- npx -y colors-le-mcp
Cursor、Windsurf 及其他工具将其指向 npx colors-le-mcp

Claude Code 中的 Agent 调用 colors-le MCP 服务

extract_colors(content, format?, filename?, dedupe?, maxResults?)

它会返回每种颜色及其表示法和从 1 开始计数的行号与列号,默认上限为 500,并通过 meta.truncated 标记结果是否截断,避免大型样式表淹没 Agent 的上下文窗口。

该服务接收内容并返回数据——它不会读取文件,也不会自行发起网络请求。它以 colors-le-mcp 的名称发布在 npm 上,并以 io.github.nolindnaidoo/colors-le 的名称发布在 MCP 注册表中。

手动配置 — 适用于任何带 MCP 配置文件的宿主

大多数宿主会读取 JSON 配置。添加一项:

{
  "mcpServers": {
    "colors-le": {
      "command": "npx",
      "args": ["-y", "colors-le-mcp"]
    }
  }
}

-y 会在首次运行时跳过安装提示。如果你不想跟踪新版本,可以固定版本 — [email protected]。

不想每次启动都通过 npx 运行?可以一次性安装,然后指向二进制文件:

npm install -g colors-le-mcp
{
  "mcpServers": {
    "colors-le": { "command": "colors-le-mcp" }
  }
}

它通过 stdio 使用 MCP 通信,无需环境变量、API 密钥或自身配置。将它接入任何内容之前,可以先进行检查:

echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y colors-le-mcp

这会打印工具列表并退出 — 如果你看到 extract_colors,说明服务运行正常。

## 支持的格式
格式语言 ID识别颜色的位置
CSScss注释之外任意位置的十六进制/函数式字面量;声明值中的命名颜色
SCSS / LESS / Stylusscss、less、stylus与 CSS 相同,另外会正确处理 // 行注释;Stylus 的 = 赋值也视为值
HTMLhtmlstyle="…" 属性、<style> 块、color/bgcolor 属性
JavaScript / TypeScriptjavascript、javascriptreact、typescript、typescriptreact字符串和模板字面量内(主题对象、styled-components);仅当整个字符串都是颜色时才识别命名颜色
SVG / XMLxml、svgfill、stroke、stop-color、flood-color、lighting-color、color、bgcolor 属性,以及 style 属性/块
JSON / YAML / TOMLjson、jsonc、yaml、toml设计令牌:任意位置的字面量,以及值就是颜色时的命名颜色
Markdown / 纯文本markdown、plaintext同上;3 位或 4 位十六进制值必须包含 a–f,因此正文中的 #250 会被视为问题编号
其他所有格式任意语言 ID按相同规则作为原始文本读取,并报告为 unknown

不会拒绝任何文档。 没有专用读取器的语言会作为原始文本读取,metadata.fileType 会说明由哪种读取器处理。

可识别的语法:#rgb、#rgba、#rrggbb、#rrggbbaa、逗号形式的 rgb()/rgba()/hsl()/hsla()、CSS Color 4 现代语法——以空格分隔并使用 / 表示 alpha 的 rgb()/hsl()、hwb()、lab()、lch()、oklab()、oklch(),以及九种预定义色彩空间中的 color();角度单位支持 deg、rad、grad 或 turn,也支持 none(调用可以跨多行);还包括 CSS 命名颜色,如 rebeccapurple 和 transparent。位置是每个字面量真实的、从 1 开始计数的行/列号。注释不会产生颜色,字符串中的注释标记也不会开始注释。

已知限制(有文档说明,并非缺陷):不读取相对颜色(rgb(from red r g b))、颜色调用中的 calc() 和 var();转换时,超出 sRGB 范围的颜色会被裁切;任何 JS 字符串中的十六进制值都会匹配,包括 URL 片段;没有 : 或 = 的 Stylus 值只会识别十六进制/函数式字面量,不会识别命名颜色;原始文本扫描中,值片段会延伸到行尾,因此同一行上的两个令牌会导致命名颜色被计入代价。

扫描文件夹或工作区

Extract 会读取当前打开的文档。扫描会从磁盘读取多个文件,并生成一份报告:项目的调色板。

  • 整个工作区:在命令面板中运行 Colors-LE: Extract Colors from Workspace。
  • 单个文件夹:在资源管理器中右键单击该文件夹,然后选择 Extract Colors from Folder;或者运行 Colors-LE: Extract Colors from Folder 并选择一个文件夹。

每种颜色无论写法如何都只列出一次,按使用频率从高到低排序,并显示其写法、出现次数和所在位置:

# Colors-LE workspace report

`my-project` · 3 file(s) read · 3 distinct color(s), 7 occurrence(s) in 3 file(s)

| Color | Written as | Occurrences | Files |
|---|---|---|---|
| `#ff0000` | `#FF0000`, `#f00`, `red`, `rgb(255, 0, 0)` | 4 | 2 |
| `#00ff00` | `#00ff00` | 2 | 2 |
| `#0000ff` | `#0000ff` | 1 | 1 |

## `#ff0000` (4)

- `styles/a.css` · **1:12**, **1:30**, **2:12**
- `styles/b.css` · **1:12**

## `#00ff00` (2)

- `styles/a.css` · **2:31**
- `styles/b.css` · **1:43**

## `#0000ff` (1)

- `theme.json` · **2:14**

相同的颜色只占一行。 #f00、#FF0000、red 和 rgb(255, 0, 0) 是同一种颜色的四种写法,表格会将其标明。Alpha 值会让颜色彼此区分:半透明红色是另一种颜色。对于本身不是 sRGB 颜色的值(例如 var()),则按其原样进行比较。

以上效果需要开启 colors-le.showPositions。此选项默认关闭,关闭时每行会显示文件及颜色在其中出现的次数:styles/a.css (3)。剪贴板中的内容遵循 colors-le.clipboardIncludesPositions 设置,与 Extract 一样。

扫描会读取什么。 文件从磁盘读取,因此不会看到尚未保存的编辑内容。超过安全大小的文件,或非 UTF-8 文本文件,不会被读取。扫描最多处理 5,000 个文件或 10,000 个列出的匹配项。报告末尾会逐项列出所有被跳过的内容,避免将简短报告误认为项目没有问题。

会跳过什么,以及如何更改。 默认开启三个开关,可在设置中分别关闭:

开关跳过的内容
scanUseDefaultExcludes依赖文件夹、构建输出、工具缓存和锁文件。完整列表见下文
scanRespectGitignore项目 .gitignore 文件排除的所有内容
scanSkipBinaryFiles图像、字体、归档文件及其他非文本文件

还可以通过两个列表调整扫描结果,而不必关闭开关。要跳过更多内容,请将模式添加到 scanExcludes。要读取开关原本会跳过的内容,请将其添加到 scanAlwaysInclude:

{
	// Also skip the test fixtures.
	"colors-le.workspace.scanExcludes": ["**/fixtures/**"],
	// Read the vendored code, though the built-in list skips it.
	"colors-le.workspace.scanAlwaysInclude": ["**/vendor/**"]
}

Colors-LE: Open Settings 会在设置编辑器中打开上述所有设置。

内置列表

文件夹(无论出现在哪里):

.git、.hg、.svn、node_modules、bower_components、jspm_packages、.pnpm-store、.yarn、vendor、site-packages、Pods、Carthage、dist、build、out、target、_build、_site、dist-newstyle、zig-out、storybook-static、cdk.out、DerivedData、CMakeFiles、.next、.nuxt、.output、.svelte-kit、.angular、.astro、.docusaurus、.vuepress、.expo、.turbo、.parcel-cache、.cache、.sass-cache、.jekyll-cache、.dart_tool、.pub-cache、.gradle、.kotlin、.cxx、.externalNativeBuild、captures、ephemeral、.symlinks、.swiftpm、.build、.bundle、.stack-work、.zig-cache、.godot、elm-stuff、.vercel、.netlify、.serverless、.aws-sam、.terraform、.venv、venv、__pycache__、.tox、.nox、.mypy_cache、.pytest_cache、.ruff_cache、.ipynb_checkpoints、.eggs、coverage、htmlcov、.nyc_output、.vscode-test、.idea、.vs、xcuserdata、*.egg-info

文件(无论出现在哪里):

*.min.js、*.min.css、*.map、*.snap、*.lock、package-lock.json、pnpm-lock.yaml、npm-shrinkwrap.json、go.sum、*.pbxproj、*.iml、local.properties、output-metadata.json、.flutter-plugins、.flutter-plugins-dependencies、.packages、Generated.xcconfig、flutter_export_environment.sh、GeneratedPluginRegistrant.*、fastlane/report.xml、fastlane/test_output/**、doc/api/**

未列入其中的文件夹包括:bin、obj、tmp、logs、public、generated,因为它们在许多项目中都是普通文件夹。生成这些内容的项目会在 git 中将其排除,扫描时也会读取 .gitignore。

影响扫描的设置位于设置下。

CLI

在终端或 CI 步骤中执行相同的提取操作,可通过 npm 安装 (使用 npm install -g colors-le,或运行 npx colors-le),也可通过 crates.io 安装(使用 cargo install colors-le)。两种方式安装的都是同一个命令, 相关文档见 crate/,两者的输出逐字节一致。 转换、分析和验证都是交互式的,并且会在编辑器中进行。

colors-le .                              # every colour in the tree; JSON on stdout when piped
colors-le --palette brand.txt .          # what is not in the palette
colors-le --values --dedupe . | sort -u  # write the palette in the first place
colors-le mcp                            # the same extraction over MCP on stdio

终端中的 colors-le

从 npm (colors-le) 或从 crates.io 安装 (colors-le)。两种方式安装的都是同一个 colors-le 命令。

npm 上的 colors-le crates.io 上的 colors-le

npm install -g colors-le   # or run it once: npx colors-le
cargo install colors-le

退出代码:0 表示无问题;1 表示未找到颜色或颜色不在调色板中;2 表示问题格式错误。

按颜色匹配,而非按拼写匹配。 即使调色板使用十六进制表示,也能捕获以 rgb() 表示的违规项,因为 #FFF、#ffffff 和 rgb(255, 255, 255) 属于同一项。Alpha 值是颜色标识的一部分,而命名颜色只与自身相等——white 和 #ffffff 是同一个 像素,却不是同一个判断。

命令

命令说明
Colors-LE: Extract Colors从当前文档提取所有颜色
Colors-LE: Extract Colors from Workspace提取工作区中每个文件的调色板:每种颜色仅列一次,并显示其写法及所在位置
Colors-LE: Extract Colors from Folder对一个文件夹执行相同操作。在资源管理器中的文件夹上也可使用
Colors-LE: Analyze Colors统计数据、聚类、模式和调色板报告
Colors-LE: Convert Colors将提取出的颜色转换为 hex/rgb/hsl
Colors-LE: Filter Colors按格式、亮度和饱和度筛选
Colors-LE: Validate Colors格式验证和 WCAG 对比度检查
Colors-LE: Deduplicate Colors从结果中移除重复行
Colors-LE: Sort Colors按配置的 sortMode 对结果排序
Colors-LE: Open Settings打开 Colors-LE 设置
Colors-LE: Help内置文档

默认情况下,没有命令绑定快捷键。可在编辑器的 键盘快捷方式 中为任意命令设置快捷键。

设置

设置项默认值描述
colors-le.openResultsSideBySidetrue在当前编辑器旁边打开结果(关闭时 = 就地替换)
colors-le.showPositionsfalse显示每种颜色所在的行和列
colors-le.copyToClipboardEnabledfalse同时将结果复制到剪贴板
colors-le.clipboardIncludesPositionsfalse在复制内容中包含行和列
colors-le.dedupeEnabledfalse自动对提取结果去重
colors-le.sortModeoffSort 命令使用的排序方式(hue/saturation/lightness/hex,asc/desc)
colors-le.notificationsLevelsilentall = 所有通知,important = 警告 + 错误,silent = 仅错误
colors-le.workspace.scanPatterns["**/*"]文件夹或工作区扫描所读取的文件
colors-le.workspace.scanUseDefaultExcludestrue跳过依赖文件夹、构建输出、缓存和锁文件
colors-le.workspace.scanRespectGitignoretrue跳过项目 .gitignore 文件中指定的内容
colors-le.workspace.scanSkipBinaryFilestrue跳过图像、字体、归档文件及其他非文本文件
colors-le.workspace.scanExcludes[]通过 glob 模式指定要跳过的其他文件
colors-le.workspace.scanAlwaysInclude[]即使会被以上三项之一跳过,也要读取的文件
colors-le.workspace.scanMaxFiles5000单次扫描读取的文件数上限
colors-le.workspace.scanMaxResults10000扫描停止读取前列出的出现次数上限
colors-le.safety.enabledtrue为超大文件启用防护措施
colors-le.safety.fileSizeWarnBytes1000000超过此文件大小时拒绝提取(可选择覆盖)
colors-le.safety.largeOutputLinesThreshold50000行数超过此阈值时发出警告
colors-le.statusBar.enabledtrue显示状态栏项
colors-le.telemetryEnabledfalse仅记录在本地的事件日志(参见隐私)

语言

除英语外,还支持十二种语言:

德语 · 西班牙语 · 法语 · 印度尼西亚语 · 意大利语 · 日语 · 韩语 · 葡萄牙语(巴西) · 俄语 · 乌克兰语 · 越南语 · 简体中文

两部分内容均已覆盖——清单(命令标题、设置名称和描述),以及扩展运行时显示的所有内容(通知、状态栏、快速选择项和提示词)。扩展会遵循 VS Code 的显示语言,因此会与编辑器当前设置的语言一致;无需单独设置。

隐私与安全

  • 不访问网络。 扩展绝不会向任何地方发送数据。telemetryEnabled 设置只会将事件写入本地输出通道,供你查看(Colors-LE Telemetry)。
  • MCP 服务同样遵循这一原则。 它将内容作为参数接收并返回数据:不访问文件系统、不进行网络调用,也不收集遥测数据。你的 Agent 已有文件读取工具,因此在服务中重复实现这些功能只会增加路径遍历攻击面,却不提供额外能力。如果服务导入了任何可能访问这两者的内容,check:mcp-bundle 就会导致构建失败。
  • 错误通知会对主目录路径和类似凭据的片段进行脱敏。
  • 评分提示最多出现两次。 第 3 次成功使用时,扩展会询问一次你是否愿意评分;如果你选择了 稍后 或关闭提示,第 20 次使用时还会再询问一次。选择 不再询问 后就不会再出现。将 notificationsLevel 设置为 important 或 silent 可关闭此提示。次数记录在 VS Code 的扩展存储中,不会向任何地方发送数据;选择 评分 会在浏览器中打开你安装扩展的平台页面——VS Code Marketplace 或 Open VSX。

文档

内容位置
工具允许说什么——提取范围、输出约定、拒绝事项、非目标crate/SPEC.md
扩展的构建与运作方式——架构、不变量、工具链、发布AGENTS.md
CLI 的构建与运作方式crate/AGENTS.md
变更内容CHANGELOG.md · crate/CHANGELOG.md
此工具的页面及其他十五个工具的页面letools.dev/tools/colors-le

性能

输入大小找到数耗时速率扫描速度
CSS 样式表1.58 MB60,00057.25 ms1,048,075/sec27.7 MB/s
SCSS 变量1.96 MB60,00067.02 ms895,249/sec29.3 MB/s
HTML 标记1.29 MB50,00033.72 ms1,482,680/sec38.2 MB/s

在 Apple M5 Pro、24 GB RAM、Node 24.3.0 上预热后运行 7 次所得的中位数。输入由 scripts/benchmark.ts 生成,而非签入仓库,因此上方所列大小与实际测量值 完全一致。运行 bun run benchmark 可复现。

这些数据因机器而异,且不会在 CI 中断言——以基准测试结果作为构建门槛, 只能说明运行器当时有多忙。

测试

指标覆盖率
语句86.66%
分支77.07%
函数89.79%
行89.18%

36 个文件中共有 501 个测试用例,另有一个在真实 VS Code 扩展宿主中运行的 集成测试套件,以及一个将构建出的 .vsix 安装到干净配置文件中的端到端测试。

这些数据由真实运行生成的 coverage/coverage-summary.json 和 coverage/test-results.json 经 scripts/coverage-readme.js 生成;如果此部分 与实际情况不符,CI 将失败。运行 bun run test:coverage 可复现,测试用例 数量以 vitest 输出为准。

LE 系列的更多工具

为每个模型眼前的工作打造的 16 款单一用途工具。每款都附带一个 Rust CLI 和一个 MCP 服务。一页尽览:letools.dev

提取

  • String-LE — 提取代码库中的所有字符串,方便人工阅读
  • Numbers-LE — 提取代码库中所有硬编码数字,方便人工检查
  • Units-LE — 提取所有带单位的数量并统一格式,遇到含义不明确的数量时会按名称拒绝处理
  • Dates-LE — 提取所有日期和时间戳,并给出每个日期和时间戳解析出的确切时刻
  • IDs-LE — 提取所有 UUID、ULID、NanoID、ObjectId 和 Snowflake,并解码其中的时间
  • IPs-LE — 提取所有 IP 地址、CIDR 网段和 MAC 地址,统一格式并按范围分类
  • URLs-LE — 提取代码库中的所有 URL,并给出协议和确切位置
  • Paths-LE — 提取代码库中的所有文件路径,并说明它们是否仍指向实际内容
  • Colors-LE — 提取代码库中的所有颜色,并指出哪些颜色不在你的调色板中

检查

  • Regex-LE — 查找代码库中的所有正则表达式,并报告哪些可能导致灾难性回溯
  • Versions-LE — 查找某个依赖项在仓库的各个清单文件中受到不同约束的位置
  • i18n-LE — 识别项目使用的 i18n 库,然后依据该库的规则审查其目录
  • Scrape-LE — 在编写抓取器之前检查网页能否抓取,并说明何时无法判断

防护

  • Secrets-LE — 查找代码库中的硬编码凭据,绝不在报告中打印凭据
  • EnvSync-LE — 比较目录树中的 dotenv 文件,并指出哪些文件缺少哪些键
  • Unicode-LE — 查找那些隐藏含义的 Unicode 字符——双向控制字符、不可见字符、同形异义字符、混合文字系统

每款工具都独立运行:没有共享的 crate,也没有发布的核心库。若有两款工具得出相同结论,那是因为这个答案经得起两次验证。

联系 — nolindnaidoo.com · GitHub · LinkedIn

nolindnaidoo 的其他项目

Rust — pixelcoords 和 pixelactions 构成一个工作循环:pixelcoords 回答 位置,pixelactions 在那里执行操作。它们有各自的工具、各自的风格——不属于 LE 系列。

许可证

MIT © nolindnaidoo

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。