Publicado el 15 de septiembre de 2026, Laravel MCP 1.0 es la primera versión estable del paquete de Laravel para crear servidores de Model Context Protocol. Estos servidores permiten que las aplicaciones de IA utilicen herramientas y datos de una aplicación Laravel.

WeatherServer.php
<?php
use App\Mcp\Tools\CurrentWeatherTool;
use App\Mcp\Tools\HistoricalWeatherTool;
use App\Mcp\Tools\WeatherAlertsTool;
use Laravel\Mcp\Server;
use Laravel\Mcp\Server\Tools\ToolSearch;

class WeatherServer extends Server
{
    protected array $tools = [
        CurrentWeatherTool::class,
        ToolSearch::class => [
            HistoricalWeatherTool::class,
            WeatherAlertsTool::class,
        ],
    ];
}

La versión adopta MCP 2026-07-28. El descubrimiento se realiza mediante server/discover. El protocolo también incorpora catálogos de herramientas consultables, indicaciones de caché, procesamiento sin estado, cambios en OAuth y MCP Apps dentro de la capacidad extensions. Los clientes que todavía usan initialize siguen siendo compatibles. El servidor responde con la versión 2025-11-25 o 2025-06-18 según la versión solicitada por el cliente.

ToolSearch mantiene algunas herramientas fuera del catálogo predeterminado. La herramienta search_tools recibe una consulta y un límite de resultados. Devuelve los nombres, las descripciones y las entradas esperadas de las herramientas coincidentes. execute_tools ejecuta una o varias herramientas por nombre. Así, un agente puede buscar y usar herramientas sin cargar el catálogo completo. Esta función está documentada en el pull request #324.

El atributo Cacheable define las indicaciones de caché predeterminadas. cacheHints() permite modificarlas para métodos concretos. Los ejemplos incluyen valores ttlMs de 60_000 y 30_000, además del ámbito público CacheScope::Public. El cliente MCP de Laravel sigue estas indicaciones cuando se activa la caché con withCache(). Las respuestas sin ttlMs o con un valor de cero no se guardan en caché. Las llamadas a herramientas no se pueden almacenar. Los pull requests relacionados son #301 y #326.

Los servidores funcionan sin estado con el nuevo protocolo. Cada solicitud HTTP y cada mensaje de entrada y salida estándar incluye la versión del protocolo y las funciones compatibles en params._meta. MCP-Session-Id, Request::sessionId(), Request::setSessionId() y el evento SessionInitialized fueron eliminados. Las aplicaciones que necesiten relacionar varias llamadas deben enviar su propio identificador en los argumentos de la solicitud o en _meta. El cambio corresponde al pull request #285.

La autorización OAuth requiere ahora PKCE. OAuthClient::redirect() lanza una OAuthException cuando el servidor de autorización no incluye code_challenge_methods_supported en sus metadatos. Antes, la validación rechazaba el servidor cuando el campo existía sin soporte para S256. Laravel MCP también admite Client ID Metadata Documents. En este modelo, client_id es una URL HTTPS que apunta a un documento JSON con la descripción del cliente. Mcp::oAuthRoutesFor() sirve ese documento en GET /mcp/oauth/{client}/client-metadata.json.

Cuando no se proporciona un ID de cliente, Laravel usa el documento de metadatos si el servidor de autorización lo admite. Dynamic Client Registration queda como mecanismo de respaldo, aunque MCP 2026-07-28 lo marca como obsoleto. Con un documento de metadatos, $token->clientSecret vale null. La columna correspondiente de la base de datos debe aceptar valores nulos. El cambio también evita registrar un cliente nuevo cada vez que se ejecuta redirect(). Los pull requests #323 y #342 cubren estas modificaciones.

La actualización desde 0.9 requiere revisar las conexiones de los clientes y la forma de construir las solicitudes. ValidateMcpHeaders se ejecuta ahora en todas las rutas registradas mediante Mcp::web(). Las solicitudes POST del nuevo protocolo deben incluir MCP-Protocol-Version y Mcp-Method, con valores que coincidan con el cuerpo. tools/call, prompts/get y resources/read necesitan además Mcp-Name. Este valor debe coincidir con el nombre de la herramienta, el nombre del prompt o la URI del recurso.

Las pruebas que usan postJson() necesitan esos encabezados y los campos params._meta. Una discrepancia devuelve HTTP 400 con el código de error JSON-RPC -32020. Los clientes antiguos basados en initialize que no envían metadatos de protocolo en _meta quedan exentos de esta validación. La guía de actualización también recoge los cambios de códigos de error, la eliminación de Server::CAPABILITY_UI y el contrato para transportes personalizados. La publicación incluye las notas de versión y el changelog completo.