Claude Code × Storybook UIカタログ駆動開発ガイド|MCP連携・Story自動生成・Play Function・Chromatic VRT

Claude Code × Storybook UIカタログ駆動開発ガイド|MCP連携・Story自動生成・Play Function・Chromatic VRT AI開発

UIコンポーネントの実装・テスト・ドキュメント作成を同時にこなせたら——Storybook MCPがそれを実現します。Claude CodeからStorybookに直接アクセスし、既存コンポーネントのProps情報を取得してから新しいコンポーネントを生成し、ストーリーを自動作成し、テストを実行して問題があれば自動修正する。この「自己修復ループ」が、Storybook MCPの最大の強みです。

この記事では、Storybook 9 + 公式MCPアドオン + Claude Codeを組み合わせた「UIカタログ駆動開発」の具体的なワークフローを解説します。セットアップからStory自動生成、Play Functionによるインタラクションテスト、Chromaticでのビジュアルリグレッションテスト、Figma MCP連携まで実践的に紹介します。

スポンサーリンク

Storybook MCPとは ── Claude Codeが得る6つの能力

Storybook公式の@storybook/addon-mcpをインストールすると、Storybookの起動時にMCPエンドポイントが有効になり、Claude Codeから以下の操作ができるようになります。

MCPツール できること
list-all-documentation プロジェクトの全コンポーネント・ドキュメントのID一覧を取得
get-documentation 指定コンポーネントのProps・使用例・ストーリー詳細を取得
get-documentation-for-story 特定ストーリーバリアントの詳細情報を取得
get-storybook-story-instructions ストーリー作成・更新のガイドラインを取得
preview-stories 変更後のプレビューURLを返却
run-story-tests ストーリーのテスト実行(アクセシビリティ含む)と結果返却
自己修復ループ:Claude Codeがrun-story-testsでテスト失敗を検出→原因を分析→コードを修正→再テスト——このサイクルを人手なしで回せるのがStorybook MCPの最大の価値です。

セットアップ

Storybook MCPアドオンのインストール
# 公式アドオンをインストール
npx storybook add @storybook/addon-mcp

# Claude CodeにMCPサーバーを登録
claude mcp add storybook-mcp --transport http http://localhost:6006/mcp --scope project

.storybook/main.ts の設定

.storybook/main.ts
import type { StorybookConfig } from "@storybook/react-vite";

const config: StorybookConfig = {
  stories: ["../src/**/*.stories.@(ts|tsx)"],
  addons: [
    "@storybook/addon-essentials",
    "@storybook/addon-mcp",
  ],
  features: {
    // Storybook 9ではデフォルトtrue。Storybook 8.xでは明示的に有効化が必要
    componentsManifest: true,
  },
  framework: {
    name: "@storybook/react-vite",
    options: {},
  },
};

export default config;
Storybook MCPはViteベースのStorybook(@storybook/react-vite@storybook/nextjs-vite等)のみ対応しています。Webpack版では動作しません。

.mcp.json への設定(チーム共有用)

.mcp.json(プロジェクトルート)
{
  "mcpServers": {
    "storybook": {
      "type": "http",
      "url": "http://localhost:6006/mcp"
    }
  }
}

MCPの詳しい設定方法はClaude Code MCP完全ガイドをご覧ください。

Story自動生成 ── MCPを活用した正確な生成フロー

Storybook MCPの最大の利点は、Claude Codeがコンポーネントの実際のPropsを「推測」ではなく「取得」してからストーリーを書ける点です。

MCPを使った生成フロー

Story自動生成プロンプト
src/components/Button.tsx のStorybookストーリーを作成してください。

手順:
1. get-storybook-story-instructions でこのプロジェクトのStory作成ルールを確認
2. list-all-documentation で既存コンポーネント一覧を確認(重複防止)
3. get-documentation で Button のProps情報を取得
4. CSF3形式でストーリーを生成(autodocs、全バリアント、play関数付き)
5. preview-stories でプレビュー確認
6. run-story-tests でテスト実行・検証
生成されるStory例(CSF3形式)
import type { Meta, StoryObj } from "@storybook/react";
import { expect, fn } from "storybook/test";
import { Button } from "./Button";

const meta = {
  component: Button,
  tags: ["autodocs"],
  args: {
    onClick: fn(),
  },
  argTypes: {
    variant: {
      control: "select",
      options: ["primary", "secondary", "danger"],
    },
    size: {
      control: "select",
      options: ["sm", "md", "lg"],
    },
    disabled: { control: "boolean" },
    loading: { control: "boolean" },
  },
} satisfies Meta<typeof Button>;

export default meta;
type Story = StoryObj<typeof meta>;

// 各バリアント
export const Primary: Story = {
  args: { variant: "primary", children: "送信" },
};

export const Secondary: Story = {
  args: { variant: "secondary", children: "キャンセル" },
};

export const Danger: Story = {
  args: { variant: "danger", children: "削除" },
};

// 状態別
export const Disabled: Story = {
  args: { variant: "primary", children: "送信", disabled: true },
};

export const Loading: Story = {
  args: { variant: "primary", children: "送信", loading: true },
};

// インタラクションテスト
export const ClickTest: Story = {
  args: { variant: "primary", children: "クリック" },
  play: async ({ args, canvas, step, userEvent }) => {
    await step("ボタンをクリック", async () => {
      await userEvent.click(
        canvas.getByRole("button", { name: "クリック" })
      );
    });
    await expect(args.onClick).toHaveBeenCalledOnce();
  },
};
satisfies Meta<typeof Button>構文はTypeScriptのsatisfies演算子を使い、metaオブジェクトの型安全性を保ちつつ、ストーリーの型推論を正確にします。Storybook 9 + CSF3の標準パターンです。

Play Functionでインタラクションテストを自動生成する

Storybook 9のPlay Functionは、ユーザー操作のシミュレーションとアサーションをストーリー内に書けるテスト機能です。Claude Codeにフォームの送信テストなどを自動生成させられます。

Play Function生成プロンプト
src/components/LoginForm.tsx のストーリーを作成してください。
Play Functionで以下のインタラクションテストを含めること:
- メールとパスワードを入力してフォーム送信
- バリデーションエラー(空入力時のエラーメッセージ表示)
- step() でテストを論理的にグループ化
LoginFormのPlay Functionテスト
import type { Meta, StoryObj } from "@storybook/react";
import { expect, fn } from "storybook/test";
import { LoginForm } from "./LoginForm";

const meta = {
  component: LoginForm,
  tags: ["autodocs"],
  args: {
    onSubmit: fn(),
  },
} satisfies Meta<typeof LoginForm>;

export default meta;
type Story = StoryObj<typeof meta>;

export const SuccessfulLogin: Story = {
  play: async ({ args, canvas, step, userEvent }) => {
    await step("認証情報を入力", async () => {
      await userEvent.type(
        canvas.getByLabelText("メールアドレス"),
        "user@example.com"
      );
      await userEvent.type(
        canvas.getByLabelText("パスワード"),
        "password123"
      );
    });

    await step("フォームを送信", async () => {
      await userEvent.click(
        canvas.getByRole("button", { name: "ログイン" })
      );
    });

    await expect(args.onSubmit).toHaveBeenCalledWith({
      email: "user@example.com",
      password: "password123",
    });
  },
};

export const ValidationError: Story = {
  play: async ({ canvas, step, userEvent }) => {
    await step("空のまま送信", async () => {
      await userEvent.click(
        canvas.getByRole("button", { name: "ログイン" })
      );
    });

    await step("エラーメッセージを確認", async () => {
      await expect(
        canvas.getByText("メールアドレスを入力してください")
      ).toBeInTheDocument();
    });
  },
};
Play Functionで書いたテストは、Storybook 9のVitest統合によりCIでもvitest runで実行できます。ブラウザで確認するテストとCI自動テストが同じコードベースで動きます。

Chromaticでビジュアルリグレッションテストを自動化する

Chromaticは、Storybookのストーリーを自動でスクリーンショット撮影し、前回との差分を検出するビジュアルリグレッションテスト(VRT)ツールです。

.github/workflows/chromatic.yml
name: Chromatic

on: push

jobs:
  chromatic:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0  # 全コミット履歴が必要

      - uses: actions/setup-node@v4
        with:
          node-version: 22

      - run: npm ci

      - uses: chromaui/action@latest
        with:
          projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
Chromaticにpublishすると、ホスト型MCPエンドポイント(https://your-url/mcp)も利用可能になります。ローカルのStorybookを起動せずに、Claude Codeがコンポーネント情報にアクセスできます。

Figma MCP × Storybook MCP ── デザインから実装まで一気通貫

Figma MCPとStorybook MCPを両方設定すると、デザイン→コンポーネント実装→Story作成→テストの全フローをClaude Codeに任せられます。

.mcp.json(Figma + Storybook両方)
{
  "mcpServers": {
    "storybook": {
      "type": "http",
      "url": "http://localhost:6006/mcp"
    },
    "figma": {
      "type": "http",
      "url": "https://mcp.figma.com/mcp"
    }
  }
}
Figma→コンポーネント→Story の一気通貫プロンプト
Figmaの以下のフレームを参照して、
Reactコンポーネント + Storybook Storiesを作成してください。
[Figma URL をペースト]

手順:
1. Figma MCPでデザイントークン・レイアウト情報を取得
2. Storybook MCPの get-storybook-story-instructions でStory作成ルールを確認
3. get-documentation で既存の類似コンポーネントを確認(重複防止)
4. コンポーネント実装(Tailwind CSS v4)
5. CSF3 Stories生成(autodocs + 全バリアント + play関数)
6. run-story-tests で検証

CLAUDE.mdテンプレート(Storybook開発用)

CLAUDE.md(Storybook設定)
## Storybook開発ルール

### MCPツール利用(必須)
- UI開発前に必ずStorybook MCPツールを呼ぶ
- list-all-documentation → get-documentation の順で既存を確認
- コンポーネントのPropsを推測しない(必ずMCPから取得)
- 作業完了後は run-story-tests で検証

### Story作成規約
- CSF3 + TypeScript(satisfies Meta<typeof Component> 構文)
- tags: ["autodocs"] を必ず付与
- argTypes はProps型から自動マッピング
- fn() でコールバック関数をスパイ化

### 必須バリエーション
1. Default(デフォルト状態)
2. 各variant(Primary, Secondary, Danger等)
3. 各size(sm, md, lg)
4. 状態別(Disabled, Loading, Error, Empty)
5. インタラクション(play関数によるユーザー操作テスト)

### Play Function規約
- step() でテストを論理的にグループ化する
- フォーム送信・クリック・入力の主要操作をカバー
- expect() でアサーション必須
- アクセシビリティ(role, label)でDOM要素を取得する(testIDは最終手段)

CLAUDE.mdの詳しい書き方はCLAUDE.md完全ガイドをご覧ください。

よくある質問

QStorybook MCPはWebpack版のStorybookで使えますか?
A現時点ではViteベースのStorybookのみ対応しています。@storybook/react-viteまたは@storybook/nextjs-viteを使用してください。Webpack版からの移行はnpx storybook@latest upgradeで行えます。
QPlay Functionで書いたテストはCIでも実行できますか?
Aはい。Storybook 9のVitest統合により、vitest runでPlay Functionを含む全ストーリーのテストをCIで実行できます。ブラウザで確認するテストとCIテストが同じコードで動くため、二重メンテナンスが不要です。
QChromaticは無料で使えますか?
AChromaticには無料プラン(月5,000スナップショットまで)があります。小規模プロジェクトやOSSには十分です。大規模プロジェクトではTurboSnap(差分のみスナップショット)を有効にしてスナップショット数を削減できます。
QClaude Codeが古いCSF2形式でストーリーを生成します
ACLAUDE.mdに「CSF3 + satisfies Meta<typeof Component> 構文を使用。CSF2(export const story = Template.bind({}))は使用しない」と明記してください。さらにStorybook MCPのget-storybook-story-instructionsを呼ぶと、プロジェクトのStory作成ルールが自動で取得されるため、正しい形式で生成されます。
QStorybook MCPとChromaticのホスト型MCPは何が違いますか?
AStorybook MCPはローカルのStorybook(http://localhost:6006/mcp)に接続します。Chromaticのホスト型MCPはChromaticにpublish済みのStorybookに接続するため、ローカルでStorybookを起動する必要がありません。CIや他のマシンからコンポーネント情報にアクセスする場合に便利です。

まとめ

  • Storybook MCP: 6つのツールでClaude CodeからProps取得・Story生成・テスト実行・プレビュー確認が直接可能
  • 自己修復ループ: run-story-tests→問題検出→自動修正→再テストのサイクルを人手なしで回せる
  • CSF3 + Play Function: 型安全なストーリーとインタラクションテストをClaude Codeが自動生成
  • Chromatic: GitHub ActionsでPRごとにビジュアルリグレッションテストを自動実行
  • Figma MCP連携: デザイン→コンポーネント→Story→テストの一気通貫フロー
  • CLAUDE.md: MCPツール必須利用・CSF3規約・Play Function規約を明記して生成品質を担保

フロントエンド開発全般はClaude Codeフロントエンド開発ガイド、テスト戦略はClaude Codeテスト完全ガイドもあわせてご覧ください。