Changelog
All notable changes to this project are documented here. The format follows Keep a Changelog and the project uses Semantic Versioning.
[Unreleased]
[2.0.0] - 2026-11-14
Breaking release: HCT-based outputs, gradient steps semantics, tool error handling and input limits changed — see Changed.
Added
audit_design_mdtool: audits the color tokens of a DESIGN.md file (YAML front matter and fencedyamlblocks). It checks WCAG and APCA contrast for pairs declared incomponentsand pairs inferred from token names, color-blind collisions between accent and status colors, exact and near-duplicate tokens, disliked colors, broken{colors.x}references and a missingprimary. Failing pairs get a same-hue fix. Values it cannot evaluate (hwb(),lab(),lch(),color-mix(),transparent) are listed, never guessed.export_paletteformatdesign-md: acolors:block for DESIGN.md front matter.Agent-oriented tools:
describe_color,fix_contrast,design_ui_palette,audit_ui_colorsandgenerate_categorical_palette.Color input now accepts CSS named colors, CSS Color 4
rgb()/hsl()syntax (space-separated, decimals, percentages, alpha),oklch(),oklab(),hct()and bare 6/8-digit hex.convert_colorcan outputoklabandoklch.MCP tool annotations on every tool (
readOnlyHint,destructiveHint: false,openWorldHint: false).CHANGELOG.md.MCP catalog metadata:
server.jsonfor the official MCP Registry, under the nameio.github.x51xxx/coolors-mcpwith schema 2025-12-11;- the matching
mcpNameinpackage.json; glama.jsonfor Glama.
After the npm publish, the release workflow publishes to the registry through GitHub OIDC using a signature-verified
mcp-publisher.
Changed
- HCT is now Google's CAM16-based HCT, provided by
@material/material-color-utilities(pinned to^0.3.0, because 0.4.0 fails to load in plain Node ESM). The old implementation was CIE LCh with clipping, so tones drifted by up to 20 L* and Material themes failed contrast. Every HCT-based output changes: Material themes, tonal palettes and scales, state colors, semantic palettes, harmonization, dislike detection, image theming andconvert_colortohct. - Material core palettes use Material's fixed chromas: secondary 16, tertiary 24, neutral 4, neutral-variant 8, error at hue 25 / chroma 84.
generate_gradient:stepsis now the total number of colors, and every input color is kept as a stop.stepssmaller than the number of colors is an error.- Tool errors (invalid input, failed validation, exceptions) are returned as MCP tool results with
isError: true, so the calling model can read them and retry. Toolexecutefunctions now throwToolInputErrorinstead of returning error strings. - JSON Schemas are generated in zod input mode: parameters that have defaults are no longer listed as
required. - Server
instructionsare now sent to clients. - Inputs are bounded:
- most color arrays are capped at 64–256 entries;
themeCSSis limited to 200k characters andcssto 500k;- images are limited to 256×256 RGBA, and
datamust equalwidth × height × 4; check_palette_accessibilitylists at most 20 collisions per CVD type.
- Color-vision simulation:
- the anomalous trichromacies use Machado et al. severity 0.6 matrices;
- achromatopsia maps to a grey of equal relative luminance.
- Package and CI:
engines.node >= 20;- the published files are whitelisted to
dist,README.mdandLICENSE; - failing tests now fail CI and release.
Fixed
refactor_css_with_themecorrupted CSS when a line held two or more colors, and rewrote colors insideurl(), strings and comments. It now rewrites only real declaration values, skipping selectors and custom-property definitions, and detects the property per declaration.- The theme parser and matcher read
rgb()channels as 0–1, sorgb()colors never matched. They now use the shared color parser. - Invalid hex (
#ggg,#ff00zz,#12345) was silently parsed as another color. It is now rejected. Out-of-rangergb()channels are clamped as in CSS. - APCA light-on-dark exponents were swapped. Results now match apca-w3 0.1.9 exactly.
lighten,darken,saturateanddesaturateignored fractional amounts and changed the color at amount 0.generate_palette_with_locks:- gradient mode returned locked colors first and the wrong count;
- harmony mode could return fewer colors than requested.
harmonize_colorsignoredfactor: 0.generate_theme_csswith customincludeTonesreferenced CSS variables it never defined.generate_theme_from_imagesilently fell back to#4285F4with "NaN%" for images without colorful pixels. It now returns an error, andextract_image_colorsreports the real dominant colors instead.export_palette:- an unsafe
prefixproduced invalid output; - non-ASCII names became
---n-code; - names that collided after normalization were silently merged.
- an unsafe
- The theme parser dropped a custom property without a trailing
;(:root { --a: #fff }, valid CSS) and failed on comments inside values. generate_theme_from_imageshowed 0% coverage for a seed adjusted away from a disliked color, and ignoredincludeCustomColors.generate_tonal_scaleusednameverbatim, so"Brand Blue"produced the invalid custom property--brand blue-500; names are now slugified.harmonize_colors(harmonize) mishandled hues on either side of 0°/360° (full 15° rotation in the wrong direction); it now matches Material'sBlend.harmonizeexactly.- Theme match confidence could exceed 100%.
match_theme_colorreported invalid colors as "no match", and theme CSS without color variables is now an error.package.jsonmainpointed to a missing file, and thejsr.jsonexport path was wrong.
Security
- Removed unused runtime dependencies
file-type,fuse.js,mcp-proxy,undicianduri-templates, and updated@modelcontextprotocol/sdkto ^1.32.2 andzodto ^4.6.7. Production audit advisories dropped from 113 to 51. The remaining advisories are in the SDK's HTTP transport stack, which the stdio server does not import. - The development CLI no longer runs commands through a shell with interpolated file paths.
[1.1.0]
- Visual cohesion tools, color-vision-deficiency simulation, APCA contrast, and fixes to tool schemas and RGB conversion.