Data Prism
Capa de privacidad de fallo cerrado que seudonimiza los datos de API empresariales para agentes LLM y clientes MCP.
Documentación
Data Prism
Capa de privacidad con cierre por fallo que seudonimiza datos de APIs empresariales para agentes LLM y clientes MCP.
Data Prism es una capa de privacidad de código abierto para equipos Java/Spring que ponen agentes LLM o clientes MCP frente a APIs internas que contienen datos de clientes. Seudonimiza datos personales por ámbito de privacidad, rechaza cualquier dato no clasificado y puede mantener un registro de auditoría encadenado por hash.
Para quién es. Equipos de plataforma y backend Java/Spring que ponen agentes LLM o clientes MCP frente a APIs internas que contienen datos de clientes. Si nada de lo que ejecutas expone datos personales a un modelo, no lo necesitas.
Estado: el esqueleto funcional y cada corte hasta S9a están construidos, con 18 submódulos Maven (19 proyectos Maven en el reactor contando el agregador raíz empaquetado como pom) y una suite de pruebas que pasa. El motor de privacidad, los hallazgos de correlación y consistencia, los conectores mTLS paralelos, la caché de identidad embebida de Hazelcast con presupuesto de lectura, un servidor de recursos OAuth2 con PrivacyContext derivado de sesión, auditoría y métricas son reales y se ejercitan de extremo a extremo. El servidor independiente es la superficie de despliegue principal; el starter de Spring Boot es la opción embebida. También existe un inicio rápido local con Compose de un solo comando: ver "Pruébalo" abajo. Dos herramientas MCP se incluyen hoy, get_entity_context y compare_entity_sources — las otras dos mencionadas en la revisión de diseño, search_entity_data y describe_entity_model, aún no están construidas (docs/tools.md "Aún no construido"). Un sumidero de auditoría duradero, de solo añadidura y encadenado por hash, y un AuditChainVerifier fuera de línea se incluyen desde 0.3.0, opt-in vía dataprism.audit.sink: hash-chained; el verificador detecta una edición o eliminación dentro de la cadena de un escritor, pero no puede detectar la truncación de los registros más recientes de un escritor ni la eliminación de los registros de un arranque completo del proceso, y el rastro no resiste a un operador, ni a nadie más, que ya tenga acceso de escritura al archivo (docs/audit.md "Qué demuestra y qué no demuestra esto"). No construido: la superficie de operador de reidentificación (pospuesta más allá de V1 por decisión, ver docs/architecture.md#decisions-worth-knowing) y el conector de Elasticsearch con sus herramientas de búsqueda. Ver docs/plan/PLAN.md para lo que está abierto.
El problema
Una organización quiere que un LLM investigue datos empresariales en vivo distribuidos en varios sistemas. Dar al modelo acceso directo a la API no es aceptable: esas APIs contienen datos personales y confidenciales, cada sistema representa la misma entidad de forma diferente, y los identificadores en bruto permiten que cualquier cosa posterior correlacione entre sesiones.
La solución obvia — redactar todo lo sensible — destruye la investigación. Una vez que los nombres de tres sistemas para una persona son todos [REDACTED], el modelo no puede saber si está viendo una persona o tres.
Qué hace Data Prism
Se sitúa entre ambos y hace dos cosas que son fáciles de confundir:
Hace consistente la identidad. Un sujeto obtiene una identidad sintética en cada fuente, derivada determinísticamente de (ámbito, sujeto, espacio de nombres, versión de algoritmo, clave) — nunca aleatoria, nunca almacenada en texto plano, y reproducible sin la caché. La misma persona en tres sistemas se lee como una persona para el modelo.
Deja los datos inconsistentes, y lo dice. Si esos tres sistemas discrepan sobre un nombre, la respuesta lleva un hallazgo que dice que discrepan. La plataforma nunca hace que los datos empresariales parezcan más limpios de lo que son. Esa distinción es el punto del proyecto:
La representación de identidad se vuelve consistente. Las inconsistencias subyacentes de los datos se vuelven más visibles, no menos.
Los seudónimos están limitados por ámbito. La misma persona en dos investigaciones diferentes obtiene dos identidades sintéticas distintas, de modo que nada correlaciona entre casos por accidente.
Qué no es
No es una puerta de enlace de API, no es una plataforma ETL, no es un sistema de datos maestros, no es un proveedor de identidad, y no es un motor de resolución de entidades — la correlación requiere una clave que las fuentes ya compartan, detrás de un SPI documentado. No lleva ningún dominio de negocio: no existe ningún tipo Customer, Taxpayer o Employee fuera de la aplicación de ejemplo.
No es anonimización. Bajo el Art. 4(5) del RGPD, los datos seudonimizados siguen siendo datos personales. Enviar la salida de Data Prism a un modelo de terceros sigue siendo tratamiento, y sigue necesitando una base jurídica, una EIPD y un mecanismo de transferencia cuando el proveedor está fuera de la UE. La plataforma reduce la exposición; no elimina la obligación.
Pruébalo
La forma más rápida de ver una llamada MCP real respondida por el motor de privacidad real — sin JDK local, sin instalación de Maven, un solo comando:
docker compose up
extrae las imágenes publicadas de ghcr.io/aindriub/data-prism-quickstart-<name> (fija una con QUICKSTART_IMAGE_TAG=0.3.1; ejecuta docker compose -f compose.yaml -f compose.build.yaml up --build en su lugar para construir cada imagen desde el código fuente) y levanta el servidor independiente, una API de datos sintéticos y un emisor JWT HTTPS local, demostrando que una llamada get_entity_context compatible con agentes devuelve una respuesta seudonimizada. Recórrelo en docs/quickstart.md; conecta tu propio cliente de agente a esa pila o a un despliegue real vía docs/agents/.
Una vez que hayas visto la demo, protege tu propia API: docs/quickstart.md termina con una sección "Qué sigue" que apunta a docs/protect-your-own-api.md, un recorrido solo con YAML desde una API JSON REST real hasta una llamada get_entity_context funcional.
Si encontraste esto en el registro de MCP
La imagen ghcr.io/aindriub/data-prism-server listada allí se publica como una lista de manifiestos multiarquitectura que cubre linux/amd64 y linux/arm64, cada una construida y verificada de forma nativa — docker run en Apple Silicon o cualquier otro host arm64 extrae la imagen arm64 directamente, sin emulación.
No es una instalación de un solo comando, en ninguna arquitectura. docker run solo produce un servidor que se niega a arrancar: DataPrismContractValidator exige un bean DataSourceAdapter revisado para cada fuente configurada, y DataPrismProperties.validate() exige una configuración de despliegue completa (emisor/audiencia/JWKS de JWT, mapeos de reclamaciones del llamante, política de seguridad, referencia de clave HMAC, sumidero de auditoría, sumidero de métricas, topología de Hazelcast). Nada de eso se incluye en la imagen. Dos cosas que un operador debe proporcionar él mismo antes de que sirva algo:
- Un jar
DataSourceAdapter(yIdentityResolver) revisado para cada API que estés protegiendo, montado en la ruta de carga de la imagen. - Una configuración de despliegue que satisfaga el vocabulario de
dataprism.*.
docs/configuration.md es el contrato autoritativo y completo para ambos. La sección "Pruébalo" de arriba es un fixture local de Compose para evaluación, no esta imagen ni esa configuración.
Documentación
El conjunto completo de documentación de usuario también se publica, renderizado y buscable, en https://aindriub.github.io/data-prism/.
Documentación de usuario
Cada fila enlaza la página del sitio y el archivo del repositorio del que se construye.
| Doc | Sitio | Qué cubre |
|---|---|---|
docs/quickstart.md | quickstart/ | Demostración local de un solo comando con Compose — empieza aquí |
docs/protect-your-own-api.md | protect-your-own-api/ | Apuntar Data Prism a tu propia API en lugar del fixture |
docs/configuration.md | configuration/ | El contrato autoritativo y completo de configuración de despliegue de dataprism.* |
docs/tools.md | tools/ | Qué toma y devuelve cada herramienta MCP incluida, con ejemplos trabajados |
docs/extending.md | extending/ | Proteger una nueva fuente: un adaptador Java revisado, o el modo JSON REST dirigido por configuración |
docs/audit.md | audit/ | Qué registra el rastro de auditoría encadenado por hash, y cómo verificarlo |
docs/architecture.md | architecture/ | Mapa de módulos, reglas de dependencia, los límites que no deben cruzarse, decisiones fechadas |
docs/agents/ | agents/ | Conectar un cliente de agente MCP, fixture local o remoto autenticado |
docs/agents/stdio.md | agents/stdio/ | El flujo de trabajo local con fixture stdio: una llamada real de herramienta MCP sin JWT, llamada de red ni sistema fuente |
docs/agents/remote-http.md | agents/remote-http/ | El flujo de trabajo autenticado Streamable HTTP contra un endpoint MCP real; sin bypass de desarrollo |
docs/faq.md | faq/ | Respuestas directas sobre seudonimización, detección de PII, requisitos de Java, el rastro de auditoría e inyección de prompts |
docs/comparison.md | comparison/ | Cómo se compara Data Prism con Presidio, LLM Guard, NeMo Guardrails y puertas de enlace o proxies MCP |
docs/use-cases/pseudonymise-customer-data-spring-boot.md | use-cases/pseudonymise-customer-data-spring-boot/ | Seudonimizar datos de clientes desde una API Spring Boot antes de que un agente LLM los vea |
docs/use-cases/gdpr-data-minimisation-mcp.md | use-cases/gdpr-data-minimisation-mcp/ | Minimización de datos RGPD para herramientas MCP |
docs/use-cases/consistent-pseudonyms-across-systems.md | use-cases/consistent-pseudonyms-across-systems/ | Mantener un cliente reconocible entre sistemas sin exponer la identidad |
CHANGELOG.md | changelog/ | Cada cambio notable de Data Prism por versión, en formato Keep a Changelog |
Documentación interna / de trabajo del proyecto
No publicada en el sitio.
| Doc | Qué cubre |
|---|---|
docs/design-review.md | Enmiendas a la especificación, con razonamiento. Autoritativo |
docs/development-plan.md | Orden de cortes, dimensionamiento y las decisiones que bloquean el primero |
docs/pack.md | La especificación original. Superada e histórica; describe herramientas que nunca se construyeron |
docs/conventions.md | Estilo de código y las reglas de privacidad que un diff debe satisfacer |
docs/workflow.md | Cómo se divide y se ejecuta el trabajo |
docs/plan/PLAN.md | Qué está abierto, en orden de prioridad |
docs/plan/HISTORY-INDEX.md | Qué se construyó, y qué costó descubrirlo |
docs/plan/PLAN.md es la cola de trabajo. GitHub Issues es la puerta de entrada para cualquier cosa que venga de fuera — archiva allí, no en PLAN.md.
Pila tecnológica
Java 21, Spring Boot 3.x, Maven multimódulo, Hazelcast, Model Context Protocol vía el SDK oficial de MCP para Java.
Los artefactos se publican bajo el grupo io.github.aindriub como data-prism-<module>, con raíz de paquete io.github.aindriub.dataprism.
Construcción y ejecución
Requiere Java 21 (la compilación usa --release 21, así que un JDK local más nuevo está bien) y Maven >= 3.6.3 (pom.xml:201-203 lo impone).
mvn -B --no-transfer-progress verify
Este es el mismo comando que ejecuta CI (.github/workflows/build.yml). Construye los 18 submódulos más el agregador raíz, ejecuta la suite de pruebas completa, las reglas de límites de ArchUnit y la regla de enforcer que mantiene el classpath en una sola versión mayor de Jackson.
data-prism-server es la distribución ejecutable principal. Su sonda de vivacidad /health es pública y no lleva ningún detalle de despliegue; su ruta MCP configurada (normalmente /mcp) requiere un JWT de portador verificado. Deliberadamente no contiene ningún esquema de fuente, adaptador de fixture ni clave. Proporciona la configuración descrita en docs/configuration.md, más un adaptador revisado para cada fuente configurada. Dos formas de obtenerlo: una extensión de adaptador Java con un modelo de respuesta anotado (el caso general — objetos anidados, cualquier transporte), o, cuando la respuesta de la fuente es un único objeto JSON plano, el artefacto publicado data-prism-connectors-rest — cargado vía -Dloader.path, configurado enteramente en YAML, sin Java. Ver docs/extending.md para ambas rutas y exactamente dónde termina la cobertura de la dirigida por configuración (nunca desciende a un objeto anidado).
Las extensiones de adaptadores son archivos JAR comunes que contienen auto-configuración de Spring Boot
que declara los beans DataSourceAdapter requeridos y un IdentityResolver revisado explícitamente
(use PassThroughIdentityResolver solo cuando cada fuente
comparta genuinamente el mismo identificador). Registre esa configuración en
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,
luego cargue los archivos JAR de extensiones revisados sin reconstruir el 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
El proceso se niega a iniciar si falta la configuración, los secretos, los enlaces operativos o
el conjunto exacto de adaptadores configurados. data-prism-integration-tests es
la suite de pruebas de integración entre módulos del reactor, no una demostración solo con fixtures,
y nunca se empaqueta en un artefacto desplegable. El empaquetado de contenedores y
la orquestación con Compose para una instancia real y ejecutable localmente de esto también existen
— consulte "Pruébelo" arriba y docs/quickstart.md.
Contribuciones
Consulte CONTRIBUTING.md. La versión corta: lea docs/conventions.md antes
de abrir una solicitud de extracción, y espere que las reglas de privacidad contenidas en él se apliquen
literalmente.
Licencia
Apache License 2.0 — consulte LICENSE y NOTICE.