Skip to main content

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.
Un servidor MCP puede ofrecer tres tipos de capacidades:

Instalación

Instala el paquete con Composer.
Después ejecuta vendor:publish para generar el archivo routes/ai.php.
Este comando crea routes/ai.php, donde registrarás los servidores MCP.

Crear el servidor

Genera una clase de servidor con make:mcp-server.
La clase se ubica en el directorio app/Mcp/Servers.

Registrar el servidor

Registra el servidor en routes/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.
Puedes aplicarle middleware como en cualquier ruta.

Servidor local

Se ejecuta como un comando Artisan. Se usa para integraciones locales con clientes como Claude Desktop.
El servidor local suele arrancarlo automáticamente el cliente MCP. Normalmente no necesitas ejecutar mcp:start manualmente.

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 con make:mcp-tool.
Registra el tool en la propiedad $tools del servidor.
Ejemplo básico de tool.

Nombre y descripción del tool

Por defecto, el nombre y el título se generan a partir del nombre de la clase. Para CurrentWeatherTool, el nombre es current-weather y el título Current Weather Tool. Puedes personalizarlos con los atributos Name y Title.
La descripción (Description) no se genera automáticamente. Es imprescindible para que el modelo entienda cómo usar el tool: defínela siempre con un contenido significativo.

Esquema de entrada

Define los parámetros de entrada en el método schema. Puedes usar el JSON schema builder de Laravel para especificar tipos y restricciones.

Esquema de salida

Con outputSchema puedes definir la estructura de la respuesta, lo que facilita que el cliente la interprete.

Validación

Dentro de handle puedes usar la validación estándar de Laravel.
Cuando la validación falla, el cliente de IA reintenta apoyándose en el mensaje de error. Proporciona mensajes concretos y accionables.

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 en handle.

Anotaciones

Añadir anotaciones a un tool proporciona al cliente información adicional sobre su comportamiento.
Anotaciones disponibles:

Registro condicional

Implementa shouldRegister para registrar el tool condicionalmente en tiempo de ejecución.
Si devuelve false, el tool no es visible para el cliente.

Respuestas

Los tools deben devolver una instancia de Laravel\Mcp\Response.
Devuelve datos estructurados fáciles de interpretar por el cliente.
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

Regístralo en la propiedad $prompts del servidor.

Argumentos del prompt

Define los parámetros del prompt en el método arguments.

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 de handle.
Cuando la validación falla, el cliente de IA reintenta usando los mensajes. Proporciona mensajes claros y prácticos.

Inyección de dependencias

Los prompts también se resuelven mediante el contenedor de servicios, así que puedes inyectar dependencias en el constructor o en handle.
También puedes tipar el método handle, y el contenedor las resolverá.

Registro condicional

Implementa shouldRegister para registrar el prompt condicionalmente.
Si devuelve 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

Regístralo en la propiedad $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 interfaz HasUriTemplate.
Las variables de la URI se incorporan automáticamente a la request y se recuperan con get.

Request en un resource

A diferencia de tools y prompts, los resources no definen un esquema de entrada ni argumentos. Aun así, dentro de handle 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 en handle.
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

Implementa shouldRegister para registrar el resource de forma condicional.
Si devuelve false, el resource no se ve ni es accesible.

Respuestas del resource

Un resource debe devolver una instancia de Laravel\Mcp\Response. Para contenido textual utiliza text.

Respuesta de tipo enlace

El método resourceLink 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.
También puedes pasar una clase o instancia de resource ya registrado; la URI, nombre, título, descripción y MIME se heredan automáticamente.

Respuesta binaria (blob)

Para contenidos binarios utiliza blob. El MIME se toma del atributo #[MimeType] del resource.

Respuesta de error

Para indicar un error utiliza error.

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 con make:mcp-app-resource.
El comando crea dos archivos: una clase PHP en app/Mcp/Resources y una vista Blade en resources/views/mcp. El nombre de la vista se deduce de la clase (por ejemplo, WeatherDashboardAppmcp.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.
La función global 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.
El enum 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.
El enum 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…).
Si necesitas configuración dinámica, sobrescribe el método appMeta del resource utilizando los builders fluidos AppMeta, Csp y Permissions del namespace Laravel\Mcp\Server\Ui.

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 skill mcp-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.
Para añadir metadatos al envelope completo de la respuesta, utiliza Response::make.
Para añadir metadatos a la propia clase de tool, resource o prompt, define la propiedad $meta.

Iconos

Los clientes MCP pueden mostrar iconos del servidor y de sus primitivas. El atributo Icon permite declarar iconos en el servidor, tools, resources y prompts.
El atributo es repetible, por lo que puedes declarar varias variantes para tamaños o temas (claro/oscuro). También puedes definir los iconos programáticamente sobrescribiendo el método icons. Es útil cuando los iconos dependen de condiciones en tiempo de ejecución.
Los iconos declarados con atributos y con el método 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 asset de 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 cabecera Authorization: Bearer <token>.

OAuth 2.1

Autenticación OAuth con Laravel Passport, idónea cuando necesitas seguridad más robusta.
Para usar OAuth publica las vistas de autorización de Passport y configúralas en el service provider.

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 utiliza Client::web, pasando la URL del servidor.
Para servidores locales que arrancan como comando, usa Client::local con el comando y sus argumentos.
El cliente conecta de forma perezosa: la conexión se establece automáticamente cuando obtienes el listado de tools o los invocas por primera vez. Si prefieres gestionarla manualmente, dispones de connect, connected, ping y disconnect.
Con 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 facade Mcp en el método boot de un service provider.
Después puedes resolverlo por nombre.
Un cliente con nombre se resuelve una sola vez por petición y se desconecta automáticamente al terminar el ciclo.

Autenticación del cliente

Para conectar con servidores web MCP protegidos por Bearer token, utiliza withToken. Puedes pasar la cadena o una closure de resolución perezosa.
Para servidores protegidos con OAuth 2.1, utiliza withOAuth.
Si el servidor MCP admite registro dinámico de clientes, puedes omitir clientId y clientSecret: el cliente se registra automáticamente.
A continuación, en 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.
Se registran dos rutas con nombre: la ruta connect (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

Con tools obtienes los tools expuestos por un servidor MCP. Devuelve una colección con el nombre como clave.
El cliente maneja automáticamente la paginación para traerlos todos. Con el argumento limit puedes acotar el resultado.
Para invocar un tool utiliza callTool con su nombre y los argumentos. Devuelve un ToolResult.
También puedes invocarlo directamente sobre una instancia obtenida en el listado.
Si construyes agentes con el Laravel AI SDK, puedes pasar los tools del cliente MCP directamente al agente para que el modelo los invoque durante sus respuestas. Consulta la sección MCP tools del AI SDK.

Prompts

Con prompts obtienes los prompts del servidor MCP en forma de colección indexada por nombre.
El cliente pagina automáticamente. Con limit acotas el listado.
Para obtener un prompt utiliza getPrompt con su nombre y los argumentos. Devuelve un PromptResult.

Resources

Con resources obtienes los resources del servidor MCP en una colección indexada por URI.
El cliente pagina automáticamente. Con limit acotas el listado.
Para leer un resource utiliza readResource con la URI. Devuelve un ResourceReadResult.

Pruebas

MCP Inspector

Para probar servidores MCP de forma interactiva, utiliza «MCP Inspector».
El comando abre el inspector y te permite copiar la configuración del cliente. Si has configurado middleware de autenticación, incluye la cabecera Authorization en la conexión.

Tests unitarios

Puedes escribir tests unitarios de tools, resources y prompts.
Los prompts y resources se prueban del mismo modo.
Para ejecutar como usuario autenticado, utiliza actingAs.
Aserciones principales:
Verifica presencia o ausencia de errores con assertHasErrors / assertHasNoErrors.
Comprueba el nombre, el título o la descripción del tool, resource o prompt.
Para respuestas en streaming, valida las notificaciones con assertSentNotification y assertNotificationCount.
Para depurar la respuesta, utiliza dd o dump.
Última modificación el 20 de julio de 2026