Laravel MCP — Serveur MCP pour Laravel 13
Tu es un expert en MCP (Model Context Protocol) avec Laravel. Ton rôle est d'exposer des données et actions Laravel via le protocole MCP pour les outils AI.
Quand utiliser
- Créer un serveur MCP pour Laravel
- Exposer des données à un assistant AI
- Configurer Laravel Boost
- Créer des tools MCP personnalisés
Installation (Laravel Boost)
composer require laravel/boost --dev
php artisan boost:install
Architecture MCP
MCP Server
├── Tools — Actions exécutables (GET, POST, etc.)
├── Resources — Données exposées (lecture seule)
└── Prompts — Templates de prompts réutilisables
Tool MCP
<?php
namespace App\Mcp\Tools;
use Laravel\Mcp\Tool;
use Illuminate\Support\Facades\DB;
class SearchUsers extends Tool
{
protected string $name = 'search_users';
protected string $description = 'Recherche des utilisateurs par nom ou email';
protected array $inputSchema = [
'type' => 'object',
'properties' => [
'query' => [
'type' => 'string',
'description' => 'Terme de recherche (nom ou email)',
],
'limit' => [
'type' => 'integer',
'description' => 'Nombre max de résultats',
'default' => 10,
],
],
'required' => ['query'],
];
public function execute(array $params): array
{
$users = DB::table('users')
->where('name', 'LIKE', "%{$params['query']}%")
->orWhere('email', 'LIKE', "%{$params['query']}%")
->limit($params['limit'] ?? 10)
->get();
return [
'content' => [
[
'type' => 'text',
'text' => json_encode($users, JSON_PRETTY_PRINT),
],
],
];
}
}
Resource MCP
<?php
namespace App\Mcp\Resources;
use Laravel\Mcp\Resource;
use App\Models\Post;
class PostResource extends Resource
{
protected string $name = 'posts';
protected string $uri = 'laravel://posts';
protected string $description = 'Liste des articles du blog';
public function read(): array
{
$posts = Post::with('user')
->latest()
->limit(50)
->get();
return [
'contents' => [
[
'uri' => $this->uri,
'mimeType' => 'application/json',
'text' => json_encode($posts),
],
],
];
}
}
Prompt MCP
<?php
namespace App\Mcp\Prompts;
use Laravel\Mcp\Prompt;
class AnalyzePost extends Prompt
{
protected string $name = 'analyze_post';
protected string $description = 'Analyse un article et suggère des améliorations';
public function arguments(): array
{
return [
[
'name' => 'post_id',
'description' => 'ID de l'article à analyser',
'required' => true,
],
];
}
public function execute(array $params): array
{
$post = Post::findOrFail($params['post_id']);
return [
'description' => "Analyse de l'article : {$post->title}",
'messages' => [
[
'role' => 'user',
'content' => [
'type' => 'text',
'text' => "Analyse cet article et suggère des améliorations :\n\nTitre : {$post->title}\nContenu : {$post->content}",
],
],
],
];
}
}
Configuration
// config/mcp.php
return [
'servers' => [
'default' => [
'driver' => 'stdio',
'tools' => [
\App\Mcp\Tools\SearchUsers::class,
\App\Mcp\Tools\GetPost::class,
],
'resources' => [
\App\Mcp\Resources\PostResource::class,
],
'prompts' => [
\App\Mcp\Prompts\AnalyzePost::class,
],
],
],
];
.mcp.json pour les agents
{
"mcpServers": {
"laravel": {
"command": "php",
"args": ["artisan", "mcp:serve"],
"env": {
"APP_ENV": "local"
}
}
}
}
Bonnes pratiques
- Principe du moindre privilège — Exposer uniquement les données nécessaires
- Validation — Valider les entrées MCP comme des API classiques
- Description claire — Chaque tool doit avoir une description précise
- Rate limiting — Sur les endpoints MCP
- Authentification — Restreindre l'accès aux données sensibles
- Logging — Tracer les appels MCP
- Tests — Tester chaque tool individuellement
- Documentation — Décrire les inputs/outputs de chaque tool
Validation
- Tools MCP créés avec descriptions
- Resources exposées
- Prompts configurés
- .mcp.json généré
- Validation des entrées
- Rate limiting configuré
- Tests des tools