Help us improve
Share bugs, ideas, or general feedback.
From linkedin-maxvision
Use when projetar/operar features que tocam dado pessoal — definir o que é PII no contexto do plugin, entender o que armazenamos, retenção, direitos do titular (LGPD art. 18 / GDPR), e o que devs MUST fazer em logs e prompts.
npx claudepluginhub produtoramaxvision/maxvision-linkedin-mcp --plugin linkedin-maxvisionHow this skill is triggered — by the user, by Claude, or both
Slash command
/linkedin-maxvision:lgpd-gdpr-handlingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Política operacional para tratamento de dados pessoais nos componentes `linkedin-maxvision` e `mcp-server`. Prioriza LGPD (Brasil, Lei 13.709/2018) com sobreposição GDPR (UE, Reg. 2016/679) onde divergem.
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
Política operacional para tratamento de dados pessoais nos componentes linkedin-maxvision e mcp-server. Prioriza LGPD (Brasil, Lei 13.709/2018) com sobreposição GDPR (UE, Reg. 2016/679) onde divergem.
Dado pessoal (LGPD art. 5º, I): "informação relacionada a pessoa natural identificada ou identificável."
Identificadores diretos:
Dado pessoal sensível (LGPD art. 5º, II) — proteção reforçada:
Combinações que viram PII mesmo individualmente não-PII:
(cidade + cargo + empresa) → frequentemente identifica um único indivíduo em empresa < 200 pessoas.(perfil LinkedIn URL slug) → identifica diretamente.(IP + timestamp) → identifica em janelas curtas.(currículo body + universidade + ano) → muito frequentemente único.Conclusão prática: tratar QUALQUER dado retornado por get_profile, payload de currículo do usuário, e identificadores de aplicação como PII.
Tabela autoritativa do schema vive em mcp-server/PLAN.md e mcp-server/db/schema.sql. Réplica resumida:
| Tabela | Coluna(s) com PII | Estado | Justificativa de armazenamento |
|---|---|---|---|
accounts | cookie_encrypted (sessão LinkedIn do dono) | Encriptado em rest com chave em variável de ambiente (MCP_DB_KEY) | Necessário para autenticar requisições; sem ele, não há produto. |
applications | notes (texto livre escrito pelo usuário; pode conter nomes de recrutadores, observações) | Plaintext local. | É o caderno do usuário — não pode ser encriptado sem perder UX de busca. |
applications | job_url | Plaintext local. | Identificador da vaga; não é PII direto, mas combinado com timestamp pode revelar busca. |
profiles_cache | payload (snapshot público de /in/<slug>: nome, cargo, empresa, sumário, experience) | Plaintext local; cache 24h. | Permite voltar a um perfil sem refazer hit no LinkedIn. Sempre dado público. |
audit_log | tool_name, arguments_redacted, status, latency_ms, timestamp | Plaintext local. | Necessário para auditoria + telemetria de risco. Sem PII nos arguments — redact obrigatório. |
rate_limit_events, captcha_events | Sem PII (apenas counters + timestamp). | Plaintext local. | Saúde de conta. |
Local físico: SQLite/Postgres na máquina/VPS do usuário. Sem replicação a terceiros.
arguments crus — sempre passar por redactor.ts antes de gravar (mascara cookie, email, phone, cpf, body de currículo).Ver cron job (Sprint 1.5 vai implementar). Valores autoritativos em mcp-server/db/retention.sql:
| Dado | Retenção máxima | Mecanismo de purga |
|---|---|---|
accounts.cookie_encrypted | Até logout manual ou cookie expirar | Manual via comando MCP. |
applications.* | Indefinido (é o caderno do usuário) | User-driven (DELETE explícito). |
profiles_cache.payload | 24h (slug-level), 60min (job-detail-level) | Cron horário (Sprint 1.5). |
audit_log | 90 dias | Cron diário (Sprint 1.5). |
rate_limit_events, captcha_events | 30 dias | Cron diário (Sprint 1.5). |
| Backups locais | Mesma retenção da fonte; nunca > 90d | Manual em Sprint 1; automatizar em Sprint 2. |
Princípio: retenção mínima necessária para entregar o serviço. Não estamos no negócio de armazenar dados.
O usuário (titular dos dados) tem direito a, gratuitamente:
| Direito (art. 18) | O que significa | Como atender |
|---|---|---|
| I — Confirmação de tratamento | Saber se temos dados sobre ele. | Comando MCP data_export (Sprint 1.5) lê todos os registros indexados pelo account_id ou e-mail. |
| II — Acesso | Receber cópia dos dados. | Mesmo data_export retorna JSON com todas as linhas. |
| III — Correção | Corrigir dado incompleto/desatualizado. | Edição direta nas tabelas locais (interface Sprint 2). |
| IV — Anonimização / bloqueio / eliminação de dados desnecessários | Apagar o que não se precisa mais. | Comando data_purge (Sprint 1.5). |
| V — Portabilidade | Exportar para outro fornecedor. | data_export --format=json ou --format=csv. |
| VI — Eliminação dos dados tratados com consentimento | Apagar tudo. | account_delete cascade nas tabelas. |
| VII — Informação sobre compartilhamento | Saber com quem compartilhamos. | Resposta documentada: "compartilhamos apenas com o LinkedIn ao executar buscas em seu nome — esse é o serviço. Nenhum terceiro recebe seus dados." |
| VIII — Informação sobre não fornecer consentimento | Saber consequências. | Documentado em onboarding. |
| IX — Revogação do consentimento | Voltar atrás. | account_logout + data_purge. |
Canal oficial de exercício de direitos: e-mail produtoramaxvision@gmail.com. Tempo de resposta legal: até 15 dias (LGPD art. 19, §1º).
GDPR art. 12 dá 1 mês (extensível para 3 em casos complexos). Como atendemos LGPD com 15 dias, automaticamente cobrimos GDPR.
DPIA é obrigatória sob LGPD art. 38 e GDPR art. 35 quando o tratamento "em larga escala envolva categoria sensível" ou "atinja decisão automatizada com efeitos significativos". Em nossa escala, disparar DPIA antes de:
Output mínimo do DPIA:
Documento vive em docs/compliance/DPIA-<slug>.md — committed.
Não-negociáveis. Se algum destes for violado em PR, bloquear merge.
PII redaction em todos os logging sites.
redact(obj, keys=['cookie', 'email', 'phone', 'cpf', 'body', 'resume', 'notes']) em mcp-server/src/observability/redactor.ts.console.log, structured logger, audit_log writes, error reporting.redactor.test.ts cobrindo cada chave com input contendo PII.Nunca logar valores de .env.
console.log(process.env).MCP_DB_KEY, LINKEDIN_COOKIE, etc.gitleaks ou trufflehog em pre-commit.Nunca paste raw user resume em prompt cacheable.
cache_control: false na mensagem específica.Encrypt-at-rest para campos sensíveis.
cookie_encrypted usa AES-256-GCM (lib node:crypto) com chave em MCP_DB_KEY.docs/compliance/key-rotation.md (Sprint 1.5).HTTPS para qualquer transporte fora-da-máquina.
--insecure.Acesso ao DB com least privilege.
DROP TABLE em produção.Retention enforcement em cron (Sprint 1.5).
DELETE FROM profiles_cache WHERE created_at < NOW() - INTERVAL '24 hours'.DPIA antes de feature nova.
Se houver vazamento (cookie comprometido, dump de DB, leak de log com PII):
MCP_DB_KEY, derrubar logs.docs/compliance/incidents/<date>-<slug>.md.