MCP Servers (Figma & Github & FileSystem) による 新たな"Figma To Flutter"

# 指示はこんなにシンプルにできる

いきなりですが、
今回の作業で最終的に`Claude Desktop`にチャットした内容から見ていただきたいです！

```text
Figmaの以下ページにあるUIをベースにFlutterのコードを作成してほしい。
https://www.figma.com/design/Xxx7xXxxxXXxXXx112XxxX/UI-Pockets?node-id=68-179&t=hsgygrZCyk2fq7Wc-0

各要素の細かい仕様は以下のissueを参照
https://github.com/eno-conan/flutter-poc/issues/33

できた実装について、
C:\Users\{username}\flutter\poc\lib\smbc_login_page.dartを更新してほしい
（Git管理しているので、バックアップは不要）
```

上記文章だけで、以下すべてを勝手にやってくれます。
本当にありがたいです！
- FigmaからのUI情報取得
- Github Issueの確認
- Flutterのコード生成とローカルの対象フォルダへ配置

今回は、
この指示だけで作業できるようになるまでの話をさせていただきます。

--- 

## MCP（Model Context Protocol）を用いた開発を体験
MCP（Model Context Protocol）を活用することで、
Figma、FileSystem、Githubといった複数のツールを連携させ、より効率的な開発フローを構築することが可能になります。

**MCPは、AI アシスタントが外部システムと安全に接続し、データを取得・操作するためのプロトコルです。**

これにより、ClaudeのようなAIアシスタントが、Figma のデザインデータや Github のリポジトリ情報、ローカルファイルシステムに直接アクセスできる構成を作ることができます。

https://modelcontextprotocol.io/introduction

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/1df8dec6-7b76-4435-843e-2da2df6d7988.png)

## 開発環境構成 (v1)
最初、Githubがない以下2つで構成していました。

| ツール | 機能 |
|--------|------|
| Figma MCP | デザインデータの取得とUI要素の解析 |
| FileSystem MCP | ローカルファイルの作成・編集・管理 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/c2a062bf-ab2d-42c9-85c3-58d72e1b690f.png)

### チャット送信
> Figmaの情報を参照して、Flutterのコードを作成して。

簡単な指示だけでコード生成を試みましたが、
さすがにこれだけでは、想定通りの結果を得られませんでした。

最初に作成されたコードで起動してみると、以下の通りでした。

<details><summary>スクリーンショット（スマホ）と説明</summary>

一見すると、そこそこいい感じに見えます。
しかし、サラッと確認しただけで以下の問題がありました。
- タブの切り替えができない
- 各テキストフィールドには何も入力できない
- トグル部分は、灰色の塗りつぶしの中に白い丸の塗りつぶしが重なっているだけで、トグルとしては機能しない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/c78b9407-d88b-468f-8b61-8084ea740209.png)

</details>

### チャットで指示を追加
作成されたコードでは問題だらけだったので、
詳細な要件や修正方法を、以下のように追加で提示しました。

> 以下の内容を確認して、修正しておいて
・メニューバー：AppBarを用いること
・口座情報とSMBC IDはそれぞれ別のタブなので、TabControllerを用いて、タブ切り替えができること
（SMBC IDの方をタップ時、テキスト入力欄が一つあればOK）
・以下3つは文字が入力できるように、TextFormFieldとTextEditingControllerを各入力欄に適用すること
店番号、口座情報、ログイン認証
・店・口座番号保存は
トグルなので、CupertinoSwitchを使って、切り替えできるようにすること
・ログインボタン
ボタンの形はOK。活性状態になるには、「店番号、口座情報、ログイン認証」すべて入力済であること
タップした際は、入力値をログ出力

上記指示を受けて作成されたコードで、フォームが出来上がりました。

また、**この内容をチャットするのであれば、Githubのissueに要件を最初から記載しておく方がよい**、と思いました。

<details><summary>スクリーンショット（スマホ）</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/68e4991e-e8be-48c6-9680-695d26c0085a.png)

</details>

## 開発環境構成（v2）
v1の結果をふまえて、構成を見直しました。
| ツール | 機能 |
|--------|------|
| Figma MCP | デザインデータの取得とUI要素の解析 |
| **Github MCP** | リポジトリ管理、issue管理、（コードのプッシュ） |
| FileSystem MCP | ローカルファイルの作成・編集・管理 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/98f24ee0-ba5d-4fa7-9cba-deca4c598915.png)

ここから、
上記v2を作るための作業を記載していきます。

--- 

## Claude Desktopのセットアップ
インストールは以下リンクから行えます。

https://claude.ai/download

MCPサーバーの設定に進みますが、まず開発者モードを有効化します。
`Claude Desktop`を起動し、左上メニューで、「開発者モードを有効にする」を選択します。

選択すると、一旦アプリが閉じます。
再起動すると、サーバーの設定が行えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/50133e73-5a17-4472-ace9-5b61986796a7.png)

### Node.jsのインストール
インストールされていない場合は、ここでインストールしておきましょう。（MCPサーバーの多くは`Node.js`を使用して実行される関係で）

https://nodejs.org/ja

### 設定ファイル（`claude_desktop_config.json`）の開き方
MCPサーバーを設定するファイルを開くまでの手順です。

Claude Desktopの左上にあるアイコンから、「ファイル」 > 「設定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/8faa85c7-0183-4049-b415-268311d28203.png)

`構成を編集`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/20983d57-b4fe-4679-bb8d-d23c6d318a05.png)

エクスプローラーが立ち上がります。
`claude_desktop_config.json`が選択されているので、このファイルをエディタで開いて、サーバーの情報を追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/e6e69e6c-7fb7-40e1-9918-5605c741eb75.png)

ここから今回利用した各MCPサーバーの設定を行っていきます。
いずれも、同じ方の記事を参考にさせていただきました。

---

### FileSystem

https://zenn.dev/takna/articles/mcp-server-tutorial-02-filesystem

:::note info
ローカルのプロジェクトディレクトリにファイルを配置してもらい、手動でのファイル作成やコピー＆ペーストの手間を省きます。
:::

記事でも記載されていますが、Windowsの場合にはバックスラッシュのエスケープを行ってください。
複数のディレクトリへのアクセスを許可する場合は、以下のように列挙します。
（`args`の第二引数以降だけは各々の作業状況で変わります。）

<details><summary>claude_desktop_config.jsonの記述内容</summary>

```json
    "filesystem": {
      "command": "C:\\Program Files\\nodejs\\node.exe",
      "args": [
        "C:\\Users\\{username}\\AppData\\Roaming\\npm\\node_modules\\@modelcontextprotocol\\server-filesystem\\dist\\index.js",
        "C:\\Users\\{username}\\Desktop",
        "C:\\Users\\{username}\\flutter\\poc"
      ]
    }
```
</details>

### Figma

アカウント作成の話は割愛します。

https://zenn.dev/takna/articles/mcp-server-tutorial-06-figma

:::note info
Figmaと連携をすることで、UIに関する情報について、都度スクリーンショットを撮って、アップロードしたりする作業などの手間を省きます。
:::

ブラウザで、Figmaのページを開きます。画像のURLバーにある通り、`figma.com/files`で表示されたページで作業を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/d7d37eb0-9e6a-4faf-9f1c-36e25e20e98c.png)

画面中央にモーダルウインドウが表示されるので、セキュリティタブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/4f637a88-165b-457e-a657-b3cafe8f98bd.png)
下にスクロールすると、トークン作成エリアがあるので、そこでトークンを作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/7973e1f1-4c3a-452d-909a-ae345a97356f.png)

<details><summary>claude_desktop_config.jsonの記述内容</summary>

```json
    "figma-developer-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figma-developer-mcp",
        "--stdio"
      ],
      "env": {
        "FIGMA_API_KEY": "figd_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      }
    }
```
</details>

### Github 

https://zenn.dev/takna/articles/mcp-server-tutorial-05-github

:::note info
Githubと連携することで、Issueの読み込み（作成も可能）や、今回はやっていませんが、コミット・プッシュ作業の手間を省くこともできます。
:::

`https://github.com/settings/apps`にアクセスします。

`Personal access tokens` > `Tokens(classic)`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/c6b8723c-0da5-4227-9dea-1a9cf25b8c95.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/83cbcd40-8b2e-48a2-96d4-e917a899cb0e.png)

`repo`にチェックを入れ、下までスクロールし、`Generate token`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/fc953672-07ad-48ce-829f-21eefd44fbfd.png)

英文で記載されている通り、再度値は表示されないので、ここでコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/86968dd2-2fdc-4922-9d37-76af502673c4.png)

<details><summary>claude_desktop_config.jsonの記述内容</summary>

```json
	"github": {
	  "command": "npx",
	  "args": [
	    "-y",
	    "@modelcontextprotocol/server-github"
	  ],
	  "env": {
	    "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
	  }
	},
```
</details>

### MCPサーバーの設定完了
これで必要なMCPサーバーの設定が完了しました。
`claude_desktop_config.json`は以下のようになっています。
（サーバーごとの順番が異なるのはOKです。）

:::note warn
**トークンの扱い**
FigmaとGithubでトークンを作成された方は、`public`リポジトリへのPushしないなど、扱いにご注意ください。
:::

<details open><summary>最終的なclaude_desktop_config.json</summary>

```json
{
  "mcpServers": {
    "filesystem": {
      "command": "C:\\Program Files\\nodejs\\node.exe",
      "args": [
"C:\\Users\\Administrator\\AppData\\Roaming\\npm\\node_modules\\@modelcontextprotocol\\server-filesystem\\dist\\index.js",
        "C:\\Users\\Administrator\\Desktop",
        "C:\\Users\\Administrator\\flutter\\poc"
      ]
    },
    "github": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-github"
      ],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      }
    },
    "figma-developer-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figma-developer-mcp",
        "--stdio"
      ],
      "env": {
        "FIGMA_API_KEY": "figd_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      }
    }
  }
}
```
</details>

正しく設定が完了すれば、
`Claude Desktop`上では、以下の通り表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/5f2659a0-591b-4d06-84a2-ee73272634b7.png)

## FigmaとGithub Issue
今回チャットに渡している、Figmaの情報とGithub Issueの情報を共有していなかったので、ここで記載します。

### Figmaのページ
今回、UI Pocketsで載っていたあるスクリーンショットを私自身でFigmaを作成してみました。
このページの情報をMCPサーバーを通じて、`Claude Desktop`で扱えるようにします。

https://www.ui-pocket.com/mobile/apps

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/df328c3f-1882-4986-917a-2f20d2c4d01a.png)

### Github Issue
Figma部分ではUIに関する情報だけです。
画面の各要素についてどういった機能か、Issueに記載しました。

<details><summary>以下画像のMarkdown</summary>

```markdown
## メニューエリア
以下3つの機能を画像の通り横並びで作成
- 戻るアイコン：タップ時の挙動は実装なしでOK
- テキスト：ログイン
- ？アイコン：タップ時にダイアログ表示

## タブバーエリア
以下2つのタブをタップで移動（`TabController`で実装）
・SMBC ID（SMBC IDの方をタップ時、テキスト入力欄が一つあればOK）
・口座情報（このタブが本issueのメイン）

## フォームエリア
### 入力欄
・3つのテキストフィールドを作成（`TextFormField`と`TextEditingController`で実装）
- 店番号
- 口座情報
- ログイン認証
### トグル
・店・口座番号保存は`CupertinoSwitch`で実装

### ボタン
- ログインボタン作成
- 活性状態になるには、「店番号、口座情報、ログイン認証」すべて入力済であること
- タップした際は、入力値をログ出力
```
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/e6ecf059-9d5b-43c8-b861-532c8ab7f863.png)

## 動作確認
以下内容をチャットで送信します。
これだけです。あとは各MCPサーバーが良しなにやってくれます。

```text
Figmaの以下ページにあるUIをベースにFlutterのコードを作成してほしい。
https://www.figma.com/design/Pwa7kTqwoRYxDNu112TamU/UI-Pockets?node-id=68-179&t=hsgygrZCyk2fq7Wc-0

各要素の細かい仕様は以下のissueを参照
https://github.com/eno-conan/flutter-poc/issues/33

実装できた実装について、
C:\Users\Administrator\flutter\poc\lib\smbc_login_page.dartを更新してほしい
（Git管理しているので、バックアップは不要）
```
実行後の`Claude Desktop`の様子です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/89c15e17-eb01-46a6-9fc6-0cca8c45eb4b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/264ba860-e0ac-4b0b-839e-42224b5f1282.png)

### 成果物をローカルで動かしてみる
以下の機能がきちんと実装されていることは確認できました。
**Issueにより細かく記載すれば、そちらも対応してくれそうな期待を持てそうな結果となりました！**
- ダイアログ表示
- タブ切り替え
- フォーム入力
- ログインボタンの活性/非活性制御

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/2e901b20-bcb4-48d4-8d03-c0dc8a7ea1c8.png)

## まとめ
MCP を活用することで、Figma、FileSystem、Github を連携させた効率的な開発フローを構築することができました。作業の自動化により、開発者はより細かい微修正などの作業からの対応できるようになりそうです。

AIによる自動化を効果的に活用するためには、明確で詳細な要件定義が重要であることも分かりました。今後も様々なツールとの連携を試し、より効率的な開発手法を模索していきたいと思います。

## 参考記事
本文で適宜リンクは記載しましたが、それ以外で参考にした情報です。

https://github.com/modelcontextprotocol

https://learn.deeplearning.ai/courses/mcp-build-rich-context-ai-apps-with-anthropic/lesson/fkbhh/introduction

https://www.builder.io/blog/figma-mcp-server

https://www.figma.com/community/plugin/1236863310201087089/figma-to-flutter