mcpField
P
PHP MCP Server for Laravel

PHP MCP Server for Laravel

ローカル
github.com/php-mcp開発ツール47530 週間前に更新

PHP MCP Server for Laravel について

Laravel MCP Server SDK は、Laravel で MCP サーバーを構築するための Composer パッケージです。Laravel アプリケーションの機能を、AI アシスタント向けのツール、リソース、プロンプト、リソーステンプレートとして公開します。

主な機能

  1. 01Laravel のコンテナ、設定、ログとの統合
  2. 02Mcp ファサードによるフルーエントな要素登録
  3. 03PHP 8 属性による自動検出とキャッシュ
  4. 04STDIO、統合 HTTP、独立 HTTP の各トランスポート
  5. 05サーバー起動、検出、一覧表示用の Artisan コマンド

活用シーン

  1. 01Laravel アプリケーションの処理を MCP ツールとして公開する
  2. 02STDIO 経由で Laravel アプリを Cursor に接続する
  3. 03本番環境で独立した HTTP サーバーとして MCP サーバーを運用する

MCP 対応

本プロジェクトは MCP サーバーを構築する SDK であり、Laravel アプリケーションのツール、リソース、プロンプト、リソーステンプレートを MCP クライアントに公開します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Laravel MCP Server SDK

Packagist の最新バージョン 総ダウンロード数 ライセンス

エンタープライズグレードの機能とLaravelネイティブの連携を備えた、Model Context Protocol (MCP) サーバー構築のための包括的なLaravel SDKです。

このSDKは、強力な php-mcp/server ライブラリをLaravel向けに最適化したラッパーです。Laravelアプリケーションの機能を、AnthropicのClaude、Cursor IDE、OpenAIのChatGPTなどのAIアシスタントで利用できる、標準化されたMCPのツール、リソース、プロンプト、リソーステンプレートとして公開できます。

主な機能

  • Laravelネイティブの連携:Laravelのサービスコンテナ、設定、キャッシュ、ログ、セッション、Artisanコンソールと深く連携します
  • 柔軟な要素定義:Mcp ファサードを使い、Laravelスタイルの洗練されたAPIでMCP要素を定義できます
  • 属性ベースの検出:PHP 8の属性(#[McpTool]、#[McpResource]など)を使い、自動検出とキャッシュを利用できます
  • 高度なセッション管理:自動ガベージコレクションを備えた、Laravelネイティブのセッションハンドラー(file、database、cache、redis)を利用できます
  • 柔軟なトランスポートオプション:
    • 統合HTTP:ミドルウェアに対応したLaravelルート経由で提供します
    • 専用HTTPサーバー:高性能なスタンドアロンReactPHPサーバーです
    • STDIO:クライアントと直接連携するためのコマンドラインインターフェースです
  • ストリーム可能なトランスポート:再開機能とイベントソーシングを備えた強化版HTTPトランスポートです
  • Artisanコマンド:サーバーの起動、検出、要素管理のためのコマンドを利用できます
  • 完全なテストカバレッジ:信頼性を確保する包括的なテストスイートを備えています

このパッケージは、Model Context Protocolの2025-03-26バージョンに対応しています。

要件

  • PHP >= 8.1
  • Laravel >= 10.0
  • 拡張機能:json、mbstring、pcre(通常はデフォルトで有効です)

インストール

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

composer require php-mcp/laravel:^3.0 -W

設定ファイルを公開します:

php artisan vendor:publish --provider="PhpMcp\Laravel\McpServiceProvider" --tag="mcp-config"

データベースにセッションを保存する場合は、マイグレーションを公開します:

php artisan vendor:publish --provider="PhpMcp\Laravel\McpServiceProvider" --tag="mcp-migrations"
php artisan migrate

設定

すべてのMCPサーバー設定は config/mcp.php で管理されており、各オプションの詳細な説明が記載されています。設定には、サーバーの識別情報、機能、検出設定、セッション管理、トランスポートオプション、キャッシュ、ログが含まれます。すべての設定で環境変数を利用できるため、デプロイ時の管理が簡単です。

主な設定項目は次のとおりです:

  • サーバー情報:名前、バージョン、基本的な識別情報
  • 機能:有効にするMCP機能(ツール、リソース、プロンプトなど)を制御します
  • 検出:コードベースから要素を検出してキャッシュする方法を設定します
  • セッション管理:自動ガベージコレクションに対応した、複数のストレージバックエンド(file、database、cache、redis)を利用できます
  • トランスポート:STDIO、統合HTTP、専用HTTPサーバーのオプション
  • パフォーマンス:キャッシュ戦略とページネーションの制限

公開した config/mcp.php ファイルで、利用可能なすべてのオプションと環境変数による上書き設定の詳細を確認してください。

MCP要素の定義

Laravel MCPでは、MCP要素を定義するための強力な方法を2つ利用できます。手動登録(流暢な Mcp ファサードを使用)と属性ベースの検出(PHP 8の属性を使用)です。両方を組み合わせることもでき、その場合は手動登録が優先されます。

要素の種類
  • ツール:実行可能な関数/アクション(例:calculate、send_email、query_database)
  • リソース:URI からアクセスできる静的コンテンツ/データ(例:config://settings、file://readme.txt)
  • リソーステンプレート:URI パターンを使用する動的リソース(例:user://{id}/profile)
  • プロンプト:会話のきっかけ/テンプレート(例:summarize、translate)
1. 手動登録

routes/mcp.php で、洗練された Mcp ファサードを使って MCP 要素を定義します。

<?php

use PhpMcp\Laravel\Facades\Mcp;
use App\Services\{CalculatorService, UserService, EmailService, PromptService};

// Register a simple tool
Mcp::tool([CalculatorService::class, 'add'])
    ->name('add_numbers')
    ->description('Add two numbers together');

// Register an invokable class as a tool
Mcp::tool(EmailService::class)
    ->description('Send emails to users');

// Register a closure as a tool with custom input schema
Mcp::tool(function(float $x, float $y): float {
    return $x * $y;
})
    ->name('multiply')
    ->description('Multiply two numbers')
    ->inputSchema([
        'type' => 'object',
        'properties' => [
            'x' => ['type' => 'number', 'description' => 'First number'],
            'y' => ['type' => 'number', 'description' => 'Second number'],
        ],
        'required' => ['x', 'y'],
    ]);

// Register a resource with metadata
Mcp::resource('config://app/settings', [UserService::class, 'getAppSettings'])
    ->name('app_settings')
    ->description('Application configuration settings')
    ->mimeType('application/json')
    ->size(1024);

// Register a closure as a resource
Mcp::resource('system://time', function(): string {
    return now()->toISOString();
})
    ->name('current_time')
    ->description('Get current server time')
    ->mimeType('text/plain');

// Register a resource template for dynamic content
Mcp::resourceTemplate('user://{userId}/profile', [UserService::class, 'getUserProfile'])
    ->name('user_profile')
    ->description('Get user profile by ID')
    ->mimeType('application/json');

// Register a closure as a resource template
Mcp::resourceTemplate('file://{path}', function(string $path): string {
    if (!file_exists($path) || !is_readable($path)) {
        throw new \InvalidArgumentException("File not found or not readable: {$path}");
    }
    return file_get_contents($path);
})
    ->name('file_reader')
    ->description('Read file contents by path')
    ->mimeType('text/plain');

// Register a prompt generator
Mcp::prompt([PromptService::class, 'generateWelcome'])
    ->name('welcome_user')
    ->description('Generate a personalized welcome message');

// Register a closure as a prompt
Mcp::prompt(function(string $topic, string $tone = 'professional'): array {
    return [
        [
            'role' => 'user',
            'content' => "Write a {$tone} summary about {$topic}. Make it informative and engaging."
        ]
    ];
})
    ->name('topic_summary')
    ->description('Generate topic summary prompts');

使用できる Fluent メソッド:

すべての要素:

  • name(string $name):推定された名前を上書きします
  • description(string $description):カスタムの説明を設定します

ツール:

  • annotations(ToolAnnotations $annotations):MCP ツールのアノテーションを追加します
  • inputSchema(array $schema):パラメーターのカスタム JSON スキーマを定義します

リソース:

  • mimeType(string $mimeType):コンテンツタイプを指定します
  • size(int $size):コンテンツのサイズをバイト単位で設定します
  • annotations(Annotations $annotations):MCP アノテーションを追加します

リソーステンプレート:

  • mimeType(string $mimeType):コンテンツタイプを指定します
  • annotations(Annotations $annotations):MCP アノテーションを追加します

ハンドラー形式:

  • [ClassName::class, 'methodName'] - クラスメソッド
  • InvokableClass::class - __invoke() メソッドを持つ呼び出し可能なクラス
  • function(...) { ... } - 呼び出し可能な関数(v3.2+)
2. 属性ベースの検出

または、PHP 8 の属性を使って、メソッドやクラスを MCP 要素として指定できます。この場合、routes/mcp.php に登録する必要はありません。

<?php

namespace App\Services;

use PhpMcp\Server\Attributes\{McpTool, McpResource, McpResourceTemplate, McpPrompt};

class UserService
{
    /**
     * Create a new user account.
     */
    #[McpTool(name: 'create_user')]
    public function createUser(string $email, string $password, string $role = 'user'): array
    {
        // Create user logic
        return [
            'id' => 123,
            'email' => $email,
            'role' => $role,
            'created_at' => now()->toISOString(),
        ];
    }

    /**
     * Get application configuration.
     */
    #[McpResource(
        uri: 'config://app/settings',
        mimeType: 'application/json'
    )]
    public function getAppSettings(): array
    {
        return [
            'theme' => config('app.theme', 'light'),
            'timezone' => config('app.timezone'),
            'features' => config('app.features', []),
        ];
    }

    /**
     * Get user profile by ID.
     */
    #[McpResourceTemplate(
        uriTemplate: 'user://{userId}/profile',
        mimeType: 'application/json'
    )]
    public function getUserProfile(string $userId): array
    {
        return [
            'id' => $userId,
            'name' => 'John Doe',
            'email' => '[email protected]',
            'profile' => [
                'bio' => 'Software developer',
                'location' => 'New York',
            ],
        ];
    }

    /**
     * Generate a welcome message prompt.
     */
    #[McpPrompt(name: 'welcome_user')]
    public function generateWelcome(string $username, string $role = 'user'): array
    {
        return [
            [
                'role' => 'user',
                'content' => "Create a personalized welcome message for {$username} with role {$role}. Be warm and professional."
            ]
        ];
    }
}

検出プロセス:

属性で指定された要素は、次の場合に自動的に検出されます。

  • 設定で auto_discover が有効になっている場合(デフォルト:true)
  • 手動で php artisan mcp:discover を実行した場合
# Discover and cache MCP elements
php artisan mcp:discover

# Force re-discovery (ignores cache)
php artisan mcp:discover --force

# Discover without saving to cache
php artisan mcp:discover --no-cache
要素の優先順位
  • 手動登録は、同じ識別子を持つ検出済み要素より常に優先されます
  • 検出された要素は、パフォーマンス向上のためキャッシュされます
  • キャッシュは、新たに検出を実行すると自動的に無効化されます

MCP サーバーの実行

Laravel MCP には、デプロイシナリオに応じて最適化された 3 つのトランスポートオプションがあります。

1. STDIO トランスポート

最適な用途: クライアントからの直接実行、Cursor IDE、コマンドラインツール

php artisan mcp:serve --transport=stdio

クライアント設定(Cursor IDE):

{
    "mcpServers": {
        "my-laravel-app": {
            "command": "php",
            "args": [
                "/absolute/path/to/your/laravel/project/artisan",
                "mcp:serve",
                "--transport=stdio"
            ]
        }
    }
}

⚠️ 重要:STDIO トランスポートを使用する場合、ハンドラーで STDOUT に書き込まないでください(デバッグには Laravel のロガーまたは STDERR を使用してください)。STDOUT は JSON-RPC 通信専用です。

2. 統合 HTTP トランスポート

最適な用途: 開発、既存のウェブサーバーを使うアプリケーション、迅速なセットアップ

統合トランスポートは、Laravel アプリケーションのルートを通じて MCP を提供します。

// Routes are automatically registered at:
// GET  /mcp       - Streamable connection endpoint
// POST /mcp       - Message sending endpoint  
// DELETE /mcp     - Session termination endpoint

// Legacy mode (if enabled):
// GET  /mcp/sse   - Server-Sent Events endpoint
// POST /mcp/message - Message sending endpoint

CSRF 保護の設定:

MCP ルートを CSRF の除外設定に追加します。

Laravel 11 以降:

// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: [
        'mcp',           // For streamable transport (default)
        'mcp/*',   // For legacy transport (if enabled)
    ]);
})

Laravel 10 以前:

// app/Http/Middleware/VerifyCsrfToken.php
protected $except = [
    'mcp',           // For streamable transport (default)
    'mcp/*',   // For legacy transport (if enabled)
];

設定オプション:

'http_integrated' => [
    'enabled' => true,
    'route_prefix' => 'mcp',           // URL prefix
    'middleware' => ['api'],           // Applied middleware
    'domain' => 'api.example.com',     // Optional domain
    'legacy' => false,                 // Use legacy SSE transport instead
],

クライアント設定:

{
    "mcpServers": {
        "my-laravel-app": {
            "url": "https://your-app.test/mcp"
        }
    }
}

サーバー環境に関する考慮事項:

標準的な同期サーバーでは、SSE 接続が継続することで各接続がワーカープロセスを占有するため、処理が困難になります。これは開発環境と本番環境の両方に影響します。

開発環境の場合:

  • PHP の組み込みサーバー(php artisan serve)は使用できません。SSE ストリームによって単一のプロセスがロックされます
  • Laravel Herd(ローカル開発に推奨)
  • 複数の PHP-FPM ワーカーを適切に設定した Nginx
  • 非同期処理に対応した Laravel Octane と Swoole/RoadRunner
  • 専用 HTTP サーバー(php artisan mcp:serve --transport=http)

本番環境の場合:

  • 専用 HTTP サーバー(強く推奨)
  • Laravel Octane と Swoole/RoadRunner
  • 十分な数の PHP-FPM ワーカーを適切に設定した Nginx
3. 専用 HTTP サーバー(本番環境に推奨)

最適な用途: 本番環境、高トラフィックのアプリケーション、複数の同時接続クライアント

ReactPHP ベースのスタンドアロン HTTP サーバーを起動します:

# Start dedicated server
php artisan mcp:serve --transport=http

# With custom configuration
php artisan mcp:serve --transport=http \
    --host=0.0.0.0 \
    --port=8091 \
    --path-prefix=mcp_api

設定オプション:

'http_dedicated' => [
    'enabled' => true,
    'host' => '127.0.0.1',              // Bind address
    'port' => 8090,                     // Port number
    'path_prefix' => 'mcp',             // URL path prefix
    'legacy' => false,                  // Use legacy transport
    'enable_json_response' => false,    // JSON mode vs SSE streaming
    'event_store' => null,              // Event store for resumability
    'ssl_context_options' => [],        // SSL configuration
],

トランスポートモード:

  • ストリーミング可能モード(legacy: false):再開機能とイベントソーシングを備えた拡張トランスポート
  • レガシーモード(legacy: true):非推奨の HTTP+SSE トランスポートです。

JSON レスポンスモード:

'enable_json_response' => true,  // Returns immediate JSON responses
'enable_json_response' => false, // Uses SSE streaming (default)
  • JSON モード:即時レスポンスを返します。高速に実行されるツールに最適です
  • SSE モード:レスポンスをストリーミングします。長時間実行される操作に最適です

本番環境へのデプロイ:

これにより長時間実行されるプロセスが作成されます。次の方法で管理してください:

  • Supervisor(推奨)
  • systemd
  • Docker コンテナ
  • プロセスマネージャー

Supervisor の設定例:

[program:laravel-mcp]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/laravel/artisan mcp:serve --transport=http
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/laravel-mcp.log

本番環境へのデプロイに関する包括的なガイドについては、php-mcp/server のドキュメントをご覧ください。

Artisan コマンド

Laravel MCP には、MCP サーバーを管理するための Artisan コマンドがいくつか用意されています:

Discovery コマンド

コードベースから MCP 要素を検出してキャッシュします:

# Discover elements and update cache
php artisan mcp:discover

# Force re-discovery (ignore existing cache)
php artisan mcp:discover --force

# Discover without updating cache
php artisan mcp:discover --no-cache

出力例:

Starting MCP element discovery...
Discovery complete.

┌─────────────────────┬───────┐
│ Element Type        │ Count │
├─────────────────────┼───────┤
│ Tools               │ 5     │
│ Resources           │ 3     │
│ Resource Templates  │ 2     │
│ Prompts             │ 1     │
└─────────────────────┴───────┘

MCP element definitions updated and cached.
List コマンド

登録済みの MCP 要素を表示します:

# List all elements
php artisan mcp:list

# List specific type
php artisan mcp:list tools
php artisan mcp:list resources
php artisan mcp:list prompts
php artisan mcp:list templates

# JSON output
php artisan mcp:list --json

出力例:

Tools:
┌─────────────────┬──────────────────────────────────────────────┐
│ Name            │ Description                                  │
├─────────────────┼──────────────────────────────────────────────┤
│ add_numbers     │ Add two numbers together                     │
│ send_email      │ Send email to specified recipient            │
│ create_user     │ Create a new user account with validation    │
└─────────────────┴──────────────────────────────────────────────┘

Resources:
┌─────────────────────────┬───────────────────┬─────────────────────┐
│ URI                     │ Name              │ MIME                │
├─────────────────────────┼───────────────────┼─────────────────────┤
│ config://app/settings   │ app_settings      │ application/json    │
│ file://readme.txt       │ readme_file       │ text/plain          │
└─────────────────────────┴───────────────────┴─────────────────────┘
Serve コマンド

さまざまなトランスポートオプションで MCP サーバーを起動します:

# Interactive mode (prompts for transport selection)
php artisan mcp:serve

# STDIO transport
php artisan mcp:serve --transport=stdio

# HTTP transport with defaults
php artisan mcp:serve --transport=http

# HTTP transport with custom settings
php artisan mcp:serve --transport=http \
    --host=0.0.0.0 \
    --port=8091 \
    --path-prefix=api/mcp

コマンドオプション:

  • --transport:トランスポートの種類(stdio または http)を選択します
  • --host:HTTP トランスポートのホストアドレス
  • --port:HTTP トランスポートのポート番号
  • --path-prefix:HTTP トランスポートの URL パスプレフィックス

動的更新とイベント

Laravel MCP は Laravel のイベントシステムと連携し、接続中のクライアントにリアルタイムで更新を提供します:

リスト変更イベント

利用可能な要素が変更されたときにクライアントに通知します:

use PhpMcp\Laravel\Events\{ToolsListChanged, ResourcesListChanged, PromptsListChanged};

// Notify clients that available tools have changed
ToolsListChanged::dispatch();

// Notify about resource list changes
ResourcesListChanged::dispatch();

// Notify about prompt list changes  
PromptsListChanged::dispatch();
リソース更新イベント

特定のリソースの内容が変更されたときにクライアントに通知します:

use PhpMcp\Laravel\Events\ResourceUpdated;

// Update a file and notify subscribers
file_put_contents('/path/to/config.json', json_encode($newConfig));
ResourceUpdated::dispatch('file:///path/to/config.json');

// Update database content and notify
User::find(123)->update(['status' => 'active']);
ResourceUpdated::dispatch('user://123/profile');

高度な機能

スキーマ検証

サーバーは、PHP の型ヒントと DocBlock からツールパラメーターの JSON スキーマを自動生成します。高度な検証には、#[Schema] 属性を使用して拡張できます:

use PhpMcp\Server\Attributes\Schema;

class PostService
{
    public function createPost(
        #[Schema(minLength: 5, maxLength: 200)]
        string $title,
        
        #[Schema(minLength: 10)]
        string $content,
        
        #[Schema(enum: ['draft', 'published', 'archived'])]
        string $status = 'draft',
        
        #[Schema(type: 'array', items: ['type' => 'string'])]
        array $tags = []
    ): array {
        return Post::create([
            'title' => $title,
            'content' => $content,
            'status' => $status,
            'tags' => $tags,
        ])->toArray();
    }
}

スキーマ機能:

  • PHP の型ヒントと DocBlock からの自動推論
  • #[Schema] 属性を使用したパラメーターレベルの検証
  • 文字列の制約、数値の範囲、列挙型、配列、オブジェクトをサポート
  • 手動登録と属性ベースの検出の両方に対応

スキーマに関する包括的なドキュメントと高度な機能については、php-mcp/server のスキーマドキュメントをご覧ください。

補完プロバイダー

リソーステンプレート変数やプロンプト引数の入力候補を提供し、ユーザーが利用可能なオプションを見つけやすくします:

use PhpMcp\Server\Contracts\CompletionProviderInterface;
use PhpMcp\Server\Contracts\SessionInterface;
use PhpMcp\Server\Attributes\CompletionProvider;

class UserIdCompletionProvider implements CompletionProviderInterface
{
    public function getCompletions(string $currentValue, SessionInterface $session): array
    {
        return User::where('username', 'like', $currentValue . '%')
            ->limit(10)
            ->pluck('username')
            ->toArray();
    }
}

class UserService
{
    public function getUserData(
        #[CompletionProvider(UserIdCompletionProvider::class)]
        string $userId
    ): array {
        return User::where('username', $userId)->first()->toArray();
    }
}

補完機能:

  • リソーステンプレート変数とプロンプト引数の自動補完
  • Laravel との連携 — Eloquent モデル、コレクションなどを使用できます
  • セッション対応 — ユーザーセッションに応じて補完候補を変えられます
  • ユーザー入力に基づくリアルタイムフィルタリング

補完プロバイダーの詳細なドキュメントについては、php-mcp/server の補完ドキュメントをご覧ください。

依存性注入

MCP ハンドラーは、Laravel のサービスコンテナの機能を自動的に利用できます:

class OrderService
{
    public function __construct(
        private PaymentGateway $gateway,
        private NotificationService $notifications,
        private LoggerInterface $logger
    ) {}

    #[McpTool(name: 'process_order')]
    public function processOrder(array $orderData): array
    {
        $this->logger->info('Processing order', $orderData);
        
        $payment = $this->gateway->charge($orderData['amount']);
        
        if ($payment->successful()) {
            $this->notifications->sendOrderConfirmation($orderData['email']);
            return ['status' => 'success', 'order_id' => $payment->id];
        }
        
        throw new \Exception('Payment failed: ' . $payment->error);
    }
}
例外処理

ツールハンドラーから例外をスローすると、適切な JSON-RPC エラーレスポンスに自動的に変換されます:

#[McpTool(name: 'get_user')]
public function getUser(int $userId): array
{
    $user = User::find($userId);
    
    if (!$user) {
        throw new \InvalidArgumentException("User with ID {$userId} not found");
    }
    
    if (!$user->isActive()) {
        throw new \RuntimeException("User account is deactivated");
    }
    
    return $user->toArray();
}
ロギングとデバッグ

MCP サーバーの包括的なロギングを設定します:

// config/mcp.php
'logging' => [
    'channel' => 'mcp',  // Use dedicated log channel
    'level' => 'debug',  // Set appropriate log level
],

config/logging.php に専用のログチャネルを作成します:

'channels' => [
    'mcp' => [
        'driver' => 'daily',
        'path' => storage_path('logs/mcp.log'),
        'level' => env('MCP_LOG_LEVEL', 'info'),
        'days' => 14,
    ],
],

移行ガイド

v3.0 から v3.1 への移行

新しいハンドラータイプ:

Laravel MCP v3.1 では、クロージャーハンドラーがサポートされ、クラスメソッドや呼び出し可能クラスだけでなく、利用できるハンドラーの種類が広がりました。

// v3.0 and earlier - Class-based handlers only
Mcp::tool([CalculatorService::class, 'add'])
    ->name('add_numbers');

Mcp::tool(EmailService::class)  // Invokable class
    ->name('send_email');

// v3.1+ - Now supports closures
Mcp::tool(function(float $x, float $y): float {
    return $x * $y;
})
    ->name('multiply')
    ->description('Multiply two numbers');

Mcp::resource('system://time', function(): string {
    return now()->toISOString();
})
    ->name('current_time');

入力スキーマのサポート:

ツールで、パラメーター検証用のカスタム JSON スキーマを定義できるようになりました。

// v3.1+ - Custom input schema
Mcp::tool([CalculatorService::class, 'calculate'])
    ->inputSchema([
        'type' => 'object',
        'properties' => [
            'operation' => [
                'type' => 'string',
                'enum' => ['add', 'subtract', 'multiply', 'divide']
            ],
            'numbers' => [
                'type' => 'array',
                'items' => ['type' => 'number'],
                'minItems' => 2
            ]
        ],
        'required' => ['operation', 'numbers']
    ]);

Blueprint メソッドの拡充:

Blueprint で利用できる新しいフルーエントメソッド:

->inputSchema(array $schema)  // Define custom parameter schema

破壊的変更はありません:

既存の v3.0 のコードはすべて、変更せずに引き続き動作します。新機能は追加の機能強化です。

v2.x から v3.x への移行

設定の変更:

// Old structure
'capabilities' => [
    'tools' => ['enabled' => true, 'listChanged' => true],
    'resources' => ['enabled' => true, 'subscribe' => true],
],

// New structure  
'capabilities' => [
    'tools' => true,
    'toolsListChanged' => true,
    'resources' => true,
    'resourcesSubscribe' => true,
],

セッションの設定:

// Old: Basic configuration
'session' => [
    'driver' => 'cache',
    'ttl' => 3600,
],

// New: Enhanced configuration
'session' => [
    'driver' => 'cache',
    'ttl' => 3600,
    'store' => config('cache.default'),
    'lottery' => [2, 100],
],

トランスポートの更新:

  • デフォルトのトランスポートが sse から streamable に変更されました
  • CSRF 除外パターンが mcp/* から mcp に変更されました
  • 自動ガベージコレクションによってセッション管理が強化されました

破壊的変更:

  • 非推奨のメソッドが削除され、新しいレジストリ API が採用されました
  • 要素の登録に新しいスキーマ形式が使用されるようになりました
  • 整理を改善するため、設定の構造が変更されました

使用例とユースケース

Eコマースとの統合
class EcommerceService
{
    #[McpTool(name: 'get_product_info')]
    public function getProductInfo(int $productId): array
    {
        return Product::with(['category', 'reviews'])
            ->findOrFail($productId)
            ->toArray();
    }

    #[McpTool(name: 'search_products')]
    public function searchProducts(
        string $query,
        ?string $category = null,
        int $limit = 10
    ): array {
        return Product::search($query)
            ->when($category, fn($q) => $q->where('category', $category))
            ->limit($limit)
            ->get()
            ->toArray();
    }

    #[McpResource(uri: 'config://store/settings', mimeType: 'application/json')]
    public function getStoreSettings(): array
    {
        return [
            'currency' => config('store.currency'),
            'tax_rate' => config('store.tax_rate'),
            'shipping_zones' => config('store.shipping_zones'),
        ];
    }
}
コンテンツ管理
class ContentService
{
    #[McpResourceTemplate(uriTemplate: 'post://{slug}', mimeType: 'text/markdown')]
    public function getPostContent(string $slug): string
    {
        return Post::where('slug', $slug)
            ->firstOrFail()
            ->markdown_content;
    }

    #[McpPrompt(name: 'content_summary')]
    public function generateContentSummary(string $postSlug, int $maxWords = 50): array
    {
        $post = Post::where('slug', $postSlug)->firstOrFail();
        
        return [
            [
                'role' => 'user',
                'content' => "Summarize this blog post in {$maxWords} words or less:\n\n{$post->content}"
            ]
        ];
    }
}
API 統合
class ApiService
{
    #[McpTool(name: 'send_notification')]
    public function sendNotification(
        #[Schema(format: 'email')]
        string $email,
        
        string $subject,
        string $message
    ): array {
        $response = Http::post('https://api.emailservice.com/send', [
            'to' => $email,
            'subject' => $subject,
            'body' => $message,
        ]);

        if ($response->failed()) {
            throw new \RuntimeException('Failed to send notification: ' . $response->body());
        }

        return $response->json();
    }
}

コントリビューション

コントリビューションを歓迎します!ガイドラインについては、CONTRIBUTING.md をご覧ください。

開発環境のセットアップ
# Clone the repository
git clone https://github.com/php-mcp/laravel.git
cd laravel

# Install dependencies
composer install

# Run tests
./vendor/bin/pest

# Check code style
./vendor/bin/pint

ライセンス

MIT License(MIT)。詳細は LICENSE をご覧ください。

謝辞

  • Model Context Protocol 仕様に基づいて構築されています
  • コアとなる MCP 機能には php-mcp/server を使用しています
  • シームレスな統合には Laravel フレームワークの機能を活用しています
  • 高性能な非同期処理には ReactPHP を使用しています

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。