Qué es MCP
Model Context Protocol (MCP) es una especificación que estandariza la comunicación entre clientes de IA (Claude, Cursor, GitHub Copilot, etc.) y las aplicaciones. Al implementar un servidor MCP, los agentes de IA pueden acceder a los datos de tu aplicación Laravel y ejecutar acciones sobre ella.Laravel MCP es un paquete oficial añadido en Laravel 13. Se distribuye como
laravel/ai — más concretamente laravel/mcp — y ofrece todo lo necesario para construir servidores MCP.Instalación
Instala el paquete con Composer.vendor:publish para generar el archivo routes/ai.php.
routes/ai.php, donde registrarás los servidores MCP.
Crear el servidor
Genera una clase de servidor conmake:mcp-server.
app/Mcp/Servers.
Registrar el servidor
Registra el servidor enroutes/ai.php. Existen dos modalidades: servidor web y servidor local.
Servidor web
Accesible mediante una petición HTTP POST. Perfecto para clientes de IA remotos o integraciones basadas en web.Servidor local
Se ejecuta como un comando Artisan. Se usa para integraciones locales con clientes como Claude Desktop.Tools
Un tool es una función invocable por el cliente de IA. Puedes implementar obtención de datos, integraciones con APIs externas, operaciones de base de datos, etc.Crear un tool
Genera una clase de tool conmake:mcp-tool.
$tools del servidor.
Nombre y descripción del tool
Por defecto, el nombre y el título se generan a partir del nombre de la clase. ParaCurrentWeatherTool, el nombre es current-weather y el título Current Weather Tool. Puedes personalizarlos con los atributos Name y Title.
Esquema de entrada
Define los parámetros de entrada en el métodoschema. Puedes usar el JSON schema builder de Laravel para especificar tipos y restricciones.
Esquema de salida
ConoutputSchema puedes definir la estructura de la respuesta, lo que facilita que el cliente la interprete.
Validación
Dentro dehandle puedes usar la validación estándar de Laravel.
Inyección de dependencias
El servidor resuelve los tools a través del contenedor de servicios, así que puedes tipar dependencias en el constructor o enhandle.
Anotaciones
Añadir anotaciones a un tool proporciona al cliente información adicional sobre su comportamiento.Registro condicional
ImplementashouldRegister para registrar el tool condicionalmente en tiempo de ejecución.
false, el tool no es visible para el cliente.
Respuestas
Los tools deben devolver una instancia deLaravel\Mcp\Response.
Respuesta de texto
Respuesta de texto
Respuesta de error
Respuesta de error
Imagen o audio
Imagen o audio
Respuesta con varios contenidos
Respuesta con varios contenidos
Respuesta estructurada
Respuesta estructurada
Devuelve datos estructurados fáciles de interpretar por el cliente.
Respuesta en streaming
Respuesta en streaming
Envía progreso en tiempo real durante procesos largos.
Prompts
Los prompts son plantillas reutilizables. Aportan un formato estandarizado para las consultas típicas que el cliente de IA usa al conversar con un modelo de lenguaje.Crear un prompt
$prompts del servidor.
Argumentos del prompt
Define los parámetros del prompt en el métodoarguments.
Validación
Los argumentos se validan automáticamente según su definición, pero puedes aplicar reglas más complejas. Laravel MCP se integra sin fricciones con la validación de Laravel. Puedes validar los argumentos dentro dehandle.
Inyección de dependencias
Los prompts también se resuelven mediante el contenedor de servicios, así que puedes inyectar dependencias en el constructor o enhandle.
handle, y el contenedor las resolverá.
Registro condicional
ImplementashouldRegister para registrar el prompt condicionalmente.
false, el prompt no se ve ni se puede invocar.
Respuesta del prompt
handle puede devolver mensajes del usuario y del asistente. Con asAssistant() marcas un mensaje como del asistente.
Resources
Los resources son datos o información que el cliente de IA puede leer como contexto. Puedes ofrecer documentación, configuraciones o datos dinámicos que mejoren las respuestas de la IA.Crear un resource
$resources del servidor.
URI y tipo MIME
Por defecto, la URI se genera a partir del nombre de la clase (por ejemplo,weather://resources/weather-guidelines). Puedes personalizarla con los atributos Uri y MimeType.
Plantillas de resource
Para definir resources dinámicos con variables en la URI, implementa la interfazHasUriTemplate.
get.
Request en un resource
A diferencia de tools y prompts, los resources no definen un esquema de entrada ni argumentos. Aun así, dentro dehandle puedes acceder a la información de la petición mediante el objeto request.
Inyección de dependencias en resources
Los resources también se resuelven por el contenedor. Puedes inyectar dependencias en el constructor o enhandle.
handle también puede tipar dependencias.
Anotaciones de un resource
A los resources se les pueden añadir anotaciones como audiencia, prioridad o fecha de última modificación.Registro condicional del resource
ImplementashouldRegister para registrar el resource de forma condicional.
false, el resource no se ve ni es accesible.
Respuestas del resource
Un resource debe devolver una instancia deLaravel\Mcp\Response.
Para contenido textual utiliza text.
Respuesta de tipo enlace
El métodoresourceLink devuelve un enlace a un resource. En vez de incrustar el contenido, se envía un puntero URI que el cliente descarga por su cuenta.
Respuesta binaria (blob)
Para contenidos binarios utilizablob. El MIME se toma del atributo #[MimeType] del resource.
Respuesta de error
Para indicar un error utilizaerror.
Apps
Laravel MCP soporta las MCP Apps, una extensión del Model Context Protocol que permite que los tools rendericen aplicaciones HTML interactivas dentro de un iframe seguro alojado por el host compatible. Así puedes ofrecer dashboards, formularios, visualizaciones y experiencias enriquecidas más allá de las respuestas de texto plano. Las MCP Apps se apoyan en dos piezas que trabajan juntas:- App resource: devuelve el HTML autocontenido de la aplicación.
- Tool: se enlaza al app resource mediante el atributo
#[RendersApp]. Cuando se invoca el tool, el host obtiene el resource enlazado y lo renderiza.
Crear un app resource
Genera un app resource conmake:mcp-app-resource.
app/Mcp/Resources y una vista Blade en resources/views/mcp. El nombre de la vista se deduce de la clase (por ejemplo, WeatherDashboardApp → mcp.weather-dashboard-app).
AppResource extiende Resource y configura automáticamente el esquema de URI ui:// y el MIME text/html;profile=mcp-app que exige la especificación de MCP Apps. Como cualquier otro resource, debes registrarlo en la propiedad $resources del servidor.
La vista Blade generada utiliza el componente <x-mcp::app>, que renderiza un documento HTML completo con el SDK cliente de MCP empaquetado.
createMcpApp la aporta el SDK empaquetado. Gestiona la conexión del iframe con el servidor, aplica el tema del host y expone helpers y callbacks como callServerTool, sendMessage, openLink, etc. Consulta la API cliente completa en la especificación de MCP Apps.
Renderizar la app desde un tool
Para mostrar un app resource, enlázalo desde un tool con el atributo#[RendersApp]. Al invocarse el tool, Laravel MCP incluye la URI del resource en la metadata para que el host pueda renderizar la app en un iframe seguro.
Cuando se registra un
AppResource, Laravel MCP anuncia automáticamente la capacidad io.modelcontextprotocol/ui. No requiere configuración adicional del servidor.Visibilidad de los tools de la app
Cada tool#[RendersApp] puede restringir sus invocadores mediante el argumento visibility. Es útil para exponer tools privados destinados solo a la app (por ejemplo, para cargar o refrescar datos) que no debe ver el modelo.
Visibility tiene los valores Model y App; por defecto se aplican ambos. Usa [Visibility::App] para acciones backend que solo debe llamar la UI y [Visibility::Model] para deshabilitar el tool desde la UI.
Configuración de la app
El atributo#[AppMeta] del app resource configura la Content Security Policy del iframe, los permisos del navegador y las librerías que se incluyen en el <head> de la vista.
Library incluye scripts CDN preconfigurados para librerías populares (Tailwind, Alpine, etc.) y sus orígenes se combinan automáticamente en el CSP. Permission cubre permisos habituales del navegador (Camera, Microphone, Geolocation, ClipboardWrite…).
Desarrollo de apps con Boost
Laravel MCP incluye una skill de referencia específica de Boost para construir MCP Apps. Si tienes Laravel Boost instalado, tu agente puede invocar la skillmcp-development y generar automáticamente el app resource, la vista Blade y los tools enlazados.
Para la referencia completa (API cliente, esquemas, etc.), consulta la documentación oficial de MCP Apps.
Metadatos
Puedes añadir el campo_meta (definido por la especificación MCP) a las respuestas de tools, resources y prompts.
Response::make.
$meta.
Iconos
Los clientes MCP pueden mostrar iconos del servidor y de sus primitivas. El atributoIcon permite declarar iconos en el servidor, tools, resources y prompts.
icons. Es útil cuando los iconos dependen de condiciones en tiempo de ejecución.
icons se combinan automáticamente. Las rutas se resuelven así:
- Rutas con esquema (
https:,data:, etc.) se usan tal cual. - Rutas relativas se resuelven con el helper
assetde Laravel.
Autenticación
Los servidores web se autentican con el middleware estándar de Laravel.Sanctum
Autenticación por token con Laravel Sanctum. El cliente MCP envía la cabeceraAuthorization: Bearer <token>.
OAuth 2.1
Autenticación OAuth con Laravel Passport, idónea cuando necesitas seguridad más robusta.Autorización
Con$request->user() obtienes el usuario autenticado y puedes comprobar permisos dentro de tools y resources.
Cliente MCP
Laravel MCP no solo permite construir servidores: también incluye un cliente para conectar con otros servidores MCP. Con él puedes descubrir e invocar los tools expuestos por servidores externos. Es especialmente útil para exponer capacidades de servidores MCP externos a agentes de IA.Conectar con un servidor
Para servidores accesibles por HTTP utilizaClient::web, pasando la URL del servidor.
Client::local con el comando y sus argumentos.
connect, connected, ping y disconnect.
withTimeout puedes personalizar el timeout de la petición.
Clientes con nombre
En lugar de crear el cliente cada vez, puedes registrar clientes con nombre reutilizables. Normalmente se hace con el facadeMcp en el método boot de un service provider.
Autenticación del cliente
Para conectar con servidores web MCP protegidos por Bearer token, utilizawithToken. Puedes pasar la cadena o una closure de resolución perezosa.
withOAuth.
Si el servidor MCP admite registro dinámico de clientes, puedes omitir
clientId y clientSecret: el cliente se registra automáticamente.routes/ai.php registra las rutas OAuth del cliente con nombre mediante oAuthRoutesFor. La closure recibe el nombre del cliente y un TokenSet una vez intercambiado el código por un access token.
mcp.oauth.{client}.connect), que redirige al usuario al servidor de autorización, y la ruta callback (mcp.oauth.{client}.callback), que intercambia el código y ejecuta el handler. Ambas usan el grupo de middleware web (personalizable con el argumento middleware).
Para iniciar el flujo, redirige al usuario a la ruta connect.
Tools
Contools obtienes los tools expuestos por un servidor MCP. Devuelve una colección con el nombre como clave.
limit puedes acotar el resultado.
callTool con su nombre y los argumentos. Devuelve un ToolResult.
Prompts
Conprompts obtienes los prompts del servidor MCP en forma de colección indexada por nombre.
limit acotas el listado.
getPrompt con su nombre y los argumentos. Devuelve un PromptResult.
Resources
Conresources obtienes los resources del servidor MCP en una colección indexada por URI.
limit acotas el listado.
readResource con la URI. Devuelve un ResourceReadResult.
Pruebas
MCP Inspector
Para probar servidores MCP de forma interactiva, utiliza «MCP Inspector».Tests unitarios
Puedes escribir tests unitarios de tools, resources y prompts.actingAs.
assertHasErrors / assertHasNoErrors.
assertSentNotification y assertNotificationCount.
dd o dump.