Проблема передачи дизайн-системы (Design Handoff) из Figma в кодовую базу исторически сопровождается рассинхронизацией. Дизайнеры обновляют цвета или типографику, а инженеры вынуждены вручную переносить эти изменения в CSS-переменные или конфигурацию сборщика.
С появлением Model Context Protocol (MCP) и релизом Tailwind CSS v4, который перешел на нативный CSS-first подход (конфигурация базируется на CSS-переменных и директиве @theme вместо JavaScript-файла tailwind.config.js), этот процесс трансформируется в полностью автоматизированный конвейер. Архитектура решения включает кастомный MCP-сервер, который подключается к Figma REST API, извлекает актуальные Design Tokens (цвета, тени, радиусы, шрифтовые шкалы) и векторные стили, конвертируя их в семантические переменные формата Tailwind v4.
AI-агент выступает в роли интеллектуального компилятора: он опрашивает узлы Figma через MCP-инструмент, мапит дизайн-переменные на CSS Custom Properties и автоматически обновляет файл app/globals.css в Next.js проекте, сохраняя строгую типизацию React Server Components.
Пайплайн данных движется от облачного Figma REST API через локальный MCP-сервер напрямую в контекст AI-агента, который генерирует декларативные CSS-правила.
Атомарные значения дизайна (цвета, шрифты, отступы), представленные в платформонезависимом формате, обеспечивающие консистентность интерфейса во всех клиентских средах. Современная версия утилитного CSS-фреймворка, использующая CSS-first архитектуру, директивы @theme и нативные CSS-переменные вместо JavaScript-конфигурации. Открытый протокол двунаправленного RPC-взаимодействия между LLM-агентом и изолированными источниками данных или внешними API.[Figma Cloud] -> (REST API: /v1/files/:id/variables) -> [Figma MCP Server]
|
v
[AI Agent (Claude/GPT)] <- ToolCall(fetch_design_tokens) <----+
|
v
[Генерация CSS-first конфигурации] -> @theme { --color-primary: #3b82f6; }
|
v
[File System (Next.js)] -> Запись в app/globals.cssMCP-инструмент обращается к эндпоинту Figma API и скачивает сырые коллекции переменных и режимов (Light/Dark).
Сервер обходит граф ссылок переменных, конвертирует цветовые каналы (RGBA 0..1 → HEX/OKLCH) и устраняет циклические зависимости.
LLM-агент принимает отфильтрованный словарь (DTO) и сопоставляет имена переменных с дизайн-системой и соглашениями Tailwind.
Агент перезаписывает globals.css, внедряя директиву @theme с валидными CSS-переменными без деградации кэша сборки.
Каким образом архитектурно наиболее эффективно передавать дизайн-токены из Figma API в контекст LLM-агента для генерации стилей Tailwind CSS v4?
@media (prefers-color-scheme: dark) или .dark классы.Ниже приведен пример реализации MCP-инструмента, извлекающего переменные из Figma REST API и возвращающего их в стандартизированном JSON для агента.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
const server = new McpServer({ name: "FigmaTokensMCP", version: "1.0.0" });
const FIGMA_API_TOKEN = process.env.FIGMA_PERSONAL_ACCESS_TOKEN;
/**
* Вспомогательная функция для конвертации цвета из формата Figma (0-1 RGBA) в HEX.
*/
function rgbaToHex(r: number, g: number, b: number, a: number): string {
const toHex = (c: number) => Math.round(c * 255).toString(16).padStart(2, '0');
const hex = `#${toHex(r)}${toHex(g)}${toHex(b)}`;
return a < 1 ? `${hex}${toHex(a)}` : hex;
}
server.tool(
"fetch_figma_tokens",
"Извлекает актуальные Design Tokens из указанного файла Figma",
{
fileKey: z.string().describe("Уникальный идентификатор файла Figma (из URL)"),
},
async ({ fileKey }) => {
if (!FIGMA_API_TOKEN) {
return { content: [{ type: "text", text: "Error: FIGMA_PERSONAL_ACCESS_TOKEN не задан." }], isError: true };
}
try {
// Вызов Figma REST API для получения локальных переменных
const response = await fetch(`https://api.figma.com/v1/files/${fileKey}/variables/local`, {
headers: { 'X-Figma-Token': FIGMA_API_TOKEN }
});
if (!response.ok) throw new Error(`Figma API returned ${response.status}`);
const data = await response.json();
const variables = data.meta.variables;
// Формирование словаря токенов, понятного для генерации Tailwind v4 CSS
const tokens: Record<string, string> = {};
for (const key in variables) {
const v = variables[key];
if (v.resolvedType === 'COLOR') {
// Формируем имя CSS-переменной, например: --color-primary-500
const cssVarName = `--color-${v.name.replace(/\//g, '-').toLowerCase()}`;
const colorVal = v.valuesByMode[Object.keys(v.valuesByMode)[0]]; // Дефолтный режим
if (typeof colorVal === 'object' && colorVal !== null && 'r' in colorVal) {
tokens[cssVarName] = rgbaToHex(colorVal.r, colorVal.g, colorVal.b, colorVal.a);
}
}
}
// Возвращаем агенту нормализованный словарь токенов
return {
content: [{ type: "text", text: JSON.stringify(tokens, null, 2) }]
};
} catch (error) {
return {
content: [{ type: "text", text: `Figma API Error: ${(error as Error).message}` }],
isError: true
};
}
}
);При парсинге токенов Figma обнаружена цепочка алиасов: `button.primary.bg` ссылается на `color.brand.500`, который ссылается на `primitive.blue.600` со значением `#2563eb`. Как MCP-инструмент и агент должны транслировать этот токен в Tailwind CSS v4?
Не используйте статические Node ID (например, 12:34) для извлечения компонентов. Дизайнеры часто пересоздают слои и фреймы. Вместо этого инструмент должен опираться на Figma Variables и семантические коллекции токенов, которые обладают устойчивыми GUID и именами.
В Figma переменные могут ссылаться друг на друга (например, Button-Bg → Blue-500). Если MCP-сервер не разрешает (resolve) эти ссылки до базовых значений, агент сгенерирует невалидный CSS (--color-button-bg: {VariableID}).
AI-модели на базе устаревших обучающих датасетов склонны генерировать файл tailwind.config.js. В системном промпте агента необходимо строго специфицировать использование Tailwind CSS v4, где токены внедряются через @theme { ... } в корневой файл app/globals.css.