Skip to main content
Glama

generate_semantic_colors

Map base colors to semantic UI roles like primary, secondary, and error while ensuring WCAG accessibility compliance for web, mobile, or desktop applications.

Instructions

Map colors to semantic roles for UI design with accessibility compliance

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
base_paletteYesArray of base colors to map to semantic roles
semantic_rolesNoSemantic roles to generate colors for
contextNoContext for color usageweb
ensure_contrastNoEnsure WCAG contrast compliance
accessibility_levelNoWCAG accessibility level to targetAA

Implementation Reference

  • Core handler function executing the tool logic: validates base palette, generates semantic color mappings for roles like primary/success/error, ensures accessibility compliance, produces reports and recommendations.
    export async function generateSemanticColors(
      params: GenerateSemanticColorsParams
    ): Promise<ToolResponse | ErrorResponse> {
      const startTime = Date.now();
    
      try {
        // Validate required parameters
        if (!params.base_palette || params.base_palette.length === 0) {
          return createErrorResponse(
            'generate_semantic_colors',
            'MISSING_PARAMETER',
            'Base palette parameter is required and must contain at least one color',
            Date.now() - startTime,
            {
              details: { parameter: 'base_palette' },
              suggestions: ['Provide an array of colors in any supported format'],
            }
          );
        }
    
        // Validate all colors in base palette
        const basePalette: UnifiedColor[] = [];
        for (let i = 0; i < params.base_palette.length; i++) {
          const colorStr = params.base_palette[i];
          if (!colorStr) {
            return createErrorResponse(
              'generate_semantic_colors',
              'INVALID_COLOR',
              `Color at index ${i} is undefined`,
              Date.now() - startTime,
              {
                details: { index: i },
                suggestions: ['Ensure all colors in the palette are defined'],
              }
            );
          }
    
          const validation = validateColorInput(colorStr);
          if (!validation.isValid) {
            return createErrorResponse(
              'generate_semantic_colors',
              'INVALID_COLOR',
              `Invalid color at index ${i}: ${colorStr}`,
              Date.now() - startTime,
              {
                details: { index: i, provided: colorStr, error: validation.error },
                suggestions: [
                  'Ensure all colors are in valid formats like #FF0000 or rgb(255, 0, 0)',
                ],
              }
            );
          }
          basePalette.push(new UnifiedColor(colorStr));
        }
    
        // Set defaults
        const semanticRoles = params.semantic_roles || [
          'primary',
          'secondary',
          'success',
          'warning',
          'error',
          'info',
          'neutral',
        ];
        const context = params.context || 'web';
        const ensureContrast = params.ensure_contrast !== false; // Default to true
        const accessibilityLevel = params.accessibility_level || 'AA';
    
        // Generate semantic mapping
        const semanticMapping = await generateSemanticMapping(
          basePalette,
          semanticRoles,
          context,
          ensureContrast,
          accessibilityLevel
        );
    
        // Generate accessibility report
        const accessibilityReport = await generateSemanticAccessibilityReport(
          semanticMapping,
          accessibilityLevel
        );
    
        // Generate usage recommendations
        const usageRecommendations = generateUsageRecommendations(
          semanticMapping,
          context,
          accessibilityReport
        );
    
        // Prepare response
        const responseData: GenerateSemanticColorsResponse = {
          base_palette: params.base_palette,
          context,
          semantic_mapping: semanticMapping,
          accessibility_report: accessibilityReport,
          usage_recommendations: usageRecommendations,
        };
    
        const executionTime = Date.now() - startTime;
    
        // Generate accessibility notes
        const accessibilityNotes: string[] = [];
        if (accessibilityReport.overall_compliance === 'FAIL') {
          accessibilityNotes.push(
            'Some semantic colors do not meet accessibility standards'
          );
        } else if (accessibilityReport.overall_compliance === 'AA') {
          accessibilityNotes.push('Semantic colors meet WCAG AA standards');
        } else {
          accessibilityNotes.push('Semantic colors meet WCAG AAA standards');
        }
    
        if (accessibilityReport.adjustments_made > 0) {
          accessibilityNotes.push(
            `${accessibilityReport.adjustments_made} colors were adjusted for accessibility`
          );
        }
    
        const recommendations: string[] = [];
        if (accessibilityReport.contrast_issues.length > 0) {
          recommendations.push(
            `${accessibilityReport.contrast_issues.length} contrast issues found`
          );
        }
        recommendations.push(...usageRecommendations.slice(0, 3));
    
        return createSuccessResponse(
          'generate_semantic_colors',
          responseData,
          executionTime,
          {
            colorSpaceUsed: 'sRGB',
            accessibilityNotes,
            recommendations: recommendations.slice(0, 5),
          }
        );
      } catch (error) {
        const executionTime = Date.now() - startTime;
        return createErrorResponse(
          'generate_semantic_colors',
          'SEMANTIC_MAPPING_ERROR',
          `Failed to generate semantic colors: ${error instanceof Error ? error.message : 'Unknown error'}`,
          executionTime,
          {
            details: {
              base_palette: params.base_palette,
              context: params.context,
            },
            suggestions: [
              'Check that all colors in the base palette are valid',
              'Ensure the context is supported',
              'Try with different parameters',
            ],
          }
        );
      }
    }
  • TypeScript interface for input parameters including base color palette and optional semantic roles/context.
    export interface GenerateSemanticColorsParams {
      base_palette: string[];
      semantic_roles?: Array<
        | 'primary'
        | 'secondary'
        | 'success'
        | 'warning'
        | 'error'
        | 'info'
        | 'neutral'
      >;
      context?: 'web' | 'mobile' | 'desktop' | 'print';
      ensure_contrast?: boolean;
      accessibility_level?: 'AA' | 'AAA';
    }
  • TypeScript interface for the tool's response structure including semantic mappings and accessibility report.
    export interface GenerateSemanticColorsResponse {
      base_palette: string[];
      context: string;
      semantic_mapping: SemanticColorRole[];
      accessibility_report: {
        overall_compliance: 'AA' | 'AAA' | 'FAIL';
        contrast_issues: Array<{
          role: string;
          color: string;
          issue: string;
          recommendation: string;
        }>;
        adjustments_made: number;
      };
      usage_recommendations: string[];
    }
  • Import statement for the generateSemanticColorsTool.
    import { generateSemanticColorsTool } from './generate-semantic-colors';
  • Registration of the generate_semantic_colors tool in the central tool registry.
    toolRegistry.registerTool(generateSemanticColorsTool);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/keyurgolani/ColorMcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server