Data Prism

Camada de privacidade com falha segura que pseudonimiza dados de API empresariais para agentes de LLM e clientes MCP.

Documentação

Data Prism

Build Maven Central License: Apache-2.0

Camada de privacidade com falha segura que pseudonimiza dados de APIs empresariais para agentes de LLM e clientes MCP.

Data Prism é uma camada de privacidade de código aberto para equipes Java/Spring que colocam agentes de LLM ou clientes MCP diante de APIs internas que armazenam dados de clientes. Ele pseudonimiza dados pessoais por escopo de privacidade, recusa qualquer coisa não classificada e pode manter uma trilha de auditoria encadeada por hash.

Para quem é. Equipes de plataforma e backend Java/Spring que colocam agentes de LLM ou clientes MCP diante de APIs internas que armazenam dados de clientes. Se nada que você executa expõe dados pessoais a um modelo, você não precisa disso.

Status: o esqueleto funcional e todas as fatias até S9a estão construídos, com 18 submódulos Maven (19 projetos Maven no reator, contando o próprio agregador raiz empacotado como pom) e uma suíte de testes aprovada. O mecanismo de privacidade, descobertas de correlação e consistência, conectores mTLS paralelos, cache de identidade embutido no Hazelcast e orçamento de leitura, um servidor de recursos OAuth2 com PrivacyContext derivado de sessão, auditoria e métricas são todos reais e exercitados de ponta a ponta. O servidor autônomo é a superfície de implantação principal; o starter Spring Boot é a opção embutida. Um quickstart local com Compose de um único comando também existe: veja "Experimente" abaixo. Duas ferramentas MCP são entregues hoje, get_entity_context e compare_entity_sources — as outras duas mencionadas na revisão de design, search_entity_data e describe_entity_model, ainda não foram construídas (docs/tools.md "Ainda não construído"). Um sink de auditoria durável, somente anexação e encadeado por hash, e um AuditChainVerifier offline são entregues a partir da versão 0.3.0, opt-in via dataprism.audit.sink: hash-chained; o verificador detecta uma edição ou exclusão dentro da cadeia de um escritor, mas não consegue detectar o truncamento dos registros mais recentes de um escritor ou a exclusão de registros de uma inicialização inteira do processo, e a trilha não resiste a um operador, ou qualquer outra pessoa, que já tenha acesso de escrita ao arquivo (docs/audit.md "O que isso prova e o que não prova"). Não construído: a superfície de operação de reidentificação (adiada para depois da V1 por decisão, veja docs/architecture.md#decisions-worth-knowing) e o conector Elasticsearch e suas ferramentas de busca. Veja docs/plan/PLAN.md para saber o que está em aberto.

O problema

Uma organização quer que um LLM investigue dados empresariais ao vivo espalhados por vários sistemas. Dar ao modelo acesso direto à API não é aceitável: essas APIs carregam dados pessoais e confidenciais, cada sistema representa a mesma entidade de forma diferente, e identificadores brutos permitem que qualquer coisa a jusante correlacione entre sessões.

A correção óbvia — redigir tudo que é sensível — destrói a investigação. Quando os nomes de três sistemas para uma pessoa são todos [REDACTED], o modelo não consegue dizer se está olhando para uma pessoa ou três.

O que o Data Prism faz

Ele fica entre os dois e faz duas coisas que são fáceis de confundir:

Torna a identidade consistente. Um sujeito recebe uma identidade sintética em cada fonte, derivada deterministicamente de (escopo, sujeito, namespace, versão do algoritmo, chave) — nunca aleatória, nunca armazenada em texto puro, e reproduzível sem o cache. A mesma pessoa em três sistemas é lida como uma pessoa para o modelo.

Deixa os dados inconsistentes, e diz isso. Se esses três sistemas discordam sobre um nome, a resposta carrega uma descoberta que diz que eles discordam. A plataforma nunca faz os dados empresariais parecerem mais limpos do que são. Essa distinção é o ponto do projeto:

A representação de identidade se torna consistente. As inconsistências subjacentes dos dados se tornam mais visíveis, não menos.

Pseudônimos são limitados por escopo. A mesma pessoa em duas investigações diferentes recebe duas identidades sintéticas diferentes, então nada correlaciona entre casos por acidente.

O que não é

Não é um gateway de API, não é uma plataforma de ETL, não é um sistema de dados mestres, não é um provedor de identidade e não é um mecanismo de resolução de entidades — a correlação exige uma chave que as fontes já compartilham, por trás de um SPI documentado. Ele não carrega domínio de negócio: nenhum tipo Customer, Taxpayer ou Employee existe fora do aplicativo de exemplo.

Não é anonimização. Sob o Art. 4(5) do GDPR, dados pseudonimizados ainda são dados pessoais. Enviar a saída do Data Prism a um modelo de terceiros ainda é processamento, e ainda precisa de uma base legal, uma DPIA e um mecanismo de transferência quando o provedor está fora da UE. A plataforma reduz a exposição; ela não remove a obrigação.

Experimente

A maneira mais rápida de ver uma chamada MCP real respondida pelo mecanismo de privacidade real — sem JDK local, sem instalação do Maven, um único comando:

docker compose up

puxa as imagens ghcr.io/aindriub/data-prism-quickstart-<name> publicadas (fixe uma com QUICKSTART_IMAGE_TAG=0.3.1; execute docker compose -f compose.yaml -f compose.build.yaml up --build para construir cada imagem a partir do código-fonte) e sobe o servidor autônomo, uma API de fixture sintética e um emissor JWT HTTPS local, provando que uma chamada get_entity_context compatível com agente retorna uma resposta pseudonimizada. Percorra o passo a passo em docs/quickstart.md; conecte seu próprio cliente de agente a essa pilha ou a uma implantação real via docs/agents/.

Depois de ver a demonstração, proteja sua própria API: docs/quickstart.md termina com uma seção "O que vem a seguir" apontando para docs/protect-your-own-api.md, um passo a passo somente em YAML de uma API JSON REST real até uma chamada get_entity_context funcional.

Se você encontrou isso no registro MCP

A imagem ghcr.io/aindriub/data-prism-server listada lá é publicada como uma lista de manifesto multiarquitetura cobrindo linux/amd64 e linux/arm64, cada uma construída e verificada nativamente — docker run em Apple Silicon ou qualquer outro host arm64 puxa a imagem arm64 diretamente, sem emulação necessária.

Não é uma instalação de um único comando, em nenhuma das arquiteturas. docker run sozinho produz um servidor que se recusa a iniciar: DataPrismContractValidator exige um bean DataSourceAdapter revisado para cada fonte configurada, e DataPrismProperties.validate() exige uma configuração de implantação completa (emissor JWT/audiência/JWKS, mapeamentos de claims do chamador, política de segurança, referência de chave HMAC, sink de auditoria, sink de métricas, topologia Hazelcast). Nenhum deles acompanha a imagem. Duas coisas que um operador deve fornecer por conta própria antes de servir qualquer coisa:

  • Um jar DataSourceAdapter (e IdentityResolver) revisado para cada API que você está protegendo, montado no caminho de carregamento da imagem.
  • Uma configuração de implantação que satisfaça o vocabulário dataprism.*.

docs/configuration.md é o contrato autoritativo e completo para ambos. A seção "Experimente" acima é um fixture Compose local para avaliação, não esta imagem ou essa configuração.

Documentação

O conjunto completo de documentação do usuário também é publicado, renderizado e pesquisável, em https://aindriub.github.io/data-prism/.

Documentação do usuário

Cada linha vincula a página do site e o arquivo do repositório a partir do qual é construída.

DocSiteO que cobre
docs/quickstart.mdquickstart/Demonstração local Compose de um único comando — comece aqui
docs/protect-your-own-api.mdprotect-your-own-api/Apontando o Data Prism para sua própria API em vez do fixture
docs/configuration.mdconfiguration/O contrato de configuração de implantação dataprism.* autoritativo e completo
docs/tools.mdtools/O que cada ferramenta MCP entregue recebe e retorna, exemplos trabalhados
docs/extending.mdextending/Protegendo uma nova fonte: um adaptador Java revisado, ou o modo JSON REST orientado por configuração
docs/audit.mdaudit/O que a trilha de auditoria encadeada por hash registra e como verificá-la
docs/architecture.mdarchitecture/Mapa de módulos, regras de dependência, os limites que não devem ser cruzados, decisões datadas
docs/agents/agents/Conectando um cliente de agente MCP, fixture local ou remoto autenticado
docs/agents/stdio.mdagents/stdio/O fluxo de trabalho local do fixture stdio: uma chamada de ferramenta MCP real sem JWT, chamada de rede ou sistema de origem
docs/agents/remote-http.mdagents/remote-http/O fluxo de trabalho HTTP Streamable autenticado contra um endpoint MCP real; sem bypass de desenvolvimento
docs/faq.mdfaq/Respostas diretas sobre pseudonimização, detecção de PII, requisitos de Java, trilha de auditoria e injeção de prompt
docs/comparison.mdcomparison/Como o Data Prism se compara a Presidio, LLM Guard, NeMo Guardrails e gateways ou proxies MCP
docs/use-cases/pseudonymise-customer-data-spring-boot.mduse-cases/pseudonymise-customer-data-spring-boot/Pseudonimizando dados de clientes de uma API Spring Boot antes que um agente de LLM os veja
docs/use-cases/gdpr-data-minimisation-mcp.mduse-cases/gdpr-data-minimisation-mcp/Minimização de dados GDPR para ferramentas MCP
docs/use-cases/consistent-pseudonyms-across-systems.mduse-cases/consistent-pseudonyms-across-systems/Mantendo um cliente reconhecível entre sistemas sem expor identidade
CHANGELOG.mdchangelog/Cada mudança notável do Data Prism por versão, no formato Keep a Changelog

Documentação interna / de trabalho do projeto

Não publicada no site.

DocO que cobre
docs/design-review.mdEmendas à especificação, com justificativa. Autoritativo
docs/development-plan.mdOrdem das fatias, dimensionamento e as decisões que bloqueiam a primeira
docs/pack.mdA especificação original. Substituída e histórica; descreve ferramentas que nunca foram construídas
docs/conventions.mdEstilo de código e as regras de privacidade que um diff deve satisfazer
docs/workflow.mdComo o trabalho é dividido e executado
docs/plan/PLAN.mdO que está em aberto, em ordem de prioridade
docs/plan/HISTORY-INDEX.mdO que foi construído e o que custou descobrir

docs/plan/PLAN.md é a fila de trabalho. GitHub Issues é a porta de entrada para qualquer coisa vinda de fora — registre lá, não em PLAN.md.

Pilha

Java 21, Spring Boot 3.x, Maven multi-módulo, Hazelcast, Model Context Protocol via o SDK Java oficial do MCP.

Artefatos são publicados sob o grupo io.github.aindriub como data-prism-<module>, com pacote raiz io.github.aindriub.dataprism.

Construindo e executando

Requer Java 21 (a compilação usa --release 21, então um JDK local mais novo é aceitável) e Maven >= 3.6.3 (pom.xml:201-203 impõe isso).

mvn -B --no-transfer-progress verify

Este é o mesmo comando que o CI executa (.github/workflows/build.yml). Ele constrói todos os 18 submódulos mais o agregador raiz, executa a suíte de testes completa, as regras de limite do ArchUnit e a regra do enforcer que mantém o classpath em uma única versão principal do Jackson.

data-prism-server é a distribuição executável principal. Sua sonda de liveness /health é pública e não carrega detalhes de implantação; seu caminho MCP configurado (normalmente /mcp) exige um JWT de portador verificado. Ele deliberadamente não contém esquema de origem, adaptador de fixture ou chave. Forneça a configuração descrita em docs/configuration.md, além de um adaptador revisado para cada fonte configurada. Duas maneiras de obter um: uma extensão de adaptador Java com um modelo de resposta anotado (o caso geral — objetos aninhados, qualquer transporte), ou, quando a resposta da fonte é um único objeto JSON plano, o artefato data-prism-connectors-rest publicado — carregado via -Dloader.path, configurado inteiramente em YAML, sem necessidade de Java. Veja docs/extending.md para ambos os caminhos e exatamente onde a cobertura do orientado por configuração termina (ele nunca desce para um objeto aninhado). Adapter extensions são jars comuns contendo auto-configuração do Spring Boot que declara os beans DataSourceAdapter necessários e um IdentityResolver revisado explicitamente (use PassThroughIdentityResolver apenas quando cada fonte genuinamente compartilha o mesmo identificador). Registre essa configuração em META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports, e então carregue jars de extensão revisados sem reconstruir o servidor:

LOADER_PATH=/opt/data-prism/extensions \
  java -jar data-prism-server/target/data-prism-server-0.3.1.jar \
  --spring.config.additional-location=file:/etc/data-prism/application.yaml

O processo recusa a inicialização se configuração, segredos, bindings operacionais ou o conjunto exato de adaptadores configurados estiver ausente. data-prism-integration-tests é a suíte de testes de integração entre módulos do reactor, não uma demonstração apenas com fixtures, e nunca é empacotada em um artefato implantável. O empacotamento de contêineres e a orquestração Compose para uma instância real e executável localmente também existem — veja "Experimente" acima e docs/quickstart.md.

Contribuindo

Veja CONTRIBUTING.md. A versão resumida: leia docs/conventions.md antes de abrir um pull request, e espere que as regras de privacidade nele contidas sejam aplicadas literalmente.

Licença

Apache License 2.0 — veja LICENSE e NOTICE.