伊達巻のイラスト

Storybook MCP を試してみた

Storybook MCP は Storybook と AI エージェントを接続し、エージェントがコンポーネントドキュメントを参照しつつコードを生成したり、ストーリーを作成して UI コンポーネントをテストしたりできるようにする機能です。この記事では、Storybook MCP を実際に試してみた内容を紹介します。

AI エージェントに UI の生成を任せる際、せっかく用意した UI コンポーネントを使ってもらえず、デザインシステムと一貫しない UI が生成されてしまうことがあります。また UI のインタラクションテストを実行する環境が整っていないと、人間が実際に試してみて初めて問題に気づき、AI にフィードバックを送るという非効率なやり取りが発生しがちです。Storybook MCP はこうした課題を解決するために、エージェントが Storybook のドキュメントを直接参照しながらコードを生成し、ストーリーのテストまで自律的に実行できる仕組みを提供します。

この記事では、Storybook MCP を実際に試してみた内容を紹介します。

Note

Storybook MCP は 2026 年 3 月 25 日現在、React 向けの Storybook でのみ利用可能な機能です。

Storybook MCP のセットアップ

Storybook MCP を使用するには @storybook/addon-mcp アドオンが必要です。以下のコマンドでインストールします。

npm install @storybook/addon-mcp

.storybook/main.ts ファイルを開いて、@storybook/addon-mcp をアドオンに追加します。

.storybook/main.ts
  export default {
    "stories": [
      "../src/**/*.stories.mdx",
      "../src/**/*.stories.@(js|jsx|ts|tsx)"
    ],
    "addons": [
     "@chromatic-com/storybook",
     "@storybook/addon-vitest",
     "@storybook/addon-a11y",
-    "@storybook/addon-docs"
+    "@storybook/addon-docs",
+    "@storybook/addon-mcp"
   ],
   "framework": "@storybook/react-vite"
 };

@storybook/addon-mcp を追加したら、Storybook を起動します。

npm run storybook

http://localhost:6006/mcp エンドポイントが利用可能になっていることを確認してください。

AI エージェントに http トランスポート形式で MCP サーバーを接続します。コーディングエージェントの種類に応じて MCP サーバーの接続方法は異なりますが、ここでは Claude Code を例に説明します。以下のコマンドでプロジェクト単位で MCP サーバーを Claude Code に接続します。Chromatic などに Storybook をデプロイしている場合は、デプロイ先の URL を指定できます。

claude mcp add --transport http storybook http://localhost:6006/mcp --scope project

プロジェクトのルートディレクトリに .mcp.json ファイルが作成され、MCP サーバーの接続情報が保存されます。

.mcp.json
{
  "mcpServers": {
    "storybook": {
      "type": "http",
      "url": "http://localhost:6006/mcp"
    }
  }
}

Storybook を起動したまま Claude Code を起動し、/mcp コマンドを使用して Storybook が接続されていることを確認します。

Storybook MCP は以下の 6 つのツールを提供しています。

  • list-all-documentation: 利用可能なコンポーネント・ドキュメントの ID 一覧を取得する。withStoryIds: true を指定するとストーリー ID も取得できる
  • get-documentation: ID を指定してコンポーネントの詳細ドキュメント(props、使用例、ストーリー)を取得する
  • get-documentation-for-story: 特定のストーリーバリアントの追加ドキュメントを取得する
  • get-storybook-story-instructions: ストーリーの作成・更新・テスト修正に関する包括的なガイドラインを取得する。ストーリーファイルを操作する前に呼び出すことで、正しいパターンやインポートパスに従える
  • preview-stories: コンポーネントやストーリーの変更後にプレビュー URL を返す。変更のたびに呼び出し、結果 URL をユーザーに提示する
  • run-story-tests: ストーリーのテストを実行する。失敗があれば修正してから完了報告する

「ドキュメント化されたすべてのコンポーネントを一覧表示」といったプロンプトを Claude Code に投げてみて、実際に Storybook MCP が動作していることを確認してみましょう。list-all-documentation ツールを使用してコンポーネントの一覧を取得してくれていることがわかります。

必要に応じて AGENTS.mdCLAUDE.md などのエージェント向けのドキュメントにツールの使用方法を記載しておくと、エージェントがツールを正しく使用するのに役立ちます。

AGENTS.md
When working on UI components, always use the `your-project-sb-mcp` MCP tools to access Storybook's component and documentation knowledge before answering or taking any action.
 
- **CRITICAL: Never hallucinate component properties!** Before using ANY property on a component from a design system (including common-sounding ones like `shadow`, etc.), you MUST use the MCP tools to check if the property is actually documented for that component.
- Query `list-all-documentation` to get a list of all components
- Query `get-documentation` for that component to see all available properties and examples
- Only use properties that are explicitly documented or shown in example stories
- If a property isn't documented, do not assume properties based on naming conventions or common patterns from other libraries. Check back with the user in these cases.
- Use the `get-storybook-story-instructions` tool to fetch the latest instructions for creating or updating stories. This will ensure you follow current conventions and recommendations.
- Check your work by running `run-story-tests`.
 
Remember: A story name might not reflect the property name correctly, so always verify properties through documentation or example stories before using them.

次は具体的なユースケースとして、Storybook MCP を使用してみます。

既存の UI コンポーネントを再利用して UI を生成する

Storybook MCP を使用すると、UI コンポーネントのドキュメントを参照しながらコードを生成できます。「ログインフォームを作成してみて」といったプロンプトを渡して UI を生成してもらいましょう。

実装計画を立てるために list-all-documentation ツールや get-documentation ツールを使用して、ログインフォームに必要なコンポーネント(テキストフィールド、ボタンなど)のドキュメントを参照していることがわかります。

get-documentation ツールでは <Button> コンポーネントのドキュメントや Story のバリアント(Primary、Secondary、Disabled)、Props 仕様などを確認しています。Best practices for using Storybook with AI でも記載されているように、コンポーネントがどの目的でなぜ使用されるのか(Primary はフォーム送信などのメインアクションで使用する、Danger は削除・リセット操作で使用するなど)についてドキュメント化されていることが重要です。Props の各属性はどのように使用するのかも含め、どれだけ詳細にコンポーネントがドキュメント化されているかに AI エージェントが生成するコードの品質が大きく依存することでしょう。

コンポーネントの仕様をあらかじめ詳細に確認していることもあり、計画時点でどの Props を使用するかも明確に指定してくれています。

上記で参照したコンポーネントを使用して LoginForm コンポーネントとその Story を生成し、インタラクションテストの計画も含めて提案してくれています。

UI の実装が完了すると run-story-tests ツールを使用して Story のインタラクションテストを実行し、テストが失敗したので自律的に修正して再度テストを実行していることがわかります。カラーコントラスト比のようにアクセシビリティの問題もしっかり検知してくれていますね。

すべてのテストが成功した後 preview-stories ツールを使用して Storybook 上のプレビュー画面の URL を返してくれています。生成されたコードが Storybook 上でどのように表示されているかも確認してみましょう。

VSCode の Copilot Agent のように MCP Apps に対応しているエージェントであれば、その場で生成された Story をプレビューできるようです。

実際に生成されたコードは以下のようになりました。Story の Variant ごとのドキュメントをもう少し書いておいてもらいたいところですが、主要なテストケースはしっかりカバーできていることがわかります。

LoginForm.stories.tsx
import type { Meta, StoryObj } from "@storybook/react-vite";
import { expect, fn, userEvent } from "storybook/test";
import { LoginForm } from "./LoginForm";
 
const meta: Meta<typeof LoginForm> = {
  component: LoginForm,
  title: "Components/LoginForm",
  tags: ["autodocs"],
};
 
export default meta;
type Story = StoryObj<typeof LoginForm>;
 
export const Default: Story = {
  name: "Default",
  args: {
    onSubmit: fn(),
  },
};
 
export const Loading: Story = {
  name: "Loading",
  args: {
    isLoading: true,
    onSubmit: fn(),
  },
};
 
export const WithError: Story = {
  name: "With Error",
  args: {
    error: "メールアドレスまたはパスワードが正しくありません",
    onSubmit: fn(),
  },
};
 
export const SuccessfulSubmit: Story = {
  name: "Successful Submit",
  args: {
    onSubmit: fn(),
  },
  play: async ({ canvas, args }) => {
    await userEvent.type(
      canvas.getByLabelText("メールアドレス"),
      "[email protected]",
    );
    await userEvent.type(canvas.getByLabelText("パスワード"), "password123");
    await userEvent.click(canvas.getByRole("button", { name: "ログイン" }));
    await expect(args.onSubmit).toHaveBeenCalledWith(
      "[email protected]",
      "password123",
    );
  },
};
 
export const ValidationError: Story = {
  name: "Validation Error",
  args: {
    onSubmit: fn(),
  },
  play: async ({ canvas, args }) => {
    await userEvent.click(canvas.getByRole("button", { name: "ログイン" }));
    await expect(
      canvas.getByText("メールアドレスを入力してください"),
    ).toBeVisible();
    await expect(
      canvas.getByText("パスワードを入力してください"),
    ).toBeVisible();
    await expect(args.onSubmit).not.toHaveBeenCalled();
  },
};

まとめ

  • Storybook MCP を使用すると、Storybook と AI エージェントを接続し、エージェントがコンポーネントドキュメントを参照しつつコードを生成したり、ストーリーを作成して UI コンポーネントをテストしたりできるようになる
  • @storybook/addon-mcp アドオンをインストールして Storybook MCP をセットアップする。Storybook を起動すると http://localhost:6006/mcp エンドポイントが利用可能になる
  • AI エージェントに http トランスポート形式で MCP サーバーを接続する
  • Storybook MCP は list-all-documentationget-documentationget-documentation-for-storyget-storybook-story-instructionspreview-storiesrun-story-tests の 6 つのツールを提供している
  • Storybook MCP を使用して、コンポーネントのドキュメントを参照しながらコードを生成したり、ストーリーを作成して UI コンポーネントをテストしたりできる
  • 生成されたコードの品質は、UI をどれだけ詳細にドキュメント化しているかに大きく依存する。コンポーネントの目的や使用方法、Props の仕様などを詳細にドキュメント化しておくことが重要

参考

記事の理解度チェック

以下の問題に答えて、記事の理解を深めましょう。

Storybook MCP を使用するために必要なアドオンはどれか?

  • @storybook/addon-mcp

    正解!

    @storybook/addon-mcp をインストールして .storybook/main.ts に追加することで、Storybook MCP が利用可能になります

  • @storybook/addon-ai

    もう一度考えてみましょう

  • @storybook/addon-agent

    もう一度考えてみましょう

  • @storybook/addon-llm

    もう一度考えてみましょう

Storybook MCP で、コンポーネントの詳細ドキュメント(props、使用例、ストーリー)を取得するためのツールはどれか?

  • list-all-documentation

    もう一度考えてみましょう

    list-all-documentation は利用可能なコンポーネント・ドキュメントの ID 一覧を取得するツールです

  • get-documentation

    正解!

    get-documentation は ID を指定してコンポーネントの詳細ドキュメント(props、使用例、ストーリー)を取得するツールです

  • preview-stories

    もう一度考えてみましょう

    preview-stories はコンポーネントやストーリーの変更後にプレビュー URL を返すツールです

  • run-story-tests

    もう一度考えてみましょう

    run-story-tests はストーリーのテストを実行するツールです