Documentación/Guía de integración de DBFlux con IA + MCP

Guía de integración de DBFlux con IA + MCP

Esta guía explica cómo integrar agentes de IA con DBFlux a través del binario standalone del servidor MCP.

Es intencionalmente explícita sobre qué está disponible hoy y qué sigue pendiente, para que las integraciones no dependan de un comportamiento que no está implementado.

1. Visión general de la arquitectura

DBFlux expone la funcionalidad de servidor MCP a través del subcomando dbflux mcp, que habla el Model Context Protocol sobre stdio. Los clientes de IA (Claude Desktop, Cursor, etc.) lanzan este binario como subproceso y se comunican vía JSON-RPC 2.0, delimitado por saltos de línea.

AI Client (Claude Desktop / Cursor / any MCP client)
        |  stdio  (JSON-RPC 2.0, newline-delimited)
        v
  dbflux mcp                    ← integrated into main dbflux binary
        |
        +--  dbflux_mcp          governance, authorization, tool catalog
        +--  dbflux_core         profiles, config, driver traits
        +--  dbflux_driver_*     real database drivers
        +--  dbflux_policy       policy engine
        +--  dbflux_audit        audit trail (SQLite)

El servidor MCP y la app GUI de DBFlux son procesos independientes. Comparten la misma base de datos SQLite unificada en ~/.local/share/dbflux/dbflux.db (profiles, governance, audit, history, sessions). La governance configurada en la GUI (trusted clients, roles, policies, ajustes por conexión) es leída por el servidor desde esa base de datos al arrancar. El flag --config-dir se acepta por compatibilidad de CLI, pero no reubica la base de datos unificada; governance y audit siempre leen desde ~/.local/share/dbflux/dbflux.db.

2. Ejecutar el servidor MCP

Build

# All drivers with MCP support (default)
cargo build -p dbflux --release

# SQLite only with MCP
cargo build -p dbflux --features sqlite,mcp --release

# Without MCP support (AI integration disabled)
cargo build -p dbflux --no-default-features --features sqlite,postgres,mysql,mongodb,redis,dynamodb,lua,aws --release

El servidor MCP está integrado en el binario principal dbflux.

Uso

dbflux mcp --client-id <id> [--config-dir <path>]
FlagDescripción
--client-id <id>Identidad de este cliente de IA. Debe coincidir con un trusted client registrado en la configuración de governance. Obligatorio.
--config-dir <path>Se acepta por compatibilidad de CLI. La base de datos de governance/audit siempre se resuelve a la unificada ~/.local/share/dbflux/dbflux.db; este flag no la reubica. Para entornos de test aislados, sobrescribe HOME/XDG_DATA_HOME en su lugar.

Configuración de Claude Desktop

Agrega esto a ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) o el equivalente en tu plataforma:

{
  "mcpServers": {
    "dbflux": {
      "command": "/path/to/dbflux",
      "args": ["mcp", "--client-id", "claude-desktop"]
    }
  }
}

El valor de client-id debe coincidir con una entrada de trusted client que hayas creado en la GUI de DBFlux, en Settings → MCP → Clients.

Nota: si compilaste DBFlux sin el feature mcp (--no-default-features), el servidor MCP no estará disponible.

3. Modelo de governance (conceptos centrales)

Toda solicitud de IA se hace cumplir a través de todas estas capas, en orden:

  1. Trusted client: la identidad del solicitante debe estar activa y registrada.
  2. Connection MCP gate: la conexión objetivo debe tener MCP habilitado.
  3. Policy assignment: el actor debe tener una asignación con scope en esa conexión.
  4. Tool + classification allowlist: tanto el tool ID como su clase de ejecución deben estar permitidos por la policy asignada.
  5. Approval path: los flujos de write/destructive pueden requerir aprobación humana antes de ejecutarse.
  6. Audit trail: cada decisión se añade a aud_audit_events en la base de datos SQLite unificada y es consultable/exportable. Ver Audit events para el esquema completo de eventos.

Las seis capas se ejecutan dentro del proceso del servidor en cada solicitud tools/call. Ninguna puede saltarse desde el lado del cliente.

4. Superficie canónica de tools (v1)

GrupoTool IDClaseQué hace
Connectionlist_connectionsmetadataEnumera todas las conexiones de base de datos configuradas
ConnectionconnectmetadataAbre una sesión contra una conexión configurada
ConnectiondisconnectmetadataCierra una sesión abierta
Connectionget_connection_infometadataObtiene las capabilities del driver y los metadatos de la conexión
Schemalist_databasesmetadataLista todas las bases de datos accesibles en una conexión
Schemalist_schemasmetadataLista los schemas dentro de una base de datos
Schemalist_tablesmetadataLista tablas y vistas dentro de un schema
Schemalist_collectionsmetadataLista colecciones de MongoDB
Schemadescribe_objectmetadataObtiene las definiciones de columnas/campos e índices de una tabla
Readselect_datareadEjecuta un SELECT estructurado contra una tabla o colección. Los joins no soportados se rechazan explícitamente
Readcount_recordsreadDevuelve un conteo de filas/documentos para un target
Readaggregate_datareadEjecuta un pipeline de agregación de solo lectura
Readexplain_queryreadMuestra el plan de ejecución de la query sin ejecutar la mutación objetivo
Readpreview_mutationreadDevuelve un preview/plan de solo lectura para una write query. Siempre de solo lectura; la mutación nunca se ejecuta
Writeinsert_recordwriteInserta un único registro
Writeupdate_recordswriteActualiza registros que coinciden con un filtro
Writeupsert_recordwriteInserta o actualiza un único registro por clave
Writedelete_recordsdestructiveElimina registros que coinciden con un filtro
Destructivetruncate_tabledestructiveElimina todas las filas de una tabla
DDLcreate_tableadminCrea una tabla
DDLalter_tableadmin_safe / admin / admin_destructiveAltera una tabla; la clasificación se calcula según el tipo de cambio
DDLcreate_indexadminCrea un índice
DDL Destructivedrop_indexadmin_destructiveElimina un índice
DDLcreate_typeadminCrea un tipo definido por el usuario
DDL Destructivedrop_tableadmin_destructiveElimina una tabla
DDL Destructivedrop_databaseadmin_destructiveElimina una base de datos
Scriptslist_scriptsmetadataLista los scripts guardados en el directorio de scripts
Scriptsget_scriptreadObtiene el source de un script guardado específico
Scriptscreate_scriptwriteGuarda un nuevo script en el directorio de scripts
Scriptsupdate_scriptwriteSobrescribe un script guardado existente
Scriptsdelete_scriptadminElimina permanentemente un script
Scriptsexecute_scriptcomputedEjecuta un script guardado contra una conexión. La clasificación se deriva del cuerpo del script
Aprobaciónrequest_executionadminEnvía una mutación para aprobación humana antes de ejecutarla
Aprobaciónlist_pending_executionsreadMuestra todas las ejecuciones pendientes de aprobación
Aprobaciónget_pending_executionreadObtiene los detalles de una ejecución pendiente específica
Aprobaciónapprove_executionadminAprueba una mutación pendiente (solo admin)
Aprobaciónreject_executionadminRechaza y descarta una mutación pendiente (solo admin)
Auditoríaquery_audit_logsreadBusca y filtra el audit trail
Auditoríaget_audit_entryreadObtiene una entrada específica del audit log por ID
Auditoríaexport_audit_logsreadDescarga entradas del audit log como CSV o JSON

Tools diferidas (rechazadas explícitamente en tiempo de solicitud en v1):

  • estimate_query_cost
  • get_execution_status

5. Clases de ejecución

Las policies controlan las tools en dos niveles: el tool ID en sí y la clasificación de ejecución. Una solicitud solo se permite cuando ambos coinciden con la allowlist de la policy.

ClaseQué cubre
metadataInspección de schema — listar bases de datos, tablas y describir objetos
readEjecutar queries de solo lectura, obtener datos y previews de solo lectura
writeInsertar, actualizar o ejecutar scripts que modifican datos
destructiveDELETE, DROP, TRUNCATE y otras operaciones irreversibles
admin_safeOperaciones DDL seguras como cambios de schema aditivos y creación de índices
adminOperaciones DDL riesgosas, aprobaciones, export de audit y acciones privilegiadas
admin_destructiveOperaciones admin irreversibles, como eliminar o truncar objetos de schema

6. Policies y roles integrados

Se incluyen tres policies y tres roles como built-ins inmutables. Siempre están presentes sin importar qué esté persistido en disco, y no pueden eliminarse ni modificarse.

Policies integradas

IDClases permitidasScope
builtin/read-onlymetadata, readTodas las tools de discovery + schema; tools de query y preview de solo lectura; listado/get de scripts; tools de lectura de audit
builtin/writemetadata, read, writeTodas las tools de solo lectura más los flujos de scripts con capacidad de write y de request/approval-submission
builtin/adminmetadata, read, write, destructive, admin_safe, admin, admin_destructiveTodas las tools canónicas expuestas en esta branch

Roles integrados

IDPolicy asignada
builtin/read-onlybuiltin/read-only
builtin/writebuiltin/write
builtin/adminbuiltin/admin

Los built-ins se inyectan al arranque tanto en la app GUI (AppState) como en el servidor MCP (a través de los loops builtin_policies() / builtin_roles() en dbflux_mcp_server::governance). Nunca se escriben en disco. Cualquier intento de eliminar un built-in devuelve un error.

Para la mayoría de las integraciones, asigna builtin/read-only para empezar y escala a builtin/write o a una policy personalizada solo cuando el acceso de escritura sea explícitamente necesario.

7. Configuración del operador en la GUI de DBFlux

Configura la governance en la GUI de DBFlux antes de arrancar el servidor MCP.

  1. Settings → MCP → pestaña Clients

    • Registra cada agente de IA como trusted client (client_id estable, nombre legible, issuer opcional).
    • Marca los clients como activos. Los clients inactivos se deniegan en el primer gate de autorización.
  2. Settings → MCP → pestaña Roles

    • Los roles integrados (Read Only, Write, Admin) aparecen arriba y no se pueden eliminar.
    • Crea roles personalizados combinando múltiples policies con el dropdown multi-select.
  3. Settings → MCP → pestaña Policies

    • Las policies integradas aparecen arriba y no se pueden modificar.
    • Crea policies personalizadas activando checkboxes de tools y clases.
  4. Connection Manager → pestaña MCP

    • Habilita MCP para la conexión objetivo.
    • Selecciona el actor (trusted client), el role y/o la policy para esta conexión desde los dropdowns ya poblados.
  5. Workspace → Pending Approvals

    • Revisa y aprueba/rechaza solicitudes de write/destructive que dispararon el approval path.
  6. Workspace → Audit

    • Filtra por actor/tool/decisión/rango de tiempo y exporta CSV/JSON.

El servidor MCP lee esta configuración desde disco al arrancar. Si cambias la configuración de governance en la GUI mientras el servidor está corriendo, reinícialo para que tome la nueva configuración.

8. Archivos y rutas persistidas

DBFlux persiste todo su estado en una única base de datos SQLite unificada y unos pocos directorios de soporte. Las rutas se resuelven con dirs (XDG_* en Linux, ~/Library en macOS).

Valores por defecto típicos en Linux:

RutaContenido
~/.local/share/dbflux/dbflux.dbBase de datos unificada: profiles, auth, SSH tunnels, governance, audit events, history, sessions, estado de UI
~/.local/share/dbflux/sessions/Archivos de scratch y shadow para el auto-save de restauración de sesión
~/.local/share/dbflux/scripts/Directorio de scripts creados por el usuario

La base de datos dbflux.db contiene todas las tablas de dominio bajo schemas con prefijo:

  • cfg_* — config (profiles, auth, governance, services, hooks, drivers)
  • st_* — state (sessions, query history, estado de UI, saved queries)
  • aud_audit_events — audit log unificado (eventos MCP, eventos de query, conexiones, hooks, scripts)
  • sys_* — system (migrations, tracking de legacy import)

Las policies y roles integrados se sintetizan al arrancar y nunca se escriben en disco.

Importante para tests: no uses directorios reales del usuario. Pasa --config-dir al binario o define HOME/XDG_CONFIG_HOME/XDG_DATA_HOME a rutas temporales para ejecuciones aisladas. El helper dbflux_audit::temp_sqlite_path(name) genera rutas aisladas para tests de audit.

9. Patrón de integración en Rust

En proceso (app GUI, AppState)

// Register a trusted client
state.upsert_mcp_trusted_client(TrustedClientDto {
    id: "agent-a".into(),
    name: "Agent A".into(),
    issuer: None,
    active: true,
})?;

// Assign a built-in role to the agent on a connection
state.save_mcp_connection_policy_assignment(ConnectionPolicyAssignmentDto {
    connection_id: connection_id.to_string(),
    assignments: vec![ConnectionPolicyAssignment {
        actor_id: "agent-a".into(),
        role_ids: vec!["builtin/read-only".into()],
        policy_ids: vec![],
    }],
})?;

Comprobar IDs de built-ins antes de eliminar

if dbflux_mcp::is_builtin(id) {
    // built-ins cannot be modified or deleted
}

Llamada de autorización (usada internamente por el servidor MCP)

use dbflux_mcp::server::authorization::{AuthorizationRequest, authorize_request};

let outcome = authorize_request(
    &amp;trusted_clients,
    &amp;policy_engine,
    &amp;audit_service,
    &amp;AuthorizationRequest {
        identity: RequestIdentity { client_id: "agent-a".into(), issuer: None },
        connection_id: connection_id.to_string(),
        tool_id: "select_data".to_string(),
        classification: ExecutionClassification::Read,
        mcp_enabled_for_connection: true,
    },
    now_epoch_ms(),
)?;

if !outcome.allowed {
    // deny_code and deny_reason explain why
}

10. Checklist de integración

Antes de apuntar un cliente de IA al servidor MCP:

  • dbflux compilado con soporte MCP (habilitado por defecto, o con --features mcp)
  • Trusted client registrado y activo en la GUI de DBFlux
  • --client-id pasado al binario coincide con el client registrado
  • La conexión objetivo tiene MCP habilitado
  • El actor tiene una policy assignment en esa conexión
  • La policy cubre las tools que usará el agente
  • El flujo de aprobación está entendido para cualquier tool de write/destructive

11. Higiene de tests

Para evitar contaminar las máquinas de desarrollo durante los tests:

  • Pasa --config-dir a un directorio temporal o define HOME/XDG_CONFIG_HOME/XDG_DATA_HOME.
  • Usa rutas SQLite temporales para tests de audit.
  • No leas/escribas ~/.config/dbflux ni ~/.local/share/dbflux en código de test.
  • Las policies y roles integrados están disponibles sin ninguna configuración previa — no los insertes manualmente en fixtures de test.
  • El helper dbflux_audit::temp_sqlite_path(name) genera una ruta aislada para cada test.

12. Solución de problemas

El servidor se cierra inmediatamente

  • Falta el argumento --client-id.
  • El directorio de configuración es inaccesible o no se puede crear.

La solicitud se deniega como no confiable

  • Verifica que el client exista y esté activo en la lista de trusted clients.
  • Verifica que --client-id coincida exactamente con el id registrado (sensible a mayúsculas/minúsculas).

La solicitud se deniega porque la conexión no tiene MCP habilitado

  • Habilita MCP en la configuración de governance de la conexión objetivo (Connection Manager → pestaña MCP).
  • O define mcp_enabled_by_default: true en la configuración si quieres que todas las conexiones estén habilitadas.

Policy denegada

  • Confirma que el actor tiene una assignment en el scope de esa conexión.
  • Confirma que el tool ID está en las tools permitidas de la policy asignada.
  • Confirma que la clase de ejecución está en las clases permitidas de la policy.
  • Si usas builtin/read-only, las tools de write (create_script, etc.) quedan excluidas por diseño.

Aprobación atascada en pending

  • Revisa la cola de pending en el workspace de DBFlux y aprueba/rechaza explícitamente.
  • approve_execution requiere la clase admin — asegúrate de que la policy del aprobador la incluya.

La exportación de audit no muestra eventos

  • Verifica que los filtros (actor_id, tool_id, rango de tiempo, decisión) no sean demasiado restrictivos.
  • export_audit_logs está clasificada con la clase de ejecución read.

No se puede eliminar una policy o un role

  • Los IDs integrados (builtin/read-only, builtin/write, builtin/admin) no se pueden eliminar.
  • Crea una policy personalizada con un ID distinto si necesitas una variante modificable.

La configuración cambió en la GUI pero el servidor sigue usando los valores anteriores

  • Reinicia el proceso del servidor MCP. La governance se carga desde disco una sola vez, al arrancar.
Esc
mover abrirEsc cerrar