一个模型上下文协议(MCP)服务器,通过赋予AI助手直接访问权限来创建、修改和测试设计系统中的UI组件,从而增强Flutter Widgetbook的开发体验。
这是实验性的,不应在生产应用或设计系统中使用
正在进行中
Widgetbook MCP 服务器弥合了AI助手与Flutter Widgetbook项目之间的差距,实现了强大的新工作流程,包括:
widgetbook.list_widgets):列出项目中所有可用的小部件widgetbook.get_widget_details):获取特定小部件的详细信息,包括属性和用例widgetbook.get_widget_use_cases):获取小部件的所有现有用例widgetbook.generate_use_case_code):生成新的WidgetbookUseCase代码片段widgetbook.modify_widget_use_case):修改现有用例属性widgetbook.run_use_case_test):执行特定用例的测试widgetbook.generate_screenshot):捕获用例的视觉快照// 待定
git clone https://github.com/mastersam07/widgetbook_mcp_server.git
cd widgetbook_mcp_server
dart pub get
dart compile exe bin/widgetbook_mcp_server.dart -o widgetbook-mcp-server
添加到您的MCP客户端配置(例如Cursor):
{
"mcpServers": {
"widgetbook": {
"command": "path/to/compiled/widgetbook-mcp-server",
"args": ["--project-path", "/path/to/your/flutter/project"]
}
}
}
添加到您的MCP客户端配置(例如Cursor):
{
"mcpServers": {
"widgetbook": {
"command": "dart",
"args": [
"run",
"path/to/widgetbook-mcp-server/bin/widgetbook-mcp-server.dart",
"--project-path",
"/path/to/your/flutter/project",
]
}
}
}
widgetbook.list_widgets列出Widgetbook项目中所有可用的小部件。
参数:无
返回值:
[
{
"name": "ProductCard",
"description": "用于显示产品信息的卡片组件"
}
]
widgetbook.get_widget_details获取特定小部件的详细信息。
参数:
widget_name(字符串,必需):小部件的唯一名称返回值:
{
"name": "ProductCard",
"description": "用于显示产品信息的卡片组件",
"properties": [
{
"name": "title",
"type": "String",
"defaultValue": "产品标题"
}
],
"use_cases": [
{
"name": "default",
"description": "默认的产品卡片",
"fileName": "product_card.dart"
}
]
}
widgetbook.generate_use_case_code生成一个新的WidgetbookUseCase代码片段。
参数:
widget_name(字符串,必需):小部件的名称property_values(对象,必需):属性名称到值的映射返回值:
{
"file_path": "lib/widgetbooks/product_card.dart",
"generated_code": "WidgetbookUseCase(\n name: 'dark_theme',\n builder: (context) {\n return ProductCard(\n title: '暗色主题产品',\n );\n },\n),"
}
widgetbook.generate_screenshot捕获特定用例的截图。
参数:
widget_name(字符串,必需):小部件的名称use_case_name(字符串,必需):用例的名称返回值:
{
"use_case_name": "dark_theme",
"image_data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJ...",
"file_path": ".widgetbook/screenshots/ProductCard_dark_theme.png"
}
widgetbook://project-info提供当前Widgetbook项目的相关信息。
widgetbook://config返回当前服务器配置和功能。
import 'package:flutter/material.dart';
import 'package:widgetbook/widgetbook.dart';
import '../widgets/product_card.dart';
WidgetbookComponent productCardComponent() {
return WidgetbookComponent(
name: 'ProductCard',
useCases: [
WidgetbookUseCase(
name: 'Default',
builder: (context) => ProductCard(
title: context.knobs.string(
label: '标题',
initialValue: '示例产品',
),
price: context.knobs.double.slider(
label: '价格',
initialValue: 29.99,
min: 0,
max: 1000,
),
),
),
WidgetbookUseCase(
name: 'Dark Theme',
builder: (context) => ProductCard(
title: '暗色主题产品',
price: 49.99,
isDarkMode: true,
),
),
],
);
}
人类:列出我项目中的所有小部件
AI:我将检查您的Widgetbook项目以查找可用的小部件。
[使用widgetbook.list_widgets]
找到项目中的3个小部件:
- ProductCard:用于显示产品信息的卡片组件
- UserProfile:用户资料展示组件
- NavigationButton:可复用的导航按钮组件
人类:给我展示ProductCard小部件的详细信息
AI:[使用widgetbook.get_widget_details,widget_name: "ProductCard"]
ProductCard小部件的详细信息:
描述:用于显示产品信息的卡片组件
属性:4
用例:2
属性:
- title (String):示例产品
- price (double):29.99
- imageUrl (String):https://example.com/image.jpg
- isDarkMode (bool):false
用例:
- Default:默认的产品卡片配置
- Dark Theme:具有暗色主题样式的卡片
人类:为ProductCard生成一个新的用例,标题为“高级产品”,价格为99.99
AI:[使用widgetbook.generate_use_case_code]
为ProductCard生成的用例代码:
文件:lib/widgetbooks/product_card.dart
代码:
```dart
WidgetbookUseCase(
name: 'title_高级产品_price_99.99',
builder: (context) {
final title = '高级产品';
final price = 99.99;
return ProductCard(
title: title,
price: price,
);
},
),
人类:运行ProductCard默认用例的测试
AI:[使用widgetbook.run_use_case_test]
“Default”(默认)用例的测试结果:
状态:通过
详情:所有测试均成功通过。
人类:生成ProductCard暗色主题用例的截图
AI:[使用widgetbook.generate_screenshot]
为“Dark Theme”(暗色主题)生成的截图:
文件:.widgetbook/screenshots/ProductCard_Dark Theme.png
图像数据长度:15847个字符(base64)
您可以解码base64数据以查看截图。
# 运行所有测试
dart test
# 运行特定测试文件
dart test test/unit/services/widgetbook_analyzer_test.dart
# 运行集成测试
dart test test/integration/
# 构建可执行文件
dart compile exe bin/widgetbook_mcp_server.dart -o widgetbook-mcp-server
# 为不同平台构建
dart compile exe bin/widgetbook_mcp_server.dart -o widgetbook-mcp-server-linux
dart compile exe bin/widgetbook_mcp_server.dart -o widgetbook-mcp-server.exe
设置日志级别以获取更详细的信息:
widgetbook-mcp-server --log-level FINE --project-path ./example_project
确保提供的路径存在并且包含一个包含pubspec.yaml的Flutter项目。
验证pubspec.yaml是否存在于项目根目录。
检查小部件是否在Widgetbook文件中正确定义,并使用WidgetbookComponent。
确保服务器对项目目录具有读写权限。
.widgetbook/screenshots/以避免重新生成启用详细日志以调试问题:
# 最大详细程度
widgetbook-mcp-server --log-level FINEST
# 查看特定操作
widgetbook-mcp-server --log-level FINE | grep "WidgetbookAnalyzer"
dart pub getdart testdart compile exe bin/widgetbook_mcp_server.dart此项目采用MIT许可证——详见LICENSE文件。