aesthete-agent
This MCP server exposes color-system tooling for matching, generating, validating, exporting, and visualizing palettes.
Match a natural-language brief against an evidence library, with learned preference penalties and endorsement ranking.
Generate OKLCH harmony palettes from a seed color across rules and light/dark themes.
Score palettes with a 5-dimension scorecard and P0–P3 findings.
Check WCAG or APCA contrast for a foreground/background pair.
Build a full pairwise contrast matrix with best-pair recommendations.
Simulate protanopia, deuteranopia, and tritanopia, flagging collision risks.
Generate color-blind-safe categorical colors for charts.
List named theme packs and emit themes as CSS custom properties or JSON.
Export palettes as CSS, Tailwind, JSON, SVG, W3C Design Tokens, or LLM-ready context.
Detect AI-slop signatures such as training-median hexes, purple gradients, flat lightness, and all-loud palettes.
Render palettes into realistic UI scenes with derived roles and legibility gates.
Produce a one-shot PASS/FAIL report aggregating contrast, color-blind, slop, and scorecard gates.
Exports a validated palette as CSS custom properties (CSS tokens), and the HTML delivery linter checks generated CSS/HTML for aesthetic gate violations such as gradients.
Renders palettes into UI scenes and can recolor an existing SVG, slotting palette colors into the artwork while preserving pure black and white; also exports SVG color tokens.
aesthete-agent
Mechanically validated frontend aesthetics for AI agents. An agent skill (and MCP server) that plans, validates, and exports color systems — so your agent stops shipping purple-gradient AI slop and starts shipping palettes that pass WCAG, survive color-blindness, and read as designed.
npx skills add docsor1212/aesthete-agent # 30 seconds; also: skillhub / clawhub / MCP uvx — see InstallOther tools give your agent taste advice. This one gives it gates: nothing ships until it passes four mechanical checks (WCAG contrast, three color-blindness simulations, AI-slop detection, scorecard) — backed by a 119-palette evidence library, five full-page layout recipes, and a render-verified review loop.
Why
LLMs choose colors badly for measurable reasons: they treat hex codes as text, they regress to the median of their training data (the frontend-tutorial median is purple/indigo), and they cannot see the colors they emit. aesthete-agent fixes this the engineering way — outsource taste to process:
an evidence library of 119 curated palettes filtered by objective quality gates (flat lightness → rejected; no readable text pair → rejected; color-blind collisions / slop signatures → flagged),
mechanical gates on every decision: a 5-dimension scorecard, exact WCAG 2.2 boundaries (APCA optional), three color-blindness simulations, AI-slop signature detection, a gradient ban (any gradient = P0), and an HTML delivery linter,
a six-step method (manifesto → register check → source → roles → validate → five-lens review) that turns "make it pretty" into a reproducible pipeline,
a preference profile (
profile.json) that learns from every accept/reject verdict and mechanically down-ranks what the user rejects.
Related MCP server: MCP Color Converter
What it renders
Every image below is a real deliverable produced by the engine — roles derived in OKLCH, contrast gated, color-blind simulated, slop checked, then rendered into a full scene. No hand-picked colors. Live versions: visual showcase (30 scenes across curated palettes).
Install
Agent skill — one line in any skills-compatible agent (Claude Code, ZCode, Codex, Cursor, Gemini CLI):
npx skills add docsor1212/aesthete-agentSkillHub (中文站, fastest in China — primary release channel):
skillhub install aesthete-agent --dir <your-skills-dir> # e.g. ~/.claude/skillsor open skillhub.cn/skills/aesthete-agent and click 安装到本地 Agent.
DeepSeek Harness native plugin (DSH desktop / web / TUI) — 11 native tools over the bundled engine:
dsh plugin --profile web add github:docsor1212/dsh-aesthete-agentClawHub (international registry):
ClawHub (international registry):
npx clawhub install aesthete-agentMCP server (Claude Desktop, Cursor, any MCP client) — the engine as 21 callable tools:
uvx aesthete-agent-mcp # from PyPI, zero keys
# or: npx -y @smithery/cli install docsor1212/aesthete-agent-mcp --client claudePure Python stdlib in the core engine (offline, zero keys, zero telemetry); Pillow optional for image extraction; FastMCP optional for the MCP server.
30-second agent quickstart
S="scripts/palette_forge.py" # inside the installed skill directory
python "$S" match --brief "pediatric clinical teaching page" --limit 6 # rank the evidence library by register
python "$S" score --palette 264653,2A9D8F,E9C46A,F4A261,E76F51 # 5-dim scorecard /20
python "$S" matrix --palette ... --method apca --recommend # full contrast matrix (APCA = WCAG 3 draft)
python "$S" semantic --count 8 --base 2A9D8F # color-blind-safe categorical colors
python "$S" visualize --palette ... --variants 3 # 10 real UI scenes + variants
python "$S" report --palette ... # all gates → one PASS/FAIL verdict
python "$S" theme "Golden Window Suya" --format css # named theme pack → CSS tokens
python "$S" export --palette ... --format w3c # W3C Design Tokens JSON
python "$S" export --palette ... --format prompt # image-generation prompt block
python "$S" doctor # environment health checkFull method (manifesto → register → source → roles → validate → five-lens review) lives in SKILL.md. References carry a 30-second routing table per task.
What's inside
Area | Highlights |
Engine (38 subcommands) | match/search/harmony/ramp/mutate/roles/score/contrast/blind/matrix/semantic/slop/themes/theme/export(w3c·context·css·tailwind·prompt)/card/showcase/visualize/report/critique/doctor/selftest/house/extract/directions/scene/scaffold/check-image/evidence/tokens/audit/chartpal/typescale/qc/narrate/exemplar/patch/loop |
Evidence library | 119 curated palettes with like tiers, computed style tags, gate flags |
Scene visualizer | 10 real front-end scene types × any palette, light and dark, |
Theme packs | 8 named packs (colors + fonts + voice + use-when), all with provenance |
Quality gates | exit-code enforced: scorecard, contrast, blind collisions, slop, HTML lint (gradient ban: any gradient = P0), |
Learning |
|
Tests | 39 automated tests incl. WCAG boundary values (#767676=4.54 pass / #777777=4.48 fail), APCA, W3C export |
The evidence library
Nobody can know "beautiful" a priori — so the library is built from three filters, each doing only what it can: crowd signal (community-endorsed charts, like tiers, cross-page recurrence), objective gates (reject only objectively broken architecture: flat lightness, no readable pair; flag CB collisions and slop), and in-context review (the final verdict happens in real layouts, with the user). Every rejection is recorded with a measured cause.
MCP server
mcp/ wraps the engine as MCP tools (JSON-RPC over stdio). Zero keys, zero telemetry; ships as a self-contained wheel — server_data/ carries the engine, so uvx aesthete-agent-mcp works standalone. A pure-stdlib stdio fallback (--stdio) runs even without FastMCP.
Tool | Wraps |
| evidence-library ranking by brief |
| OKLCH harmony generation |
| 5-dim scorecard / all-gates PASS-FAIL verdict |
| pair check / full pair matrix (WCAG + APCA) |
| CB simulation / CB-safe categorical colors |
| AI-slop signature detection |
| 10-scene renderings + variants |
| named theme packs |
| css / tailwind / w3c / context / prompt |
Platform availability
Platform | Handle | Link |
GitHub (source of truth) | install above | |
SkillHub (中文站) |
| |
ClawHub |
| |
PyPI (MCP) |
| |
Smithery (MCP) |
| |
Online demo | showcase + live visualizers |
License
MIT
Available Tools
13 toolspalette_blind_implPalette Blind ImplB
Simulate protanopia/deuteranopia/tritanopia; flags collision risk.
| Name | Required | Description | Default |
|---|---|---|---|
| palette | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses the three simulation modes and that it flags collision risk, but omits read-only status, required input format, and whether output is per-pair or aggregate — relevant gaps for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact clause with the primary action front-loaded and no filler. It is arguably too terse rather than bloated, which costs only slightly here.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required. However, with no annotations and an undocumented palette parameter, the definition is only minimally sufficient for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%: 'palette' is an undescribed string with no format, delimiter, or encoding guidance. The description never explains what syntax the palette string should take, so it fails to compensate for the schema's silence.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Simulate') and the exact resource (protanopia/deuteranopia/tritanopia simulation), plus a secondary output (collision risk flagging). It doesn't name the closest sibling (palette_contrast_impl) or otherwise distinguish itself within the large palette_* family, so an agent must still infer positioning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative-routing guidance. An agent could infer an accessibility-check context, but nothing in the text says when this should be chosen over palette_contrast_impl or palette_score_impl.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_contrast_implPalette Contrast ImplB
Contrast for one fg/bg pair. method='apca' uses the APCA 0.1.9 perceptual algorithm (WCAG 3 draft direction; Lc>=75 body, >=60 large, >=45 bold).
| Name | Required | Description | Default |
|---|---|---|---|
| bg | Yes | ||
| fg | Yes | ||
| method | No | wcag |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does disclose real substance: the APCA 0.1.9 algorithm, its WCAG 3 draft provenance, and the Lc thresholds (>=75 body, >=60 large, >=45 bold). However, it never explains the default 'wcag' method's behavior or whether the tool is a pure read/computation, leaving a notable gap for an annotation-free tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler, and the core purpose ('Contrast for one fg/bg pair') is front-loaded before the method detail. Slightly jargon-dense but appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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. But with zero annotations the description should more fully cover behavior, and it omits the default 'wcag' method semantics and any routing to the sibling that handles multiple pairs, leaving the definition only partially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 3 parameters, so the description must compensate. It does add genuine meaning for 'method' (the 'apca' option and its thresholds) but says nothing about the required 'fg' and 'bg' parameters – their accepted format (hex, rgb, name) is undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation and scope: 'Contrast for one fg/bg pair.' The 'one pair' phrasing implicitly separates it from batch siblings like palette_matrix_impl or palette_score_impl, but no sibling is named explicitly, so differentiation is inferential rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use or when-not-to-use guidance and never names an alternative tool. The implicit signal that this handles a single pair (vs. a matrix/scoring sibling) is the only usage cue, and an agent must infer it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_export_implPalette Export ImplC
Export tokens: css | tailwind | json | svg | w3c (W3C Design Tokens) | context (paste-ready color-system context for any LLM).
| Name | Required | Description | Default |
|---|---|---|---|
| fmt | No | css | |
| palette | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It briefly characterizes one format's output ("paste-ready color-system context for any LLM"), but says nothing about the operation being a safe read, permissions, or how the export is produced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words; the format enumeration is dense but appropriate. It reads as a value list more than a structured definition, but it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, and the format options are covered. What is missing for correct invocation is the meaning/format of the required `palette` argument and any sense of when to choose this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema declares no enum, so the description's enumeration of the five fmt values (css, tailwind, json, svg, w3c, context) is the only documentation for that parameter and adds real value. However the required `palette` parameter is completely unexplained — its expected form (name, JSON, reference) is unknown.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Export tokens") and enumerates the output formats, which is enough to distinguish it from the sibling analyze/visualize/match tools. It does not explicitly name an alternative, but the export function is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The format list implies the agent picks a target format, but there is no explicit when-to-use guidance, no prerequisites, and no mention of when to prefer this over the twelve palette_* siblings. Usage 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.
palette_harmony_implPalette Harmony ImplB
Generate an OKLCH harmony palette from a seed color (7 rules x light/dark).
| Name | Required | Description | Default |
|---|---|---|---|
| base | Yes | ||
| mode | No | analogous | |
| theme | No | light |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that output is an OKLCH harmony palette with 7 rules across light/dark, but does not state valid mode values, whether the seed accepts any color format, error behavior, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the action, output format, and input source with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, but the description omits the mode enum vocabulary and any guidance distinguishing this tool from its twelve siblings. Adequate but incomplete for a generation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate, and it partially does: 'seed color' maps to base, '7 rules' hints at mode values, and 'light/dark' explains theme. However, it never enumerates the 7 rule names, so mode remains guesswork.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Generate) and resource (OKLCH harmony palette) scoped to a seed color, which clearly separates it from score/visualize/contrast siblings. It does not name a specific sibling or exclusion, so it falls short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use context, no prerequisites, and no indication of how this harmony generation differs from the many other palette_* tools it sits beside. The agent must infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_match_implPalette Match ImplB
Rank the 89-palette evidence library for a natural-language brief. Auto-detects register, applies learned preference penalties, sorts by endorsement tiers.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | Yes | ||
| limit | No | ||
| no_flags | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose non-obvious behavior — register auto-detection, learned preference penalties, endorsement-tier sorting — but omits whether the operation has side effects, how penalties are sourced/updated, or determinism across calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, and the core purpose is front-loaded before the secondary behavioral detail. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, and the ranking behavior is described. But undocumented parameters and absent sibling routing leave the definition only minimally sufficient for a tool embedded in a large, undifferentiated family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters. The description implies the 'brief' input but adds no syntax or format guidance, and says nothing about 'limit' (result count, default 6) or 'no_flags' (which controls penalty behavior). With coverage below 50%, the description should compensate and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Rank') and resource ('89-palette evidence library') for a natural-language brief, which is more informative than a tautology. However, in a family of 13 palette_* siblings it does not name or contrast with any alternative (e.g. palette_score_impl or palette_semantic_impl), leaving differentiation to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the tool does but never states when to use it, when not to, or which sibling to prefer for a given task. With a dozen competing palette tools, no routing guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_matrix_implPalette Matrix ImplC
Full pairwise contrast matrix (WCAG ratios or APCA Lc) + best-pair recommendation.
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | wcag | |
| palette | Yes | ||
| recommend | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it only names the output content (matrix + recommendation). It does not state that this is a pure read-only computation with no side effects, nor what the method switch changes or what 'recommend' toggling does. For a zero-annotation tool this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the core output (the contrast matrix) before the appended recommendation. There is no filler, though the compression comes at the cost of the missing detail noted elsewhere rather than through deliberate density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, but the description leaves the 0%-covered parameters undocumented and offers no distinction from the many sibling palette tools. For a 3-parameter tool with zero annotation support, this is insufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all three parameters. It hints at the method choice ('WCAG ratios or APCA Lc') and the recommendation feature, but never maps these to the 'method' or 'recommend' parameters explicitly, and gives no guidance on the 'palette' string format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific computation ('full pairwise contrast matrix') with two supported metrics (WCAG ratios or APCA Lc) plus a 'best-pair recommendation', which is concrete enough for an agent to know what the tool produces. However, it never differentiates itself from the related sibling palette_contrast_impl, leaving ambiguity about which one to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to use this tool versus alternatives such as palette_contrast_impl, palette_score_impl, or palette_report_impl. No prerequisites, exclusions, or usage context are provided beyond the implicit 'give me a matrix' reading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_report_implPalette Report ImplB
One-shot acceptance artifact: contrast / color-blind / AI-slop / scorecard gates aggregated into a single PASS/FAIL JSON. Exit code = verdict.
| Name | Required | Description | Default |
|---|---|---|---|
| palette | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the aggregation behavior, the PASS/FAIL JSON shape, and that an exit code encodes the verdict — a non-obvious trait. It says nothing about permissions, side effects, idempotency, or whether it writes anything to disk, which for a "report artifact" tool is a real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the purpose front-loaded and zero filler; "Exit code = verdict" is an efficient way to convey a behavioral detail. Slightly jargon-dense ("AI-slop") but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't be spelled out, and the description still usefully summarizes them. However, with an undocumented input parameter and a crowded 13-tool sibling set, it omits the palette input format and any explicit guidance on choosing this aggregate over the individual gate tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sole parameter `palette` has 0% schema description coverage and the description never explains what it accepts (hex list, file path, palette name?). The gate names hint that the input is a color palette, but the format is left entirely to inference, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb (aggregate) and a concrete resource (a single PASS/FAIL JSON report), and names the four gates it rolls up (contrast, color-blind, AI-slop, scorecard) — which map directly onto sibling tools like palette_contrast_impl, palette_blind_impl and palette_slop_impl. That implicitly differentiates it as the umbrella tool, though it never says so explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"One-shot acceptance artifact" implies the context (a final go/no-go check rather than incremental inspection), which hints at when to reach for it over the individual gate tools. But there is no explicit when/when-not statement or named alternative, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_score_implPalette Score ImplB
5-dimension scorecard (/20) with P0-P3 findings: architecture, readability, CB-safety, saturation discipline, uniqueness. Exit non-zero = untrustworthy.
| Name | Required | Description | Default |
|---|---|---|---|
| palette | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the scoring rubric and flags that a non-zero exit signals an untrustworthy palette, which is genuine behavioral context, but it omits whether the tool is read-only, what auth it needs, or how failures are surfaced through the MCP interface rather than a CLI exit code.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and front-loaded: the scorecard output leads, dimensions follow, and the untrustworthy note closes. No wasted sentences, though 'CB-safety' is unexplained jargon that costs a little clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, and the description covers the scoring concept adequately. The gap is the input side – a required, undocumented 'palette' parameter – leaving the definition only just sufficient for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'palette' parameter has 0% schema description coverage, and the description says nothing about its expected format (hex list, file path, theme name, etc.). With the schema doing no work and the description silent, the agent cannot know what to pass.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete output (a 5-dimension scorecard out of 20 with P0-P3 findings) and enumerates the dimensions scored, so the agent knows this is the evaluation/grading tool in the palette family. It does not explicitly contrast itself with close siblings like palette_slop_impl or palette_report_impl, so sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus the twelve palette siblings, no prerequisites, and no mention of what a valid palette input looks like. Only the terse 'Exit non-zero = untrustworthy' note hints at usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_semantic_implPalette Semantic ImplC
Color-blind-safe categorical colors for charts: interleaved luminance ramp + evenly spread hues, verified >=0.08 min separation under deuteranopia.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | ||
| count | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It does disclose a real behavioral guarantee — verified >=0.08 minimum separation under deuteranopia — and the generation strategy, which is more than nothing. But it says nothing about determinism, whether output ordering is stable, or how the palette relates to the supplied base color.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the output and its audience, with no filler. It is information-rich rather than padded, though the algorithm detail arguably crowds out the more useful usage and parameter guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, and the tool is a stateless two-parameter computation. Still, with no annotations, no parameter documentation, and no usage routing among twelve siblings, an agent cannot confidently decide when to call this or what to pass for 'base'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it does not: neither 'base' nor 'count' is mentioned. The meaning of 'base' (a seed color? a named palette? a hex string?) is entirely opaque, and 'count' is only weakly implied by the notion of a categorical set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific output — color-blind-safe categorical colors for charts — and characterizes it via its construction method (interleaved luminance ramp + evenly spread hues). It does not, however, differentiate itself from siblings such as palette_blind_impl or palette_harmony_impl, which plausibly produce overlapping outputs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for charts' hints at a use case, but there is no statement of when to pick this tool over palette_blind_impl, palette_harmony_impl, or the other eleven siblings. No prerequisites, exclusions, or alternative routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_slop_implPalette Slop ImplB
Detect AI-slop signatures: training-median hexes, purple gradients, flat lightness, all-loud palettes.
| Name | Required | Description | Default |
|---|---|---|---|
| palette | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully enumerates the signatures it detects, implying a read-only analysis, but says nothing about the expected input format, whether it returns counts/flags/severity, or any constraints on the palette string.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, packing four concrete detection criteria. Slightly dense jargon ('training-median hexes') but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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. However, for a tool whose only input is an unformatted string, the description omits the input contract and offers no routing guidance among twelve sibling palette tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single 'palette' parameter has no type detail beyond 'string'. The description never clarifies the accepted format (hex array, comma-delimited list, JSON), so an agent cannot know how to construct the value from either the schema or the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Detect') plus a named target ('AI-slop signatures') with concrete exemplars (training-median hexes, purple gradients, flat lightness, all-loud palettes). It is clearly distinct in kind from siblings like palette_score_impl or palette_match_impl, though it never explicitly names a sibling to differentiate itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no condition that selects this over palette_score_impl or palette_semantic_impl, and no stated prerequisites. The intended usage (auditing a palette for AI-generated clichés) must be inferred from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_theme_implPalette Theme ImplC
Emit a named theme as CSS custom properties (or full JSON).
| Name | Required | Description | Default |
|---|---|---|---|
| fmt | No | css | |
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It says the tool 'emits' output, implying a read-only or generative operation, but does not disclose whether it writes to disk, returns a string, requires a valid theme name, or has side effects. For a tool with no annotations and an output schema, description adds little beyond naming output formats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It is appropriately concise, though it may be too terse given the lack of parameter and usage details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, 0% schema coverage, 2 parameters, and many overlapping sibling tools, the description is insufficient. It omits parameter semantics, usage context, and behavioral details. The presence of an output schema alleviates the need to describe return values, but other gaps remain significant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for both parameters. It indirectly refers to 'name' and the format choice, but does not explain what values 'name' accepts, whether it must match an existing theme, or what valid 'fmt' values are. Since an output schema exists, return value explanation is unnecessary, but parameter meaning is left undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a verb and resource: 'Emit a named theme as CSS custom properties (or full JSON).' This is clear about what it does. However, it doesn't distinguish itself from sibling tools like palette_themes_impl or palette_export_impl, which likely overlap in theme output. Without that differentiation, the purpose is adequate but ambiguous in the sibling context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as palette_export_impl or palette_themes_impl. It mentions output formats but does not state when one should choose CSS over JSON or why this tool is preferable to siblings. Neither conditions nor exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_themes_implPalette Themes ImplB
List named theme packs (colors + fonts + voice + use-when), all dogfood-proven.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. "List" weakly implies a read-only operation, but the description never says so explicitly, nor does it mention permissions, rate limits, or scope constraints; "all dogfood-proven" is a quality claim rather than behavioral information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the action and resource. The trailing "all dogfood-proven" is uninformative filler that could be cut, but the rest earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, and with zero parameters there is little schema burden. The remaining gap is disambiguation from palette_theme_impl, which a definition with only two words differing in its name badly needs and does not provide.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to add beyond what the (empty, closed) schema already conveys. The baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List named theme packs") and enumerates what a pack contains (colors, fonts, voice, use-when). It is clear what the tool returns, but it never names or contrasts with the near-identical sibling palette_theme_impl, leaving the singular/plural distinction to be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all, and crucially no routing between this tool and palette_theme_impl despite the almost identical names. The agent gets no signal about which one to pick or on what condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_visualize_implPalette Visualize ImplB
Render the palette into 6 realistic UI scenes (mobile, landing, dashboard, branding, typography, pattern) with derived roles and legibility gates; optionally recolor an SVG keeping pure black/white.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | visualizer.html | |
| theme | No | ||
| palette | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: 6 scene types, derived color roles, legibility gates, and a black/white-preservation rule for SVG recoloring. However, it never mentions side effects such as writing an output file (implied by the 'out' default of visualizer.html) or whether the operation is read-only, which is a notable gap for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the primary action and scene enumeration, with the optional SVG mode placed correctly as a secondary clause. No filler, though the sentence is long enough to be slightly hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 restated, and the core rendering behavior is well covered. Still, the undocumented 'out'/'theme' parameters, absent annotations, and unclear file-writing side effect leave gaps an agent would need to resolve before invoking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 3 parameters, so the description must compensate and largely does not. It clarifies the subject of 'palette' but adds nothing about 'out' (an output path) or 'theme', leaving two of three parameters semantically undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Render') and resource ('the palette') with an enumerated scope of 6 named UI scenes plus derived roles. The rendering action is implicitly distinct from siblings like palette_score_impl or palette_contrast_impl, but no sibling is named or contrasted explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no routing against alternatives such as palette_report_impl, palette_export_impl, or palette_themes_impl. The only usage-adjacent hint is the optional SVG recolor mode, which is a capability rather than a selection criterion.
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.
13 tool updates
- First observed
palette_blind_impl - First observed
palette_contrast_impl - First observed
palette_export_impl - First observed
palette_harmony_impl - First observed
palette_match_impl - First observed
palette_matrix_impl - First observed
palette_report_impl - First observed
palette_score_impl - First observed
palette_semantic_impl - First observed
palette_slop_impl - First observed
palette_theme_impl - First observed
palette_themes_impl - First observed
palette_visualize_impl
TDQS
Scored across 13 tools
Most tools have distinct purposes (harmony generation, contrast checking, blindness simulation, export, slop detection), but palette_themes_impl (list packs) and palette_theme_impl (emit one theme) differ only by a trailing 's' and are easy to misselect. palette_score_impl and palette_report_impl, plus palette_contrast_impl vs palette_matrix_impl, also have some functional overlap that descriptions mostly resolve.
Every tool follows the exact same palette_<action>_impl pattern with a single conventional prefix and suffix. The convention is uniform across all 13 tools despite the slightly unusual '_impl' suffix.
13 tools is squarely in the well-scoped range and each one maps to a recognizable capability of a color-system agent (scoring, matching, generation, checking, export, reporting). No tool feels redundant or padded.
The surface covers generation (harmony), analysis (score, contrast, matrix, slop, blindness), curation (match, themes, theme), and output (export, visualize, report) — a full workflow lifecycle. Minor gaps such as extracting or persisting a user's own custom palette from an image/design are not addressed.
Maintenance
Related MCP Connectors
18 color tools: OKLCH, WCAG and APCA contrast fixes, palettes, gradients, color blindness, tokens.
Contrast checks with fixes, OKLCH harmonies, palettes, color-blind previews and code export.
Verified color tokens for AI coding agents: one brand hex in, WCAG/APCA-measured themes out.
WCAG color contrast checks, nearest accessible color, CSS color conversion and palette pair checks.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides comprehensive color conversion, manipulation, analysis, and WCAG accessibility tools supporting multiple formats (hex, rgb, hsl, oklch, oklab) for design systems and web development.7 npm2MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive toolkit for color conversion, manipulation, and accessibility analysis supporting formats like OkLCH and WCAG compliance. It enables AI agents to manage design systems by generating harmonious palettes, transforming color spaces, and performing contrast checks.2MIT
- AlicenseNot gradedqualityBmaintenanceExtract 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
- AlicenseAqualityAmaintenanceEnables high-craft web design and engineering through OKLCH color systems, fluid typography, Three.js 3D scenes, frontend security audits, multi-viewport capture, and Python-backed design verification.1110 npmMIT