Protegendo Agentes de IA com Ferramentas MCP no Laravel
Dar acesso de um agente de IA ao seu aplicativo via MCP é como entregar um chaveiro a alguém. Se você não definir regras, eles podem abrir as portas erradas.
Recentemente, construí ferramentas MCP para um aplicativo Laravel multi-tenant. Eu tinha um objetivo: permitir que o agente operasse o aplicativo sem permitir que ele visse os dados de outra pessoa.
O Problema com Ferramentas MCP
Cada ferramenta MCP é um endpoint. Um agente chama uma ferramenta e seu servidor executa o código. Em um aplicativo multi-tenant, cada ferramenta deve responder a duas perguntas:
- Você tem permissão para fazer isso?
- Você tem permissão para fazer isso nesta organização específica?
Se você falhar em um deles, você vazará dados.
Por que o Multi-Tenancy Padrão Falha Aqui
Em um aplicativo web normal, você tem sessões. Você usa global scopes para filtrar dados pelo ID da organização. Isso funciona porque a "organização atual" está sempre na sessão.
Ferramentas MCP não usam sessões. Elas usam tokens. Não há um middleware para definir o contexto do tenant. Se você depender de um global scope que busca uma sessão, ele não encontrará nada. Isso pode resultar no retorno de todas as linhas do seu banco de dados. Isso é um vazamento de dados silencioso.
A Solução: Filtragem Explícita
Nunca dependa de escopo ambiente com autenticação por token. Filtre explicitamente todas as vezes.
Eu criei uma única trait para lidar com isso:
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();
}
}
Esta abordagem segue quatro regras:
- Use UUIDs: Nunca use IDs de auto-incremento. Agentes não devem ser capazes de adivinhar IDs alterando um número.
- Fonte Única de Verdade: O filtro de organização reside em uma única trait. Todas as ferramentas a utilizam.
- Reutilize Permissões: Não invente novas permissões para agentes. Use as mesmas strings de permissão que seu aplicativo web utiliza. Isso evita que o agente tenha mais poder do que o usuário humano.
- Marque Efeitos Colaterais: Use anotações para mostrar se uma ferramenta é apenas de leitura ou permite escrita.
Testando o Limite
Você deve testar o caminho negativo. Não teste apenas se a ferramenta funciona. Teste se um usuário da Organização A não consegue ver os dados da Organização B.
Se um agente tentar acessar um UUID de outro tenant, a ferramenta deve retornar "not found". Ela não deve dizer ao agente que os dados existem, mas pertencem a outra pessoa.
Trate cada ferramenta de IA como um endpoint não confiável. A disciplina é a única maneira de manter seus dados seguros.
