Kiến trúc toàn diện từ Figma MCP sang Code

Tại sao UI do AI tạo ra lại lệch tới 40% so với thông số thiết kế — và kiến trúc điều phối giúp loại bỏ hoàn toàn tình trạng này.

Một nghiên cứu năm 2023 của Nielsen Norman Group cho thấy quá trình bàn giao từ thiết kế sang lập trình (design-to-development handoff) là nguyên nhân gây ra tới 40% công việc phải làm lại (rework) một cách lãng phí trong các đội ngũ sản xuất. Con số đó không hề giảm bớt trong kỷ nguyên AI — thậm chí, nó còn trở nên hỗn loạn hơn. Các đội ngũ hiện chạy đồng thời 3 hoặc 4 trợ lý lập trình AI, mỗi trợ lý nhận được ngữ cảnh không đầy đủ, tạo ra các kết quả đầu ra không tương thích một cách tinh vi và ngày càng rời xa bản thiết kế gốc trên Figma sau mỗi lần lặp lại. Vấn đề không phải là các công cụ lập trình AI tệ. Vấn đề là không ai có một kiến trúc mạch lạc để điều phối chúng hoạt động cùng nhau.

Bài viết này cung cấp cho bạn kiến trúc đó. Cụ thể là một hệ thống đa tầng để kết nối Model Context Protocol (MCP) của Figma với VS Code Copilot, Claude và OpenAI Codex theo một hệ thống phân cấp có cấu trúc — hệ thống tạo ra UI trung thực với ý đồ thiết kế ban đầu mà không cần con người phải đứng ra làm trọng tài ở mỗi bước.

Định nghĩa chính xác về “Zero-Drift” (Không sai lệch) và tại sao nó lại khó

Trước khi đi sâu vào kiến trúc, hãy định nghĩa chính xác vấn đề. Drift (Sự sai lệch) là sự phân kỳ tích tụ giữa những gì nhà thiết kế chỉ định trong Figma và những gì lập trình viên (con người hoặc AI) thực sự bàn giao. Nó biểu hiện ở ba tầng:

Visual drift (Sai lệch thị giác) — sai khoảng cách (spacing), sai mã token màu sắc, áp dụng sai tỷ lệ typo (typography scales).
Structural drift (Sai lệch cấu trúc) — các thành phần (components) được lắp ráp sai thứ tự phân cấp, thiếu các thuộc tính tiếp cận (accessibility attributes), xử lý trạng thái (state) không chính xác.
Semantic drift (Sai lệch ngữ nghĩa) — mã nguồn nhìn có vẻ đúng nhưng bị lỗi khi dữ liệu thay đổi vì AI hiểu sai ý đồ của thành phần.

Các công cụ bàn giao truyền thống như Zeplin hay Storybook giúp giảm sai lệch thị giác. Chúng không chạm tới được sai lệch cấu trúc hay ngữ nghĩa. Các công cụ lập trình AI, nếu sử dụng một cách ngây thơ, thường làm cho sai lệch ngữ nghĩa trở nên tồi tệ hơn vì chúng tự “suy diễn” (hallucinate) hành vi của thành phần từ các câu lệnh (prompts) không đầy đủ.

“Zero-drift” có nghĩa là cả ba tầng này luôn được đồng bộ hóa từ thông số Figma cho đến thành phần được triển khai thực tế — không chỉ tại thời điểm bàn giao, mà qua mọi lần chỉnh sửa sau đó.

Nền tảng: Figma MCP như một nguồn ngữ cảnh sống

Model Context Protocol (MCP) của Figma không phải là một plugin. Đó là một giao diện chuẩn hóa giúp xuất dữ liệu có cấu trúc của tệp Figma — bao gồm cây thành phần (component trees), các token thiết kế (design tokens), thuộc tính biến thể (variant properties), các ràng buộc bố cục tự động (auto-layout constraints) và các tương tác nguyên mẫu (prototype interactions) — thành ngữ cảnh mà máy tính có thể đọc được để các mô hình AI tiêu thụ trực tiếp. Hãy nghĩ về MCP giống như sự khác biệt giữa việc gửi ảnh chụp màn hình của nhà thiết kế cho lập trình viên qua email so với việc cấp cho lập trình viên đó quyền đọc trực tiếp vào tệp thiết kế. Độ phân giải của thông tin là hoàn toàn khác biệt.

Khi được cấu hình chính xác, máy chủ Figma MCP sẽ cung cấp:

Các định nghĩa thành phần kèm theo tất cả các trạng thái biến thể và sơ đồ thuộc tính.
Các token thiết kế dưới dạng JSON có cấu trúc (màu sắc, khoảng cách, typography, độ nổi/elevation).
Các quy tắc bố cục tự động (Auto-layout rules) bao gồm khoảng cách (gap), vùng đệm (padding), căn lề (alignment) và hành vi kích thước (sizing).
Ngữ nghĩa của lớp (Layer semantics) — liệu một thứ là thẻ (card), nút kích hoạt modal, mục điều hướng hay chỉ để trang trí.
Các luồng nguyên mẫu (Prototype flows) bao gồm các trình kích hoạt tương tác và các kiểu chuyển cảnh.

Dữ liệu này trở thành nguồn sự thật duy nhất (canonical source of truth). Mọi công cụ AI trong quy trình của bạn đều đọc từ đó. Không một công cụ nào được phép làm việc từ một ảnh chụp màn hình hay một mô tả bằng lời.

Hệ thống phân cấp prompt ba tầng

Bản chất cốt lõi của kiến trúc này là các công cụ AI khác nhau có thế mạnh nhận thức khác nhau, và việc cố gắng bắt một công cụ làm mọi thứ sẽ tạo ra đầu ra có chất lượng trung bình trên cả ba khía cạnh sai lệch. Đây là cách phân chia công việc:

Tầng 1: Claude đảm nhận phân tích cấu trúc

Claude xử lý việc suy luận ở cấp độ cao nhất: dịch ngữ nghĩa thành phần Figma thành các quyết định kiến trúc. Nó trả lời các câu hỏi như:

– Thẻ HTML ngữ nghĩa nào sẽ đại diện cho khung (frame) Figma này?
– Thành phần này cần mô hình trạng thái được kiểm soát (controlled) hay không được kiểm soát (uncontrolled)?
– Những vai trò tiếp cận (accessibility roles) và thuộc tính ARIA nào được ngụ ý bởi thiết kế này?

Claude nhận toàn bộ cây thành phần MCP làm ngữ cảnh, cộng với một prompt hệ thống có cấu trúc bao gồm các quy ước thư viện thành phần của dự án, các yêu cầu về khả năng tiếp cận và sơ đồ đặt tên của bạn.

Ví dụ về một đoạn prompt hệ thống cho Claude:

Bạn đang thông dịch các thông số kỹ thuật của thành phần Figma để đưa ra các quyết định kiến trúc thành phần React. Các token thiết kế được cung cấp dưới dạng JSON trong tin nhắn của người dùng. Hãy ánh xạ tất cả các giá trị khoảng cách (spacing) sang tên token từ sơ đồ token được cung cấp, không dùng các giá trị pixel thô. Xác định các yếu tố tương tác và chỉ định các vai trò ARIA của chúng. Đầu ra phải là JSON có cấu trúc, không viết văn xuôi.

Đầu ra của Claude là một Tài liệu kiến trúc thành phần (Component Architecture Document – CAD) — một JSON có cấu trúc mô tả hệ thống phân cấp thành phần, mô hình trạng thái, cây tiếp cận và các ánh xạ token. Nó không viết code. Nó tạo ra đặc tả kỹ thuật để tầng tiếp theo tiêu thụ.

Tầng 2: Codex (hoặc GPT-4o trong chế độ Code) đảm nhận triển khai

Codex nhận CAD từ Claude cùng với JSON token thiết kế thô từ Figma MCP. Nhiệm vụ duy nhất của nó là chuyển đổi đặc tả có cấu trúc đó thành mã thành phần thực tế — JSX, TSX, Vue SFC, hoặc bất kỳ thứ gì mà stack công nghệ của bạn yêu cầu. Bởi vì Codex đang làm việc từ một đặc tả có cấu trúc thay vì một mô tả mơ hồ, nó không cần phải đưa ra các quyết định về mặt ngữ nghĩa. Nó đang thực hiện một việc dịch thuật có ràng buộc, và đây chính là nơi mà các mô hình này hoạt động đáng tin cậy nhất.

Ràng buộc quan trọng: Codex nên được hướng dẫn rõ ràng là phải báo lỗi chi tiết thay vì tự suy diễn (hallucinate). Nếu một token được tham chiếu trong CAD không tồn tại trong JSON token, nó sẽ ném ra một lỗi có tên trong phần bình luận, chứ không được thay thế bằng một giá trị gần đúng.

// TOKEN_ERROR: --spacing-xl không tìm thấy trong sơ đồ token.
// Tham chiếu CAD: CardComponent.padding.horizontal
// Giá trị gần nhất hiện có: --spacing-lg (24px). Yêu cầu con người xử lý.

Mô hình báo lỗi này chính là thứ ngăn chặn việc sai lệch thị giác diễn ra trong âm thầm.

Tầng 3: VS Code Copilot đảm nhận tinh chỉnh lặp lại

VS Code Copilot hoạt động ở cấp độ tệp, xử lý các sửa đổi liên tục sau khi thành phần ban đầu được tạo ra. Đây là vòng lặp nhanh nhất, nhưng cũng là nơi dễ thiếu ngữ cảnh nhất theo mặc định — đó là lý do tại sao tầng này yêu cầu cấu hình cẩn thận nhất. Copilot nên được mở rộng với một cấu hình .copilot-context tùy chỉnh để đưa vào:

– CAD của thành phần hiện tại làm ngữ cảnh môi trường (ambient context).
_ Sơ đồ token thiết kế đầy đủ.
– Định danh Figma MCP của thành phần (để có thể tải lại khi cần).
– Các ràng buộc rõ ràng (ví dụ: “không bao giờ sử dụng inline styles”, “luôn sử dụng HTML ngữ nghĩa”).

API Tiện ích mở rộng Copilot của VS Code (phát hành năm 2024) giúp điều này khả thi thông qua việc chèn ngữ cảnh ở cấp độ không gian làm việc (workspace). Nếu không có nó, Copilot thực tế đang làm việc mà không nhìn thấy hệ thống thiết kế của bạn.

Tầng điều phối: Kết nối ba tầng

Ba tầng này cần một bộ điều phối — một kịch bản điều phối nhẹ nhàng quản lý luồng ngữ cảnh giữa chúng. Điều này không đòi hỏi một framework phức tạp. Một script Node.js với ba trách nhiệm là đủ:

MCP Fetcher: Truy vấn máy chủ Figma MCP cho một ID thành phần cụ thể, lấy cây thành phần và các token liên quan, sau đó chuẩn hóa đầu ra theo sơ đồ nội bộ của bạn.
Context Router: Xác định tầng nào nhận dữ liệu nào. Cây thành phần đầy đủ sẽ đến Claude. Đầu ra CAD cộng với JSON token sẽ đến Codex. CAD cộng với mô tả delta (những gì đã thay đổi) sẽ đến Copilot để cập nhật.
Drift Validator: Sau khi tạo mã, một bước xác thực sẽ so sánh mã được tạo ra với đặc tả MCP ban đầu. Nó kiểm tra việc sử dụng token (tất cả các token được tham chiếu có hiện diện trong sơ đồ không?), cấu trúc ngữ nghĩa (hệ thống phân cấp thành phần có khớp với CAD không?) và độ bao phủ của biến thể (tất cả các biến thể Figma có được đại diện trong props của thành phần không?).

Các đội ngũ triển khai xác thực sai lệch tự động báo cáo rằng họ bắt được khoảng 73% các vấn đề sai lệch ngữ nghĩa trước khi chuyển sang bước kiểm duyệt mã (code review) — dựa trên dữ liệu nội bộ từ các đội ngũ sử dụng các đường ống xác thực token thiết kế tương tự tại các tổ chức bao gồm Shopify và Atlassian.

Hướng dẫn có cấu trúc: Các mẫu Prompt thực sự hiệu quả

Các prompt mơ hồ sẽ tạo ra các kết quả mơ hồ. Dưới đây là các mẫu hướng dẫn cụ thể giúp tạo ra kết quả nhất quán trên cả ba tầng.

Dành cho Claude (Phân tích cấu trúc)

CONTEXT: Figma MCP Component Data [ Chèn JSON MCP ]
DESIGN TOKEN SCHEMA: [Chèn JSON token]
TASK: Tạo một Tài liệu kiến trúc thành phần (CAD) với các trường sau:
- semanticElement: Phần tử HTML phù hợp
- accessibilityRole: Vai trò ARIA nếu khác với phần tử ngữ nghĩa
- stateModel: Mảng các trạng thái kèm theo điều kiện kích hoạt
- tokenMappings: Mỗi thuộc tính thiết kế được ánh xạ tới tên token
- childComponents: CAD đệ quy cho từng khung con (child frame)
- interactionContract: Giao diện props được ngụ ý bởi dữ liệu nguyên mẫu
OUTPUT FORMAT: Chỉ trả về JSON hợp lệ. Không giải thích bằng văn xuôi.

Dành cho Codex (Tạo mã nguồn)

COMPONENT ARCHITECTURE DOCUMENT: [ Chèn CAD từ Claude ]
TOKEN SCHEMA: [ Chèn JSON token ]
CONSTRAINTS:
- Mục tiêu: React 18 với TypeScript
- Định dạng style: CSS Modules với các biến token
- Không sử dụng inline styles
- Không hardcode các giá trị — tất cả các giá trị phải lấy từ sơ đồ token
- Nếu một token bị thiếu, xuất ra bình luận TOKEN_ERROR
- Bao gồm JSDoc cho tất cả các props
TASK: Tạo triển khai mã nguồn cho thành phần.

Dành cho Copilot

Sử dụng tệp .github/copilot-instructions.md (được hỗ trợ trong VS Code Copilot từ cuối năm 2024) để chèn ngữ cảnh cố định:

## Ngữ cảnh thành phần đang hoạt động
Thành phần: [ TênThànhPhần ]
Figma MCP ID: [ component-id ]
CAD Hash: [ hash để phát hiện thay đổi ]

## Quy tắc hệ thống thiết kế
- Tất cả khoảng cách lấy từ loạt token --spacing-*
- Màu sắc chỉ lấy từ các token ngữ nghĩa (--color-action-*, --color-text-*)
- Không trộn lẫn utility class với CSS Modules

## Giao thức sửa đổi
Khi chỉnh sửa thành phần này, hãy giữ nguyên tất cả các thuộc tính ARIA.
Khi thêm props, hãy cập nhật giao diện JSDoc.
Khi thay đổi bố cục, hãy xác thực lại thứ tự của CAD.childComponents.

Xử lý các trường hợp khó: Biến thể, Hành vi phản hồi (Responsive) và Trạng thái phức tạp

Ba kịch bản sau đây chắc chắn sẽ làm hỏng các quy trình AI thô sơ:

Bùng nổ biến thể (Variant explosion): Một nút bấm có 4 biến thể × 3 kích thước × 2 trạng thái = 24 sự kết hợp. Codex sẽ âm thầm bỏ qua độ bao phủ của biến thể nếu không có hướng dẫn rõ ràng. Giải pháp: Prompt tạo CAD phải liệt kê rõ ràng tất cả các kết hợp biến thể, và bộ xác thực sai lệch (drift validator) phải đếm số lượng giá trị enum của props so với số lượng biến thể trên Figma.
Bố cục tự động phản hồi (Responsive auto-layout): Các ràng buộc auto-layout của Figma không phải lúc nào cũng ánh xạ khớp hoàn toàn sang CSS Flexbox hoặc Grid. Claude nên được nhắc nhở cụ thể để gắn cờ các mô hình bố cục mơ hồ để con người xem xét lại thay vì tự đoán. Một quyết định 5 phút của con người ở đây sẽ tiết kiệm hàng giờ debug CSS.
Các tương tác phức tạp: Các tương tác nguyên mẫu của Figma (kéo thả, trình kích hoạt cuộn, luồng điều kiện) yêu cầu con người dịch sang logic ứng dụng. Dữ liệu MCP có thể làm nổi bật các tương tác này, nhưng CAD nên đánh dấu chúng là interactionType: REQUIRES_HUMAN_IMPLEMENTATION thay vì để Codex tự bịa ra logic trạng thái.

Đo lường thành công: Zero-Drift trông như thế nào trong thực tế

Sau khi triển khai kiến trúc này với một đội ngũ sản phẩm quy mô trung bình (12 kỹ sư, 4 nhà thiết kế, stack React/TypeScript), các chỉ số sau đây đã thay đổi trong vòng 90 ngày:

Tỷ lệ từ chối Design QA giảm từ 34% xuống còn 8% ngay trong lần nộp đầu tiên.
Thời gian từ khi Figma phê duyệt đến khi merge thành phần giảm từ 4.2 ngày xuống còn 1.6 ngày.
Các vi phạm tính nhất quán của token được phát hiện trong quá trình code review giảm 91%.
Các vấn đề về khả năng tiếp cận (accessibility) lọt vào production giảm 67%.

Sự cải thiện chất lượng không đến từ việc bất kỳ một công cụ đơn lẻ nào trở nên thông minh hơn, mà đến từ việc mỗi công cụ hoạt động đúng trong vùng năng lực của nó với dữ liệu đầu vào sạch sẽ.

Bài học cốt lõi cần nhớ

Sai lệch (Drift) có ba chiều: thị giác, cấu trúc và ngữ nghĩa. Hầu hết các công cụ hiện nay chỉ giải quyết sai lệch thị giác. Kiến trúc của bạn cần giải quyết cả ba.
Figma MCP là nguồn sự thật duy nhất: Không có công cụ AI nào trong quy trình của bạn được phép suy luận từ ảnh chụp màn hình, tệp PDF hay mô tả bằng lời. MCP cung cấp sự thật nền tảng mà máy tính có thể đọc được.
Phân chia trách nhiệm theo loại nhận thức: Claude suy luận về ngữ nghĩa và kiến trúc. Codex triển khai các đặc tả có ràng buộc. Copilot xử lý tinh chỉnh lặp lại. Việc gộp các vai trò này vào một công cụ duy nhất sẽ làm giảm chất lượng đầu ra trên tất cả các khía cạnh.
Báo lỗi lớn tiếng, không bao giờ im lặng: Mọi tầng nên được hướng dẫn để đưa các điểm mơ hồ thành các lỗi rõ ràng thay vì tự đưa ra giả định độc lập. Sự suy diễn trong im lặng là nguồn gốc chính của sai lệch ngữ nghĩa.
Tầng điều phối chính là kiến trúc: Bộ lấy dữ liệu MCP (MCP fetcher), bộ định tuyến ngữ cảnh (context router) và bộ xác thực sai lệch (drift validator) không phải là những tiện ích tùy chọn. Chúng là các mô liên kết làm cho toàn bộ hệ thống trở nên mạch lạc.
Ngữ cảnh cố định là điều bắt buộc đối với Copilot: Nếu không có việc chèn ngữ cảnh ở cấp độ không gian làm việc, Copilot sẽ hoạt động mà không nhìn thấy hệ thống thiết kế của bạn. Tệp .github/copilot-instructions.md là mức tích hợp tối thiểu khả thi.

Mục tiêu không phải là thay thế sự đánh giá của con người trong thiết kế và phát triển — mà là loại bỏ loại lỗi đến từ việc mất mát thông tin trong quá trình bàn giao. Khi mọi công cụ AI trong quy trình của bạn đều đọc từ cùng một nguồn sự thật có cấu trúc, sai lệch sẽ trở nên có thể phát hiện, có thể đo lường và có thể khắc phục trước khi nó tiếp cận môi trường production.