Figma MCPがある時代にデザインシステムのコンポーネントを使ってFigmaを書くべき理由

## はじめに

最近、Model Context Protocol（MCP）が活発に議論され、2000を超えるサービスでMCPサーバーが構築されています。MCPとは、Claude等のLLMがNotion、Figmaといった外部サービスに直接アクセスできるようにするためのプロトコルです。MCPについての詳細は以下の記事が参考になります：

- [Model Context Protocol（MCP）とは何か](https://zenn.dev/cloud_ace/articles/model-context-protocol)
- [Model Context Protocol入門](https://zenn.dev/yamada_quantum/articles/465c4993465053)

その中でも特に注目したいのがFigma対応です。従来のLLMを使ったUI実装では、UIのスクリーンショットをLLMに渡すといった方法が使われてきましたが、MCPの登場により、LLMが直接Figmaにアクセスしてデザインを確認できるようになりました。これはコンテキストの面でも大きな進化で、階層構造やgap/padding/marginなどをより正確に再現できるようになります。

最近では、以下の記事が注目を集めています：

https://zenn.dev/ubie_dev/articles/f927aaff02d618

この記事では、自社のデザインシステムに関するコンテキストをLLMに提供することで、LLMが自社のデザインシステムを使ったコーディング能力が格段に向上したと報告されています。

## 個人開発者にもMCP×Figmaは有効か？

ここで一つの疑問が浮かびました。この記事の本質は「Figmaで使われているコンポーネントと対応するデザインシステムのコンポーネントを特定し、そのコンポーネントに渡すpropsを特定できる」点にあると注目しました。

個人開発者の多くは独自のデザインシステムを持っておらず、Material UI（MUI）やChakra UIなどのライブラリを使うことがほとんどです。このような開発者も同様の恩恵を受けることができるのでしょうか？

私は可能だと考えます。MUIなどの一般的なデザインシステムではコンポーネントのFigmaファイルが公開されています：

https://www.figma.com/community/file/912837788133317724

そこで、MUIのFigmaコンポーネントを用いてデザインし、そのデザインをMCPを通じてLLMに提供すれば、企業の事例と同様の効果が得られるのではないかと考え、実験を行ってみました。

## 実験方法

以下の二つのアプローチで比較実験を行いました：

1. Figmaのスクリーンショットを使ってUIを再現させる
2. Figma MCPを使ってUIを再現させる

どちらもMUIのコンポーネントを使って構築したFigmaデザインを用いました。


MUIのコンポーネントを使わず構築したfigmaでの実験もするべきですが、時間の制約上、今回は含めていません。そのうち追加実験を行って記事を更新する予定です。

## 結果

### Figmaデザイン（オリジナル）
![Figmaオリジナルデザイン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/fa7a9d07-bcea-48de-8804-0e2a541e23a7.png)

### 実験のプロセス

まず、基本的なNext.jsプロジェクトを作成しました：
![Nextプロジェクト作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/cb3ceb38-1adc-4772-91bf-4559ae768c90.png)

次に、MUIを導入しました：
![MUI導入](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/04af5a83-a20b-4b37-9f3d-fe39f3d3512c.png)

### スクリーンショットベースの実装結果

Cursorに画像を渡して生成した結果：
![スクショでの実装プロセス1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/bed3f1ed-4ebe-43f5-a31a-9400c227e10e.png)
![スクショでの実装プロセス2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/9815b7b1-cd9a-4d4a-bfdf-86a9699e83ba.png)
![スクショでの実装プロセス3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/1e8f8c4a-6838-468c-9c10-62a80300ccb7.png)
![スクショでの実装プロセス4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/7cf4c34d-07df-40db-abfb-01c2ddb9825c.png)

画像の渡し方による影響はありますが、細部では様々な差異が生じました。意図したものとは異なるコンポーネントが使われていたり、本来使うべきコンポーネントが使われていなかったりする例が見られました。例えば、必須ラベルやファイルアップロード部分のデザインが異なります：

![スクショでの違い1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/dc3cf265-105c-45f6-9a07-baf134906de4.png)
![スクショでの違い2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/28c29c85-66a2-4505-bdd8-a5a9b64ad9d1.png)

### Figma MCPを用いた実装結果

続いて、CursorにFigmaを直接読み込ませて作成しました：
![MCP実装プロセス1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/dfdbe2ea-d493-4df2-a164-8372dd93b5f3.png)
![MCP実装プロセス2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/ee0603be-e80e-474f-b4ac-823d0ab05e88.png)
![MCP実装プロセス3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/b89817d0-e4c2-4bd9-809d-acaff64e79d4.png)
![MCP実装プロセス4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/928a6034-9337-46ae-a206-ff7089ad94a3.png)

かなりの改善が見られました。**注目すべき点は、Figmaで使っていたMUIのコンポーネントと同じコンポーネントが正確に使われている点です**。

Figmaで複数のコンポーネントを組み合わせて作成した複合コンポーネントも、正しくコンポーネントを組み合わせて実装できています（テキストが日本語化されていますが、機能的には問題ありません）：

![複合コンポーネントの実装](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/04ed44e7-631c-4fcc-b3ac-d6b661574101.png)

ファイルアップロードのデザインも正確に再現されています：

![ファイルアップロードの実装](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/fd5bd6f6-733d-4575-a4f1-6d1ae98320a7.png)

## Props指定の課題

コンポーネント自体は正しく選択されましたが、渡されているpropsが若干異なる点が課題として残りました（例：size="small"やTypographyのvariantなど）。そこで、追加の指示を与えてみました：

![追加指示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/516e6c28-e68a-4574-8ad5-21bef7d0fd0e.png)

ある程度は正しく修正されましたが、まだ改善の余地がありました。特に`sx`プロパティの使用が目立ちました。MUIでは`size="small"`のように標準propsを使うべきところを、`sx`で`fontSize`を直接指定するなどの実装が見られました。デザインの統一性を保つためには、不必要な`sx`の使用は避けたいところです。

Figmaの公式MUIコンポーネントでは、以下の画像のようにpropsを渡すような操作感でデザインを修正できます：

![Figma上でのprops設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/17ea36d6-3430-4566-bccc-620609c55191.png)

## MCPで注入されるデータの調査

Figma MCPでどのようなデータが注入されるのかを調査しました：

![MCPデータ構造](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/1e294b94-8a4c-452a-a143-8f198c3db7cc.png)

MUIの場合、階層の`name`部分がコンポーネント名になっています。これが正しいコンポーネントの使用を可能にしているようです。

しかし、Figma上でprops的に渡している設定は`textStyle: style_0KBETQ`のような変数として置かれ、それがJSON内の`global_values`として定義されています：

![global_values](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/5ab42bc6-295e-490f-ad79-0d2ba1adc56e.png)

## 改善の試み

`sx`を使わないようにというヒントだけを与え、新しいチャットで再チャレンジしました：

![改善の指示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/5b9db892-0456-4fbf-8aeb-0a4c7236d9b6.png)

結果：

![改善結果1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/3f348937-3468-44df-8eb9-16cdbda66771.png)
![改善結果2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/3ced43ed-bd4a-4bd8-9f7d-92dda40b4a36.png)
![改善結果3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/dcc1afec-4b01-47f7-b769-88d454a2660b.png)

一部改善されました。特に、Typographyに渡す`body1`などのvariantは正しく適用されるようになりました。しかし、SelectBoxに与える`size="small"`などのpropsはまだ適用されていませんでした：

![SelectBox比較1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/b4a741e9-664c-468d-b522-c963e8ba9562.png)
![SelectBox比較2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287608/7312e818-a9e2-498d-beb7-6171f506f13c.png)

## 結論と考察

実験の結果、MUIのFigmaコンポーネントを使って構築したFigmaデザインを読み込ませることで、かなりの精度でMUIを使ったUI構築が可能であることが確認できました。特にコンポーネントの選択においては非常に高い精度を示しました。

ただし、propsの完全な再現にはまだ改善の余地があります。injectされるデータにprops名まで含まれるようにできれば、より完璧なUI再現が可能になるでしょう。

これは、私のようにFigmaでの詳細なデザイン作成に時間をかけていなかった開発者にとって大きな発見です。実質的に、Figmaでデザインを作成することが、コーディングとほぼ同等の価値を生み出すようになったと言えます。

UI構築がボトルネックだった従来の開発フローから、より裏側のロジック実装に注力できるようになることで、開発効率の向上が期待できます。また、MUIのtheme情報などをより効率的に伝えられるMCPサーバーがあれば、さらに開発体験が向上するでしょう。

## 残された課題：Organismレベルのコンポーネント

まだ重要な課題が残っています。MUIなどのライブラリで提供されているコンポーネントは、原子（Atom）または分子（Molecule）レベルのものがほとんどです。規模の大きなプロジェクトや特定領域に特化したシステムでは、これらの基本コンポーネントを組み合わせて、ドメイン知識を必要とする有機体（Organism）レベルのコンポーネントを独自に作成・活用することが一般的です。

このような場合、基本コンポーネントの特定ができても、プロジェクト固有のOrganismコンポーネントを適切に使用してもらえない可能性があります。

解決策の一つとして、FigmaでMUIコンポーネントで作成したOrganismコンポーネントの名前と、実際のプロジェクトディレクトリにあるOrganismコンポーネントの名前を一致させることが考えられます。Cursorのルールに「Figmaでコンポーネントを見つけた時、プロジェクトが提供する同名のコンポーネントがあればそれを使う」と指示することで、正しいOrganismコンポーネントを探し出して使用してもらえる可能性があります。

この方法についても、今後実験を行う予定です。

## 今後の展望

次のステップとして、以下のような取り組みを検討しています：

1. **独自デザインシステムのMCPサーバー作成**：  
   MUIとは異なり、独自デザインシステムではLLMがコンテキストを持っていないため、Ubieの記事を参考にMCPサーバーを作成してみたいと考えています。私の場合はStorybookを使ってデザインシステムを構築しているので、Storybookを活用したMCPサーバーの可能性を探ります。

2. **MUI用MCPサーバーの拡張**：  
   MUIのpropsやtheme情報を効率的に伝えるためのMCPサーバーを開発します。

3. **Organismコンポーネントの課題解決**：  
   先述のOrganismコンポーネントに関する課題を実際に検証します。

4. **効率的なFigmaコンポーネントの構築**：  
   MUIを効率的に再現できるFigmaコンポーネントの作成を目指します。特に、props名が直接注入データに含まれるようなFigmaコンポーネントの構築を検討します。

以上の取り組みを通じて、MCPとFigmaを活用したUI開発の新たな可能性を模索し、開発効率のさらなる向上を目指します。