Huolala Figma MCP 原理与实践

简介:Huolala Figma MCP(huolala-figma-mcp)是货拉拉自研的将 Figma 设计稿自动转换为高还原度UI代码的 MCP 服务。AI 客户端(如 Cursor、Qorder)调用后可获得包含 index.html、切图、字体等资源的 ZIP 包,再借助 LLM 进一步转换为目标平台代码(HTML、React、Vue、ObjectC、Swift、Kotlin、React Native等)。

  • 还原度高:对冗余图层和控件做了清洗,对红点气泡、系统栏、homebar做了识别

  • 布局能力完备:拥有分散对齐、居中对齐、线形布局、重叠布局、列表识别、文字宽高自动去除识别等,生成的代码可用性高

  • 可扩展:DSL 加工采用处理器注册 ,可按需启用/禁用步骤。此外还能自定义SKILLS,自己定制大模型运行流程。

目前代码已在github开源:github.com/HuolalaTech...

一、背景

1.1 UI编程痛点

一直以来,客户端工程师们需要花费大量精力在重复还原UI视觉稿的工作上,UI开发耗时约占移动端开发总耗时的 1/3。

1)效率痛点:大量重复劳动,开发极慢。按钮、卡片、间距、阴影、圆角... 都要写一遍,复制粘贴改参数,纯体力活,对齐、居中、间距差 1px 都要反复改、刷新、看效果。

2)多端维护:要同时维护开发安卓、iOS、鸿蒙三个端的UI代码。

3)**视觉还原度低。**纯靠眼睛和经验还原设计稿,很难做到 1:1 精准还原,需要花费大量时间走查

1.2 AI技术飞速发展

自2022年底ChatGPT发布后,先后出了Agent、MCP、SKILLS等一系列AI相关的技术,传统的手写UI代码已经无法适应当前AI编程趋势。

二、现有技术方案

目前开发团队主要使用以下方式生成 UI 代码,但都存在明显不足:

方案 转码语言 开源 UI 还原度 自动切图 原理 缺点
figma插件+低代码平台 支持H5,rn等web语言,不支持kotlin、object c等原生客户端语言 不开源 较高 figma插件提取UI信息后规则转码,然后低代码平台编辑和预览 生成的代码灵活性和语义化差
图片输入+多模态大模型 H5,RN、Object C、swift、kotlin等 多模态大模型有些开源,有些不开源 比较低 基本不可用 原始设计稿 利用多模态大模型识别图片中的UI细节 还原度最差,无法精确还原设计稿属性
开源figma contex mcp H5,RN、Object C、swift、kotlin等 开源 复杂图层切图大小不对情况 正常情况: 调用restful api后,提取关键信息和相同属性合并后送大模型转码 没有融合多模态大模型,对循环组件分组处理不是很好
figma官方MCP H5,RN、Object C、swift、kotlin等 不开源 部分case切图不对: 原始设计稿: 会同时获取设计稿的json信息+设计稿截图调用多模态大模型后融合 复杂页面还原度差
百度自研F2C H5,RN、安卓、iOS、鸿蒙、小程序等 不开源 支持 自研F2C插件+自研大模型+自研大模型 不对外开放

产品定位:UI 开发日常必备工具

为了解决上述方案的不足,我们自研了 Huolala Figma MCP,核心目标:

  1. 高 UI 还原度:通过独家图层清洗和精简算法,在复杂/不合理设计稿上实现更高还原度

  2. 准确切图:自研icon 识别算法,能同时导出 2x、3x 多倍切图,满足多个平台场景

  3. 便捷使用:一键安装到 Cursor,无需手动配置,SSO 登录即用

  4. 高扩展性:提供prompts模板、SKILLS,可开箱即用,也可自由组装定制

  5. 多语言支持:支持 React、Vue、Objective-C、Kotlin、React Native 等

三、Huolala Figma MCP 原理

3.1 MCP整体架构

主要功能模块:

  • 用户输入参数提取。分析用户输入的提示词,将用户输入的figma url等关键参数提取后转换成MCP工具需要的参数。

  • 获取 Figma 数据:通过 Figma REST API 获取设计稿的节点信息、图层结构、样式属性等原始数据

  • **AI服务:**通过独家算法对 Figma 图层进行清洗,去除冗余图层,处理不合理的 autolayout,优化图层结构。同时自动识别设计稿中的ICON,去重后导出。

  • 智能IDE转码:根据用户需求,动态加载对应的 Skills(如循环组件调整、转码风格适配等)。最后将 HTML、切图等产物交给智能IDE,结合用户提示词生成目标语言代码

3.1.1 MCP功能

类型 名称 说明
Tool figma_to_code_package 获取 Figma 设计稿数据,返回包含 HTML、切图资源、字体、多模态数据的 ZIP 包
Prompt ui2code_with_skills 预设的提示词模板,一键触发完整转码流程,适合全线界面或者UI模块
Prompt get_figma_property 获取 Figma 节点的属性,用于局部UI界面修改
Resource Skills 列表 内置多种 Skills资源,支持按需加载。

3.1.2 产物说明

Huolala Figma MCP 返回的 ZIP 包包含以下产物:

产物 说明
index.html 通过规则转码生成的精确还原页面,可作为大模型转码的参考基准。包含图层、布局、样式等完整信息
vlm_result.json 多模态大模型对设计稿的理解结果
images_2 / images_3 2x 和 3x 倍率的切图资源,语义化命名
fonts 导出的字体文件

3.1.3 Skills 机制

Huolala Figma MCP 内置多种 Skills,实现功能的可扩展性:

  • adjust-list-group:循环组件调整,自动识别列表/网格布局

  • 多语言转码:支持 React、Vue、Objective-C、Swift、Kotlin、React Native 等

用户还可自定义 Skills,满足个性化需求,如图片压缩、上传 CDN 等。

3.2 AI算法服务

算法服务涉及技术点众多,下面选取部分重点算法进行解析:

3.2.1 列表识别与合并

列表识别一直是UI组件识别难度,循环组件样式多样,传统的规则算法只能处理简单的场景,复杂的场景会存在case by case问题,逐个适配成本高。因此我们采用多模态大模型识别循环组件。

组件后,然后编写skills让智能IDE自动处理层级。

1)多模态大模型提示词:

识别UI结构 ,输出前端可用json结构,要求包含x,y,width,height,type,text(如有),children(如有)字段

JSON 复制代码
{              "type": "tabBar",
                "x": 0,
                "y": 768,
                "width": 375,
                "height": 44,
                "backgroundColor": "#FFFFFF",
                "items": [
                    {
                        "text": "首页",
                        "icon": "home",
                        "x": 28,
                        "y": 770,
                        "width": 40,
                        "height": 40
                    },
                    {
                        "text": "订单",
                        "icon": "order",
                        "x": 108,
                        "y": 770,
                        "width": 40,
                        "height": 40
                    },
                    {
                        "text": "消息",
                        "icon": "msg",
                        "x": 188,
                        "y": 770,
                        "width": 40,
                        "height": 40
                    },
                    {
                        "text": "我的",
                        "icon": "my",
                        "x": 268,
                        "y": 770,
                        "width": 40,
                        "height": 40
                    }]
     }

2)列表skills编写

对横向、纵向、网格排布的列表分别进行识别与处理。

Markdown 复制代码
---
name: adjust-list-layout
description: 根据vlm_result.json识别 JSON 文件中的列表控件,并调整 HTML 代码中的布局结构,使其更符合语义化和响应式布局要求。
---

# 调整列表布局层级

根据 JSON 布局描述文件识别列表控件类型(横向、纵向、网格),并自动调整 HTML 代码中的布局结构。

## When to Use

- 当需要将设计稿转换后的 HTML 代码进行布局优化时
- 当 HTML 中的列表元素层级结构不合理时
- 当需要将平铺的元素转换为语义化的列表、表格或 Flex 布局时
- 当存在 `vlm_result.json` 等布局描述文件,需要据此调整代码结构时

## Instructions

### 参数说明

| 参数名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `json_file` | string | `vlm_result.json` | JSON 布局描述文件路径 |
| `code_file` | string | `index.html` | 需要调整的 HTML 代码文件路径 |

### 前置条件

- 检查 `${json_file}` 是否存在(可选,不存在则跳过 JSON 相关步骤)

### 第 1 步:识别列表控件

从 `${json_file}` 中找出列表控件,判断条件如下:

| 列表类型 | 判断条件 |
|----------|----------|
| 横向列表 | 子元素的 y 和 height 一致;或者两组交错 y 和 height 一致的元素交错排列 |
| 纵向列表 | 子元素的 width 和 x 坐标都一致;或者局部连续的元素 width 和 x 坐标相同,且子元素的结构相似 |
| 网格列表 | 子元素 height 相同,存在多行,同行 y 坐标相同 |

### 第 2 步:控件匹配

遍历列表控件,在 `${code_file}` 中进行控件匹配:

- **横向列表匹配**:找到 `${code_file}` 中一个容器,其包含的文本大部分都能与横向列表元素匹配成功
- **纵向列表匹配**:找到 `${code_file}` 中一个容器,其包含的文本大部分都能与纵向列表元素匹配成功
- **网格列表匹配**:将网格拆成多行,逐行文本匹配,每行中的文字大部分都能匹配成功

### 第 3 步:调整布局

将原始 `${code_file}` 备份为 `${code_file}.backup`,然后修改 `${code_file}` 调整布局。

#### 3.1 横向列表调整

| 子类型 | 处理方式 |
|--------|----------|
| 交错列表 | 将 `${code_file}` 中相邻的交错元素用一个新容器进行包裹和分组,变成标准横向列表 |
| 带分割线列表 | 如果横向列表元素中包含垂直分割线,且分割线和其他元素间隔分布,则将分割线提取出来,剩余的元素包裹容器宽度进行等分,内部元素垂直居中 |

#### 3.2 局部纵向列表调整

如果 `${code_file}` 中的局部纵向列表元素未被包裹,用一个新容器将这些元素包裹起来。

#### 3.3 网格列表调整

> ⚠️ **必须按顺序判断**

如果 `${code_file}` 中每一行的文本匹配到的容器都不一样,将这些容器合并成一个大的网格布局:

| 判断顺序 | 类型 | 条件 | 处理方式 |
|----------|------|------|----------|
| 1 | 表格 | 行列元素间距都 ≤ 2px,且同一列的元素宽度相同(误差 ≤ 1px) | 不要用flex-wrap: wrap布局,改成 `<table>` 结构 |
| 2 | 折行布局 | 不满足表格条件(不同列元素宽度不一致) | 采用 `display: flex; flex-wrap: wrap`,并计算设置 `row-gap` 和 `column-gap` |

3)列表识别与合并结果截图

3.2.2 红点和气泡识别

在前面列表识别的时候,我们经常碰到一些红点和气泡,做循环组件分组的时候需要单独剔除。

红点气泡样式很多,而且部分红点非常小,通用多模态模型对于小尺寸的红点和气泡组件识别准确率不高,因此我们专门训练了一个基于yolo的小模型做红点气泡识别。

采用目标检测模型YOLO v8,自己标注数据和人工合成数据集,训练了红点和气泡识别模型,识别准确率>90%,识别案例如下:

3.2.3 icon识别

原始设计稿中的icon是由多个矢量图形组合而成,开发期望导出成一个图片后放到代码中。目前的多模态大模型,开源的figma contex mcp和官方的figma mcp都无法精确的导出这种需要合并的icon,我们采用控件属性+几何特征+元素排布的方式,对icon进行识别与合并。算法流程如下:

在打包阶段,我们还会对图标进行像素级相似度检测,去除重复的图标图片。

3.2.4 图层清洗

两个大小一模一样的图标叠加一起

设计稿中会出现一些开发不可见,但是存在于设计稿中,导出时候存在的冗余元素或者图层。比如上图中圆形头像下面就盖住了一个大小一模一样的图层。

我们采用投影方法,得到一个控件树不可见图层的层级序号矩阵。如果一个控件的区域的投影矩阵值的最小值大于当前层级序号,表示被完全覆盖,可以删除。投影时候还要考虑透明、圆角的情况。

3.2.5 布局计算

设计稿中存在很多布局方式不合理的情况,例如图中8个原始应该是一个分组,内部用折行或者网格布局实现,但设计稿中是多个行布局组成,因此需要进行布局识别,根据不同局部类型重新计算布局。

类别 方案选型 图示
网格类别 多行相同列表合并成网格网格布局计算
红点气泡 绝对定位
底部tab栏 绝对定位
分散对齐识别 flex布局
宽度自适应容器识别 flex布局
文本宽高去除 要结合文本渲染宽度、容器宽度、是否多行、左右间距等综合去除
分割线处理 分割线分组,转成bottom_line属性
左中布局 flex+绝对定位布局
重叠布局 flex+绝对定位

四、Huolala Figma MCP 实践

4.1 同类方案对比

原始设计稿 多模态大模型 开源figma context mcp figma官方MCP 货拉拉figma MCP
首页 1图标不对 2.顶部背景渐变色不对 3.输入卸货地下单渐变色边框不对 1.气泡布局处理不对 2.冷藏车的布局不对 3.顶部渐变背景和标题排布错乱 4.对多层嵌套的边框处理不好 1.右上角图标不对 2 啥车都有都便宜没有加粗字体 3选车地址图标不对 4.我的图标拉伸了 叫车流程字体不对,其他基本还原

4.2 具体业务实践

目前已经在货拉拉企业、司机、专送、多拉等多个业务中落地使用。下面以其中一个业务的应用举例说明:

场景 手写耗时 Huolala Figma MCP 耗时 提示词
新页面 0.5d 2min /user-mdap-u2c/ui2code_with_skills url链接 2x,3x 转码风格:这个半屏弹窗用 EBaseBottomModalView 实现,代码入口:点击"车长车型"单元格后弹出这个页面
原有页面上新增一种卡片样式 30min 2min /user-mdap-u2c/get_figma_property url链接 生成一种新的单元格样式,切图同时导出2x,3x,参考当前目录的资源存放方法 2. 当用户点击了零担拼车后, 将价格样式从EConfirmOrderOptionPriceCell换成前面的新样式。 3. 用户点击新样式上的"查看【快车】等更多价格"单元格样式切回EConfirmOrderOptionPriceCell
界面上新增一个按钮 10min 1min 1.修改viewWithCommodityModel,当model.title=="零担拼车" 时候,进入零担拼车显示模式 ,初始化gotoUserBtn按钮, 2 按钮的UI细节通过/user-mdap-u2c/get_figma_property url 链接 获取

实际业务中,不同的项目、语言风格差异很大,除了huolala figma mcp提供的能力,业务还会自己定制skills、commands、rules的方式来适配自己的业务。

4.3 多语言转码

货拉拉figma mcp 支持多种语言转码,目前在H5、Object- C、swift、Kotlin、React Native语言上均有落地经验,还原度都比较高。

目标语言 原始设计稿 转码结果
H5
Objective-C
Swift
Kotlin
React Native

五、小结

5.1 成果总结

Huolala Figma MCP 结合 Cursor 后功能大幅提升,不仅可应用于新增页面,也可应用于局部 UI 改版,在写 UI 代码的同时能顺带生成逻辑代码。

Huolala Figma MCP 补齐了三方 MCP 复杂设计稿 UI 还原差和切图不对问题,还能自定义 Skills 实现个性化功能。

5.2 经验与不足

  • 新增页面:提示词相对简单,提效明显,界面总体还原度高

  • 局部改版:UI 占比小,逻辑部分占比更重,提示词会相对复杂,微调会更多

  • 工程适配:图片存放路径、组件实现偏好等需要手动指定,增加提示词复杂度

5.3 后续优化方向

  1. 自动分析工程组件:能够自动分析用户工程的组件实现和使用偏好,减少指定基类、图片存放路径的提示词

  2. 界面自动定位:能自动分析用户界面,定位到某个设计稿界面对应的类实现

  3. Skills 扩展:支持更多个性化需求,如图片压缩、上传 CDN 等

  4. 视觉还原度计算:自动计算生成代码与设计稿的还原度差异,实现UI代码自动生成和自动验收闭环


参考资料

相关推荐
劈星斩月1 小时前
从“画图”到“算数”:GPU如何站上AI时代的C位
人工智能·gpu
hongyucai1 小时前
OPENPi模型源码AI解读
人工智能
果丁智能1 小时前
物联网智能锁赋能网约房与民宿:身份核验、远程授权的技术落地与成本优化方案
人工智能·物联网·智能家居
科技每日热闻1 小时前
618 AI显示器选购指南!爱攻AGON AI定制芯片电竞显示器AG277UX,适合哪些玩家?
人工智能·科技·游戏·计算机外设
初圣魔门首席弟子1 小时前
AI Agent 核心原理:工具调用(Function Calling)完整工作流程详解
前端·数据库·人工智能
MacroZheng1 小时前
横空出世!Claude Code画图神器来了,比Visio快10倍!
java·人工智能·后端
FII工业富联科技服务1 小时前
“可持续灯塔工厂”技术解密:AI+IoT如何落地端到端碳管理闭环
大数据·人工智能·物联网·ai·数据分析·自动化·制造
AniShort1 小时前
AniShort携3D世界+3D导演台王炸组合AI短剧协作平台亮相2026横店AI短剧大会 近亿元融资赋能短剧工业化
人工智能·microsoft·3d
大山佬1 小时前
ARM 汇编优化:NEON 指令与内存访问的实战技巧
人工智能