KINTO Tech Blog
Android

Figma MCPとClaude CodeでAndroidのUI構築を高速化

Cover Image for Figma MCPとClaude CodeでAndroidのUI構築を高速化

この記事は KINTOテクノロジーズアドベントカレンダー2025 の19日目の記事です🎅🎄


KINTOテクノロジーズで Unlimited(Android)アプリの開発を担当している kikumido と申します。

これまで Android の UI 実装では、Figma のデザインを見ながら色・タイポグラフィー・レイアウト・アセットを手作業で Compose へ落とし込む必要があり、どうしても時間と労力がかかっていました。

しかし、Figma が提供する MCP(Model Context Protocol) と、Anthropic の Claude Code を組み合わせることで、このワークフローが大きく変わります。
Figma MCP を通じて AI がデザインデータを直接読み取り、Claude Code が Compose コードを自動生成してくれるため、これまで手作業で行っていた工程が一気に効率化されます。

本記事では、この「Figma MCP × Claude Code」による UI 実装高速化の流れを、設定方法からプロンプト例、生成結果までまとめて紹介します。


目次

  1. Figma MCP を有効にする
  2. MCP クライアントを導入する
  3. API Token(PAT)を設定する
  4. Figma のファイル URL を指定する
  5. Claude Code に実装を依頼する
  6. 実行結果
  7. まとめ

1. Figma MCP を有効にする

デスクトップ版 Figma の MCP サーバー機能をオンにするだけで準備は完了です。
公式ヘルプに非常にわかりやすい手順があります。

🔗 https://help.figma.com/hc/ja/articles/32132100833559-Figma-MCPサーバーのガイド


2. MCP クライアントを導入する

本記事では、チームで使用している Claude Code を MCP クライアントとして設定します。
Claude Code は Figma MCP に公式対応しており、設定も非常に簡単です。

🔗 https://developers.figma.com/docs/figma-mcp-server/remote-server-installation/#claude-code


3. API Token(PAT)を設定する

Figma の API を利用するためには Personal Access Tokens(PAT) が必要です。
セキュリティを考慮し、Claude Codeに直接PATを記載するのではなく環境変数に保存して使用する方法が安全です。

3.1 環境変数が安全とされる理由

  1. 誤ってAIに送信されない
  2. Git に誤コミットされるリスクを防げる
  3. PC(OS)のユーザー権限で保護される

3.2 PAT の取得方法

  1. Figma にログイン
  2. 右上の自分のアイコン → Settings
  3. 左メニューの Personal Access Tokens
  4. Generate new token
  5. 名前を入力して生成 → 表示されたトークンをコピー(再表示不可)

3.3 環境変数への設定(例:macOS / Linux)

echo 'export FIGMA_TOKEN="あなたのPAT"' >> ~/.zshrc
source ~/.zshrc

PAT の詳細:
🔗 https://www.figma.com/developers/api#access-tokens

4. Figma のファイル URL を指定する

Claude Code に Figma の URL を渡すだけで、ノード階層・レイアウト・色・フォント・画像アセット を自動で読み込みます。

4.1 正しい Figma ファイル URL の取得方法

  1. 対象の フレーム / コンポーネント / レイヤー を選択
  2. 右クリック
  3. Copy → Copy link(リンクをコピー)

?node-id=xxx を含む正しい URL がコピーされます。

4.2 環境変数への設定(例:macOS / Linux)

echo 'export FIGMA_FILE_KEY="コピーしたリンク"' >> ~/.zshrc
source ~/.zshrc

5. Claude Code に実装を依頼する

以下は、Figma のデザインを Jetpack Compose に落とし込むためのプロンプト例です。
ご自分のプロジェクトに合わせて適宜調整してください。

目的:
Figma MCP を使い、Figma のデザインデータを直接参照して Jetpack Compose の UI コードを生成してください。

前提:
- FIGMA_TOKEN(環境変数)
- FIGMA_FILE_KEY(環境変数)

■ デザイン情報
- Figma に存在する色・Typography のみ使用し、未定義の値は追加しない
- 以下のファイルに分割して実装
  - Color.kt
  - Type.kt
  - Theme.kt
- 上記テーマを使って Screen.kt を実装
- @Preview を追加
- 不明点は推測せず、Figma MCP が取得したデータを使用する

■ 画像アセットの扱い
- SVG の場合:
  - Figma MCP から取得したファイルを基に、正確に Android VectorDrawable(.xml)へ変換して配置
- PNG の場合:
  - Figma の Export 設定に従う  
  - Export 設定がなければ以下 5 種類の密度で PNG を生成して配置  
    - mdpi / hdpi / xhdpi / xxhdpi / xxxhdpi
- アセット名は Figma 名を Android の命名規則(lower_snake_case)へ変換して作成する

6. 実行結果

Claude Code は、指定された Figma ノードから 色・Typography・レイアウト・画像アセット を取得し、
Color.kt / Type.kt / Theme.kt / Screen.kt / Preview を自動生成します。

これにより、手作業で行っていた

  • 色のコピペ
  • フォント設定
  • 画像書き出し
  • レイアウト再現

といった作業が大幅に自動化され、UI 実装の速度と正確性が飛躍的に向上します。

それでは、Claude Code にプロンプトを渡した結果を確認してみましょう。

6.1 UIを確認する

左が Figma 、右が Claude Code が実装した Compose のPreviewです。
良い精度で再現できていると思います。
※「×」はSVGからVectorDrawableに変換された画像、アバターはPNG画像です。

Figma ComposeのPreview
Figma Compose

コードも確認してみましょう。

6.2 コードを確認する

画像は以下のように実装されていました。

Image(
    painter = painterResource(id = R.drawable.ic_avatar_large),
    contentDescription = "メインアバター",
    modifier = Modifier
        .size(106.dp)
        .clip(CircleShape),
    contentScale = ContentScale.Crop
)

Textは以下のように実装されていました。
styleや色も Figma で指定されたtypography、colorが適切に指定されています。

// ドライバー名
Text(
    text = driverName,
    style = KintoTheme.typography.labelLarge,
    color = KintoTheme.colors.textPrimary
)

入力欄の幅が Figma は固定値なのに対し、Compose はfillMaxWidth()を使用し横幅いっぱいに広がるようになっていました。
こちらはFigmaを正とするのであれば実装を修正するべきですが、横幅の広い端末を考慮しデザイナーと相談しても良いかもしれません。
入力欄の間の余白が14dpであることも Figma 通りに再現できています。
同じ見た目の入力欄が一つのInputFieldとして実装されている点も注目です。
さらに、選択状態に合わせてボーダーの色が変わるようにすでに実装されてもいます。

var selectedField by remember { mutableStateOf<SelectedField>(SelectedField.BirthYear) }
// 入力フィールド
Row(
    modifier = Modifier.fillMaxWidth(),
    horizontalArrangement = Arrangement.spacedBy(14.dp)
) {
    // 生年月
    InputField(
        label = "生年月",
        value = birthYear,
        isSelected = selectedField == SelectedField.BirthYear,
        onClick = { selectedField = SelectedField.BirthYear },
        modifier = Modifier.weight(1f)
    )

    // 普段の起床時刻
    InputField(
        label = "普段の起床時刻",
        value = wakeUpTime,
        isSelected = selectedField == SelectedField.WakeUpTime,
        onClick = { selectedField = SelectedField.WakeUpTime },
        modifier = Modifier.weight(1f)
    )
}

InputFieldは Figma の仕様どおりに実装されており、onClick などの挙動もパラメータで柔軟に渡せる設計になっています。
また、入力ボックス内のテキストに typography が設定されていない点も、Figma の定義を忠実に反映した結果です。

なお、プロンプトで「未定義の値は追加しない」と指定しない場合、Claude Code が推測で適切そうな typography を補完してしまいます。
しかし、望ましいアプローチはアプリ側で補正することではなく、Figma のデザイン側を修正し、正しい typography を設定することだと考えています。
その方が、UI の一貫性やメンテナンス性が大きく向上するためです。

@Composable
private fun InputField(
    label: String,
    value: String,
    isSelected: Boolean,
    onClick: () -> Unit,
    modifier: Modifier = Modifier
) {
    Column(modifier = modifier) {
        // ラベル
        Text(
            text = label,
            style = KintoTheme.typography.labelMedium,
            color = KintoTheme.colors.textPrimary
        )

        Spacer(modifier = Modifier.height(8.dp))

        // 入力ボックス
        Box(
            modifier = Modifier
                .fillMaxWidth()
                .height(53.dp)
                .border(
                    width = if (isSelected) 2.dp else 1.dp,
                    color = if (isSelected) KintoTheme.colors.borderFocused else KintoTheme.colors.borderDefault,
                    shape = RoundedCornerShape(8.dp)
                )
                .clickable { onClick() }
                .padding(horizontal = 16.dp),
            contentAlignment = Alignment.CenterStart
        ) {
            Text(
                text = value,
                style = TextStyle(
                    fontFamily = FontFamily.SansSerif,
                    fontWeight = FontWeight.Normal,
                    fontSize = 16.sp,
                    lineHeight = 21.sp
                ),
                color = KintoTheme.colors.textPrimary
            )
        }
    }
}

先述のプロンプトでは文字をstrings.xmlに定義するように指示をしていないので、コード上にそのまま記載されています。
先のプロンプトを修正したり、追加で指示を出せばstrings.xmlに定義した上で使用することもしてくれます。


7. まとめ

まとめとして強調したいのは、実装の精度は Figma 側のデザインシステムが適切に整備されているかに大きく左右されるという点です。
Figma のスタイルが未整理だったり、コンポーネント化が不十分な場合、AI が取得する情報も不完全になり、結果的にコードの手直しが必要になってしまいます。

逆に、デザイナーとエンジニアが協力してデザインシステムをしっかり構築しておけば、
UI 実装の速度・正確性は飛躍的に向上し、保守性も格段に高まります。
そのためにも、日頃から密に連携し、同じ前提でデザイン・実装を行うことが不可欠です。

さらに、Compose Multiplatform と組み合わせて Figma MCP を活用すれば、
プラットフォームをまたいだ UI 実装の高速化にもつながり、よりスピーディに高品質なアプリ開発が可能になります。

質の高いアプリを素早く届けるためにも、
エンジニアとして継続的に知識をアップデートし、より良いワークフローを探求していくことが重要だと感じています。

Facebook

関連記事 | Related Posts

We are hiring!

【UI/UXデザイナー】クリエイティブ室/東京・大阪・福岡

クリエイティブGについてKINTOやトヨタが抱えている課題やサービスの状況に応じて、色々なプロジェクトが発生しそれにクリエイティブ力で応えるグループです。所属しているメンバーはそれぞれ異なる技術や経験を持っているので、クリエイティブの側面からサービスの改善案を出し、周りを巻き込みながらプロジェクトを進めています。

【プロジェクトマネージャー(iOS/Android/Flutter)】モバイルアプリ開発G/東京

モバイルアプリ開発GについてKINTOテクノロジーズにおける、モバイルアプリ開発のスペシャリストが集まっているグループです。KINTOやmy routeなどのサービスを開発・運用しているグループと協調しながら、品質の高いモバイルアプリを開発し、サービスの発展に貢献することを目標としています。

イベント情報