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 |
ストーリーのテスト実行(アクセシビリティ含む)と結果返却 |
run-story-testsでテスト失敗を検出→原因を分析→コードを修正→再テスト——このサイクルを人手なしで回せるのが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 の設定
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/react-vite、@storybook/nextjs-vite等)のみ対応しています。Webpack版では動作しません。.mcp.json への設定(チーム共有用)
{
"mcpServers": {
"storybook": {
"type": "http",
"url": "http://localhost:6006/mcp"
}
}
}
MCPの詳しい設定方法はClaude Code MCP完全ガイドをご覧ください。
Story自動生成 ── MCPを活用した正確な生成フロー
Storybook MCPの最大の利点は、Claude Codeがコンポーネントの実際のPropsを「推測」ではなく「取得」してからストーリーを書ける点です。
MCPを使った生成フロー
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 でテスト実行・検証
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にフォームの送信テストなどを自動生成させられます。
src/components/LoginForm.tsx のストーリーを作成してください。 Play Functionで以下のインタラクションテストを含めること: - メールとパスワードを入力してフォーム送信 - バリデーションエラー(空入力時のエラーメッセージ表示) - step() でテストを論理的にグループ化
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();
});
},
};
vitest runで実行できます。ブラウザで確認するテストとCI自動テストが同じコードベースで動きます。Chromaticでビジュアルリグレッションテストを自動化する
Chromaticは、Storybookのストーリーを自動でスクリーンショット撮影し、前回との差分を検出するビジュアルリグレッションテスト(VRT)ツールです。
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 }}
https://your-url/mcp)も利用可能になります。ローカルのStorybookを起動せずに、Claude Codeがコンポーネント情報にアクセスできます。Figma MCP × Storybook MCP ── デザインから実装まで一気通貫
Figma MCPとStorybook MCPを両方設定すると、デザイン→コンポーネント実装→Story作成→テストの全フローをClaude Codeに任せられます。
{
"mcpServers": {
"storybook": {
"type": "http",
"url": "http://localhost:6006/mcp"
},
"figma": {
"type": "http",
"url": "https://mcp.figma.com/mcp"
}
}
}
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開発用)
## 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完全ガイドをご覧ください。
よくある質問
@storybook/react-viteまたは@storybook/nextjs-viteを使用してください。Webpack版からの移行はnpx storybook@latest upgradeで行えます。vitest runでPlay Functionを含む全ストーリーのテストをCIで実行できます。ブラウザで確認するテストとCIテストが同じコードで動くため、二重メンテナンスが不要です。get-storybook-story-instructionsを呼ぶと、プロジェクトのStory作成ルールが自動で取得されるため、正しい形式で生成されます。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テスト完全ガイドもあわせてご覧ください。
