Asegurando Agentes de IA con Herramientas MCP de Laravel

Darle acceso a un agente de IA a tu aplicación a través de MCP es como entregarle a alguien un llavero. Si no estableces reglas, podrían abrir las puertas equivocadas.

Recientemente construí herramientas MCP para una aplicación Laravel multi-tenant. Tenía un objetivo: permitir que el agente maneje la aplicación sin permitirle ver los datos de otra persona.

El problema con las herramientas MCP

Cada herramienta MCP es un endpoint. Un agente llama a una herramienta y tu servidor ejecuta código. En una aplicación multi-tenant, cada herramienta debe responder a dos preguntas:

  • ¿Tienes permiso para hacer esto?
  • ¿Tienes permiso para hacerlo en esta organización específica?

Si olvidas una, habrá una fuga de datos.

Por qué la multi-tenencia estándar falla aquí

En una aplicación web normal, tienes sesiones. Utilizas scopes globales para filtrar datos por el ID de la organización. Funciona porque la "organización actual" siempre está en la sesión.

Las herramientas MCP no utilizan sesiones. Utilizan tokens. No hay un middleware que establezca el contexto del tenant. Si dependes de un scope global que busca una sesión, no encontrará nada. Entonces, podría devolver todas las filas de tu base de datos. Eso es una fuga de datos silenciosa.

La solución: Filtrado explícito

Nunca dependas de un scope ambiental con autenticación por token. Filtra explícitamente cada vez.

Creé un único trait para manejar esto:

trait ResolvesOrgEvents
{
    protected function resolveOrgEvent(Authenticatable $user, string $uuid): ?Event
    {
        if (empty($user->organization_id)) {
            return null;
        }

        return Event::query()
            ->withOrganization($user->organization_id)
            ->where('uuid', $uuid)
            ->first();
    }
}

Este enfoque sigue cuatro reglas:

  • Usa UUIDs: Nunca uses IDs de autoincremento. Los agentes no deberían poder adivinar los IDs cambiando un número.
  • Fuente única de verdad: El filtro de organización reside en un único trait. Cada herramienta lo utiliza.
  • Reutiliza permisos: No inventes nuevos permisos para los agentes. Utiliza las mismas cadenas de permisos que utiliza tu aplicación web. Esto evita que el agente tenga más poder que el usuario humano.
  • Marca los efectos secundarios: Utiliza anotaciones para mostrar si una herramienta es de solo lectura o permite escritura.

Probando el límite

Debes probar el escenario negativo. No te limites a probar si la herramienta funciona. Prueba que un usuario de la Organización A no pueda ver los datos de la Organización B.

Si un agente intenta acceder a un UUID de otro tenant, la herramienta debería devolver "not found". No debería decirle al agente que los datos existen pero pertenecen a otra persona.

Trata cada herramienta de IA como un endpoint no confiable. La disciplina es la única forma de mantener tus datos seguros.

Source: https://dev.to/nasrulhazim/giving-an-ai-agent-the-keys-without-giving-it-the-building-rbac-org-scoped-mcp-tools-in-laravel-43oi