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つの判断軸
- 失敗時の影響が金銭やユーザー体験にどれだけ波及するか
- 復旧オペレーションが明文化されているか
- 観測ログから人間が再現できる粒度に整っているか