Si has pasado años manteniendo la lógica de negocio dentro de aplicaciones PHP, ver tutoriales del Model Context Protocol puede sentirse como estar frente a una puerta cerrada con llave. Casi todas las guías asumen el uso de TypeScript o Python. Te guían a través de SDK oficiales, instalaciones de npm y paquetes de pip. Eso deja una enorme cantidad de datos de negocio —registros de clientes, historiales de pedidos, sistemas de inventario— estancados en bases de código PHP que parecen invisibles para la actual ola de herramientas de IA.
La buena noticia es que nada en MCP requiere esos SDK. MCP no es una librería. Es un protocolo de comunicación (wire protocol). Si tu entorno de ejecución puede leer una línea de texto de la entrada estándar, analizar JSON y escribir JSON de vuelta, puede hablar el protocolo. PHP ha estado haciendo exactamente eso desde mucho antes de que existieran los LLM.
Qué es MCP en realidad
MCP significa Model Context Protocol. En su esencia, es un estándar abierto para conectar asistentes de IA con datos, herramientas y APIs externas. En lugar de construir una integración personalizada para cada asistente o modelo, construyes una interfaz compatible. Cualquier cliente que entienda MCP puede entonces comunicarse con tu servidor sin saber nada sobre PHP, Laravel o tu esquema de base de datos específico.
Por debajo, MCP utiliza JSON-RPC 2.0. Eso significa que cada solicitud es un objeto JSON simple que contiene un nombre de método, parámetros y un ID. El servidor responde con otro objeto JSON que contiene un resultado o un error.
Un servidor expone tres primitivas:
- Tools: Acciones que el modelo puede invocar. Una herramienta podría consultar una base de datos, actualizar un estado o llamar a una API de terceros.
- Resources: Datos estáticos o semiestáticos que el modelo puede referenciar a través de una URI. Piensa en archivos, documentos de configuración o conjuntos de datos de referencia.
- Prompts: Plantillas predefinidas que ayudan al usuario a interactuar con el sistema.
Hay una distinción de control importante que recordar. Las Tools están controladas por el modelo. El asistente decide cuándo llamar a una. Los Resources están controlados por la aplicación. El servidor decide qué datos están disponibles y el modelo simplemente lee lo que se le ofrece. Hacer esto correctamente mantiene tu arquitectura predecible. No querrás un modelo buscando recursos que deberían haber sido herramientas, o viceversa.
Cómo funciona el transporte
MCP define dos métodos de transporte, y tu elección determinará cómo escribes el lado de PHP.
stdio es el más sencillo. El cliente MCP lanza tu script de PHP como un subproceso. El cliente escribe mensajes JSON-RPC en la entrada estándar de tu script, y tu script escribe las respuestas en la salida estándar. No hay sockets que gestionar, ni puertos que abrir, ni encabezados de autenticación que analizar. Si tu herramienta y tu cliente residen en la misma máquina, este suele ser el mejor lugar para empezar.
Ejecutar sobre stdio impone dos reglas estrictas a tu proceso PHP. Primero, tu aplicación nunca debe escribir datos que no sean del protocolo en stdout. Si haces un echo de una sentencia de depuración o permites que se filtre un aviso (notice) de PHP, romperás el analizador del cliente. Dirige todo el registro (logging) y los diagnósticos a stderr. Segundo, desactiva por completo el búfer de salida. A PHP le gusta almacenar en búfer stdout, especialmente en contextos CGI o web, pero incluso los scripts de CLI pueden retener datos. Realiza un flush de cada respuesta inmediatamente. Si estás utilizando flujos (streams), establece stream_set_write_buffer(STDOUT, 0) o desactiva el búfer implícito para que el cliente reciba el salto de línea en el instante en que lo envíes.
Streamable HTTP funciona de manera diferente. Tu aplicación PHP se ejecuta como un endpoint HTTP persistente, al que normalmente se accede mediante solicitudes POST. Esto es útil cuando el servidor reside en un host diferente, o cuando quieres un demonio de larga ejecución al que múltiples clientes puedan acceder. En PHP, esto suele significar ejecutarse bajo RoadRunner, FrankenPHP o un gestor de procesos similar, en lugar del ciclo tradicional de solicitud-respuesta que muere tras cada llamada.
Construyéndolo en PHP
No necesitas un framework para empezar. Un servidor MCP mínimo en PHP es un bucle que lee de STDIN, decodifica JSON, lo despacha a un manejador y codifica el resultado.
while ($line = fgets(STDIN)) {
$request = json_decode($line, true);
// route to tool or resource handler
// write JSON-RPC response to STDOUT
}
Dentro de ese bucle, el trabajo real consiste en construir interfaces que tengan sentido para un modelo.
Generar esquemas de herramientas a partir de código. Una de las formas más rápidas de causar problemas es escribir a mano los esquemas JSON para los parámetros de tus herramientas y dejar que se desincronicen de tu lógica de validación real. PHP tiene capacidades de reflexión muy completas. Inspecciona las firmas de tus métodos, lee las reglas de validación existentes de tus formularios u objetos de comando, y genera el esquema a partir de esas restricciones. Si tu código interno requiere un formato de correo electrónico válido, tu
