Back to skills

Laravel Mcp

Laravel v12 - The PHP Framework For Web Artisans (project, gitignored)

8 stars
0 votes
0 copies
1 views
Added 12/19/2025
data-aiphpbashtestingdebugginggitapidocumentation

Works with

cliapimcp

Install via CLI

$openskills install rawveg/skillsforge-marketplace
Download Zip
Files
SKILL.md
---
name: laravel-mcp
description: Laravel v12 - The PHP Framework For Web Artisans (project, gitignored)
---

# Laravel MCP Skill

Comprehensive assistance with Laravel MCP (Model Context Protocol) development. Laravel MCP provides a simple and elegant way for AI clients to interact with your Laravel application through the Model Context Protocol, enabling you to define servers, tools, resources, and prompts for AI-powered interactions.

## When to Use This Skill

This skill should be triggered when:
- Building MCP servers for Laravel applications
- Creating AI tools that perform actions in Laravel
- Defining reusable prompts for AI interactions
- Exposing Laravel resources (data/content) to AI clients
- Implementing OAuth 2.1 or Sanctum authentication for MCP
- Registering and configuring MCP routes (web or local)
- Testing MCP servers and tools
- Working with Laravel JSON Schema builder for tool inputs
- Implementing streaming responses or progress notifications
- Building AI-powered Laravel features using MCP

## Key Concepts

### Core Components

**MCP Server**: The central communication point that exposes MCP capabilities. Each server has:
- `name`: Server identifier
- `version`: Server version
- `instructions`: Description of the server's purpose
- `tools`: Array of tool classes
- `resources`: Array of resource classes
- `prompts`: Array of prompt classes

**Tools**: Enable AI clients to perform actions. Tools can:
- Define input schemas using Laravel's JSON Schema builder
- Validate arguments with Laravel validation rules
- Support dependency injection
- Return single or multiple responses
- Stream responses using generators
- Use annotations like `#[IsReadOnly]` and `#[IsIdempotent]`

**Prompts**: Reusable prompt templates that provide a standardized way to structure common queries with argument definitions and validation.

**Resources**: Enable your server to expose data and content that AI clients can read, including text and blob responses with customizable MIME types and URIs.

## Quick Reference

### 1. Basic MCP Server Definition

```php
<?php
namespace App\Mcp\Servers;

use Laravel\Mcp\Server;

class WeatherServer extends Server
{
    protected string $name = 'Weather Server';
    protected string $version = '1.0.0';
    protected string $instructions = 'This server provides weather information and forecasts.';

    protected array $tools = [
        // CurrentWeatherTool::class,
    ];

    protected array $resources = [
        // WeatherGuidelinesResource::class,
    ];

    protected array $prompts = [
        // DescribeWeatherPrompt::class,
    ];
}
```

### 2. Tool with Input Schema

```php
<?php
namespace App\Mcp\Tools;

use Illuminate\JsonSchema\JsonSchema;
use Laravel\Mcp\Request;
use Laravel\Mcp\Response;
use Laravel\Mcp\Server\Tool;

class CurrentWeatherTool extends Tool
{
    protected string $description = 'Fetches the current weather forecast for a specified location.';

    public function handle(Request $request): Response
    {
        $location = $request->get('location');
        // Get weather...
        return Response::text('The weather is...');
    }

    public function schema(JsonSchema $schema): array
    {
        return [
            'location' => $schema->string()
                ->description('The location to get the weather for.')
                ->required(),
        ];
    }
}
```

### 3. Tool with Validation

```php
public function handle(Request $request): Response
{
    $validated = $request->validate([
        'location' => 'required|string|max:100',
        'units' => 'in:celsius,fahrenheit',
    ], [
        'location.required' => 'You must specify a location.',
        'units.in' => 'You must specify either "celsius" or "fahrenheit".',
    ]);
    // Fetch weather data...
}
```

### 4. Tool with Dependency Injection

```php
<?php
namespace App\Mcp\Tools;

use App\Repositories\WeatherRepository;
use Laravel\Mcp\Request;
use Laravel\Mcp\Response;
use Laravel\Mcp\Server\Tool;

class CurrentWeatherTool extends Tool
{
    public function __construct(
        protected WeatherRepository $weather,
    ) {}

    public function handle(Request $request, WeatherRepository $weather): Response
    {
        $location = $request->get('location');
        $forecast = $weather->getForecastFor($location);
        // ...
    }
}
```

### 5. Tool with Annotations

```php
<?php
namespace App\Mcp\Tools;

use Laravel\Mcp\Server\Tools\Annotations\IsIdempotent;
use Laravel\Mcp\Server\Tools\Annotations\IsReadOnly;
use Laravel\Mcp\Server\Tool;

#[IsIdempotent]
#[IsReadOnly]
class CurrentWeatherTool extends Tool
{
    // ...
}
```

### 6. Streaming Tool Response

```php
<?php
namespace App\Mcp\Tools;

use Generator;
use Laravel\Mcp\Request;
use Laravel\Mcp\Response;
use Laravel\Mcp\Server\Tool;

class CurrentWeatherTool extends Tool
{
    public function handle(Request $request): Generator
    {
        $locations = $request->array('locations');

        foreach ($locations as $index => $location) {
            yield Response::notification('processing/progress', [
                'current' => $index + 1,
                'total' => count($locations),
                'location' => $location,
            ]);
            yield Response::text($this->forecastFor($location));
        }
    }
}
```

### 7. Prompt Definition

```php
<?php
namespace App\Mcp\Prompts;

use Laravel\Mcp\Server\Prompt;
use Laravel\Mcp\Server\Prompts\Argument;

class DescribeWeatherPrompt extends Prompt
{
    protected string $description = 'Generates a natural-language explanation of the weather.';

    public function arguments(): array
    {
        return [
            new Argument(
                name: 'tone',
                description: 'The tone to use in the weather description.',
                required: true,
            ),
        ];
    }

    public function handle(Request $request): array
    {
        $tone = $request->string('tone');
        return [
            Response::text("You are a weather assistant. Provide a {$tone} tone.")->asAssistant(),
            Response::text("What is the current weather like in New York City?"),
        ];
    }
}
```

### 8. Resource Definition

```php
<?php
namespace App\Mcp\Resources;

use Laravel\Mcp\Request;
use Laravel\Mcp\Response;
use Laravel\Mcp\Server\Resource;

class WeatherGuidelinesResource extends Resource
{
    protected string $description = 'Comprehensive guidelines for using the Weather API.';
    protected string $uri = 'weather://resources/guidelines';
    protected string $mimeType = 'application/pdf';

    public function handle(Request $request): Response
    {
        return Response::text($weatherData);
    }
}
```

### 9. Server Registration (Web)

```php
use App\Mcp\Servers\WeatherServer;
use Laravel\Mcp\Facades\Mcp;

Mcp::web('/mcp/weather', WeatherServer::class);

// With middleware
Mcp::web('/mcp/weather', WeatherServer::class)
    ->middleware(['throttle:mcp']);
```

### 10. Server Registration (Local)

```php
use App\Mcp\Servers\WeatherServer;
use Laravel\Mcp\Facades\Mcp;

Mcp::local('weather', WeatherServer::class);
```

### 11. OAuth 2.1 Authentication Setup

```php
use App\Mcp\Servers\WeatherExample;
use Laravel\Mcp\Facades\Mcp;

Mcp::oauthRoutes();

Mcp::web('/mcp/weather', WeatherExample::class)
    ->middleware('auth:api');
```

### 12. Sanctum Authentication

```php
use App\Mcp\Servers\WeatherExample;
use Laravel\Mcp\Facades\Mcp;

Mcp::web('/mcp/demo', WeatherExample::class)
    ->middleware('auth:sanctum');
```

## Reference Files

This skill includes comprehensive documentation in `references/`:

- **other.md** - Complete Laravel MCP documentation from Laravel 12.x official docs, including:
  - Installation and setup instructions
  - Server, tool, resource, and prompt creation
  - Input schema definition using JSON Schema builder
  - Validation and dependency injection
  - Streaming responses and progress notifications
  - Authentication (OAuth 2.1 and Sanctum)
  - Registration (web and local routes)
  - Testing and inspection

Use `view` to read specific reference files when detailed information is needed.

## Working with This Skill

### For Beginners

Start by understanding the core concepts:
1. **Installation**: Install Laravel MCP via `composer require laravel/mcp`
2. **Setup**: Run `php artisan vendor:publish --tag=ai-routes` to create `routes/ai.php`
3. **First Server**: Generate your first server with `php artisan make:mcp-server`
4. **Register**: Add your server to `routes/ai.php` using `Mcp::web()` or `Mcp::local()`

Begin with simple read-only tools using the `#[IsReadOnly]` annotation before moving to tools that modify data.

### For Intermediate Users

Focus on building robust tools:
- Use JSON Schema builder for precise input validation
- Leverage Laravel's validation rules for complex constraints
- Implement dependency injection for clean, testable code
- Use prompts to create reusable AI interaction patterns
- Expose resources to provide context to AI clients

### For Advanced Users

Implement production-ready features:
- Add OAuth 2.1 or Sanctum authentication to secure your MCP servers
- Use streaming responses for long-running operations with progress notifications
- Apply middleware for rate limiting and custom authentication
- Create idempotent tools using `#[IsIdempotent]` annotation
- Build complex multi-tool workflows
- Use the MCP Inspector for debugging and testing

### Navigation Tips

- **Quick implementation**: Use the Quick Reference section above for common patterns
- **Detailed learning**: Read `references/other.md` for comprehensive documentation
- **Examples**: All code examples include proper namespaces and imports
- **Testing**: Refer to documentation for MCP Inspector usage and unit testing

## Common Patterns

### Creating a New MCP Server

```bash
# Generate server class
php artisan make:mcp-server WeatherServer

# Edit app/Mcp/Servers/WeatherServer.php
# Add tools, resources, and prompts

# Register in routes/ai.php
Mcp::web('/mcp/weather', WeatherServer::class);
```

### Input Schema Patterns

```php
// Simple required string
'location' => $schema->string()->required()

// Optional with default
'units' => $schema->string()->default('celsius')

// Number with constraints
'temperature' => $schema->number()->minimum(0)->maximum(100)

// Array of items
'cities' => $schema->array()->items($schema->string())

// Object with properties
'forecast' => $schema->object()->properties([
    'temperature' => $schema->number(),
    'humidity' => $schema->number(),
])
```

### Response Patterns

```php
// Text response
return Response::text('The weather is sunny');

// Multiple responses
return [
    Response::text('First message'),
    Response::text('Second message'),
];

// Notification (streaming)
yield Response::notification('processing/progress', ['status' => 'processing']);
```

## Resources

### Installation

```bash
composer require laravel/mcp
php artisan vendor:publish --tag=ai-routes
```

### Official Documentation

- **Laravel MCP Docs**: https://laravel.com/docs/12.x/mcp
- **Model Context Protocol Spec**: https://modelcontextprotocol.io/

### Related Laravel Features

- **JSON Schema Builder**: For defining tool input schemas
- **Validation**: For validating tool arguments
- **Service Container**: For dependency injection in tools and resources
- **OAuth/Sanctum**: For authentication

## Notes

- This skill was generated from official Laravel 12.x MCP documentation
- All code examples use proper PHP 8+ syntax with typed properties
- Examples demonstrate Laravel's elegant API design
- Tools support both synchronous and streaming responses
- Authentication is optional but recommended for production use
- Both web (HTTP) and local (CLI) server registration are supported

## Tips & Best Practices

1. **Start Simple**: Begin with read-only tools marked with `#[IsReadOnly]`
2. **Validate Input**: Always define schemas and use validation for user input
3. **Use DI**: Leverage dependency injection for repositories and services
4. **Stream Progress**: For long operations, use generators to stream progress
5. **Secure Your Servers**: Add authentication middleware for production
6. **Test Thoroughly**: Use the MCP Inspector and unit tests to validate functionality
7. **Document Well**: Write clear descriptions for servers, tools, prompts, and resources
8. **Follow Conventions**: Use Laravel's service container patterns and naming conventions

Comments (0)

No comments yet. Be the first to comment!