基于MCP协议的Figma设计系统与AI开发工具集成实践
1. 项目概述:一个连接设计与开发的“翻译官”
最近在折腾一个内部设计系统的协作流程,发现一个挺普遍但又很磨人的问题:设计师在Figma里更新了组件库,开发同学得手动去Figma里看更新日志、截图、再对照着改代码,一来一回沟通成本巨大,还容易出错。直到我发现了这个叫sso-ss/figma-unified-mcp的项目,它像是一个专门为Figma和开发工具之间架设的“高速翻译官”。
简单来说,figma-unified-mcp是一个实现了Model Context Protocol (MCP)标准的服务器。它的核心使命,是把你在Figma文件里的设计元素——比如颜色、文本样式、组件变量——实时地、结构化地“翻译”成AI助手(比如Claude Desktop、Cursor等)能够理解和操作的数据。这意味着,你不再需要手动在Figma和代码编辑器之间来回切换,AI助手可以直接“看到”你的设计稿,并根据你的指令,帮你生成对应的代码、检查设计一致性,甚至自动更新设计令牌。
这个项目解决的不是一个简单的“导出”问题,而是一个“双向同步与智能理解”的问题。它适合所有在团队协作中,被“设计-开发”鸿沟困扰的开发者、设计师和工程效能工程师。无论你是想自动化生成设计系统的代码片段,还是希望AI能基于最新的设计稿进行代码审查,这个工具都能提供一个非常优雅的底层连接方案。接下来,我就结合自己把它接入现有工作流的全过程,拆解一下它的核心思路、实操细节以及那些容易踩坑的地方。
2. 核心思路与架构拆解:为什么是MCP?
在深入代码之前,理解它为什么选择MCP协议至关重要。这决定了整个项目的设计哲学和扩展能力。
2.1 MCP协议:AI时代的“通用插座”
你可以把MCP想象成AI助手世界里的“USB-C接口”。在过去,每个AI工具(Claude, Cursor, Windsurf)想连接外部数据源(如Figma, GitHub, 数据库),都需要开发专属的、不兼容的插件。MCP的目标就是统一这个混乱的局面。它定义了一套标准的协议,让AI助手(客户端)可以通过统一的方式,去发现、调用不同数据源(服务器)提供的“工具”(Tools)和“资源”(Resources)。
对于figma-unified-mcp而言,它的角色就是一个MCP服务器。它利用Figma的官方API,将Figma这个设计工具的能力,“包装”成一系列标准的MCP工具和资源,暴露给支持MCP的AI客户端。这样做有几个显著优势:
- 一次开发,多处使用:只要AI客户端支持MCP(如Claude Desktop已原生支持),就无需再为每个客户端单独开发Figma插件。
- 能力标准化:通过MCP定义的
list_tools,call_tool,read_resource等标准接口,AI客户端能以一致的方式与Figma交互,降低了学习和集成成本。 - 关注点分离:服务器专心处理与Figma API的通信、数据转换和业务逻辑;客户端专心处理与用户的交互和AI推理。架构清晰,易于维护。
2.2 项目架构与核心模块
这个项目的代码结构清晰地反映了其MCP服务器的定位:
figma-unified-mcp/ ├── src/ │ ├── server/ # MCP服务器核心实现 │ ├── figma/ # Figma API客户端封装与数据处理 │ ├── tools/ # 具体的MCP“工具”实现 │ └── resources/ # 具体的MCP“资源”定义 ├── scripts/ # 构建与开发脚本 └── config/ # 配置文件示例核心工作流可以概括为:
- 启动服务器:加载配置(主要是Figma个人访问令牌和文件ID)。
- 注册能力:向连接的AI客户端宣告:“我这里有这些工具(如
get_file_components获取组件列表)和资源(如figma://colors颜色样式)可用”。 - 处理请求:当AI客户端用户发出类似“请根据主按钮的样式生成React代码”的指令时,客户端会调用服务器提供的相应工具。
- 调用Figma API:服务器在后台使用你的令牌,向Figma API发起请求,获取最新的设计数据。
- 转换与响应:将Figma返回的原始JSON数据,过滤、清洗、转换成结构更清晰、对AI更友好的格式(如只提取关键的
name,fills等属性),最后通过MCP协议返回给AI客户端。
这个过程中,最核心的价值在于数据转换层。Figma API返回的数据非常详尽,但也包含大量UI渲染相关的元数据。figma-unified-mcp的核心工作之一就是做“减法”和“重塑”,提取出设计系统中对开发有直接意义的语义化信息。
3. 从零开始的配置与部署实战
理论讲完了,我们来看怎么把它用起来。整个过程可以分为获取凭证、本地配置、连接AI客户端三步。
3.1 第一步:获取Figma访问令牌(Token)
这是所有操作的钥匙。没有它,服务器无法访问你的Figma文件。
- 登录Figma网站,点击右上角头像,进入「Settings」。
- 在左侧菜单找到「Account」,向下滚动到「Personal access tokens」部分。
- 点击「Create new token」,给它起个名字,比如
MCP-Server-Dev。权限(Scopes)选择需要的最小集,通常file_read是必须的,如果你需要它未来能写回注释等,可以加上write_comment,但出于安全,初期只读即可。 - 点击创建后,立即复制生成的令牌字符串。它只显示一次,丢失后需要重新生成。
安全警告:这个令牌等同于你的Figma账户密码。绝对不要将它提交到公开的Git仓库或分享给他人。我们接下来会把它放在本地配置文件中。
3.2 第二步:本地运行与配置服务器
项目通常提供多种运行方式,这里以最直接的本地Node.js运行和Docker运行为例。
方案A:使用Node.js直接运行(适合开发调试)
# 1. 克隆项目 git clone https://github.com/sso-ss/figma-unified-mcp.git cd figma-unified-mcp # 2. 安装依赖 (确保你的Node.js版本 >= 18) npm install # 3. 准备配置文件 cp config/default.example.json config/default.json # 编辑 config/default.json配置文件default.json是关键:
{ "figma": { "accessToken": "你的Figma个人访问令牌", "fileIds": { "你的设计系统文件别名": "Figma文件ID" } }, "server": { "host": "127.0.0.1", "port": 3000 } }- 如何获取
fileIds:打开你的Figma设计文件,浏览器地址栏的URL格式是https://www.figma.com/file/FILE_KEY/file-name?node-id=...。其中FILE_KEY就是文件ID。你可以为它设置一个易读的别名,如"design_system": "abcDeFgHiJkL"。 - host和port:保持默认的
127.0.0.1和3000即可,这是服务器监听的地址。
# 4. 启动服务器 npm start # 或用于开发,监听文件变化 npm run dev如果看到类似MCP Server running on http://127.0.0.1:3000的日志,说明服务器启动成功。
方案B:使用Docker运行(适合生产或隔离环境)
# 1. 创建一个配置目录并生成配置文件 mkdir -p ~/figma-mcp-config cd ~/figma-mcp-config # 2. 创建配置文件,内容同上方的 default.json nano config.json # 3. 使用Docker运行 docker run -d \ --name figma-mcp \ -p 3000:3000 \ -v $(pwd)/config.json:/app/config/default.json \ ghcr.io/sso-ss/figma-unified-mcp:latestDocker方式将配置通过卷(-v)挂载到容器内,避免了将敏感令牌构建进镜像,更安全方便。
3.3 第三步:连接AI客户端(以Claude Desktop为例)
目前对MCP支持最友好的是Claude Desktop。
- 打开Claude Desktop应用,点击左上角「Claude」菜单,选择「Settings」,进入「Developer」设置页。
- 找到「MCP Servers」配置部分。这里可以添加自定义的MCP服务器。
- 点击「Add New Server」,配置如下:
Name: 任意,如
Figma Design System。Command: 如果你用Node直接运行,且
npm start在后台,这里其实Claude会自己处理。更通用的方式是使用npx命令。但更推荐下面这种配置。实际上,对于已启动的HTTP服务器:MCP也支持直接连接一个已经启动的HTTP/SSE服务器。在配置中,你可以使用
"url": "http://127.0.0.1:3000/sse"的方式。不过,具体需要查看figma-unified-mcp的文档,看它暴露的是Stdio模式还是HTTP/SSE端点。对于本项目:更常见的MCP连接方式是通过标准输入输出(stdio)。你可以在Claude的配置中使用一个启动脚本。创建一个Shell脚本(如
start_figma_mcp.sh):#!/bin/bash cd /path/to/your/figma-unified-mcp npm start然后在Claude的MCP配置中,Command填写这个脚本的绝对路径。
- 保存配置并重启Claude Desktop。
重启后,在Claude的对话界面,你应该能看到一个小的插件图标被激活,或者你可以直接问Claude:“你现在能访问Figma设计系统吗?” 如果配置成功,Claude会回复它已连接上Figma服务器,并可以列出可用的工具。
4. 核心功能深度解析与使用场景
连接成功只是开始,理解服务器提供了哪些“工具”和“资源”,才能发挥最大威力。根据代码和MCP的特性,我们可以推断并实践其核心功能。
4.1 核心工具(Tools)详解
工具是AI可以主动调用的函数。在Claude中,你可以通过“你能对Figma做什么?”来触发它列出所有工具。
get_file_info(获取文件信息)- 作用:获取指定Figma文件的基本元数据,如文件名、最后修改时间、包含的页面等。
- AI调用场景:“我们目前在用哪个Figma文件?”、“设计系统文件最近有更新吗?”
- 背后逻辑:服务器调用Figma API的
GET /v1/files/:key端点,返回精简后的文件信息,帮助AI建立上下文。
get_file_components(获取组件列表)- 作用:提取文件中所有发布的组件(Component)和组件集(Component Set)。
- AI调用场景:“把我们的按钮组件都列出来”、“设计系统里有多少个输入框组件?”
- 数据转换要点:这是价值所在。原始API返回的组件信息包含大量节点数据。此工具会过滤只保留关键信息:组件名称、描述(如果有)、关键属性(如变体属性
Variant),并可能生成一个唯一的引用ID。这极大减少了AI处理的噪音。
get_file_styles(获取样式列表)- 作用:获取文件中定义的颜色、文本、效果等样式。
- AI调用场景:“我们的主色调和辅助色是什么?”、“标题H1的字体样式是怎样的?”
- 实操心得:样式是设计令牌(Design Tokens)的直接来源。这个工具的输出,是自动化生成CSS变量或Theme对象最直接的依据。AI可以基于此生成
:root { --primary: #007bff; }或const colors = { primary: '#007bff' }。
get_component_details(获取组件详情)- 作用:根据组件ID,获取该组件的详细构成信息,包括其图层结构、尺寸、填充色、边框、文本内容等。
- AI调用场景:“把Primary Button的尺寸、圆角、内边距和文字内容告诉我”、“这个卡片的阴影效果参数是多少?”
- 深度解析:这是最复杂的工具之一。它可能递归地获取组件实例的节点树,并将Figma的绝对坐标、混合模式等设计属性,转换为对开发更友好的相对值(如间距、字体层级)。例如,它可能会计算出按钮内部文字距离边框的
padding,而不是文字的绝对x, y坐标。
4.2 核心资源(Resources)详解
资源是AI可以读取的静态数据URI。你可以理解为一些预定义的数据查询端点。
figma://colors(颜色资源)- 作用:提供一个持续更新的颜色样式列表流。
- 使用方式:AI客户端可以“订阅”这个资源。当Figma中的颜色样式发生变化,服务器可以通过SSE(Server-Sent Events)主动推送更新给AI(如果协议支持)。这为实现“设计变更实时同步到开发环境”提供了可能。
- 场景想象:设计师在Figma里调整了品牌色,几分钟后,AI助手在代码评审中就能提示:“这个
#oldColor已被新的#newBrandColor取代,建议更新。”
figma://text_styles(文本样式资源)- 作用:与颜色资源类似,但专注于文本样式(字体、字号、行高、字重等)。
- 开发对接:这是确保产品视觉一致性的关键。AI可以读取这些资源,来检查代码中的
font-family、font-size是否与设计规范匹配。
4.3 高级使用场景串联
单独的工具已经有用,但将它们串联起来,才能体现AI的智能。
场景一:自动化生成组件代码你可以对AI说:“请根据Figma设计系统中名为Button/Primary的组件,生成一个React函数组件,要求包含TypeScript类型定义,并使用Tailwind CSS实现样式。” AI的工作流将是:
- 调用
get_file_components找到Button/Primary及其ID。 - 调用
get_component_details获取该按钮的尺寸、颜色、文字、圆角等细节。 - 结合
get_file_styles将颜色值映射为对应的CSS变量或Tailwind色彩类。 - 综合以上信息,组装出符合要求的React代码。
场景二:设计走查与代码审查在代码评审时,AI可以主动工作:“请检查当前React组件中所有按钮的样式,是否与Figma设计系统v2.1文件中的规范一致。” AI会:
- 解析当前代码文件,提取所有按钮元素的样式属性。
- 从Figma服务器获取最新的按钮组件样式规范。
- 进行比对,并生成报告:“发现3处不一致:提交按钮的背景色应为
blue-600,当前为blue-500;取消按钮的边框宽度应为2px,当前缺失...”
场景三:设计令牌同步这是更工程化的场景。可以建立一个自动化脚本或CI/CD流程,定期通过figma-unified-mcp服务器(或直接调用其封装逻辑)获取figma://colors和figma://text_styles资源,并将其转换为JSON文件,然后通过脚本自动生成对应平台的代码(如iOS的UIColor扩展、Android的colors.xml、Web的tokens.css)。figma-unified-mcp作为MCP服务器,其数据转换逻辑可以被复用,即使不在AI对话场景中。
5. 实操中的常见问题、排查与优化
在实际集成过程中,你肯定会遇到各种问题。下面是我踩过坑后总结的排查清单和优化建议。
5.1 连接与权限问题排查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| Claude提示“无法连接MCP服务器”或“未找到工具” | 1. 服务器未启动 2. Claude配置命令错误 3. 网络/端口冲突 | 1.检查进程:在终端运行lsof -i:3000或netstat -ano | findstr :3000,看端口是否被占用,进程是否运行。2.检查日志:查看服务器启动终端的日志,是否有错误输出(如Token无效)。 3.简化测试:先用 curl http://127.0.0.1:3000/health(如果服务器暴露了健康检查端点) 或直接运行配置的Command脚本,看能否独立运行。 |
服务器日志显示401 Unauthorized | Figma个人访问令牌无效或权限不足 | 1.确认令牌:在Figma设置中检查令牌是否已启用,是否包含file_read权限。2.重置令牌:最直接的方法是去Figma设置里撤销旧令牌,生成一个新令牌,更新配置文件。 3.检查文件权限:确保该令牌所属的账户有权限访问 config.json中配置的fileIds。 |
| AI能连接但获取数据为空或报错 | 1. Figma文件ID错误 2. 文件内无对应内容(如无发布组件) 3. API速率限制 | 1.核对File ID:再次从浏览器地址栏确认文件KEY,并确保在Figma中,所需的组件和样式已经通过‘发布’按钮发布到团队库。MCP服务器读取的是已发布的库资源,而非未发布的本地组件。 2.查看原始API:用令牌直接调用Figma API测试: curl -H 'X-Figma-Token: YOUR_TOKEN' 'https://api.figma.com/v1/files/FILE_KEY',看能否返回数据。3.处理限流:Figma API有调用频率限制。如果请求频繁失败,需要在服务器代码中增加重试机制和延迟。 figma-unified-mcp项目可能已经内置了简单的缓存,但对于高频使用,你可能需要自己增强。 |
5.2 性能优化与高级配置
启用数据缓存:频繁调用Figma API会触发限流,且速度慢。理想的
figma-unified-mcp实现应该包含缓存层。检查项目配置,看是否有缓存设置。例如,可以配置一个内存或Redis缓存,将文件信息、组件列表等TTL(生存时间)较长的数据缓存起来(如5-10分钟),而不是每次AI请求都访问Figma API。处理大型设计文件:如果设计系统文件非常庞大,一次性获取所有组件或样式可能超时或返回数据过大。需要优化工具的实现,支持分页(Pagination)或增量获取。例如,
get_file_components工具可以接受page和limit参数。自定义工具扩展:MCP服务器的强大之处在于可扩展性。如果你有特殊需求,比如想获取特定页面的所有画板,或者计算两个组件的间距规则,你可以仿照
src/tools/下的模式,创建自己的工具。例如,创建一个calculate_spacing_tokens工具,专门分析设计稿中的间距规律并输出成8px倍数的尺度。多文件与别名管理:在
config.json的fileIds里,你可以配置多个文件。确保你的工具实现能根据传入的参数(如fileAlias)来切换不同的文件上下文。这样,AI就可以在不同项目的设计文件之间切换。
5.3 安全最佳实践
令牌隔离:永远不要在客户端代码或公开配置中硬编码Figma令牌。在服务器端配置中,使用环境变量或安全的密钥管理服务(如AWS Secrets Manager, HashiCorp Vault)来注入令牌。
# 启动时使用环境变量 FIGMA_ACCESS_TOKEN=your_token_here npm start然后在代码中通过
process.env.FIGMA_ACCESS_TOKEN读取。网络隔离:将
figma-unified-mcp服务器部署在内网,或仅限本地访问(127.0.0.1)。如果Claude Desktop在本地,那么服务器运行在本地是最安全的。避免将服务器暴露在公网。最小权限原则:为MCP服务器创建的Figma令牌,只授予它完成工作所必需的最小权限(如
file_read)。不要授予write_*权限,除非你明确需要AI执行修改操作。
6. 与其他方案对比及未来展望
在遇到figma-unified-mcp之前,团队可能尝试过其他集成方式:
- 手动导出/同步:设计师导出JSON或使用
style-dictionary等工具手动触发。问题在于非实时、易遗漏、流程断裂。 - Figma插件+自定义脚本:编写Figma插件监听变更,调用webhook通知后端服务。这种方式更直接,但开发维护成本高,且与AI生态结合较弱。
- 直接调用Figma API:在CI/CD中写脚本直接拉取数据。这解决了自动化问题,但缺少一个“智能中间层”来理解设计数据的语义,并将其适配到AI的交互模式。
figma-unified-mcp的价值在于,它站在了MCP这个新兴标准的肩膀上,专注于做好一件事:成为Figma数据通往AI世界的一座标准化、结构化的桥梁。它可能不是功能最全的,但它的设计理念决定了其更好的兼容性和进化潜力。
从实际体验来看,这个项目目前可能还处于比较早期的阶段,工具的丰富度、错误处理的健壮性、性能优化等方面都有很大的打磨空间。但这正是开源项目的魅力所在。你可以基于它,深度定制符合自己团队工作流的工具,比如增加一个generate_icon_sprite工具,自动将Figma中的图标组件打包成SVG雪碧图并生成React组件;或者创建一个audit_design_tokens工具,对比代码中的样式值与Figma规范,生成差异报告。
我个人认为,随着MCP协议的普及和AI编程助手的深度集成,这类“专用数据源MCP服务器”会像雨后春笋一样出现。figma-unified-mcp为设计-开发工作流自动化提供了一个非常清晰的范本。它的终极目标,是让设计师和开发者共享同一套“设计事实来源”,并通过AI这个“智能代理”,无缝地弥合两个领域之间的鸿沟,把我们从繁琐的同步和核对工作中彻底解放出来。
