seedflip-mcp 0.1.3 → 0.1.5
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.
- package/README.md +18 -1
- package/dist/exporters.d.ts +1 -0
- package/dist/exporters.js +120 -0
- package/dist/index.js +19 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -77,7 +77,7 @@ Get a curated design system by reference, vibe, or style.
|
|
|
77
77
|
|
|
78
78
|
- **Brand references:** "Stripe", "Vercel", "Linear", "GitHub", "Notion", "Supabase", "Spotify", "Framer", "Resend", "Superhuman", "Raycast", "Arc"
|
|
79
79
|
- **Style descriptors:** "dark minimal", "brutalist", "warm editorial", "neon cyberpunk", "elegant luxury"
|
|
80
|
-
- **Export formats:** `tokens` (default), `tailwind`, `css`, `shadcn`
|
|
80
|
+
- **Export formats:** `tokens` (default), `tailwind`, `css`, `shadcn`, `openclaw`
|
|
81
81
|
- **Multiple results:** Set `count: 3` to get top 3 matches
|
|
82
82
|
|
|
83
83
|
```
|
|
@@ -107,6 +107,23 @@ Each seed includes production-ready values for:
|
|
|
107
107
|
- **Depth:** Box shadows
|
|
108
108
|
- **Design brief:** AI-ready prompt describing the full aesthetic
|
|
109
109
|
|
|
110
|
+
## OpenClaw Dashboard Theming
|
|
111
|
+
|
|
112
|
+
SeedFlip includes a ready-made OpenClaw skill. Use the `openclaw` format to get CSS variables mapped directly to OpenClaw's dashboard:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
"theme my dashboard like Stripe" → format: "openclaw"
|
|
116
|
+
"dark cyberpunk dashboard" → format: "openclaw"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
The output includes:
|
|
120
|
+
- **CSS variables** ready to inject into `:root`
|
|
121
|
+
- **themes.json entry** for saving as a named theme
|
|
122
|
+
- **Console snippet** for instant preview
|
|
123
|
+
- **Google Fonts import** for the typography
|
|
124
|
+
|
|
125
|
+
See `SKILL.md` for the full OpenClaw skill definition.
|
|
126
|
+
|
|
110
127
|
## Why
|
|
111
128
|
|
|
112
129
|
Every vibe-coded app looks the same because AI agents don't have design vocabulary. They default to the same zinc palette, the same rounded corners, the same "modern minimalist" output. SeedFlip gives them 100+ curated design directions pulled from real, proven brands.
|
package/dist/exporters.d.ts
CHANGED
|
@@ -8,4 +8,5 @@ import type { DesignSeed } from './search.js';
|
|
|
8
8
|
export declare function formatTokens(seed: DesignSeed): string;
|
|
9
9
|
export declare function formatTailwind(seed: DesignSeed): string;
|
|
10
10
|
export declare function formatCSS(seed: DesignSeed): string;
|
|
11
|
+
export declare function formatOpenClaw(seed: DesignSeed): string;
|
|
11
12
|
export declare function formatShadcn(seed: DesignSeed): string;
|
package/dist/exporters.js
CHANGED
|
@@ -189,6 +189,126 @@ export function formatCSS(seed) {
|
|
|
189
189
|
${seed.aiPromptRules}
|
|
190
190
|
*/`;
|
|
191
191
|
}
|
|
192
|
+
// ── OpenClaw dashboard theme ────────────────────────────────────
|
|
193
|
+
export function formatOpenClaw(seed) {
|
|
194
|
+
const isDark = hexLuminance(seed.bg) < 0.5;
|
|
195
|
+
const headingFF = fontFamily(seed.headingFont);
|
|
196
|
+
const bodyFF = fontFamily(seed.bodyFont);
|
|
197
|
+
// Derive shadow scale from seed's shadow tokens
|
|
198
|
+
const shadowSm = seed.shadowSm;
|
|
199
|
+
const shadowMd = seed.shadow;
|
|
200
|
+
// Scale up for lg/xl
|
|
201
|
+
const shadowLg = shadowMd.replace(/(\d+)px/g, (_, n) => `${Math.round(Number(n) * 1.5)}px`);
|
|
202
|
+
const shadowXl = shadowMd.replace(/(\d+)px/g, (_, n) => `${Math.round(Number(n) * 2.5)}px`);
|
|
203
|
+
// Derive radius scale
|
|
204
|
+
const rSm = seed.radiusSm;
|
|
205
|
+
const rMd = seed.radius;
|
|
206
|
+
const rLg = seed.radiusXl;
|
|
207
|
+
const rXl = `${Math.round(parseFloat(seed.radiusXl) * 1.5)}px`;
|
|
208
|
+
const cssBlock = `:root {
|
|
209
|
+
/* SeedFlip — ${seed.name} */
|
|
210
|
+
/* ${seed.vibe} */
|
|
211
|
+
|
|
212
|
+
/* Colors */
|
|
213
|
+
--bg: ${seed.bg};
|
|
214
|
+
--card: ${seed.surface};
|
|
215
|
+
--bg-elevated: ${seed.surfaceHover};
|
|
216
|
+
--accent: ${seed.accent};
|
|
217
|
+
--primary: ${seed.accent};
|
|
218
|
+
--text: ${seed.text};
|
|
219
|
+
--text-secondary: ${seed.textMuted};
|
|
220
|
+
--muted: ${seed.textMuted};
|
|
221
|
+
--border: ${seed.border};
|
|
222
|
+
|
|
223
|
+
/* Typography */
|
|
224
|
+
--font-body: ${bodyFF};
|
|
225
|
+
--font-heading: ${headingFF};
|
|
226
|
+
--mono: 'JetBrains Mono', 'Fira Code', monospace;
|
|
227
|
+
|
|
228
|
+
/* Shape */
|
|
229
|
+
--radius-sm: ${rSm};
|
|
230
|
+
--radius-md: ${rMd};
|
|
231
|
+
--radius-lg: ${rLg};
|
|
232
|
+
--radius-xl: ${rXl};
|
|
233
|
+
|
|
234
|
+
/* Depth */
|
|
235
|
+
--shadow-sm: ${shadowSm};
|
|
236
|
+
--shadow-md: ${shadowMd};
|
|
237
|
+
--shadow-lg: ${shadowLg};
|
|
238
|
+
--shadow-xl: ${shadowXl};
|
|
239
|
+
}`;
|
|
240
|
+
const themeJson = JSON.stringify({
|
|
241
|
+
name: seed.name,
|
|
242
|
+
vibe: seed.vibe,
|
|
243
|
+
mode: isDark ? 'dark' : 'light',
|
|
244
|
+
bg: seed.bg,
|
|
245
|
+
card: seed.surface,
|
|
246
|
+
'bg-elevated': seed.surfaceHover,
|
|
247
|
+
accent: seed.accent,
|
|
248
|
+
primary: seed.accent,
|
|
249
|
+
text: seed.text,
|
|
250
|
+
'text-secondary': seed.textMuted,
|
|
251
|
+
muted: seed.textMuted,
|
|
252
|
+
border: seed.border,
|
|
253
|
+
'font-body': bodyFF,
|
|
254
|
+
'font-heading': headingFF,
|
|
255
|
+
'radius-sm': rSm,
|
|
256
|
+
'radius-md': rMd,
|
|
257
|
+
'radius-lg': rLg,
|
|
258
|
+
'radius-xl': rXl,
|
|
259
|
+
'shadow-sm': shadowSm,
|
|
260
|
+
'shadow-md': shadowMd,
|
|
261
|
+
'shadow-lg': shadowLg,
|
|
262
|
+
'shadow-xl': shadowXl,
|
|
263
|
+
}, null, 2);
|
|
264
|
+
return `## SeedFlip — ${seed.name} (OpenClaw Theme)
|
|
265
|
+
|
|
266
|
+
**${seed.vibe}**
|
|
267
|
+
Mode: ${isDark ? 'Dark' : 'Light'} | Tags: ${seed.tags.join(', ')}
|
|
268
|
+
|
|
269
|
+
### CSS Variables — paste into your OpenClaw dashboard
|
|
270
|
+
|
|
271
|
+
\`\`\`css
|
|
272
|
+
@import url('${googleFontsUrl(seed)}');
|
|
273
|
+
|
|
274
|
+
${cssBlock}
|
|
275
|
+
\`\`\`
|
|
276
|
+
|
|
277
|
+
### themes.json entry
|
|
278
|
+
|
|
279
|
+
\`\`\`json
|
|
280
|
+
${themeJson}
|
|
281
|
+
\`\`\`
|
|
282
|
+
|
|
283
|
+
### Quick inject (browser console)
|
|
284
|
+
|
|
285
|
+
\`\`\`js
|
|
286
|
+
// Paste this into your browser console to preview the theme instantly
|
|
287
|
+
const s = document.documentElement.style;
|
|
288
|
+
s.setProperty('--bg', '${seed.bg}');
|
|
289
|
+
s.setProperty('--card', '${seed.surface}');
|
|
290
|
+
s.setProperty('--bg-elevated', '${seed.surfaceHover}');
|
|
291
|
+
s.setProperty('--accent', '${seed.accent}');
|
|
292
|
+
s.setProperty('--primary', '${seed.accent}');
|
|
293
|
+
s.setProperty('--text', '${seed.text}');
|
|
294
|
+
s.setProperty('--text-secondary', '${seed.textMuted}');
|
|
295
|
+
s.setProperty('--muted', '${seed.textMuted}');
|
|
296
|
+
s.setProperty('--border', '${seed.border}');
|
|
297
|
+
s.setProperty('--font-body', "${bodyFF}");
|
|
298
|
+
s.setProperty('--font-heading', "${headingFF}");
|
|
299
|
+
s.setProperty('--radius-sm', '${rSm}');
|
|
300
|
+
s.setProperty('--radius-md', '${rMd}');
|
|
301
|
+
s.setProperty('--radius-lg', '${rLg}');
|
|
302
|
+
s.setProperty('--radius-xl', '${rXl}');
|
|
303
|
+
s.setProperty('--shadow-sm', '${shadowSm}');
|
|
304
|
+
s.setProperty('--shadow-md', '${shadowMd}');
|
|
305
|
+
document.body.style.background = '${seed.bg}';
|
|
306
|
+
document.body.style.color = '${seed.text}';
|
|
307
|
+
\`\`\`
|
|
308
|
+
|
|
309
|
+
### Design Brief
|
|
310
|
+
${seed.aiPromptRules}`;
|
|
311
|
+
}
|
|
192
312
|
// ── shadcn/ui theme ─────────────────────────────────────────────
|
|
193
313
|
export function formatShadcn(seed) {
|
|
194
314
|
const bg = hexToHSLString(seed.bg);
|
package/dist/index.js
CHANGED
|
@@ -15,10 +15,20 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
|
15
15
|
import { z } from 'zod';
|
|
16
16
|
import { createRequire } from 'module';
|
|
17
17
|
import { searchSeeds } from './search.js';
|
|
18
|
-
import { formatTokens, formatTailwind, formatCSS, formatShadcn, } from './exporters.js';
|
|
18
|
+
import { formatTokens, formatTailwind, formatCSS, formatShadcn, formatOpenClaw, } from './exporters.js';
|
|
19
19
|
// ── Load seed data ───────────────────────────────────────────────
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
// Dual ESM/CJS: createRequire works in ESM (normal usage).
|
|
21
|
+
// Bare require() is the fallback for CJS (Smithery's esbuild scan)
|
|
22
|
+
// — esbuild statically resolves it and inlines the JSON.
|
|
23
|
+
let seeds;
|
|
24
|
+
try {
|
|
25
|
+
const _require = createRequire(import.meta.url);
|
|
26
|
+
seeds = _require('./seeds-data.json');
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// @ts-ignore — require() available in CJS contexts
|
|
30
|
+
seeds = require('./seeds-data.json');
|
|
31
|
+
}
|
|
22
32
|
// ── Server setup ─────────────────────────────────────────────────
|
|
23
33
|
const server = new McpServer({
|
|
24
34
|
name: 'seedflip',
|
|
@@ -34,15 +44,15 @@ Accepts:
|
|
|
34
44
|
- Seed names: "Nightfall", "Ivory", "Concrete", etc.
|
|
35
45
|
- Or no query for a random curated seed.
|
|
36
46
|
|
|
37
|
-
Returns complete design tokens in your requested format (tokens, tailwind, css, or
|
|
47
|
+
Returns complete design tokens in your requested format (tokens, tailwind, css, shadcn, or openclaw).`, {
|
|
38
48
|
query: z
|
|
39
49
|
.string()
|
|
40
50
|
.optional()
|
|
41
51
|
.describe('What kind of design direction you want. Examples: "Stripe", "dark minimal", "warm editorial", "brutalist", "neon developer tool"'),
|
|
42
52
|
format: z
|
|
43
|
-
.enum(['tokens', 'tailwind', 'css', 'shadcn'])
|
|
53
|
+
.enum(['tokens', 'tailwind', 'css', 'shadcn', 'openclaw'])
|
|
44
54
|
.optional()
|
|
45
|
-
.describe('Output format. "tokens" = readable summary with all values and design brief. "tailwind" = tailwind.config.ts. "css" = CSS custom properties. "shadcn" = shadcn/ui theme globals.css. Defaults to tokens.'),
|
|
55
|
+
.describe('Output format. "tokens" = readable summary with all values and design brief. "tailwind" = tailwind.config.ts. "css" = CSS custom properties. "shadcn" = shadcn/ui theme globals.css. "openclaw" = OpenClaw dashboard theme. Defaults to tokens.'),
|
|
46
56
|
count: z
|
|
47
57
|
.number()
|
|
48
58
|
.optional()
|
|
@@ -62,7 +72,9 @@ Returns complete design tokens in your requested format (tokens, tailwind, css,
|
|
|
62
72
|
? formatCSS
|
|
63
73
|
: format === 'shadcn'
|
|
64
74
|
? formatShadcn
|
|
65
|
-
:
|
|
75
|
+
: format === 'openclaw'
|
|
76
|
+
? formatOpenClaw
|
|
77
|
+
: formatTokens;
|
|
66
78
|
const sections = topSeeds.map((result, i) => {
|
|
67
79
|
const header = limit > 1
|
|
68
80
|
? `### Option ${i + 1}: ${result.seed.name} (score: ${result.score}, matched: ${result.matchReasons.join(', ')})\n\n`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "seedflip-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"mcpName": "io.github.bockenstette1/seedflip",
|
|
5
5
|
"description": "MCP server for SeedFlip — 100+ curated design systems for AI agents. When your agent needs a design direction, it calls SeedFlip instead of guessing.",
|
|
6
6
|
"type": "module",
|