Skip to main content
Glama

color-space test npm size VS Code

Open collection of color spaces.

  • Formulas tested against cited sources

  • Conventional ranges

  • JS with TypeScript types / WASM / GLSL / LUT / ICC / OCIO

Atlas →

Use

import space from 'color-space';

space.rgb.oklch(255, 128, 0);        // → [0.732, 0.186, 53] — modern CSS
space.slog3.rec2020(0.5, 0.5, 0.5);  // camera log → UHD wide gamut
space.rgb.xyz(300, -10, 0);          // → [59.7, 30.6, 2.8] — out-of-range in, unclamped out

// batch
space.rgb.oklch([255, 128, 0,  0, 255, 128]); // [0.732, 0.186, 53,  0.875, 0.234, 151]

// meta
space.lab.range;                     // [[0, 100], [-125, 125], [-125, 125]]

Individual spaces:

import oklch from 'color-space/oklch.js';
oklch.rgb(0.65, 0.25, 180);          // matches CSS oklch(0.65 0.25 180)

Related MCP server: MCP Color Converter

Imports

  • color-space – All 221 interconnected spaces. 70 kB gzip

  • color-space/<name>.js – One standalone space

  • color-space/lite – 54-space working set. 29 kB gzip

  • color-space/wasm – lite set as WASM, bare .wasm included

  • color-space/gl – GLSL/WGSL shader source

  • color-space/gl/hlsl · color-space/gl/msl – HLSL (DirectX, Unity, Unreal) and Metal, written by naga from the WGSL. await hlsl('rgb', 'oklch'). needs the optional peer naga-wasm (it declares Node ≥ 24.12; CI runs it on 22, where npm only warns)

  • color-space/lut – .cube LUTs for Resolve, Premiere, OBS, ffmpeg — verified vs ACES

  • color-space/icc – Matrix + TRC or CLUT profiles

  • color-space/ocio – OpenColorIO colorspaces for Blender, Nuke, Resolve, Houdini: colorspace(space.sgamut3cine), curve and matrix from native transforms, 55 spaces, each checked against the library to 1e-6

  • color-space/util – parse, format CSS colors, mix, gamut, visible, deltaE, contrast (WCAG), cvd (color-vision simulation), deltaE('rgb', [255, 0, 0], [250, 0, 0])

  • color-space/data.json – Channels, ranges, provenance, references, graph, gamuts

  • color-space/conformance.json – Cited reference conversions, each with its source, to test any color library against

  • npx color-space rgb oklch 255 128 0 – CLI, no install: convert (default), cube, icc, space, spaces, mcp (MCP server for agents)

Upgrading from v2?

Agents

MCP tools – convert, gamut, css, space, spaces, cube, shader, icc, code – so agents call verified math instead of guessing it. A color goes in as any CSS string ('#ff8000', 'oklch(0.7 0.1 50)', 'rebeccapurple') or as channel values; shader writes the conversion as GLSL, WGSL, HLSL or MSL, code gives the JS call and its verified colour-science equivalent.

claude mcp add color-space -- npx -y color-space mcp                                      # Claude Code
code --add-mcp '{"name":"color-space","command":"npx","args":["-y","color-space","mcp"]}'  # VS Code

Claude Desktop claude_desktop_config.json, any project .mcp.json:

{ "mcpServers": { "color-space": { "command": "npx", "args": ["-y", "color-space", "mcp"] } } }

Claude Code plugin (the server plus a skill): /plugin marketplace add colorjs/color-space, then /plugin install color-space@color-space. Docker: docker build -t color-space-mcp . and run it with docker run -i --rm color-space-mcp.

Over HTTP (Streamable HTTP, stateless): npx -y color-space mcp --http 8787 on localhost, or host fetch from color-space/mcp.js in a Worker, Deno or Bun. Skill for agents that load skills: plugins/claude/skills/color-space.

In the browser: color-space.io registers the same tools (but icc) through WebMCP where Chrome offers it, plus show, which opens a space's dossier or sets the page's color in front of the person.

Spaces

Display & web sRGB · Display P3 · Rec. 2020 · Linear-light sRGB · Rec. 709 · Rec. 709 display · sRGB 2.2 display · ProPhoto RGB · Adobe RGB (1998) · DCI-P3 · Linear Display P3 · Linear Rec. 2020 · Rec. 2020 display · Linear Adobe RGB (1998) · Linear ProPhoto RGB · scRGB · RIMM RGB · CIE RGB · NTSC RGB (1953) · PAL / SECAM RGB · Apple RGB · SMPTE-240M · ECI RGB v2 · Adobe Wide Gamut RGB · ColorMatch RGB · Bruce RGB · Beta RGB · Best RGB · Don RGB 4 · Ekta Space PS 5 · Russell RGB · Prismatic

Cylindrical HSL · HSV / HSB · HWB · HSI · IHLS · HCG · HCL · HSP · HCY · Cubehelix · HSM

Perceptual OKLCH · CIELAB · CAM16 · OKLab · HCT · Okhsl · Okhsv · Okhwb · OKLrAB · OKLrCH · SRLAB2 · proLab · sUCS · IgPgTg · HelmGen · HelmGen LCh · Helmlab MetricSpace · Jzazbz · JzCzHz · IPT · IPT Ragoo 2021 · Izazbz · hdr-IPT · IaPbP · CIELChab · CIELUV · HSLuv · CIELChuv · CIELAB D65 · CIELCh D65 · Msh · HPLuv · DIN99 · DIN99o Lab · DIN99o LCh · DIN99c · DIN99d · Log-compressed OSA-UCS · Hunter Lab · Hunter Rd,a,b · CIE 1960 UCS · CIE 1964 UVW · Adams–Nickerson Lab · hdr-CIELAB · CIECAM02 · CIECAM16 · CIECAM97s · CAM16-UCS · ZCAM · CAM02-UCS · CAM16-LCD · CAM16-SCD · CAM02-LCD · CAM02-SCD · Hellwig 2022 · Hellwig 2022 HK · ACES 2.0 JMh · sCAM · Kim 2009 · RLAB · LLAB · Nayatani 95 · Hunt · ATD95 · oRGB

Colorimetry & research CIE XYZ (D65) · CIE xyY · LMS · CIE XYZ (D50) · CIE 1976 u′v′ · CCT + Duv · Color temperature (Kelvin) · Maxwell triangle · Wavelength · Absolute XYZ D65 · LogLuv · MacLeod–Boynton · DKL · Grayscale · Dominant wavelength / DSH · rg chromaticity · Yrg (Kirk 2019) · XYB · OSA-UCS · TSL · YES · Ohta I₁I₂I₃ · lαβ · YyCxCz · Poirson–Wandell opponent

Video BT.709 Y′CbCr · ICtCp · ICtCp HLG · IPT-PQ-C2 · BT.2020 Y′CbCr · BT.601 525-line Y′CbCr · BT.601 625-line Y′CbCr · YCbCr (parameterized) · YUV · YIQ · YPbPr · YCgCo · JPEG YCbCr · YDbDr · YcCbcCrc · xvYCC · SMPTE-C · PhotoYCC · Rec. 2100 PQ · Rec. 2100 HLG · Linear Rec. 2100 · ICaCb · Y′D′zD′x

Camera ACEScg · ARRI LogC3 · ARRI Wide Gamut 3 · ACEScc · Sony S-Log3 · S-Gamut3 · Sony S-Gamut3.Cine · Venice S-Gamut3 · Venice S-Gamut3.Cine · ACES2065-1 · ACEScct · ARRI LogC4 · ARRI Wide Gamut 4 · Cineon · ADX10 · ADX16 · DaVinci Wide Gamut / Intermediate · DaVinci Wide Gamut · Sony S-Log2 · Panasonic V-Log · V-Gamut · RED Log3G10 · REDWideGamutRGB · Canon Log · Canon Log 2 · Canon Log 3 · DCI-P3+ · Fujifilm F-Log · Fujifilm F-Log2 · Fujifilm F-Log2 C · Nikon N-Log · Apple Log · Apple Log 2 · Blackmagic Film Gen 5 · Blackmagic Wide Gamut · DJI D-Log · D-Gamut · FilmLight T-Log / E-Gamut · E-Gamut · Kinefinity KineLOG3 · DCDM X′Y′Z′ · Sony S-Log · ACESproxy · ERIMM RGB · Leica L-Log · GoPro Protune · GoPro GP-Log2 · Insta360 I-Log · Xiaomi Mi-Log · OPPO O-Log · O-Log2 · Samsung Log · REDLog · REDLogFilm · RED Log3G12 · Panalog · ViperLog · Filmic Pro 6

Print CMYK · Munsell · RYB · CMY · RAL Design · Coloroid · Ostwald

Motivation

A complete collection of color spaces: one minimal API, formulas tested against their sources. While alternatives focus on digital color spaces, this project takes broader perspective, covering historical and cross-disciplinary spaces as well. Side effects: errata in papers, color education, test cases for JS→WASM compilers (porffor, jz).

It is not a color toolbox — gamut mapping, palettes, alpha stay out; the few tools the atlas itself uses (parsing, mixing, ΔE, contrast, color-vision simulation) are color-space/util. Pantone, NCS, RAL Classic, and similar licensed swatch catalogs aren't open and stay out as well.

Contributing

A wrong value or a missing space: open an issue with the document that defines it. How a space is added and checked: CONTRIBUTING.md.

Credits

Thanks to the researchers, theorists, specifiers, implementors and the libraries that helped this one happen.

Library

Spaces

Ranges

Camera log · CAM · historic

Backends

color-space

221

Conventional

✅

JS · WASM · GLSL/WGSL · LUT · ICC

color-space/lite

54

Conventional

logs · HDR · CAM16

JS · 29 kB gzip

color-space/wasm

54

Conventional

logs · HDR · CAM16

WASM

culori

30

0–1

❌

JS

colorjs.io

51

0–1

some

JS

texel/color

~16

0–1

❌

JS

chroma-js

11

mixed

❌

JS

d3-color

6

mixed

❌

JS

Available Tools

9 tools
codeLibrary codeA
Read-onlyIdempotent

The conversion as code to paste: the color-space JS call with its result and – where one exists for the space on the non-sRGB side – the colour-science (Python) equivalent verified against color-space (sRGB ↔ that space), with any named caveat. The color goes in as a CSS string or as values in from (default: sRGB 200, 100, 50).

NameRequiredDescriptionDefault
toYestarget space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)
fromNosource space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)
colorNoa CSS color instead of `from` + `values`: '#ff8000', 'rebeccapurple', 'oklch(0.7 0.1 50)', 'lab(54% 80 67)', 'color(display-p3 1 0.5 0)'
valuesNothe color in the source space

Output Schema

NameRequiredDescription
jsYes
pythonYes
pythonForYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds real behavioral context: the output is a JS call with result plus a verified Python equivalent and a named caveat, and that the Python form only exists on the non-sRGB side. This goes beyond the annotations usefully, though it does not mention caveats around missing equivalents or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with what the tool returns. The first sentence is dense and hyphen-heavy, but no sentence is wasted and the key output contract comes first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and 100% schema coverage, the description only needs to frame what is returned, which it does by naming the JS call, result, Python equivalent and caveat. Minor gaps in when-to-use and default-value syntax keep it short of a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds information not in the schema: the default color is sRGB 200, 100, 50 and that input arrives either as a CSS string or as values tied to `from`. That default detail is genuinely additive over the schema's per-parameter text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies what the tool produces: a pasteable conversion expressed as a color-space JS call with its result plus the Python colour-science equivalent and any caveat. This distinguishes it from the value-only `convert` sibling implicitly by emphasizing 'code to paste', though it never names `convert` directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: an agent infers you call this when you want reusable code rather than a converted value. There is no explicit when-to-use/when-not guidance or reference to `convert`/`css` as alternatives, so the routing decision is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convertConvert colorA
Read-onlyIdempotent

Convert a color between any two of the 221 color spaces, identity included, in each space's conventional ranges (rgb 0-255, oklch L 0-1 / C 0-0.4 / H 0-360, lab L 0-100 …). The color goes in as a CSS string (color) or as channel values (from + values); a batch as colors – tuples in from, CSS strings, or both. Out-of-range in, unclamped out: inRange flags each channel against the target's conventional range (rgb below 0 means outside sRGB); null = undefined at that coordinate.

NameRequiredDescriptionDefault
toYestarget space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)
fromNosource space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)
colorNoa CSS color instead of `from` + `values`: '#ff8000', 'rebeccapurple', 'oklch(0.7 0.1 50)', 'lab(54% 80 67)', 'color(display-p3 1 0.5 0)'
colorsNoa batch: one tuple (in `from`) or CSS string per color, e.g. [[255, 128, 0], '#00ff80', 'oklch(0.7 0.1 50)']
valuesNoone color in the source space, e.g. [255, 128, 0] for rgb

Output Schema

NameRequiredDescription
toYes
fromNo
colorsYes
channelsYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, non-open-world, so the safety profile is covered. The description adds genuinely new behavior: conversion is unclamped ('out-of-range in, unclamped out'), `inRange` flags each channel against the target's conventional range, and null means undefined at that coordinate. That is meaningful output-semantics disclosure beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the conversion scope and range convention come first, then the input forms, then out-of-range behavior. Every clause earns its place, though the parenthetical range list and ellipsis make it slightly harder to scan than it could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return shape, and it correctly spends its budget on the things the schema cannot convey: conventional ranges per space, unclamped behavior, `inRange` semantics, and null-as-undefined. Nothing an agent needs to call this conversion correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining the conventional ranges each space uses (rgb 0-255, oklch L 0-1/C 0-0.4/H 0-360, lab L 0-100), what `color` vs `from`+`values` vs `colors` are for, and that batch entries can mix tuples and CSS strings. It adds real semantic meaning over the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (convert) and resource (a color), and bounds the scope precisely: 'between any two of the 221 color spaces, identity included.' The mention of conventional per-space ranges and the CSS/array input forms makes it distinguishable from siblings like 'spaces' (enumeration), 'css' (parsing), and 'gamut' (checking).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the input modes (CSS string vs `from`+`values` vs batch `colors`), which implies how to call it, but never states when this tool is preferred over siblings such as `gamut`, `css`, or `space`. No exclusions or alternative-routing guidance is given; usage is inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cssCSS color stringsA
Read-onlyIdempotent

A color as CSS Color 4 strings — rgb(), hsl(), hwb(), lab(), lch(), oklab(), oklch() and color(display-p3 | a98-rgb | prophoto-rgb | rec2020 | srgb-linear | xyz-d65 | xyz-d50) — plus #hex inside sRGB. Converted, never gamut-mapped: a string is null where CSS would clamp it into a different color (rgb/hsl/hwb outside sRGB, lightness out of range). gamut is the smallest display gamut that holds the color.

NameRequiredDescriptionDefault
fromNosource space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)
colorNoa CSS color instead of `from` + `values`: '#ff8000', 'rebeccapurple', 'oklch(0.7 0.1 50)', 'lab(54% 80 67)', 'color(display-p3 1 0.5 0)'
valuesNoone color in the source space
notationsNoonly these, by library space id (default: all)

Output Schema

NameRequiredDescription
cssYes
hexYes
gamutYes

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description still adds non-obvious behavior: conversion is done 'never gamut-mapped', output is `null` exactly where CSS would clamp (out-of-sRGB rgb/hsl/hwb, out-of-range lightness), and `gamut` reports the smallest display gamut holding the color. These are genuine semantic traits an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the resource (CSS color strings), followed by the supported notation set and the two behavioral caveats. It is dense and almost every clause carries information, though the inline notation list is long and partially overlaps the schema's enum ids.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return structure needn't be explained, yet the description still clarifies the meaning of the `null` result and the `gamut` field, which is exactly the missing context for a conversion tool. Annotations plus full schema coverage leave no major gaps; only edge cases like precedence between the two input modes are unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so `from`, `color`, `values`, and `notations` are already documented at the parameter level, establishing the baseline of 3. The description adds little parameter-specific detail beyond the output-side null/gamut semantics; it does not, for example, explain precedence when both `color` and `from`+`values` are supplied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete output resource – CSS Color 4 strings – and enumerates the exact notations produced (rgb(), hsl(), lab(), oklch(), color(display-p3 ...), #hex), so an agent knows precisely what this tool returns. The verb is implicit ('Converted') and it never names or contrasts with the sibling `convert`, so sibling differentiation is left to the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the schema shows it accepts either `from` + `values` or a `color` string, and the description implies conversion into CSS syntax. There is no explicit statement of when to pick this over `convert`, `gamut`, or `space`, and no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cube.cube LUTA
Read-onlyIdempotent

Render a conversion as a .cube LUT file (Resolve, Premiere, Final Cut, OBS, ffmpeg). The header carries the measured deviation vs the direct conversion. Pure per-channel transfers auto-emit 1D. Size ≤ 33 here (larger via the library or https://color-space.io/).

NameRequiredDescriptionDefault
toYestarget space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)
fromYessource space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)
sizeNo3D lattice size (default 17)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds behavior beyond them: the header carries measured deviation vs the direct conversion, and pure per-channel transfers auto-emit 1D instead of 3D. It omits error behavior and precision details, but disclosing the conditional 1D emission and the size ceiling is meaningful added context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: purpose first, then the output/behavioral nuances, then the size constraint and its alternative. Every clause carries information and nothing is repeated from the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description partially covers the return by describing the LUT header containing measured deviation, implying file text is emitted. It does not state the concrete return shape (raw text, path, or attachment), which is the one thing an agent still has to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so from/to/size are already fully documented with examples and bounds. The description adds only marginal semantics — the rationale for the 33 cap and where to go for larger sizes — which is a slight plus over the baseline of 3 rather than a substantive enrichment.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Render a conversion as a .cube LUT file') and names the consumer ecosystem (Resolve, Premiere, Final Cut, OBS, ffmpeg), which immediately separates it from siblings like shader, icc, css, and code.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit exclusion — 'Size ≤ 33 here (larger via the library or https://color-space.io/)' — routing the agent away for oversized LUTs. It does not, however, contrast this tool against siblings such as shader or icc for non-LUT export formats, so the when-to-use picture is clear but not complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gamutGamut membershipA
Read-onlyIdempotent

Which standard display gamuts hold a color — sRGB ⊂ Display P3 ⊂ Rec. 2020, each tested in its own RGB box straight from the source space, the same ladder as the color-space.io gamut pill. smallest is the tightest one; null = beyond Rec. 2020. Membership only: nothing is gamut-mapped.

NameRequiredDescriptionDefault
fromNosource space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)
colorNoa CSS color instead of `from` + `values`: '#ff8000', 'rebeccapurple', 'oklch(0.7 0.1 50)', 'lab(54% 80 67)', 'color(display-p3 1 0.5 0)'
valuesNoone color in the source space

Output Schema

NameRequiredDescription
gamutsYes
smallestYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description still adds real behavioral context beyond that: the containment ladder sRGB ⊂ Display P3 ⊂ Rec. 2020, that each gamut is tested in its own RGB box taken straight from the source space, and the explicit statement that no gamut mapping is performed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with the core assertion ('which gamuts hold a color') front-loaded, followed by the ladder semantics and the membership-only caveat. The color-space.io pill reference is decorative rather than load-bearing, and the unicode subset notation is terse, but nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not enumerate return fields, and it still explains the semantics of the key return signals (`smallest` as the tightest gamut, null as beyond Rec. 2020). Combined with 100% schema coverage and full annotation coverage, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% – `from`, `color` and `values` are all documented in the schema, including the fact that `color` is an alternative to `from` + `values`. The description adds no parameter-level detail (no value ranges, no source-space syntax), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb+resource: it reports which standard display gamuts (sRGB, Display P3, Rec. 2020) contain a given color. The closing clause 'Membership only: nothing is gamut-mapped' cleanly separates it from the conversion siblings (convert, css, shader) without requiring the agent to open another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is clear: this is the membership/containment query, not a mapping or conversion. The 'Membership only' exclusion implicitly steers the agent to a conversion tool when actual gamut mapping is needed, but no sibling is named explicitly, so the alternative is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iccICC profileA
Read-onlyIdempotent

One space as an ICC v2 profile (.icc): matrix + tone curve where the space is an RGB working space (Photoshop, OS color management), a CLUT on a Lab PCS otherwise (lcms, ArgyllCMS, ImageMagick). Returned as a base64 embedded resource; class, pcs and bytes describe it.

NameRequiredDescriptionDefault
gridNoCLUT lattice points per channel, CLUT profiles only (default 33 for 3 channels; fewer = a smaller file)
nameYesthe space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)

Output Schema

NameRequiredDescription
pcsYes
fileYes
nameYes
bytesYes
classYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: the output is returned as a base64 embedded resource, the profile flavor depends on the space type and interoperates with specific ecosystems (lcms, ArgyllCMS, ImageMagick, Photoshop), and class/pcs/bytes describe the result.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core outcome (a space rendered as an ICC v2 profile) followed by the format-selection rule and return shape. The ecosystem name-drops (Photoshop, lcms, ArgyllCMS) are dense but each justifies the variant it belongs to.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, yet the description still identifies the class/pcs/bytes fields it returns. Combined with the format-selection rule and the spaces-tool pointer for valid names, an agent has enough to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; both `name` (with the sibling pointer to spaces) and `grid` (CLUT-only, lattice points, smaller file with fewer) are already documented in the schema. The description's CLUT-vs-matrix rule contextualizes when `grid` applies, but adds no syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the artifact produced: an ICC v2 profile (.icc) for a given color space, and explains the two representations it can take. The generating verb is implied rather than stated ('One space as an ICC v2 profile'), and it does not name a sibling export tool (cube, shader, css), so differentiation is only partial.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives the conditional logic for which profile type results (matrix+tone curve for RGB working spaces, CLUT on Lab PCS otherwise), which is genuine guidance about outcomes. However, it never says when an agent should choose icc over the sibling export tools (cube, css, shader, code), leaving the selection decision implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

shaderShader codeA
Read-onlyIdempotent

The conversion as shader source – GLSL (WebGL2; WebGL1 too unless the path reads a table), WGSL (WebGPU), HLSL (DirectX, Unity, Unreal) or MSL (Metal) – with an entry function <from>_<to> (hyphens stripped), e.g. vec3 rgb_oklch(vec3 c), plus every function on the path. Each language is differentially tested against the library and compiled on real GPUs: use it instead of writing color matrices. HLSL and MSL need the optional peer naga-wasm installed beside color-space.

NameRequiredDescriptionDefault
toYestarget space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)
fromYessource space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)
languageNodefault glsl

Output Schema

NameRequiredDescription
codeYes
entryYes
languageYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a read-only, idempotent, non-destructive operation, so the safety profile is covered. The description adds genuinely useful behavior the annotations do not: the generated entry-point name and signature, the WebGL1 table-read caveat, and the hard dependency on the optional `naga-wasm` peer for HLSL/MSL. It stops short of describing failure modes or validation errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the artifact is named first, then languages, then the entry-function convention, then the dependency note. Every parenthetical carries information (platform targets, WebGL1 caveat, naming rule), though the single long sentence is heavy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. Combined with annotations covering safety and the description covering the generated artifact, its naming, its language targets, and its dependency requirements, an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description meaningfully extends the bare `language` enum by mapping glsl→WebGL2, wgsl→WebGPU, hlsl→DirectX/Unity/Unreal, and msl→Metal, which helps an agent pick a target. The `from`/`to` ids are left to the schema and the `spaces` tool, which is reasonable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (produce) and resource (shader source for a color conversion), and enumerates the four output languages with their target platforms. The entry-function naming convention (`<from>_<to>`) makes it clearly distinct from siblings like `convert` or `code`, which produce values or generic code rather than GPU shader source.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'use it instead of writing color matrices', which tells the agent when this tool is preferred over hand-rolling a solution. It does not, however, contrast itself against the sibling `code` tool, so the choice among generation tools is left partly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

spaceSpace dossierB
Read-onlyIdempotent

The dossier of one color space: display name (as color-space.io shows it), description, channels + conventional ranges, defining references, provenance (year, author), illuminant/observer, encoding class, family and purpose, and its direct conversion neighbours.

NameRequiredDescriptionDefault
nameYesthe space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)

Output Schema

NameRequiredDescription
nameYes
titleYes
familyYes
sourceYes
purposeYes
channelsYes
neighborsYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety/idempotency profile is fully covered. The description's contribution is the payload inventory and one useful source note ('as color-space.io shows it', provenance year/author), but since an output schema exists, the field enumeration largely restates structured data. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the resource scope, so there is no filler. However, the long comma-separated field inventory is largely redundant against the output schema and does not earn its place as strongly as a shorter scope statement would.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and annotations carry the safety profile — the description is therefore sufficient to call the tool correctly. The remaining gap is the absence of routing guidance to sibling tools, which is a completeness shortfall rather than a correctness one.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage, and the schema already supplies the id format and concrete examples ('rgb', 'oklch', 'lab', ...) plus the pointer to the `spaces` tool. The description adds no additional meaning about the `name` argument, so the 3 baseline for high-coverage schemas applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The label 'dossier of one color space' specifically names the resource and its singular scope, and the enumerated field list (channels, illuminant, family, neighbours) makes clear this is a metadata lookup, not a conversion or listing. It never names the sibling `spaces` (which lists all 221) or `convert`, so differentiation must be inferred from 'one color space'. No explicit verb ('returns', 'describes') appears, but the noun phrase is specific enough to identify the resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description contains no when-to-use, when-not, or alternative routing guidance. It never mentions `spaces` (the bulk lister) or `convert` (which acts on spaces), even though those are the obvious alternatives. Usage is only inferable from the singular scope of the resource.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

spacesSpace catalogA
Read-onlyIdempotent

List the 221 color spaces with display name, family, purpose, channels and one-line use. Optional filters: query (words matched against id, name, use line and description; best matches first), family, purpose.

NameRequiredDescriptionDefault
queryNofree text, e.g. 'camera log', 'cielab', 'display p3'
familyNo
purposeNo

Output Schema

NameRequiredDescription
countYes
spacesYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely useful behavior: the fixed size of the catalog (221), the exact fields returned, and that `query` results are relevance-ranked ('best matches first'), which the schema does not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first front-loads what the tool returns, the second covers filters. No filler, and the most decision-relevant information (scope and result shape) comes first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only listing with an output schema and full safety annotations, this covers what an agent needs: scope, returned fields, and filter behavior. The only gap is the absence of routing guidance relative to the many siblings (`space`, `convert`, `gamut`) that could plausibly be confused with it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33% (only `query` has a schema description), so the description must compensate. It does well for `query`, spelling out the fields matched against and the ordering, but `family` and `purpose` are merely named; their enum values carry the meaning and no filtering semantics (single vs multiple, combinability) are explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the 221 color spaces') plus the fields returned, so the agent knows this is a catalog/browse operation. It does not explicitly contrast itself with the singular `space` sibling or `convert`, so sibling differentiation is only implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Optional filters' implies that unfiltered listing is the default and filters narrow results, which is reasonable implied usage. However, no alternative tool is named and there is no when-to-use/when-not guidance (e.g. use `space` for a single space, `convert` for transformations).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv3.5.0
    • Changedcode2 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
      • changedInput schema / properties / to / description
        Previous value: -"target space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"target space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
    • Changedconvert2 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
      • changedInput schema / properties / to / description
        Previous value: -"target space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"target space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
    • Changedcss2 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
      • changedInput schema / properties / notations / items / enum
        Previous value: -[
        -  "rgb",
        -  "hsl",
        -  "hwb",
        -  "lab",
        -  "lchab",
        -  "oklab",
        -  "oklch",
        -  "p3",
        -  "a98rgb",
        -  "prophoto",
        -  "xyz",
        -  "xyz-d50",
        -  "lrgb"
        -]New value: +[
        +  "rgb",
        +  "hsl",
        +  "hwb",
        +  "lab",
        +  "lchab",
        +  "oklab",
        +  "oklch",
        +  "p3",
        +  "a98rgb",
        +  "prophoto",
        +  "rec2020-display",
        +  "xyz",
        +  "xyz-d50",
        +  "lrgb"
        +]
    • Changedcube2 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
      • changedInput schema / properties / to / description
        Previous value: -"target space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"target space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
    • Changedgamut1 field changed
      • changedInput schema / properties / from / description
        Previous value: -"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
    • Changedicc1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"the space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"the space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
    • Changedshader2 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"source space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
      • changedInput schema / properties / to / description
        Previous value: -"target space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"target space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
    • Changedspace1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"the space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 205)"New value: +"the space id, e.g. 'rgb', 'oklch', 'lab', 'slog3', 'rec709' (the 'spaces' tool lists all 221)"
    • Changedspaces2 fields changed
      • changedInput schema / properties / family / enum
        Previous value: -[
        -  "Display & web",
        -  "RGB remixes",
        -  "Perceptual",
        -  "Colorimetry & research",
        -  "Video & broadcast",
        -  "Film & camera",
        -  "Print & paint"
        -]New value: +[
        +  "Display & web",
        +  "Cylindrical",
        +  "Perceptual",
        +  "Colorimetry & research",
        +  "Video",
        +  "Camera",
        +  "Print"
        +]
      • changedInput schema / properties / purpose / enum
        Previous value: -[
        -  "picking",
        -  "palettes",
        -  "editing",
        -  "compositing",
        -  "grading",
        -  "delivery",
        -  "print",
        -  "difference",
        -  "measurement",
        -  "research"
        -]New value: +[
        +  "picking",
        +  "palettes",
        +  "editing",
        +  "compositing",
        +  "grading",
        +  "delivery",
        +  "print",
        +  "difference",
        +  "research"
        +]
  2. 9 tool updatesv0.1.0
    • First observedcode
    • First observedconvert
    • First observedcss
    • First observedcube
    • First observedgamut
    • First observedicc
    • First observedshader
    • First observedspace
    • First observedspaces

TDQS

A3.8/5.0

Scored across 9 tools

Disambiguation4/5

Each tool has a distinct primary output: raw conversion (convert), CSS strings (css), LUT file (cube), shader source (shader), ICC profile (icc), pasteable code (code), gamut membership (gamut), and space metadata (space/spaces). The only mild overlap is that convert, css, code, cube, shader, and icc all produce a conversion of a color, but the target format clearly separates them. Descriptions make the boundaries clear.

Naming Consistency4/5

All names are single lowercase tokens with no mixed casing or hyphenation, which is predictable and readable. It is not a strict verb_noun pattern (convert is a verb; the rest are nouns like space, cube, shader), and space/spaces differ only by pluralization, but overall style is consistent.

Tool Count5/5

Nine tools is well within a healthy range and each earns its place, covering distinct output formats and metadata queries without redundancy. The surface is neither thin nor bloated for a color-space library.

Completeness4/5

The surface covers conversion, gamut testing, CSS/LUT/shader/ICC/code emission, and full space metadata, which is strong lifecycle coverage for a color-space domain. Minor gaps exist (e.g. no color-difference/delta-E, interpolation, or blending operations), but core workflows are fully supported.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables comprehensive color manipulation, conversion between 22+ formats (HEX, RGB, HSL, CMYK, LAB, etc.), palette generation, gradient creation, and accessibility compliance checking. Supports framework-specific outputs for CSS, Swift, Android, Flutter, and Tailwind with high-precision conversions and visualization capabilities.
    25
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides comprehensive color conversion, manipulation, analysis, and WCAG accessibility tools supporting multiple formats (hex, rgb, hsl, oklch, oklab) for design systems and web development.
    19 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Extract palettes from images, generate harmonies, gradients, random palettes; Check WCAG and APCA contrast; Suggest nearest passing OkLCH lightness; Simulate color-blindness; Convert and sort colors across formats (hex / RGB / HSL / OkLCH / …)
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides CSS color utilities including parsing, conversion, gamut mapping, WCAG contrast, tint/shade ramp generation, and contrast-target solving.
    6
    75 npm
    1
    MIT