gemini-design-mcp 3.4.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,26 +8,31 @@ export declare const createFrontendSchema: {
8
8
  vibe: z.ZodObject<{
9
9
  name: z.ZodString;
10
10
  description: z.ZodString;
11
+ scale: z.ZodEnum<["refined", "balanced", "zoomed"]>;
11
12
  keywords: z.ZodArray<z.ZodString, "many">;
12
13
  }, "strip", z.ZodTypeAny, {
13
14
  name: string;
14
15
  description: string;
16
+ scale: "refined" | "balanced" | "zoomed";
15
17
  keywords: string[];
16
18
  }, {
17
19
  name: string;
18
20
  description: string;
21
+ scale: "refined" | "balanced" | "zoomed";
19
22
  keywords: string[];
20
23
  }>;
21
24
  }, "strip", z.ZodTypeAny, {
22
25
  vibe: {
23
26
  name: string;
24
27
  description: string;
28
+ scale: "refined" | "balanced" | "zoomed";
25
29
  keywords: string[];
26
30
  };
27
31
  }, {
28
32
  vibe: {
29
33
  name: string;
30
34
  description: string;
35
+ scale: "refined" | "balanced" | "zoomed";
31
36
  keywords: string[];
32
37
  };
33
38
  }>>;
@@ -41,6 +46,7 @@ export declare function createFrontend(params: {
41
46
  vibe: {
42
47
  name: string;
43
48
  description: string;
49
+ scale: "refined" | "balanced" | "zoomed";
44
50
  keywords: string[];
45
51
  };
46
52
  };
@@ -16,10 +16,11 @@ export const createFrontendSchema = {
16
16
  vibe: z.object({
17
17
  name: z.string().describe("Vibe name (e.g., 'Pristine Museum', 'Dark Luxe')"),
18
18
  description: z.string().describe("Rich, evocative description of the mood (2-3 sentences)"),
19
+ scale: z.enum(["refined", "balanced", "zoomed"]).describe("Scale: 'refined' (small, elegant), 'balanced' (standard), 'zoomed' (large elements)"),
19
20
  keywords: z.array(z.string()).describe("Style keywords (e.g., ['minimal', 'whitespace', 'gallery'])"),
20
21
  }).describe("The selected design vibe"),
21
22
  }).optional().describe("Design system with selected vibe. REQUIRED for new projects without existing design. " +
22
- "The calling agent generates 5 vibe options, user selects, then pass the selection here."),
23
+ "Call generate_vibes first, user selects, then pass the selection here."),
23
24
  };
24
25
  export async function createFrontend(params) {
25
26
  const { request, filePath, techStack, context, designSystem } = params;
@@ -27,19 +28,17 @@ export async function createFrontend(params) {
27
28
  let designSystemInstructions = '';
28
29
  if (designSystem?.vibe) {
29
30
  const { vibe } = designSystem;
31
+ const scale = vibe.scale || "balanced";
30
32
  designSystemInstructions = `
31
33
  MANDATORY DESIGN SYSTEM (User Selected Vibe):
32
34
 
33
35
  **Design Vibe: "${vibe.name}"**
34
36
  ${vibe.description}
35
37
 
36
- Keywords to embody: ${vibe.keywords.join(', ')}
38
+ **Scale: ${scale}**
39
+ Keywords: ${vibe.keywords.join(', ')}
37
40
 
38
- Interpret this vibe creatively:
39
- - Choose colors, gradients, and visual styling that embody this atmosphere
40
- - Select a font from Google Fonts that perfectly matches this vibe
41
- - Apply consistent visual language throughout the entire interface
42
- - You have freedom in the specific implementation, but the overall feel MUST match this vibe
41
+ Interpret this vibe creatively — choose colors, typography, and styling that embody this atmosphere.
43
42
  `;
44
43
  }
45
44
  // Build context instructions (ignore empty strings and "null" strings)
@@ -14,6 +14,14 @@ Each vibe should represent a unique visual direction and feeling.
14
14
  Describe the mood, not specific colors - let the designer interpret creatively.
15
15
  Think: "Corporate & Trustworthy" vs "Playful & Vibrant" vs "Dark & Techy"
16
16
 
17
+ IMPORTANT - Each vibe MUST include a SCALE recommendation:
18
+ - "zoomed" = Large elements, big buttons, big text, full-width cards (e.g., kids apps, accessibility-focused)
19
+ - "refined" = Subtle scale, smaller typography, contained elements, elegant proportions (e.g., luxury, Linear.app, Raycast)
20
+ - "balanced" = Standard scale, middle ground
21
+
22
+ The scale is NOT about density (dense vs sparse), it's about the SIZE of elements.
23
+ A luxury watch e-commerce site has refined/small scale. A kids learning platform has zoomed/large scale.
24
+
17
25
  OUTPUT FORMAT (JSON):
18
26
  Return ONLY a valid JSON array with exactly 5 vibes. No markdown, no explanation.
19
27
 
@@ -22,6 +30,7 @@ Return ONLY a valid JSON array with exactly 5 vibes. No markdown, no explanation
22
30
  "emoji": "🏛️",
23
31
  "name": "Vibe Name",
24
32
  "description": "2-3 sentences describing the mood and atmosphere.",
33
+ "scale": "refined" | "balanced" | "zoomed",
25
34
  "keywords": ["keyword1", "keyword2", "keyword3"]
26
35
  }
27
36
  ]`;
@@ -58,7 +67,7 @@ export async function generateVibes(params) {
58
67
  const formattedVibes = vibes.map((vibe, index) => {
59
68
  return `${index + 1}. ${vibe.emoji} "${vibe.name}"
60
69
  ${vibe.description}
61
- Keywords: ${vibe.keywords.join(", ")}`;
70
+ Scale: ${vibe.scale} | Keywords: ${vibe.keywords.join(", ")}`;
62
71
  }).join("\n\n");
63
72
  return {
64
73
  content: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gemini-design-mcp",
3
- "version": "3.4.0",
3
+ "version": "3.5.0",
4
4
  "description": "MCP server that uses Gemini 3 Pro for frontend/design code generation",
5
5
  "main": "build/index.js",
6
6
  "bin": {