Skip to main content

MCPとは

Model Context Protocol(MCP) は、AIクライアント(Claude、Cursor、GitHub Copilotなど)とアプリケーションが標準化されたプロトコルで通信するための仕様です。MCPサーバーを実装することで、AIエージェントはあなたのLaravelアプリケーションのデータにアクセスしたり、アクションを実行したりできるようになります。
Laravel MCP は Laravel 13 で追加された公式パッケージです。laravel/mcp として提供されており、MCPサーバーの構築に必要な一連の機能を提供します。
MCPサーバーが提供できる機能は主に3つです。

インストール

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クライアントとの連携に使います。
ローカルサーバーは通常、MCPクライアントが自動的に起動します。手動で mcp:start Artisanコマンドを実行する必要はありません。

ツール

ツールはAIクライアントが呼び出せる関数です。データの取得、外部APIとの連携、データベースの操作などを実装できます。

ツールの作成

make:mcp-tool Artisanコマンドでツールクラスを生成します。
作成したツールをサーバーの $tools プロパティに登録します。
基本的なツールクラスの実装例です。

ツールの名前と説明

クラス名からデフォルトの名前とタイトルが自動生成されます。CurrentWeatherTool であれば名前は current-weather、タイトルは Current Weather Tool になります。NameTitle 属性でカスタマイズできます。
ツールの説明(Description)は自動生成されません。AIモデルがツールの使い方を理解するために必須なので、必ず意味のある説明を設定してください。

入力スキーマ

schema メソッドで入力パラメーターのスキーマを定義します。LaravelのJSONスキーマビルダーを使って型や制約を指定できます。

出力スキーマ

outputSchema メソッドでレスポンスの構造を定義できます。AIクライアントがレスポンスを解析しやすくなります。

バリデーション

handle メソッド内でLaravelの標準バリデーション機能を使えます。
バリデーション失敗時にAIクライアントはエラーメッセージを参考に再試行します。具体的で実行可能なエラーメッセージを提供してください。

依存性注入

Laravelのサービスコンテナを通じてツールが解決されるため、コンストラクタや handle メソッドで依存関係を型ヒントできます。

アノテーション

ツールにアノテーションを追加することで、AIクライアントにツールの振る舞いに関する追加情報を提供できます。
利用可能なアノテーションは次のとおりです。

条件付き登録

shouldRegister メソッドを実装することで、実行時にツールを条件付きで登録できます。
false を返すとそのツールはAIクライアントから見えなくなります。

レスポンス

ツールは Laravel\Mcp\Response のインスタンスを返す必要があります。
AIクライアントが解析しやすい構造化データを返します。
長時間かかる処理で途中経過をリアルタイム送信します。

プロンプト

プロンプトは再利用可能なプロンプトテンプレートです。AIクライアントが言語モデルと対話する際に使う定型的なクエリを標準化した形で提供できます。

プロンプトの作成

サーバーの $prompts プロパティに登録します。

プロンプトの引数

arguments メソッドでプロンプトのパラメーターを定義します。

バリデーション

プロンプトの引数は定義に基づいて自動的にバリデーションされますが、より複雑なバリデーションルールを適用することもできます。 Laravel MCP は Laravel のバリデーション機能 とシームレスに連携します。プロンプトの handle メソッド内で引数をバリデーションできます。
バリデーション失敗時、AIクライアントはエラーメッセージを参考に再試行します。具体的で実行可能なメッセージを提供してください。

依存性注入

Laravelのサービスコンテナを通じてプロンプトが解決されるため、コンストラクタや handle メソッドで依存関係を型ヒントできます。
handle メソッドでも型ヒントでき、サービスコンテナが自動的に解決・注入します。

条件付き登録

shouldRegister メソッドを実装することで、実行時にプロンプトを条件付きで登録できます。
false を返すとそのプロンプトはAIクライアントから見えなくなり、呼び出しもできなくなります。

プロンプトのレスポンス

プロンプトの handle メソッドではユーザーメッセージとアシスタントメッセージを返せます。asAssistant() でアシスタント側のメッセージとして扱います。

リソース

リソースはAIクライアントがコンテキストとして読み込めるデータや情報です。ドキュメント、設定情報、動的データなど、AIの応答品質を向上させる情報を提供できます。

リソースの作成

サーバーの $resources プロパティに登録します。

URIとMIMEタイプ

デフォルトではクラス名からURIが自動生成されます(例: weather://resources/weather-guidelines)。UriMimeType 属性でカスタマイズできます。

リソーステンプレート

URI変数を持つ動的リソースを定義するには HasUriTemplate インターフェースを実装します。
URIからの変数は自動的にリクエストに取り込まれ、get メソッドで取得できます。

リソースのリクエスト

ツールやプロンプトとは異なり、リソースは入力スキーマや引数を定義できません。ただし、handle メソッド内でリクエストオブジェクトを通じてリクエスト情報にアクセスできます。

リソースの依存性注入

Laravelのサービスコンテナを通じてリソースが解決されるため、コンストラクタや handle メソッドで依存関係を型ヒントできます。
handle メソッドでも型ヒントでき、サービスコンテナが自動的に解決・注入します。

リソースのアノテーション

リソースにはオーディエンス、優先度、最終更新日などのアノテーションを付けられます。

リソースの条件付き登録

shouldRegister メソッドを実装することで、実行時にリソースを条件付きで登録できます。
false を返すとそのリソースはAIクライアントから見えなくなり、アクセスもできなくなります。

リソースのレスポンス

リソースは Laravel\Mcp\Response のインスタンスを返す必要があります。 テキストコンテンツには text メソッドを使います。

リソースリンクレスポンス

resourceLink メソッドでリソースリンクを返せます。埋め込みリソースとは異なり、AIクライアントが独立して取得するURIポインターを返します。
登録済みのリソースクラスまたはインスタンスを渡すこともできます。URI、名前、タイトル、説明、MIMEタイプを自動継承します。

Blobレスポンス

バイナリコンテンツを返すには blob メソッドを使います。MIMEタイプはリソースの #[MimeType] 属性で設定します。

エラーレスポンス

エラーを示す場合は error メソッドを使います。

アプリ

Laravel MCPはMCP Appsをサポートしています。これはModel Context Protocolの拡張機能で、ツールがサポートされたホスト内のサンドボックスiframe上でインタラクティブなHTMLアプリケーションをレンダリングできるようにします。これにより、プレーンテキストのレスポンスを超えた、ダッシュボード、フォーム、ビジュアライゼーション、その他のリッチな体験を構築できます。 MCPアプリは以下の2つのパーツが連携して動作します。
  • アプリリソース — アプリケーションの自己完結型HTMLを返します。
  • ツール#[RendersApp] アトリビュートを使ってアプリリソースにリンクされます。ツールが呼び出されると、ホストがリンクされたリソースを取得してレンダリングします。

アプリリソースの作成

make:mcp-app-resource Artisanコマンドでアプリリソースを作成できます。
このコマンドは2つのファイルを作成します。app/Mcp/Resources 内のPHPクラスと resources/views/mcp 内のBladeビューです。ビュー名はクラス名から自動的に推測されます。たとえば WeatherDashboardAppmcp.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のサーバーへの接続、ホストテーマの適用、callServerToolsendMessageopenLinkなどのヘルパーやイベントコールバックの公開を処理します。完全なクライアントサイドAPIについてはMCP Apps仕様を参照してください。

ツールからアプリをレンダリング

アプリリソースを表示するには、#[RendersApp] アトリビュートを使ってツールにリンクします。ツールが呼び出されると、Laravel MCPはリソースのURIをツールのメタデータに含め、ホストがサンドボックスiframe内でアプリをレンダリングできるようにします。
AppResource が登録されると、Laravel MCPは自動的に io.modelcontextprotocol/ui ケイパビリティをアドバタイズします。追加のサーバー設定は不要です。

アプリツールの可視性

#[RendersApp] ツールは visibility 引数で呼び出し元を制限できます。これは、UIがデータを読み込み・更新するために呼び出すプライベートなアプリ専用ツールを、モデルからは見えないようにする場合に便利です。
Visibility enumには ModelApp の2つのケースがあり、デフォルトは両方です。UIが直接呼び出すバックエンドアクションには [Visibility::App] を、UIからツールを利用不可にするには [Visibility::Model] を使います。

アプリの設定

アプリリソースの #[AppMeta] アトリビュートで、iframeのContent Security Policy、ブラウザ権限、ビューの <head> に含めるライブラリスクリプトを設定します。
Library enumには Library::TailwindLibrary::Alpine など一般的なフロントエンドライブラリのCDNスクリプトが事前設定されており、CDNオリジンは自動的にCSPにマージされます。Permission enumは CameraMicrophoneGeolocationClipboardWrite などのブラウザ権限をカバーします。
動的な設定が必要な場合は、Laravel\Mcp\Server\Ui 名前空間の AppMetaCspPermissions フルエントビルダーを使ってリソースの appMeta メソッドをオーバーライドします。

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認証です。より堅牢なセキュリティが必要な場合に適しています。
OAuth認証を使う場合は、Passportの認可ビューを公開してサービスプロバイダーに設定します。

認可

$request->user() で認証済みユーザーを取得し、ツールやリソース内で認可チェックを行えます。

MCP クライアント

Laravel MCP はサーバーの構築だけでなく、他の MCP サーバーへ接続するためのクライアントも提供しています。クライアントを使うことで、外部 MCP サーバーが公開するツールを発見・呼び出しできます。AI エージェント に外部 MCP サーバーの機能を提供する際にとくに有用です。

サーバーへの接続

HTTP でアクセスできる MCP サーバーには Client::web メソッドを使い、サーバーの URL を渡します。
コマンドとして起動するローカル MCP サーバーへは Client::local メソッドを使い、コマンドと引数を渡します。
クライアントは遅延接続(lazy connect)し、ツールの一覧取得や呼び出しを初めて行うときに自動的に接続を確立します。接続を手動で管理する場合は connectconnectedpingdisconnect メソッドを使います。
withTimeout メソッドでリクエストタイムアウトをカスタマイズできます。

名前付きクライアント

クライアントを毎回構築するかわりに、再利用可能な名前付きクライアントを登録できます。通常は Mcp ファサードを使い、サービスプロバイダーの boot メソッド内で行います。
登録後は名前でクライアントを解決できます。
名前付きクライアントはリクエストごとに一度だけ解決され、リクエストライフサイクルの終了時に自動的に切断されます。

クライアント認証

Bearer トークンで保護されている Web MCP サーバーへ接続するには withToken メソッドを使います。トークン文字列または遅延解決するクロージャを渡せます。
OAuth 2.1 で保護されているサーバーには withOAuth メソッドを使います。
MCP サーバーが動的クライアント登録をサポートしている場合、clientIdclientSecret は省略できます。クライアントが自動登録します。
次に、routes/ai.php ファイルで名前付きクライアントの OAuth ルートを oAuthRoutesFor メソッドを使って登録します。渡すクロージャは認可コードとアクセストークンが交換された後にクライアント名と TokenSet を受け取ります。
これにより2つの名前付きルートが登録されます。ユーザーを認可サーバーへリダイレクトする connect ルート(mcp.oauth.{client}.connect)と、認可コードを交換してハンドラーを呼び出す callback ルート(mcp.oauth.{client}.callback)です。どちらも web ミドルウェアグループを使います(middleware 引数で上書き可能)。 認可フローを開始するには、ユーザーを connect ルートへリダイレクトします。

ツール

tools メソッドで MCP サーバーが公開するツールを取得します。名前をキーにしたコレクションとして返されます。
クライアントは自動的にページネーションを処理してすべてのツールを取得します。limit 引数で取得数を制限できます。
ツールを呼び出すには callTool メソッドを使い、ツール名と引数の配列を渡します。返される ToolResult インスタンスでレスポンスを取得します。
一覧取得したツールインスタンスから直接呼び出すこともできます。
Laravel AI SDK でエージェントを構築している場合は、MCP クライアントのツールをエージェントに直接渡すことで、モデルがプロンプトへの応答中にそれらを呼び出せるようになります。詳細は AI SDK の MCP ツール セクションを参照してください。

プロンプト

prompts メソッドで MCP サーバーが公開するプロンプトを取得します。名前をキーにしたコレクションとして返されます。
クライアントは自動的にページネーションを処理してすべてのプロンプトを取得します。limit 引数で取得数を制限できます。
プロンプトを取得するには getPrompt メソッドを使い、プロンプト名と引数の配列を渡します。返される PromptResult インスタンスで生成されたメッセージを取得できます。

リソース

resources メソッドで MCP サーバーが公開するリソースを取得します。URI をキーにしたコレクションとして返されます。
クライアントは自動的にページネーションを処理してすべてのリソースを取得します。limit 引数で取得数を制限できます。
リソースを読み込むには readResource メソッドを使い、リソースの URI を渡します。返される ResourceReadResult インスタンスでリソースのコンテンツを取得できます。

テスト

MCP Inspector

MCPサーバーの動作確認には、インタラクティブなデバッグツール「MCP Inspector」を使います。
コマンドを実行するとMCP Inspectorが起動し、クライアント設定をコピーできます。認証ミドルウェアを設定している場合は、Authorizationヘッダーを含めて接続してください。

ユニットテスト

ツール・リソース・プロンプトに対してユニットテストを書けます。
プロンプトとリソースも同様にテストできます。
認証済みユーザーとして実行するには actingAs を使います。
主なアサーションメソッドは次のとおりです。
エラーの有無を検証するには assertHasErrors / assertHasNoErrors を使います。
ツール・リソース・プロンプトの名前やタイトル、説明を検証できます。
ストリーミングレスポンスのノーティフィケーションを検証するには assertSentNotificationassertNotificationCount を使います。
レスポンスの内容をデバッグするには dd または dump メソッドを使います。
最終更新日 2026年7月20日