{"openapi":"3.1.0","info":{"title":"Palette API","version":"0.1.0","description":"Color and design-system math: format conversion, identification, harmony/palette generation, WCAG contrast, color-blindness simulation, gradients, tints/shades, mixing — all local.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://palette.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/palette/docs"},"termsOfService":"https://connectorbay.com/palette/terms"},"servers":[{"url":"https://palette.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/palette/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/convert":{"post":{"operationId":"convert","summary":"Convert a color between hex, RGB, HSL, HSV and CMYK. Use for \"convert #3B82F6 to HSL\".","description":"Convert a color between hex, RGB, HSL, HSV and CMYK. Use for \"convert #3B82F6 to HSL\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"color":{"description":"A color as hex, rgb()/rgba(), hsl()/hsla(), or a CSS name.","examples":["#3B82F6","rgb(59, 130, 246)","hsl(217, 91%, 60%)","coral"],"title":"Color","type":"string"}},"required":["color"],"title":"convertArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/color_info":{"post":{"operationId":"color_info","summary":"Full conversions plus nearest/exact CSS name, luminance, brightness and the best text color for that","description":"Full conversions plus nearest/exact CSS name, luminance, brightness and the best text color for that\n    background. Use for \"what color is rgb(219, 39, 119)\", \"what's the nearest named color to #FF6B35\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"color":{"description":"A color as hex, rgb()/rgba(), hsl()/hsla(), or a CSS name.","title":"Color","type":"string"}},"required":["color"],"title":"color_infoArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/harmony":{"post":{"operationId":"harmony","summary":"Generate a color harmony/palette from a base color. Use for \"generate a triadic palette from #10B981\".","description":"Generate a color harmony/palette from a base color. Use for \"generate a triadic palette from #10B981\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"color":{"description":"Base color.","title":"Color","type":"string"},"scheme":{"default":"complementary","description":"complementary | analogous | triadic | tetradic | square | split_complementary | double_complementary | monochromatic","title":"Scheme","type":"string"},"count":{"anyOf":[{"maximum":12,"minimum":2,"type":"integer"},{"type":"null"}],"default":null,"description":"Number of steps, for monochromatic only.","title":"Count"}},"required":["color"],"title":"harmonyArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/contrast_ratio":{"post":{"operationId":"contrast_ratio","summary":"WCAG 2.x contrast ratio between two colors, with AA/AAA pass/fail for normal text, large text and UI","description":"WCAG 2.x contrast ratio between two colors, with AA/AAA pass/fail for normal text, large text and UI\n    components. Use for \"contrast ratio of white text on #1E3A8A\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"foreground":{"description":"Foreground/text color.","title":"Foreground","type":"string"},"background":{"description":"Background color.","title":"Background","type":"string"}},"required":["foreground","background"],"title":"contrast_ratioArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/accessible_pair":{"post":{"operationId":"accessible_pair","summary":"The best text color (black or white) for a background, or an accessibility-adjusted version of a preferred","description":"The best text color (black or white) for a background, or an accessibility-adjusted version of a preferred\n    color. Use for \"what text color works on this background\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"background":{"description":"Background color.","title":"Background","type":"string"},"preferred_text_color":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A text color you'd like to use; it will be checked and adjusted toward AA if needed.","title":"Preferred Text Color"}},"required":["background"],"title":"accessible_pairArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/colorblind_simulate":{"post":{"operationId":"colorblind_simulate","summary":"Simulate how a color appears under a color-vision deficiency. Use for \"simulate deuteranopia for #EF4444\".","description":"Simulate how a color appears under a color-vision deficiency. Use for \"simulate deuteranopia for #EF4444\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"color":{"description":"Color to simulate.","title":"Color","type":"string"},"deficiency":{"default":"deuteranopia","description":"protanopia | deuteranopia | tritanopia | achromatopsia","title":"Deficiency","type":"string"}},"required":["color"],"title":"colorblind_simulateArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/gradient":{"post":{"operationId":"gradient","summary":"Interpolate N steps between two or more colors, in RGB or HSL space. Use for \"gradient from blue to purple","description":"Interpolate N steps between two or more colors, in RGB or HSL space. Use for \"gradient from blue to purple\n    in 8 steps\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"colors":{"description":"Two or more colors to interpolate between, in order.","items":{"type":"string"},"title":"Colors","type":"array"},"steps":{"default":5,"maximum":64,"minimum":2,"title":"Steps","type":"integer"},"space":{"default":"rgb","description":"rgb | hsl","title":"Space","type":"string"}},"required":["colors"],"title":"gradientArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/shades_tints":{"post":{"operationId":"shades_tints","summary":"A ladder of tints (toward white), shades (toward black) and tones (toward gray) from a base color. Use for","description":"A ladder of tints (toward white), shades (toward black) and tones (toward gray) from a base color. Use for\n    \"tints and shades of teal\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"color":{"description":"Base color.","title":"Color","type":"string"},"steps":{"default":5,"maximum":20,"minimum":2,"title":"Steps","type":"integer"}},"required":["color"],"title":"shades_tintsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/named_color":{"post":{"operationId":"named_color","summary":"Look up a CSS color by name (exact or partial match), or find the nearest CSS name to a color value. Use for","description":"Look up a CSS color by name (exact or partial match), or find the nearest CSS name to a color value. Use for\n    \"hex for rebeccapurple\", \"what's the nearest named color to #FF6B35\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"description":"A CSS color name, a partial name, or a color value.","title":"Query","type":"string"}},"required":["query"],"title":"named_colorArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/mix":{"post":{"operationId":"mix","summary":"Mix two colors by ratio, like paint or a blend mode. Use for \"mix red and blue 50/50\", \"multiply coral over","description":"Mix two colors by ratio, like paint or a blend mode. Use for \"mix red and blue 50/50\", \"multiply coral over\n    navy at 30%\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"color1":{"description":"First (base) color.","title":"Color1","type":"string"},"color2":{"description":"Second (blend) color.","title":"Color2","type":"string"},"ratio":{"default":0.5,"description":"Share of color2 (normal mode) or blend-layer opacity (other modes).","maximum":1,"minimum":0,"title":"Ratio","type":"number"},"mode":{"default":"normal","description":"normal | multiply | screen | overlay","title":"Mode","type":"string"}},"required":["color1","color2"],"title":"mixArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}