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
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(eIdentityResolver) 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.
| Doc | Site | O que cobre |
|---|---|---|
docs/quickstart.md | quickstart/ | Demonstração local Compose de um único comando — comece aqui |
docs/protect-your-own-api.md | protect-your-own-api/ | Apontando o Data Prism para sua própria API em vez do fixture |
docs/configuration.md | configuration/ | O contrato de configuração de implantação dataprism.* autoritativo e completo |
docs/tools.md | tools/ | O que cada ferramenta MCP entregue recebe e retorna, exemplos trabalhados |
docs/extending.md | extending/ | Protegendo uma nova fonte: um adaptador Java revisado, ou o modo JSON REST orientado por configuração |
docs/audit.md | audit/ | O que a trilha de auditoria encadeada por hash registra e como verificá-la |
docs/architecture.md | architecture/ | 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.md | agents/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.md | agents/remote-http/ | O fluxo de trabalho HTTP Streamable autenticado contra um endpoint MCP real; sem bypass de desenvolvimento |
docs/faq.md | faq/ | Respostas diretas sobre pseudonimização, detecção de PII, requisitos de Java, trilha de auditoria e injeção de prompt |
docs/comparison.md | comparison/ | 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.md | use-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.md | use-cases/gdpr-data-minimisation-mcp/ | Minimização de dados GDPR para ferramentas MCP |
docs/use-cases/consistent-pseudonyms-across-systems.md | use-cases/consistent-pseudonyms-across-systems/ | Mantendo um cliente reconhecível entre sistemas sem expor identidade |
CHANGELOG.md | changelog/ | 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.
| Doc | O que cobre |
|---|---|
docs/design-review.md | Emendas à especificação, com justificativa. Autoritativo |
docs/development-plan.md | Ordem das fatias, dimensionamento e as decisões que bloqueiam a primeira |
docs/pack.md | A especificação original. Substituída e histórica; descreve ferramentas que nunca foram construídas |
docs/conventions.md | Estilo de código e as regras de privacidade que um diff deve satisfazer |
docs/workflow.md | Como o trabalho é dividido e executado |
docs/plan/PLAN.md | O que está em aberto, em ordem de prioridade |
docs/plan/HISTORY-INDEX.md | O 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.