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 dado | Formato exibido | O que é preservado |
|---|---|---|
| CNPJ | XX.XXX.***/0001-XX | 2+3 primeiros + matriz/filial |
| CPF | ***.***.123-XX | 3 dígitos do meio (anchor humano) |
| Celular | (11) ****-1234 | DDD + últimos 4 dígitos |
j****a@dominio.com | 1ª 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.