MCPとは
Model Context Protocol(MCP) は、AIクライアント(Claude、Cursor、GitHub Copilotなど)とアプリケーションが標準化されたプロトコルで通信するための仕様です。MCPサーバーを実装することで、AIエージェントはあなたのLaravelアプリケーションのデータにアクセスしたり、アクションを実行したりできるようになります。Laravel MCP は Laravel 13 で追加された公式パッケージです。
laravel/mcp として提供されており、MCPサーバーの構築に必要な一連の機能を提供します。インストール
Composerでパッケージをインストールします。vendor:publish Artisanコマンドを実行して routes/ai.php ファイルを生成します。
routes/ai.php ファイルが作成されます。ここにMCPサーバーの登録を記述します。
サーバーの作成
make:mcp-server Artisanコマンドでサーバークラスを生成します。
app/Mcp/Servers ディレクトリにサーバークラスが生成されます。
サーバーの登録
サーバーを作成したらroutes/ai.php で登録します。登録方法には Webサーバー と ローカルサーバー の2種類があります。
Webサーバー
WebサーバーはHTTP POSTリクエストでアクセスできます。リモートのAIクライアントやWebベースの連携に最適です。ローカルサーバー
ローカルサーバーはArtisanコマンドとして動作します。Claude DesktopなどのローカルAIクライアントとの連携に使います。ツール
ツールはAIクライアントが呼び出せる関数です。データの取得、外部APIとの連携、データベースの操作などを実装できます。ツールの作成
make:mcp-tool Artisanコマンドでツールクラスを生成します。
$tools プロパティに登録します。
ツールの名前と説明
クラス名からデフォルトの名前とタイトルが自動生成されます。CurrentWeatherTool であれば名前は current-weather、タイトルは Current Weather Tool になります。Name と Title 属性でカスタマイズできます。
入力スキーマ
schema メソッドで入力パラメーターのスキーマを定義します。LaravelのJSONスキーマビルダーを使って型や制約を指定できます。
出力スキーマ
outputSchema メソッドでレスポンスの構造を定義できます。AIクライアントがレスポンスを解析しやすくなります。
バリデーション
handle メソッド内でLaravelの標準バリデーション機能を使えます。
依存性注入
Laravelのサービスコンテナを通じてツールが解決されるため、コンストラクタやhandle メソッドで依存関係を型ヒントできます。
アノテーション
ツールにアノテーションを追加することで、AIクライアントにツールの振る舞いに関する追加情報を提供できます。条件付き登録
shouldRegister メソッドを実装することで、実行時にツールを条件付きで登録できます。
false を返すとそのツールはAIクライアントから見えなくなります。
レスポンス
ツールはLaravel\Mcp\Response のインスタンスを返す必要があります。
テキストレスポンス
テキストレスポンス
エラーレスポンス
エラーレスポンス
画像・音声レスポンス
画像・音声レスポンス
複数コンテンツのレスポンス
複数コンテンツのレスポンス
構造化レスポンス
構造化レスポンス
AIクライアントが解析しやすい構造化データを返します。
ストリーミングレスポンス
ストリーミングレスポンス
長時間かかる処理で途中経過をリアルタイム送信します。
プロンプト
プロンプトは再利用可能なプロンプトテンプレートです。AIクライアントが言語モデルと対話する際に使う定型的なクエリを標準化した形で提供できます。プロンプトの作成
$prompts プロパティに登録します。
プロンプトの引数
arguments メソッドでプロンプトのパラメーターを定義します。
バリデーション
プロンプトの引数は定義に基づいて自動的にバリデーションされますが、より複雑なバリデーションルールを適用することもできます。 Laravel MCP は Laravel のバリデーション機能 とシームレスに連携します。プロンプトのhandle メソッド内で引数をバリデーションできます。
依存性注入
Laravelのサービスコンテナを通じてプロンプトが解決されるため、コンストラクタやhandle メソッドで依存関係を型ヒントできます。
handle メソッドでも型ヒントでき、サービスコンテナが自動的に解決・注入します。
条件付き登録
shouldRegister メソッドを実装することで、実行時にプロンプトを条件付きで登録できます。
false を返すとそのプロンプトはAIクライアントから見えなくなり、呼び出しもできなくなります。
プロンプトのレスポンス
プロンプトのhandle メソッドではユーザーメッセージとアシスタントメッセージを返せます。asAssistant() でアシスタント側のメッセージとして扱います。
リソース
リソースはAIクライアントがコンテキストとして読み込めるデータや情報です。ドキュメント、設定情報、動的データなど、AIの応答品質を向上させる情報を提供できます。リソースの作成
$resources プロパティに登録します。
URIとMIMEタイプ
デフォルトではクラス名からURIが自動生成されます(例:weather://resources/weather-guidelines)。Uri と MimeType 属性でカスタマイズできます。
リソーステンプレート
URI変数を持つ動的リソースを定義するにはHasUriTemplate インターフェースを実装します。
get メソッドで取得できます。
リソースのリクエスト
ツールやプロンプトとは異なり、リソースは入力スキーマや引数を定義できません。ただし、handle メソッド内でリクエストオブジェクトを通じてリクエスト情報にアクセスできます。
リソースの依存性注入
Laravelのサービスコンテナを通じてリソースが解決されるため、コンストラクタやhandle メソッドで依存関係を型ヒントできます。
handle メソッドでも型ヒントでき、サービスコンテナが自動的に解決・注入します。
リソースのアノテーション
リソースにはオーディエンス、優先度、最終更新日などのアノテーションを付けられます。リソースの条件付き登録
shouldRegister メソッドを実装することで、実行時にリソースを条件付きで登録できます。
false を返すとそのリソースはAIクライアントから見えなくなり、アクセスもできなくなります。
リソースのレスポンス
リソースはLaravel\Mcp\Response のインスタンスを返す必要があります。
テキストコンテンツには text メソッドを使います。
リソースリンクレスポンス
resourceLink メソッドでリソースリンクを返せます。埋め込みリソースとは異なり、AIクライアントが独立して取得するURIポインターを返します。
Blobレスポンス
バイナリコンテンツを返すにはblob メソッドを使います。MIMEタイプはリソースの #[MimeType] 属性で設定します。
エラーレスポンス
エラーを示す場合はerror メソッドを使います。
アプリ
Laravel MCPはMCP Appsをサポートしています。これはModel Context Protocolの拡張機能で、ツールがサポートされたホスト内のサンドボックスiframe上でインタラクティブなHTMLアプリケーションをレンダリングできるようにします。これにより、プレーンテキストのレスポンスを超えた、ダッシュボード、フォーム、ビジュアライゼーション、その他のリッチな体験を構築できます。 MCPアプリは以下の2つのパーツが連携して動作します。- アプリリソース — アプリケーションの自己完結型HTMLを返します。
- ツール —
#[RendersApp]アトリビュートを使ってアプリリソースにリンクされます。ツールが呼び出されると、ホストがリンクされたリソースを取得してレンダリングします。
アプリリソースの作成
make:mcp-app-resource Artisanコマンドでアプリリソースを作成できます。
app/Mcp/Resources 内のPHPクラスと resources/views/mcp 内のBladeビューです。ビュー名はクラス名から自動的に推測されます。たとえば WeatherDashboardApp は mcp.weather-dashboard-app にマッピングされます。
AppResource はベースの Resource クラスを継承し、MCP Apps仕様で要求される ui:// URIスキームと text/html;profile=mcp-app MIMEタイプを自動的に設定します。他のリソースと同様に、サーバーの $resources 配列に登録する必要があります。
生成されたBladeビューは <x-mcp::app> コンポーネントを使用します。このコンポーネントはクライアントサイドのMCP SDKがバンドルされた完全なHTMLドキュメントをレンダリングします。
createMcpApp グローバル関数はバンドルされたSDKが提供します。iframeのサーバーへの接続、ホストテーマの適用、callServerTool・sendMessage・openLinkなどのヘルパーやイベントコールバックの公開を処理します。完全なクライアントサイドAPIについてはMCP Apps仕様を参照してください。
ツールからアプリをレンダリング
アプリリソースを表示するには、#[RendersApp] アトリビュートを使ってツールにリンクします。ツールが呼び出されると、Laravel MCPはリソースのURIをツールのメタデータに含め、ホストがサンドボックスiframe内でアプリをレンダリングできるようにします。
AppResource が登録されると、Laravel MCPは自動的に io.modelcontextprotocol/ui ケイパビリティをアドバタイズします。追加のサーバー設定は不要です。アプリツールの可視性
各#[RendersApp] ツールは visibility 引数で呼び出し元を制限できます。これは、UIがデータを読み込み・更新するために呼び出すプライベートなアプリ専用ツールを、モデルからは見えないようにする場合に便利です。
Visibility enumには Model と App の2つのケースがあり、デフォルトは両方です。UIが直接呼び出すバックエンドアクションには [Visibility::App] を、UIからツールを利用不可にするには [Visibility::Model] を使います。
アプリの設定
アプリリソースの#[AppMeta] アトリビュートで、iframeのContent Security Policy、ブラウザ権限、ビューの <head> に含めるライブラリスクリプトを設定します。
Library enumには Library::Tailwind や Library::Alpine など一般的なフロントエンドライブラリのCDNスクリプトが事前設定されており、CDNオリジンは自動的にCSPにマージされます。Permission enumは Camera・Microphone・Geolocation・ClipboardWrite などのブラウザ権限をカバーします。
Boostを使ったアプリ開発
Laravel MCPにはMCP Appsを構築するための専用Boostスキルリファレンスが含まれています。Laravel Boostがインストールされていれば、AIコーディングエージェントがmcp-development スキルを呼び出し、アプリリソース、Bladeビュー、リンクされたツールを自動生成できます。
プロトコルの完全なリファレンス(クライアントサイドAPIやスキーマの詳細を含む)については、公式のMCP Appsドキュメントを参照してください。
メタデータ
MCP仕様の_meta フィールドをツール、リソース、プロンプトのレスポンスに付加できます。
Response::make を使います。
$meta プロパティを定義します。
アイコン
MCP クライアントはサーバーとそのプリミティブのアイコンを表示できます。Icon 属性を使ってサーバー、ツール、リソース、プロンプトにアイコンを宣言できます。
Icon 属性は繰り返し使用可能なため、異なるサイズやライト・ダークテーマのバリアントを提供するために複数のアイコンを宣言できます。
または、icons メソッドをオーバーライドしてプログラムでアイコンを定義することもできます。これはアイコンがランタイムの条件に依存する場合に便利です。
icons メソッドで定義されたアイコンは自動的に結合されます。アイコンパスは以下のように解決されます。
https:やdata:などの URI スキームを持つパスはそのまま使用されます。- 相対パスは Laravel の
assetヘルパーを使って URL に解決されます。
認証
WebサーバーはLaravelの標準的なミドルウェアで認証できます。Sanctum
Laravel Sanctum を使ったトークン認証です。MCPクライアントはAuthorization: Bearer <token> ヘッダーを送信します。
OAuth 2.1
Laravel Passport を使ったOAuth認証です。より堅牢なセキュリティが必要な場合に適しています。認可
$request->user() で認証済みユーザーを取得し、ツールやリソース内で認可チェックを行えます。
MCP クライアント
Laravel MCP はサーバーの構築だけでなく、他の MCP サーバーへ接続するためのクライアントも提供しています。クライアントを使うことで、外部 MCP サーバーが公開するツールを発見・呼び出しできます。AI エージェント に外部 MCP サーバーの機能を提供する際にとくに有用です。サーバーへの接続
HTTP でアクセスできる MCP サーバーにはClient::web メソッドを使い、サーバーの URL を渡します。
Client::local メソッドを使い、コマンドと引数を渡します。
connect、connected、ping、disconnect メソッドを使います。
withTimeout メソッドでリクエストタイムアウトをカスタマイズできます。
名前付きクライアント
クライアントを毎回構築するかわりに、再利用可能な名前付きクライアントを登録できます。通常はMcp ファサードを使い、サービスプロバイダーの boot メソッド内で行います。
クライアント認証
Bearer トークンで保護されている Web MCP サーバーへ接続するにはwithToken メソッドを使います。トークン文字列または遅延解決するクロージャを渡せます。
withOAuth メソッドを使います。
MCP サーバーが動的クライアント登録をサポートしている場合、
clientId と clientSecret は省略できます。クライアントが自動登録します。routes/ai.php ファイルで名前付きクライアントの OAuth ルートを oAuthRoutesFor メソッドを使って登録します。渡すクロージャは認可コードとアクセストークンが交換された後にクライアント名と TokenSet を受け取ります。
mcp.oauth.{client}.connect)と、認可コードを交換してハンドラーを呼び出す callback ルート(mcp.oauth.{client}.callback)です。どちらも web ミドルウェアグループを使います(middleware 引数で上書き可能)。
認可フローを開始するには、ユーザーを connect ルートへリダイレクトします。
ツール
tools メソッドで MCP サーバーが公開するツールを取得します。名前をキーにしたコレクションとして返されます。
limit 引数で取得数を制限できます。
callTool メソッドを使い、ツール名と引数の配列を渡します。返される ToolResult インスタンスでレスポンスを取得します。
プロンプト
prompts メソッドで MCP サーバーが公開するプロンプトを取得します。名前をキーにしたコレクションとして返されます。
limit 引数で取得数を制限できます。
getPrompt メソッドを使い、プロンプト名と引数の配列を渡します。返される PromptResult インスタンスで生成されたメッセージを取得できます。
リソース
resources メソッドで MCP サーバーが公開するリソースを取得します。URI をキーにしたコレクションとして返されます。
limit 引数で取得数を制限できます。
readResource メソッドを使い、リソースの URI を渡します。返される ResourceReadResult インスタンスでリソースのコンテンツを取得できます。
テスト
MCP Inspector
MCPサーバーの動作確認には、インタラクティブなデバッグツール「MCP Inspector」を使います。ユニットテスト
ツール・リソース・プロンプトに対してユニットテストを書けます。actingAs を使います。
assertHasErrors / assertHasNoErrors を使います。
assertSentNotification と assertNotificationCount を使います。
dd または dump メソッドを使います。