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.
How 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.
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 [email protected]. 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.npx claudepluginhub produtoramaxvision/maxvision-linkedin-mcp --plugin linkedin-maxvisionGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.