Putting an MCP Server Inside a Laravel App
AI エージェントには、単にスクレイピングされた UI だけでは不十分です。適切な権限を持って特定のツールを呼び出す方法が必要です。これこそが Model Context Protocol (MCP) が提供するものです。
最近、私は MCP サーバーを Laravel アプリケーションに直接統合しました。これを安全に構築するためのアーキテクチャ上の決定事項を共有したいと思います。
The Receptionist Metaphor アプリをオフィスビルだと考えてみてください。
- Web UI は人間用のロビーです。
- REST API はシステム用のスタッフ専用入口です。
- MCP サーバーは AI エージェント用の受付デスクです。
エージェントは ID を提示し、特定のタスクを依頼します。受付係は建物の鍵を渡すわけではありません。権限を確認し、一つのタスクを実行して、構造化された回答を返します。
Key Design Decisions
Use a single endpoint ツールごとに多くのルートを作成しないでください。
/mcpエンドポイントを一つだけ使用します。プロトコルがツールの検出を自動的に行います。接点を一つに絞ることで、セキュリティ対策とドキュメント化が容易になります。Support dual authentication 呼び出し元によって異なるセキュリティ手法が必要です。
- ファーストパーティの呼び出し元(CLI ツールなど)は、Sanctum のパーソナルアクセストークンを使用します。
- サードパーティのエージェント(ユーザーに代わって動作するもの)は、OAuth 2.1 を使用します。
両方を処理するために、ドライバー形式のリゾルバーを使用します。ツールのコードは、どのようにログインしたかではなく、認証されたユーザーのみを考慮するようにすべきです。
Enforce existing RBAC 認証は呼び出し元が誰であるかを証明するだけです。そのユーザーが何を実行できるかを依然としてチェックする必要があります。すべてのツールは、既存の権限 (ability) にマッピングされるべきです。もしユーザーが Web UI で参加者を表示できないのであれば、MCP 経由でも表示できてはなりません。
Limit data output データベースモデルを丸ごと返してはいけません。MCP の出力をパブリック API のように扱ってください。エージェントが必要とする特定のフィールドのみを返します。これにより、意図しないデータ漏洩を防ぐことができます。
Testing for Security テストでは、システムが正しく失敗すること(拒否されること)を証明しなければなりません。以下の点を確認してください。
- 権限のないユーザーが 403 Forbidden エラーを受け取ること。
- 権限のあるユーザーが、許可されたフィールドのみを受け取ること。
自律型エージェントを使用する場合、優れたテストスイートはデータ漏洩に対する最大の防御策となります。
Summary 責任ある MCP サーバーを構築するには、次の 3 つのルールに従ってください。
- 適切なスキームを使用して、すべての呼び出し元を認証する。
- 既存の権限モデルを使用して、すべてのツールを認可する。
- すべてのツールの出力を、制限されたパブリックリソースとして扱う。
