Mascaramento de PII por padrão

PII (Personally Identifiable Information) é qualquer dado que permita identificar uma pessoa direta ou indiretamente — CNPJ, CPF, número de celular, e-mail, endereço, data de nascimento. No contexto contábil da Alcance, esse dado é necessário para operar, mas o caminho até o operador humano atravessa um cliente IA, que mantém histórico dessas trocas. Mascarar PII por padrão é uma medida de minimização exigida pela LGPD (art. 6º, III) e reduz drasticamente a superfície de vazamento.

Por que mascarar antes do LLM

O fluxo de dados é:

Operador → Cliente IA → MCP → WebApi → MCP → Cliente IA → Operador

Cada hop é uma oportunidade de retenção: histórico do Claude/Cursor fica gravado no servidor do provider, screenshots compartilhados em canais corporativos vazam contexto inteiro, logs internos do cliente IA podem ser usados para training data em planos não-Enterprise. Uma vez na timeline da conversa, o dado pode estar em cache do provider — você não tem como retirar reactivamente.

Mascarar na borda do MCP, antes da resposta chegar ao LLM, garante que esses caches retêm apenas o mascarado, não o cru.

Formato de mascaramento

Os formatos mantêm o suficiente para conferência humana (identificar visualmente "é esse mesmo o cliente?") sem entregar o dado completo:

Tipo de dadoFormato exibidoO que é preservado
CNPJXX.XXX.***/0001-XX2+3 primeiros + matriz/filial
CPF***.***.123-XX3 dígitos do meio (anchor humano)
Celular(11) ****-1234DDD + últimos 4 dígitos
E-mailj****a@dominio.com1ª e última letra do local-part + domínio

A regra de ouro: mantém-se o mínimo necessário para um operador humano confirmar identidade visualmente, e remove-se o suficiente para que o dado mascarado não seja útil a um adversário com base parcial.

Helpers disponíveis no MCP

Os helpers vivem em src/lib/format.ts e seguem o padrão PT-BR do projeto:

mascararDocumento auto-detecta CPF vs CNPJ por quantidade de dígitos — útil para campos polimórficos como cpfecnpj da WebApi, onde o cliente pode ser pessoa física ou jurídica. Strings vazias e formatos inválidos passam por sem erro (retornam o input original).

Quando desmascarar

Há casos legítimos: emitir documento, conferir telefone exato antes de disparar lembrete, confirmar e-mail para envio formal. Para esses, existe um único caminho:

obter_cliente(cliente_id: int, full: boolean = true)

Esta tool, planejada para a Fase 1.1, retorna os dados crus quando full=true, e em paralelo grava um log de auditoria contendo cliente_id, timestamp e hash do bearer token. Na Fase 2 (com OAuth 2.1), esse hash vira identidade real e fecha o ciclo de accountability.

A escolha de concentrar o desmascaramento numa tool dedicada — em vez de um parâmetro mask=false espalhado por todas as tools — torna o ato intencional: o LLM precisa nominar a tool, e o log mostra exatamente quem pediu o dado completo de quem.

Credenciais Gov nunca são expostas

Os campos login_gov e senha_gov (acessos a portais SEFAZ, eCAC, Receita) nunca saem do MCP, com ou sem full=true. Eles são filtrados na borda do gateway. Use a WebApi diretamente, com JWT humano e auditoria, para qualquer operação que precise dessas credenciais.

LGPD

O mascaramento por padrão atende ao princípio da minimização previsto na LGPD (Lei 13.709/2018, art. 6º, III): "limitação ao mínimo necessário para a realização de suas finalidades". A ANPD publica orientações técnicas sobre tratamento de PII em sistemas com IA — recomendamos acompanhar os guias técnicos publicados pela autoridade para alinhar políticas internas.