ontoref/.coder/odoo_privado_howto.md
Jesús Pérez 472952e29b
Some checks failed
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (nightly) (push) Has been cancelled
Rust CI / Check + Test + Lint (stable) (push) Has been cancelled
Nickel Type Check / Nickel Type Checking (push) Has been cancelled
feat: domain extension system, VCS abstraction, personal/provisioning domains, web subpages
Domain extension system (ADR-012): bash-layer dispatch activates repo_kind-conditional CLI
  domains. install.nu copies domains/ tree; short_alias wrappers generated (personal, prov).
  ore help and describe capabilities domain-aware.

  personal domain (PersonalOntology): career skills/talks/publications/positioning, CFP
  pipeline (Watching→Delivered), opportunities lifecycle, content pipeline, Sessionize
  integration. Daemon pages: /career, /personal.

  provisioning domain (DevWorkspace/Mixed): FSM state, next transitions, connections graph,
  gates, workspace card, capabilities, backlog. Daemon page: /provisioning.

  VCS abstraction layer (ADR-013): reflection/modules/vcs.nu — uniform jj/git API via
  filesystem detection (.jj/ vs .git/). opmode.nu and git-event.nu migrated off ^git.
  reflection/bin/jjw.nu — jj + ontoref + Radicle agent workspace lifecycle. jjw-ncl-merge.nu
  registered as jj merge tool for .ontology/ NCL conflicts. init-repo.nu for new_project mode.
  jj/rad not in ontoref requirements — belong in orchestration project manifests.

  'Framework RepoKind: ontology/schemas/manifest.ncl gains 'Framework variant; ontoref
  self-identifies as framework — no domain activates for the protocol itself.

  Web presence: personal.html and provisioning.html domain subpages. index.html gains
  "Project Types — Domain Extensions" section with type cards and subpage links. Nav
  compacted (Arch/Prov labels, solid backdrop-filter background).

  on+re: vcs-abstraction (adrs: adr-013) and agent-workspace-orchestration Practice nodes;
  21 manifest capabilities; state.ncl catalysts updated.
2026-04-07 23:08:29 +01:00

5.6 KiB

Cómo puedo leer los datos de Odoo, usarlos y mantenerlos privados con la IA

¿ usando RAG ? ¿ anonimizándolos ? ¿ creando DAGs con índices ocultos ?

Cómo exponer datos de un ERP (Odoo) a un LLM vía MCP sin comprometer la privacidad.

Las tres estrategias que mencionas y cómo se complementan.


1. MCP Server como capa de acceso a Odoo

Lo primero es entender la arquitectura base. Un MCP Server actúa como intermediario entre Servicio_IA y Odoo:

Servicio_IA ↔ MCP Server ↔ Odoo (XML-RPC / JSON-RPC)

El MCP Server expone tools (funciones) que el Servicio_IA puede llamar, pero tú controlas qué datos salen y cómo. Odoo ya tiene una API bien documentada (xmlrpc/2/object, jsonrpc).


2. Las tres estrategias de privacidad

A) RAG (Retrieval-Augmented Generation)

En lugar de enviar toda la base de datos al LLM, extraes solo los fragmentos relevantes:

Cómo funciona con Odoo + MCP:

  • Tu MCP Server recibe la consulta del Servicio_IA (ej: "¿Cuántas facturas pendientes hay?").
  • El server consulta Odoo vía API, obtiene solo los datos necesarios.
  • Opcionalmente los pasa por un vector store (ChromaDB, Qdrant, FAISS) para búsqueda semántica.
  • Devuelve a Servicio_IA solo el contexto mínimo necesario.

Ventaja: el Servicio_IA nunca ve el dataset completo — solo fragmentos filtrados.


B) Anonimización

Reemplazas datos sensibles antes de que lleguen al LLM:

Técnicas principales:

Técnica Ejemplo Uso
Pseudonimización "Cliente A", "Cliente B" Análisis sin identificar
Hashing SHA256(email)a3f2c... Vincular sin exponer
Generalización "Madrid" → "Centro España" Análisis geográfico
Supresión Eliminar NIF, teléfono Campos innecesarios
K-anonimato Agrupar en rangos Datos estadísticos

C) DAGs con índices ocultos

Esta es la más sofisticada. Creas un grafo dirigido acíclico (DAG) que representa las relaciones entre entidades, pero con índices opacos:

Concepto:

[Nodo_A7x] --compra_a--> [Nodo_P3k] --contiene--> [Nodo_L9m]
   (cliente)              (pedido)                 (línea)

Servicio_IA puede navegar la estructura y razonar sobre relaciones, pero:

  • Los IDs reales de Odoo están cifrados o mapeados a alias.
  • Los valores sensibles están generalizados.
  • El mapeo inverso (alias → ID real) solo existe en tu servidor, nunca sale al LLM.

Ventaja: Servicio_IA puede hacer preguntas como "¿qué nodos tipo cliente tienen más de 5 conexiones de compra?" sin saber quién es quién.


3. Arquitectura combinada (recomendada)

Las tres técnicas se complementan perfectamente:

                    ┌─────────────────────┐
                    │       Servicio_IA   │
                    └─────────┬───────────┘
                              │ MCP Protocol
                    ┌─────────▼───────────┐
                    │    MCP Server       │
                    │                     │
                    │  ┌───────────────┐  │
                    │  │ Capa RAG      │  │  ← Solo fragmentos relevantes
                    │  └───────┬───────┘  │
                    │  ┌───────▼───────┐  │
                    │  │ Anonimización │  │  ← Sin PII
                    │  └───────┬───────┘  │
                    │  ┌───────▼───────┐  │
                    │  │ DAG + Índices │  │  ← Estructura sin identidad
                    │  │   ocultos     │  │
                    │  └───────┬───────┘  │
                    │          │          │
                    │  ┌───────▼───────┐  │
                    │  │ Mapeo privado │  │  ← NUNCA sale del servidor
                    │  └───────┬───────┘  │
                    └──────────┼──────────┘
                               │ XML-RPC / JSON-RPC
                    ┌──────────▼──────────┐
                    │       Odoo          │
                    └─────────────────────┘

Flujo:

  1. El Servicio_IA pide "analiza los clientes con más pedidos este trimestre"
  2. El MCP Server consulta Odoo (RAG: solo datos del trimestre)
  3. Anonimiza nombres, NIFs, emails
  4. Construye/consulta el DAG con alias
  5. Devuelve al Servicio_IA: "El nodo C3x tiene 47 pedidos, sector: Tecnología, rango facturación: Alto"
  6. Si el Servicio_IA necesita actuar (ej: enviar email), el servidor traduce el alias internamente

4. Consideraciones prácticas

Seguridad: El MCP Server debe correr en tu infraestructura (no en cloud público) o usar cifrado E2E. Las credenciales de Odoo nunca viajan al LLM.

RGPD/LOPD: La anonimización ayuda con el cumplimiento, pero consulta con un DPO si manejas datos de ciudadanos EU.

Performance: Cachea el DAG y los vectores RAG — reconstruir en cada consulta sería lento. Usa webhooks de Odoo para invalidar caché.

Granularidad de permisos: Puedes mapear los roles de Odoo (res.groups) a permisos en el MCP Server, para que cada usuario solo acceda a lo que le corresponde.