generate_triad_scheme
Create balanced triad color schemes by selecting a seed color and specifying the number of colors. Perfect for design projects requiring harmonious, evenly spaced palettes on the color wheel.
Instructions
Generates a triad color scheme with three evenly spaced colors on the color wheel
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| color | Yes | The seed color in hex (098765), RGB (0,71,171), or HSL (215,100%,34%) format | |
| count | No | Number of colors to generate (3-10, default: 5) |
Implementation Reference
- src/tools/index.ts:250-261 (handler)The handler function executed when the generate_triad_scheme tool is called. It extracts color and count from args, generates the triad scheme using the shared helper, and returns formatted JSON response.async (args) => { const { color, count } = args; const result = await generateColorScheme(color, "triad", count); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; }
- src/tools/index.ts:246-263 (registration)Registers the generate_triad_scheme tool with the MCP server, providing name, description, schema reference, and handler.server.tool( "generate_triad_scheme", "Generates a triad color scheme with three evenly spaced colors on the color wheel", colorSchemeInputShape, async (args) => { const { color, count } = args; const result = await generateColorScheme(color, "triad", count); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; } ); }
- src/tools/index.ts:94-108 (schema)Shared Zod schema defining the input shape for color scheme tools, including generate_triad_scheme: required 'color' string and optional 'count' number.const colorSchemeInputShape = { color: z .string() .describe( "The seed color in hex (098765), RGB (0,71,171), or HSL (215,100%,34%) format" ), count: z .number() .int() .min(3) .max(10) .default(5) .optional() .describe("Number of colors to generate (3-10, default: 5)"), };
- src/tools/index.ts:46-91 (helper)Shared helper function that implements the core logic for generating color schemes by parsing color input, fetching from The Color API with specified mode ('triad'), and formatting the results.async function generateColorScheme( color: string, mode: string, count: number = 5 ) { const { param, value } = parseColorInput(color); const url = `https://www.thecolorapi.com/scheme?${param}=${value}&mode=${mode}&count=${count}&format=json`; try { const response = await fetch(url); if (!response.ok) { throw new Error( `Color API request failed: ${response.status} ${response.statusText}` ); } const data: any = await response.json(); if (!data.colors || !Array.isArray(data.colors)) { throw new Error("Invalid response from Color API"); } // Format the response for better readability const colors = data.colors.map((color: any, index: number) => ({ position: index + 1, hex: color.hex?.value || "N/A", rgb: color.rgb ? `rgb(${color.rgb.r}, ${color.rgb.g}, ${color.rgb.b})` : "N/A", hsl: color.hsl ? `hsl(${color.hsl.h}, ${color.hsl.s}%, ${color.hsl.l}%)` : "N/A", name: color.name?.value || "Unknown", })); return { scheme_mode: mode, seed_color: data.seed?.hex?.value || value, color_count: colors.length, colors: colors, }; } catch (error) { console.error(`Error generating ${mode} color scheme:`, error); throw error; } }
- src/tools/index.ts:6-43 (helper)Helper function to parse and normalize the seed color input into API-compatible parameters (hex, rgb, or hsl). Used by generateColorScheme.function parseColorInput(color: string): { param: string; value: string } { const cleanColor = color.trim(); // Check for hex format if (cleanColor.startsWith("#")) { return { param: "hex", value: cleanColor.substring(1) }; } else if (/^[0-9A-Fa-f]{6}$/.test(cleanColor)) { return { param: "hex", value: cleanColor }; } // Check for RGB format if ( cleanColor.toLowerCase().includes("rgb") || /^\d+,\d+,\d+$/.test(cleanColor) ) { const rgbMatch = cleanColor.match(/(\d+),\s*(\d+),\s*(\d+)/); if (rgbMatch) { return { param: "rgb", value: `${rgbMatch[1]},${rgbMatch[2]},${rgbMatch[3]}`, }; } } // Check for HSL format if (cleanColor.toLowerCase().includes("hsl") || cleanColor.includes("%")) { const hslMatch = cleanColor.match(/(\d+),\s*(\d+)%,\s*(\d+)%/); if (hslMatch) { return { param: "hsl", value: `${hslMatch[1]},${hslMatch[2]}%,${hslMatch[3]}%`, }; } } // Default to hex if format is unclear return { param: "hex", value: cleanColor.replace("#", "") }; }