generate_analogic_scheme
Create analogic color schemes based on a seed color, generating adjacent hues from the color wheel for cohesive designs. Specify the number of colors (3-10) to tailor your palette.
Instructions
Generates an analogic color scheme with adjacent 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:183-194 (handler)The inline asynchronous handler function for the 'generate_analogic_scheme' tool. It extracts 'color' and 'count' from input args, calls the shared 'generateColorScheme' helper with 'analogic' mode, and returns the result as a formatted JSON text content block.async (args) => { const { color, count } = args; const result = await generateColorScheme(color, "analogic", count); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; }
- src/tools/index.ts:94-108 (schema)Zod-based input schema shared across all color scheme tools, including 'generate_analogic_scheme'. Defines 'color' as a string (with description of supported formats) and optional 'count' as an integer between 3-10 (default 5).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:178-196 (registration)The registration function 'registerAnalogicScheme' that calls 'server.tool' to register the tool with its name, description, input schema, and handler function.function registerAnalogicScheme() { server.tool( "generate_analogic_scheme", "Generates an analogic color scheme with adjacent colors on the color wheel", colorSchemeInputShape, async (args) => { const { color, count } = args; const result = await generateColorScheme(color, "analogic", count); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; } ); }
- src/tools/index.ts:46-91 (helper)Shared helper function that parses the input color, constructs the URL for The Color API with the specified mode ('analogic' for this tool), fetches and processes the response, formats the colors array with hex, rgb, hsl, and name, and returns a structured scheme object.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 input color string into API-compatible {param, value} for hex, rgb, or hsl formats, 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("#", "") }; }