UI预设MCP服务器
MCP服务器,用于根据可交换的设计预设系统自动配置React UI。与您的Monaco IDE集成,以强制所有业务构建的设计一致性。支持glassmorphism、neumorphism、霓虹赛博朋克、野兽派、柔和粉彩、极光渐变等——一个用于前端开发的婴儿Canva。
建筑
ui-preset-mcp-server/
├── src/
│ ├── index.ts # Server entry point (stdio + HTTP transports)
│ ├── constants.ts # Shared constants and paths
│ ├── types/
│ │ └── index.ts # All TypeScript types (tokens, presets, corrections)
│ ├── schemas/
│ │ └── toolSchemas.ts # Zod validation schemas for every tool
│ ├── services/
│ │ ├── presetLoader.ts # Reads + deep-merges preset files with caching
│ │ ├── sessionState.ts # Active preset session management + overrides
│ │ ├── uiCorrector.ts # AST correction engine (10 correction passes)
│ │ ├── tokenResolver.ts # Resolves {{token:x.y.z}} placeholders + export generators
│ │ └── fileWatcher.ts # Hot-reload presets on disk changes (dev mode)
│ ├── tools/
│ │ ├── presetTools.ts # load_preset, swap_template, list_presets, diff_presets, scaffold_preset
│ │ ├── correctionTools.ts # autocorrect_component, validate_ui, generate_component, generate_tokens, apply_token_overrides
│ │ └── styleTools.ts # generate_color_palette, suggest_style, list_style_categories
│ ├── routes/
│ │ └── uiRoutes.ts # REST API + Design Studio dashboard (GET /, /api/*)
│ └── ui/
│ └── dashboardHtml.ts # Embedded Design Studio HTML (9 sections)
└── presets/
├── glassmorphic-base/ # Core preset (all others inherit from this)
│ ├── manifest.json
│ ├── tokens.json # Full design token system
│ ├── components/
│ │ ├── shell/Sidebar.json
│ │ ├── surfaces/GlassCard.json
│ │ ├── settings/OptionGroup.json
│ │ └── navigation/NavGroup.json
│ └── layouts/DashboardLayout.json
├── client-fintech/ # Blue accent, dense spacing
├── client-saas/ # Purple accent, wider cards
├── client-dark-minimal/ # Monochrome, reduced glass intensity
├── style-neumorphic/ # Light soft UI, extruded shadows, no blur
├── style-neon-cyberpunk/ # Pitch-dark + neon accents, monospace type
├── style-brutalist/ # Raw B&W, zero radius, heavy typography
├── style-soft-pastel/ # Lavender background, pastel accents, generous rounding
└── style-aurora/ # Deep navy + iridescent aurora purple/teal accentsMCP工具
预设管理
| 工具 | 说明 |
|---|---|
load_preset | 按ID激活预设捆绑包 |
swap_template | 热插拔活动预设,无需重新启动 |
list_presets | 列出所有可用的预设 |
diff_presets | 比较两个预设之间的令牌/组件差异 |
scaffold_preset | 从父目录生成新的预设目录 |
get_session_state | 检查活动预设和运行时覆盖 |
修正与生成
| 工具 | 说明 |
|---|---|
autocorrect_component | 根据活动预设自动修复React组件 |
validate_ui | 验证组件并获得一致性得分(0-100) |
generate_component | 从预设模板生成组件 |
generate_tokens | 将令牌导出为CSS变量、JS、JSON或Tailwind配置 |
apply_token_overrides | 活动预设上的层运行时令牌覆盖 |
风格和颜色
| 工具 | 说明 |
|---|---|
generate_color_palette | 使用颜色理论(互补、三重、类比、单色、分割互补、四重)从种子十六进制颜色生成和谐的调色板 |
suggest_style | 从自然语言美学描述中获取预设+令牌覆盖建议(例如“黑暗黑客终端”、“友好的粉彩儿童应用程序”) |
list_style_categories | 列出所有可用的设计样式类别,包括原则、描述和相关预设 |
样式类别
| 类别 | 预设 | 描述 |
|---|---|---|
| 玻璃形态 | glassmorphic-base, client-* | 磨砂玻璃,背景模糊,深色基材 |
| 新形态 | style-neumorphic | 柔和的挤压形状,双阴影,浅色背景 |
| 霓虹赛博朋克 | style-neon-cyberpunk | 漆黑+生动的霓虹色调,单空间类型 |
| 粗野主义 | style-brutalist | 原始黑白,零边界半径,最大对比度 |
| 软色粉笔 | style-soft-pastel | 薰衣草底色,柔和色调,圆润大方 |
| 极光梯度 | style-aurora | 深海军蓝+虹彩极光紫色/青色 |
安装
npm install
npm run build用法
stdio(用于摩纳哥IDE集成)
node dist/index.jsHTTP服务器
TRANSPORT=http PORT=3001 node dist/index.js热重载开发模式
WATCH_PRESETS=true node dist/index.js设计工作室UI
在HTTP模式下运行时,a 设计工作室 迷你用户界面在 GET /.
UI部分
| 第节 | 说明 |
|---|---|
| 仪表盘 | 带有组件/布局统计信息和调色板预览的活动预设概述 |
| 预设 | 浏览卡中的所有预设;单击“加载”立即激活任何预设 |
| 样式库 | 视觉风格类别浏览器——每张卡片显示设计原则和颜色预览条;一键加载任何样式 |
| 调色板 | 调色板生成器——选择一个种子颜色,选择一个颜色和谐规则,并生成一个带有阴影和语义别名的完整调色板;直接应用于活动预设 |
| 代币 | 视觉标记查看器——色板、排版比例、模糊、间距、动画 |
| 验证 | 粘贴React代码并获得问题列表的一致性得分(0-100) |
| 正确 | 根据活动预设自动纠正React代码;选择上下文和模式 |
| 出口 | 生成CSS自定义属性、TypeScript const、JSON或Tailwind配置 |
| 脚手架 | 窗体,用于从任何父级创建具有可选强调色的新预设 |
UI通过REST API与服务器通信,该API也可在 /api/*.
REST API(HTTP模式)
| 端点 | 方法 | 描述 | |||
|---|---|---|---|---|---|
/api/presets | GET | 列出所有带有元数据的预设 | |||
/api/presets/load | POST | 加载并激活预设 { preset_id } | |||
/api/session | GET | 获取活动预设和覆盖状态 | |||
/api/tokens | GET | 获取活动预设的有效令牌 | |||
/api/tokens/export | POST | 导出令牌 `{ format: 'css' | 'js' | 'json' | 'tailwind' }` |
/api/tokens/overrides | POST | 应用运行时令牌覆盖 { overrides } | |||
/api/validate | POST | 验证React代码 { code, include_suggestions } | |||
/api/correct | POST | 自动更正React代码 { code, context, dry_run } | |||
/api/scaffold | POST | 创建新预设 { preset_id, name, description, extends, accent_color } | |||
/api/styles | GET | 列出所有带有元数据的设计样式类别 | |||
/api/palette | POST | 生成调色板 { seed_color, harmony, include_shades } |
典型工作流程
1. list_style_categories() # Discover available aesthetics
2. suggest_style("dark sci-fi dashboard") # Get preset recommendation
3. load_preset("style-neon-cyberpunk") # Activate chosen style
4. const palette = generate_color_palette({ seed_color: "#00ff88", harmony: "triadic" })
5. apply_token_overrides({
overrides: {
colors: {
accent: {
primary: palette.semantic.accent,
highlight: palette.semantic.highlight
}
}
}
})
6. autocorrect_component(code) # Fix component on save
7. validate_ui(code) # Get conformance score
8. generate_tokens({ format: "css" }) # Export CSS variables
9. scaffold_preset({ preset_id: "client-x", extends: "style-aurora" })创建新预设
新预设只需要覆盖与父级不同的令牌:
// presets/client-newbrand/tokens.json
{
"colors": {
"accent": {
"primary": "#e11d48"
}
}
}// presets/client-newbrand/manifest.json
{
"id": "client-newbrand",
"name": "New Brand",
"extends": "glassmorphic-base",
"version": "1.0.0",
"styleCategory": "glassmorphic",
"designPrinciples": ["backdrop-blur", "dark-substrate"],
"tags": ["custom"],
"components": [],
"layouts": []
}所有基础标记、组件和布局都会自动继承。
更正规则
校正引擎对每个组件执行这些规则:
- 没有硬编码的颜色 (错误):所有颜色值都必须使用CSS自定义属性
- 无硬编码间距 (警告):间距应使用标记比例
- 强化玻璃表面 (错误):表面元素必须具有
backdropFilter+半透明bg - 没有硬编码字体系列 (错误):字体系列必须使用排版标记
- 使用动画令牌 (警告):过渡必须使用动画标记
- 强制使用侧边栏组件 (错误):侧栏内容必须使用NavGroup/NavItem
- 强制设置组件 (错误):设置UI必须使用OptionGroup/OptionRow
- a11y img alt (警告):图像必须具有alt属性
- a11y图标按钮标签 (警告):图标按钮需要aria标签
摩纳哥一体化
在您的摩纳哥编辑中,致电 autocorrect_component 在保存事件上:
editor.onDidSaveModel(async () => {
const code = editor.getValue();
const result = await mcpClient.callTool('autocorrect_component', {
code,
context: 'auto',
dry_run: false
});
if (result.corrected !== code) {
editor.setValue(result.corrected);
}
});