ANTIGRAVITY LABEN
記事一覧/連携・プラグイン
連携・プラグイン/2026-03-20上級

Google Stitch MCP × Antigravity — Vibe Design から実装までを完全自動化するパイプライン

Google Stitch の MCP サーバーと Antigravity を接続し、Vibe Design で作成したUIデザインを自動的にコード化する統合パイプラインを構築する方法。Voice Canvas との連携も解説。

Stitch4MCP17Antigravity338Vibe Design自動化30パイプライン2Google Labs

Stitch MCP × Antigravity — デザイン駆動型開発の完全自動化

デザインからコード実装までの工程は、従来的には複数のツール間でのコンテキストスイッチが避けられず、デザインの意図が実装段階で失われることが多々ありましました。2026年、Google Stitch の MCP サーバーと Antigravity の統合により、このワークフロー全体が自動化される画期的なエコシステムが実現しました。ここではVibe Design から実装、そして運用までの完全なパイプラインを構築する方法を詳細に解説します。

Stitch MCP サーバーの基礎

Stitch と MCP の統合

Google Stitch は無料の AI ネイティブ無限キャンバスプラットフォームですが、v2026.03 から MCP(Model Context Protocol)サーバー機能を備え、他のツールとのシームレスな連携が可能になりましました。

# Stitch MCP サーバーのインストール
npm install @google/stitch-mcp-server
 
# MCP サーバーの起動
stitch-mcp-server --port=3000 --api-key=$STITCH_API_KEY
 
# サーバーステータス確認
curl http://localhost:3000/health
 
# 出力:
# {
#   "status": "healthy",
#   "version": "1.0.0",
#   "capabilities": [
#     "design_export",
#     "vibe_design",
#     "voice_canvas",
#     "component_generation"
#   ]
# }

MCP プロトコルでのデザイン取得

# Stitch デザインをMCP経由で取得
curl -X POST http://localhost:3000/mcp/call \
  -H "Content-Type: application/json" \
  -d '{
    "method": "design.export",
    "params": {
      "design_id": "stitch-app-ui-001",
      "format": "json_schema",
      "include_assets": true,
      "include_interactions": true
    }
  }'
 
# 出力: デザイン構造化データ
{
  "design_id": "stitch-app-ui-001",
  "name": "Mobile App UI",
  "components": [
    {
      "id": "comp_header",
      "type": "header",
      "properties": {
        "background_color": "#1a1a1a",
        "height": "64px",
        "shadow": true
      },
      "children": [
        {
          "id": "comp_logo",
          "type": "image",
          "properties": {
            "src": "assets/logo.png",
            "width": "40px",
            "height": "40px"
          }
        }
      ]
    }
  ],
  "design_tokens": {
    "colors": {
      "primary": "#007AFF",
      "secondary": "#5AC8FA",
      "background": "#F5F5F5"
    },
    "typography": {
      "heading": { "font": "SF Pro Display", "size": "24px", "weight": 700 },
      "body": { "font": "SF Pro Text", "size": "16px", "weight": 400 }
    },
    "spacing": {
      "xs": "4px",
      "sm": "8px",
      "md": "16px",
      "lg": "24px"
    }
  }
}

Vibe Design — UI設計から構造化データへ

Vibe Design の概要

Vibe Design は自然言語や簡単なスケッチから、AI が自動的に UI デザインを生成する Stitch の機能です。生成されたデザインは構造化されたコンポーネントツリーとして保存され、コード生成に最適な形式になっています。

Vibe Design でデザイン生成

# Vibe Design API 経由でのデザイン生成
curl -X POST http://localhost:3000/mcp/call \
  -H "Content-Type: application/json" \
  -d '{
    "method": "vibe_design.generate",
    "params": {
      "prompt": "ダークモードの e-commerce モバイルアプリ。ヘッダーに検索機能、メインには商品グリッド、フッターに購入カート",
      "style_preset": "modern_minimal",
      "color_scheme": "dark",
      "accessibility": true
    }
  }'
 
# 出力: 生成されたデザイン構造
{
  "design_id": "vibe-ecommerce-dark-001",
  "status": "success",
  "design": {
    "screens": [
      {
        "id": "screen_home",
        "name": "Home Screen",
        "layout": "flex",
        "components": [
          {
            "id": "header_search",
            "type": "search_bar",
            "properties": {
              "placeholder": "商品を検索...",
              "icon_position": "left"
            }
          },
          {
            "id": "product_grid",
            "type": "grid",
            "properties": {
              "columns": 2,
              "gap": "16px",
              "items": [/* 商品コンポーネント */]
            }
          }
        ]
      }
    ],
    "tokens": {
      "colors": { /* デザイントークン */ },
      "typography": { /* フォント設定 */ }
    }
  }
}

Antigravity との接続

Antigravity 統合の設定

Antigravity は AI ネイティブのコード生成・管理プラットフォームです。Stitch MCP との統合により、デザイン構造化データを直接コンポーネントに変換できます。

# Antigravity 環境のセットアップ
npm install @antigravity/core @antigravity/stitch-adapter
 
# antigravity.config.ts
import { AntigravityConfig } from '@antigravity/core';
import { StitchAdapter } from '@antigravity/stitch-adapter';
 
export const config: AntigravityConfig = {
  adapters: [
    new StitchAdapter({
      mcp_url: 'http://localhost:3000',
      api_key: process.env.STITCH_API_KEY,
      design_sync_interval: '5m',
      auto_publish: true
    })
  ],
  output: {
    directory: './src/generated',
    framework: 'react',
    typescript: true
  }
};

パイプラインの自動実行

# Antigravity CLI で Stitch デザイン → React コンポーネント変換
antigravity sync \
  --source=stitch \
  --design-id=vibe-ecommerce-dark-001 \
  --output=src/components/ecommerce
 
# 処理ステップ:
# 1. Stitch MCP から設計構造を取得
# 2. コンポーネント依存関係を解析
# 3. React コンポーネントコード生成
# 4. デザイントークン → CSS-in-JS 変換
# 5. 型定義(TypeScript)を自動生成
# 6. テストフレームワーク用のスナップショット作成

生成されたコンポーネントの例

// src/generated/components/ECommerceHome.tsx
// 自動生成(Stitch MCP + Antigravity)
 
import React, { useState } from 'react';
import styled from 'styled-components';
import { DesignTokens } from '@/generated/design-tokens';
 
interface ECommerceHomeProps {
  onProductSelect?: (productId: string) => void;
  onCartUpdate?: (cartCount: number) => void;
}
 
const Container = styled.div`
  background-color: ${DesignTokens.colors.background};
  min-height: 100vh;
  display: flex;
  flex-direction: column;
`;
 
const Header = styled.header`
  background-color: ${DesignTokens.colors.surface};
  padding: ${DesignTokens.spacing.lg};
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
`;
 
const SearchBar = styled.input`
  width: 100%;
  padding: ${DesignTokens.spacing.md};
  font-family: ${DesignTokens.typography.body.font};
  font-size: ${DesignTokens.typography.body.size};
  border: 1px solid ${DesignTokens.colors.border};
  border-radius: 8px;
  background-color: ${DesignTokens.colors.inputBackground};
  color: ${DesignTokens.colors.text};
 
  &::placeholder {
    color: ${DesignTokens.colors.textSecondary};
  }
`;
 
const ProductGrid = styled.div`
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: ${DesignTokens.spacing.md};
  padding: ${DesignTokens.spacing.lg};
  flex: 1;
`;
 
export const ECommerceHome: React.FC<ECommerceHomeProps> = ({
  onProductSelect,
  onCartUpdate
}) => {
  const [searchQuery, setSearchQuery] = useState('');
  const [cartCount, setCartCount] = useState(0);
 
  const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {
    setSearchQuery(e.target.value);
  };
 
  return (
    <Container>
      <Header>
        <SearchBar
          type="text"
          placeholder="商品を検索..."
          value={searchQuery}
          onChange={handleSearch}
        />
      </Header>
      <ProductGrid>
        {/* 商品グリッド内容 */}
      </ProductGrid>
    </Container>
  );
};
 
export default ECommerceHome;

Voice Canvas との連携

Voice Canvas による非デザイナー向け UI 設計

Voice Canvas は音声入力を使って UI デザインを指定する Stitch の機能です。Antigravity パイプラインと組み合わせることで、デザイナーでないエンジニアも高品質の UI を実装できます。

# Voice Canvas で音声入力によるデザイン指定
stitch voice-canvas --design-output=vibe-voice-001
 
# ユーザーの音声入力:
# 「ダッシュボード画面を作ってください。
#  左にサイドバー、中央にメインコンテンツエリア、
#  上部にナビゲーション。
#  カラースキームは紺と白。
#  グラフとテーブルを中心に配置。」
 
# 結果: Vibe Design が同じ品質のデザインを生成

完全自動化パイプラインの構築

エンドツーエンドの自動実行フロー

# pipeline.yml: Stitch → Antigravity 完全自動化
 
name: Design to Code Pipeline
on:
  design_updated:
    source: stitch
    design_ids:
      - "vibe-ecommerce-dark-001"
      - "vibe-dashboard-003"
 
jobs:
  design_sync:
    runs-on: ubuntu-latest
    steps:
      - name: Fetch Design from Stitch MCP
        run: |
          curl -X POST http://stitch-mcp:3000/mcp/call \
            -d '{"method": "design.export", "params": {...}}' \
            -o design-export.json
 
      - name: Validate Design Structure
        run: |
          antigravity validate --schema=design-schema.json design-export.json
 
      - name: Generate React Components
        run: |
          antigravity generate \
            --input=design-export.json \
            --output=src/generated/components \
            --framework=react \
            --language=typescript
 
      - name: Generate Design Tokens
        run: |
          antigravity tokens \
            --input=design-export.json \
            --output=src/generated/design-tokens.ts \
            --format=typescript-constants
 
      - name: Generate Tests
        run: |
          antigravity test \
            --components=src/generated/components \
            --output=src/generated/__tests__ \
            --snapshots=true
 
      - name: Run Tests
        run: npm test src/generated/__tests__
 
      - name: Commit Generated Code
        run: |
          git add src/generated/
          git commit -m "chore: update components from Stitch design [auto]"
          git push origin main
 
      - name: Deploy to Staging
        run: npm run deploy:staging
 
      - name: Run Visual Regression Tests
        run: npm run test:visual
 
  notify:
    needs: design_sync
    if: always()
    runs-on: ubuntu-latest
    steps:
      - name: Send Notification
        run: |
          curl -X POST https://slack-webhook \
            -d '{"text": "Design to Code パイプライン完了"}'

リアルタイムデザイン同期

// design-sync-service.ts: リアルタイムデザイン監視と自動生成
 
import { StitchMCP } from '@google/stitch-mcp-server';
import { AntigravityGenerator } from '@antigravity/core';
import { EventEmitter } from 'events';
 
class DesignSyncService extends EventEmitter {
  private stitch: StitchMCP;
  private generator: AntigravityGenerator;
  private lastSyncTime: number = 0;
  private syncInterval: NodeJS.Timeout | null = null;
 
  constructor() {
    super();
    this.stitch = new StitchMCP({
      url: process.env.STITCH_MCP_URL,
      apiKey: process.env.STITCH_API_KEY
    });
    this.generator = new AntigravityGenerator();
  }
 
  start() {
    // 30秒ごとにデザイン変更をチェック
    this.syncInterval = setInterval(() => this.checkAndSync(), 30000);
    this.emit('service:started');
  }
 
  private async checkAndSync() {
    try {
      // Stitch から最新のデザインを取得
      const designs = await this.stitch.listDesigns({
        modifiedSince: this.lastSyncTime
      });
 
      if (designs.length === 0) return;
 
      this.emit('designs:found', designs.length);
 
      for (const design of designs) {
        await this.syncDesign(design);
      }
 
      this.lastSyncTime = Date.now();
      this.emit('sync:complete', { count: designs.length });
 
    } catch (error) {
      this.emit('error', error);
    }
  }
 
  private async syncDesign(design: any) {
    try {
      // デザイン構造を取得
      const designData = await this.stitch.exportDesign({
        designId: design.id,
        format: 'json_schema'
      });
 
      // React コンポーネントを生成
      const components = await this.generator.generateComponents({
        design: designData,
        framework: 'react',
        typescript: true
      });
 
      // デザイントークンを生成
      const tokens = await this.generator.generateTokens({
        design: designData,
        format: 'typescript'
      });
 
      // ファイルシステムに保存
      await this.saveGeneratedFiles(design.id, {
        components,
        tokens
      });
 
      this.emit('design:synced', {
        designId: design.id,
        componentCount: components.length
      });
 
    } catch (error) {
      this.emit('design:error', { designId: design.id, error });
    }
  }
 
  private async saveGeneratedFiles(designId: string, files: any) {
    // 実装省略
  }
 
  stop() {
    if (this.syncInterval) {
      clearInterval(this.syncInterval);
    }
    this.emit('service:stopped');
  }
}
 
// 使用例
const syncService = new DesignSyncService();
syncService.on('design:synced', (event) => {
  console.log(`✓ Design ${event.designId} synced: ${event.componentCount} components`);
});
syncService.start();

デザイン品質の検証と最適化

生成コードの品質チェック

# 生成されたコンポーネントの品質分析
antigravity analyze \
  --components=src/generated/components \
  --checks=[
    "type-safety",
    "accessibility",
    "performance",
    "design-token-usage",
    "responsive-design"
  ]
 
# 出力レポート:
# ✓ Type Safety: 100%
# ✓ Accessibility: WCAG AA
# ✓ Performance: Lighthouse 95/100
# ✓ Design Token Usage: 98%
# ✓ Responsive Design: All breakpoints tested

自動最適化

// optimization-rules.ts: 自動最適化ルール
 
import { AntigravityOptimizer } from '@antigravity/core';
 
export const optimizationRules = [
  // メモリ化による再レンダリング最適化
  {
    rule: 'memoize_props',
    condition: (component) => component.props.length > 5,
    action: 'wrap_with_memo'
  },
 
  // 大規模リストの仮想化
  {
    rule: 'virtualize_lists',
    condition: (component) => component.hasGrid && component.itemCount > 100,
    action: 'use_react_window'
  },
 
  // CSS-in-JS の分割
  {
    rule: 'split_styled_components',
    condition: (component) => component.styledLinesOfCode > 500,
    action: 'extract_to_separate_file'
  },
 
  // アクセシビリティの自動改善
  {
    rule: 'enhance_accessibility',
    checks: [
      'add_aria_labels',
      'ensure_color_contrast',
      'add_keyboard_navigation'
    ]
  }
];
 
const optimizer = new AntigravityOptimizer();
optimizer.applyRules(optimizationRules);

運用とメンテナンス

デザイン変更時の自動フィードバック

# CI/CD パイプラインでの自動テスト
npm run test:components -- \
  --visual-regression \
  --screenshots-dir=./screenshots/baseline
 
# Pull Request に自動コメント:
# デザイン変更による影響分析
# - 修正されたコンポーネント数: 5
# - 新規コンポーネント数: 2
# - 削除されたコンポーネント数: 1
# - ビジュアル変更検出: 3 差分

全体を振り返って

Google Stitch MCP と Antigravity の統合により、デザインからコード実装までの完全な自動化が実現しました。Vibe Design による自動 UI 生成、Voice Canvas による音声指定、MCP による構造化データ連携、Antigravity による自動コード生成という4つの要素が組み合わさることで、デザイナーとエンジニアのコラボレーションが加速し、品質とスピードの両立が可能になります。

この自動化パイプラインは、特にスタートアップや小規模チームにおいて、限られたリソースで高品質な UI 実装を実現する強力なツールとなるでしょう。

個人開発12年の現場で実感したこと

線引きするときの3つの判断軸

  • 失敗時の影響が金銭やユーザー体験にどれだけ波及するか
  • 復旧オペレーションが明文化されているか
  • 観測ログから人間が再現できる粒度に整っているか
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

連携・プラグイン2026-03-22
Antigravityでストアアセット制作環境を構築する — Stitch×Figma×MCP統合ワークスペース
AntigravityにStitch・Figma・MCPを統合してApp Store・Google Playのアセット制作環境を構築する方法を解説します
連携・プラグイン2026-07-08
Antigravity の OAuth トークンが OS キーリングに保存されるようになった—ヘッドレス運用で認証を崩さない設計
v2.2.1 で更新後の OAuth トークンが OS キーリングへ自動保存されるようになりました。デスクトップでは快適な一方、ヘッドレスのスケジュール実行では保管庫そのものが存在せず認証が崩れます。バックエンドの明示指定・安全なファイルフォールバック・保存場所ごとの生死確認までを設計します。
連携・プラグイン2026-06-22
エージェントに渡すMCPツールを絞る — 最小権限の許可リスト設計
Antigravity 2.0 に MCP サーバーを足していくと、各エージェントが触れるツールはいつの間にか「全部入り」になります。読み取りしか必要ないエージェントに削除系ツールまで見えている状態は、いつか事故を起こします。ツールをエージェント単位の許可リストで絞り、呼び出し直前で弾き、破壊的操作だけ二段階にする最小権限の設計を、動くPython実装と運用の所感つきでまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →