Skip to main content

MCPサーバーとは(上級向け解説)

Model Context Protocol(MCP) は、AIクライアント(Claude、Cursor、GitHub Copilotなど)とアプリケーションが標準化されたプロトコルで通信するための仕様です。MCP には3つの主要なプリミティブがあります。 LaravelでMCPサーバーを構築する利点は、Eloquent・キャッシュ・認証・バリデーションといったLaravelのエコシステムをそのまま活用できることです。
この上級ガイドでは実践的な実装に踏み込みます。基本的なMCPの概念については 中級: Laravel MCP を参照してください。

インストールと初期設定

1

パッケージをインストールする

Composerでパッケージをインストールします。
2

ルートファイルを公開する

vendor:publish でMCPサーバーの登録場所となる routes/ai.php を生成します。
3

サーバークラスを生成する

Artisanコマンドでサーバークラスを作成します。
生成された app/Mcp/Servers/DatabaseServer.php にツール、リソース、プロンプトを登録します。
4

サーバーを登録する

routes/ai.php でサーバーをルートに登録します。
WebサーバーはHTTP POST経由でアクセスされます。ローカルサーバーはArtisanコマンドとして動作し、CLIベースのAIクライアントとの連携に使います。

ツールの実装

ツールはAIクライアントが呼び出せる関数です。Laravelのサービスコンテナ、バリデーション、Eloquentをそのまま使えます。

ツールの作成

生成されたクラスに handle メソッドと schema メソッドを実装します。

パラメータ定義(スキーマ)

schema メソッドで Illuminate\Contracts\JsonSchema\JsonSchema ビルダーを使い、受け付けるパラメータを定義します。

ツールアノテーション

MCPプロトコルのアノテーションを使うと、AIクライアントがツールの安全性を判断できます。

構造化レスポンス

AIクライアントがパースしやすいJSON形式のレスポンスを返す場合は Response::structured を使います。

ストリーミングレスポンス

長時間かかる処理では Generator を返すことで途中経過をストリームできます。
Webサーバーではストリーミングレスポンスが自動的にSSE(Server-Sent Events)ストリームとして送信されます。

条件付き登録

特定の条件を満たすユーザーにのみツールを公開できます。

リソースの実装

リソースはAIクライアントがコンテキストとして読み込むデータです。ドキュメント、設定情報、動的データを提供します。

静的リソース

動的リソース(URIテンプレート)

URIテンプレートを使うと、URLのパラメータに基づいて動的なリソースを提供できます。
AIクライアントは app://users/42/profile のようなURIでリソースを要求し、{userId} の値が $request->get('userId') で取得できます。

リソースアノテーション

リソースの優先度やオーディエンスを明示できます。

プロンプトの実装

プロンプトはAIクライアントが使える再利用可能なテンプレートです。定型的なクエリや複雑なワークフローを標準化します。

プロンプトの作成

asAssistant() を使うとメッセージがAIアシスタントの発言として扱われます。システムプロンプトとユーザーメッセージを組み合わせて、AIの振る舞いを細かく制御できます。

認証と認可

Sanctumによるトークン認証

最もシンプルな認証方法です。MCPクライアントは Authorization: Bearer <token> ヘッダーを付与します。

OAuth 2.1 による認証

より堅牢な認証にはLaravel Passportを使います。
OAuth認証を使う場合は、MCP提供の認可ビューを公開して AppServiceProvider に設定します。

カスタムミドルウェアによる認証

独自のAPIトークンを使っている場合は、カスタムミドルウェアで Authorization ヘッダーを検証します。

ツール内での認可

ツールやリソースの handle メソッド内で $request->user() を使い、きめ細かい認可チェックができます。
shouldRegister はツールをリストから非表示にするだけです。ツールが呼び出された際の認可チェックは handle メソッド内で必ず行ってください。

実践例: データベース操作ツール

Eloquentを使ってデータを検索・作成するツールの完全な実装例です。

サーバークラス

検索ツール(読み取り専用)

作成ツール(書き込み)

実践例: ファイルシステム操作ツール

Storageファサードを使ってファイルを操作するツールの実装例です。
ファイル操作ツールでは必ずパスのサニタイズを行い、許可されたディレクトリ以外へのアクセスを防いでください。.. を含むパスは拒否することが重要です。

テスト

MCPサーバー、ツール、リソース、プロンプトはLaravelの標準テスト機能でユニットテストを書けます。

ツールのテスト

Server::tool() メソッドでツールを直接呼び出してテストします。

リソースとプロンプトのテスト

主なアサーションメソッド

MCP Inspector を使ったデバッグ

インタラクティブなデバッグには MCP Inspector を使います。

デプロイの考慮事項

HTTPストリーミングとSSE

Webサーバーでストリーミングレスポンス(Generator)を使う場合、サーバーの設定を確認してください。

Laravel Octane との組み合わせ

高トラフィックのMCPサーバーには Laravel Octane(FrankenPHP または Swoole)の使用を検討してください。リクエストごとのオーバーヘッドが大幅に削減されます。
Octane 使用時はリクエスト間で状態が共有されます。ツール内で静的プロパティやグローバルな状態を使わないよう注意してください。

レートリミット

throttle ミドルウェアでMCPサーバーへのリクエストを制限します。

キャッシュ

頻繁に呼び出される読み取り専用ツールにはキャッシュを活用します。

ログとモニタリング

MCPツールの呼び出しをログに記録することで、AIクライアントの利用状況を把握できます。
本番環境では Laravel Telescope や Sentry を使ってMCPサーバーのパフォーマンスと例外を監視することをお勧めします。
最終更新日 2026年3月29日