Acceso de solo lectura a PostgreSQL y MongoDB para agentes de codificación.
Depura con contexto real de base de datos, sin exponer herramientas de escritura.
Política local y limitada al proyecto, incluso cuando tus credenciales existentes permiten escrituras.
Reutilizar tus conexiones — importa desde DBeaver, Docker Compose o MongoDB Compass.
Conectar tu agente de codificación — instala una entrada MCP fijada al proyecto/entorno.
Mantener el control — stdio local, política de proyecto, secretos externos y metadatos de auditoría.
[!IMPORTANT]
El modo de solo lectura aplica a las herramientas de base de datos de SafeSelect, no al shell de un agente,
a otros servidores MCP ni a credenciales directas. Comienza con datos de desarrollo o una
réplica saneada y usa usuarios de base de datos con privilegios mínimos. Revisa el
modelo de amenazas y límites antes de conectar datos sensibles.
Vélo en acción
Incorporación completa: de Homebrew a un agente protegido
Instala SafeSelect desde Homebrew, importa una conexión DBeaver respaldada por SSH,
mantén la contraseña en el Llavero de macOS, instala la integración de OpenCode y observa
al agente leer un pedido pagado mientras su intento de DELETE es rechazado. Los clips
enfocados del agente y del backend permanecen en la galería de demos completa.
Inicio rápido
Ejecuta la configuración desde la raíz de tu repositorio. Necesitarás una conexión PostgreSQL o MongoDB
y un runtime Java 17+ para los comandos de base de datos.
1. Instalar
En macOS con Homebrew:
brew install antonillos/tap/safeselect
Otros métodos de instalación: binarios precompilados y asdf
Binarios precompilados (macOS y Linux glibc)
Descarga un binario precompilado específico para tu plataforma, para macOS o Linux basado en glibc,
desde la última versión de GitHub.
El instalador verificado selecciona la arquitectura macOS o Linux glibc correspondiente,
comprueba el resumen SHA-256 publicado y se instala en ~/.local/bin:
curl -fsSL https://raw.githubusercontent.com/antonillos/safeselect/main/packaging/install/install-release.sh | sh
Establece PREFIX para elegir otro directorio de instalación. SafeSelect aún necesita
un runtime Java 17+ en el momento de la ejecución.
SafeSelect usa cualquier runtime Java 17+ disponible en lugar de requerir una
fórmula específica del gestor de paquetes. Si Java falta o es demasiado antiguo, instala o selecciona
un runtime Java 17+ antes de ejecutar comandos de base de datos. En macOS con Homebrew, puedes
instalar uno con brew install openjdk@17.
2. Importar una fuente de conexión
Elige la fuente que ya usas; no necesitas ejecutar las tres:
Usa tu exportación real o el directorio de Compass. Sigue los siguientes pasos del importador
para la configuración del controlador y la contraseña antes de continuar. Mantén los secretos fuera de los
archivos del proyecto. Para un recorrido respaldado por SSH, consulta DBeaver → Codex.
3. Verificar y conectar tu agente
# Check configured environments; this can open SSH tunnels and contact databases.
safeselect check
# Install for OpenCode (replace with codex for OpenAI Codex).
safeselect agent install opencode
# Inspect the installed MCP entry and its configuration location.
safeselect agent status
¿Múltiples entornos? Usa safeselect check --environment <name> para evitar
verificar bases de datos no relacionadas, y añade --environment <name> a
agent install para seleccionar el destino previsto. La instalación infiere el nombre solo
cuando hay un entorno.
Abre o reinicia tu agente y aprueba el servidor MCP si se te solicita. La instalación
usa el ámbito de usuario por defecto; consulta agentes compatibles y la
guía de configuración del cliente para el ámbito de proyecto y los pasos específicos del cliente.
4. Probar una primera lectura
Pregunta a tu agente:
Usa SafeSelect para identificar el backend conectado y descubrir sus tablas
o colecciones disponibles. Describe una, luego detente antes de consultar el contenido de filas o
documentos. Sigue las siguientes sugerencias solo dentro de ese ámbito exclusivo de descubrimiento.
El éxito se ve así: el agente llama a database_info, usa las herramientas
de descubrimiento de esquemas correspondientes e informa la estructura que encontró. No se necesitan herramientas de escritura
ni contraseñas de base de datos en la conversación.
¿Atascado? Ejecuta safeselect doctor --environment <name> para diagnósticos concisos
(esto puede contactar la base de datos), luego sigue el siguiente paso indicado. No
relajes la política para superar un rechazo. Consulta recuperación del agente.
¿Qué se instala? Configuración y ámbito de MCP
El nombre MCP generado por defecto es safeselect-<project>-<environment>.
La entrada MCP generada es un servidor stdio limitado a un proyecto y entorno:
SafeSelect usa el contrato de configuración MCP oficial de cada cliente, fija
la ruta absoluta del repositorio y usa el ámbito de usuario por defecto. Añade --local para una
entrada de ámbito de proyecto donde el cliente lo admita. Consulta
integración con agentes de IA para rutas exactas, ámbitos y configuración
manual.
Depurar una aplicación con datos realistas sin exponer herramientas de mutación.
Permitir que un agente inspeccione esquemas, índices, planes de consulta y filas limitadas durante el desarrollo.
Explorar colecciones de MongoDB mediante lecturas limitadas e inferencia de esquemas muestreados.
Reutilizar conexiones existentes de DBeaver, Docker Compose o MongoDB Compass.
Dar a los agentes de codificación contexto de base de datos mientras mantienes política, límites, secretos y auditoría bajo tu control.
¿Por qué SafeSelect?
SafeSelect es intencionalmente más limitado que los servidores MCP de bases de datos de propósito general. No es un constructor de herramientas, un banco de trabajo SQL ni una puerta de enlace remota de bases de datos. Es un límite de seguridad local para agentes que necesitan visibilidad de la base de datos, no poder sobre ella.
SafeSelect prioriza
Qué significa
Transporte stdio local
Sin listener de red ni puerto MCP abierto
Herramientas de solo lectura
Los agentes no reciben herramientas de base de datos con capacidad de escritura
Seguridad independiente de credenciales
Incluso las credenciales DBA están restringidas a la superficie de herramientas de solo lectura de SafeSelect
Cumplimiento de cierre ante fallos
Las violaciones de política terminan el proceso
Aislamiento de secretos
Las contraseñas permanecen en el Llavero o en variables de entorno
Política limitada al proyecto
Cada repositorio define su propia superficie de datos permitida
Sidecar integrado
Un binario instalado alcanza los controladores JDBC y MongoDB detrás de la política Rust
¿Qué lo hace diferente?
La combinación importa: inspección de PostgreSQL y MongoDB, una superficie fija de lectura
de base de datos, stdio local, política de proyecto, importación de conexiones y evidencia de seguridad
reproducible. Los modos de solo lectura y los controles en capas también existen en otros
proyectos; no son exclusivos de SafeSelect.
Consulta la comparación fechada para DBHub, MongoDB MCP Server,
Postgres MCP Pro y SchemaBrain, incluido cuándo cada uno es una mejor opción.
Los agentes pueden mirar, pero no pueden modificar a través de las herramientas de base de datos de SafeSelect.
Este límite no cubre un shell, otro servidor MCP ni credenciales directas
también disponibles para el agente. Usa usuarios de base de datos con privilegios mínimos y revisa el
modelo de amenazas y límites.
Soporte de backends
Backend
Estado
Herramientas
PostgreSQL
Compatible
Descubrimiento, índices/estadísticas, select y explain
MongoDB
Compatible
Descubrimiento, find, agregación, distinct/count, explain, perfilado, inferencia de esquemas y fixtures anonimizados
Arquitectura
El agente habla con SafeSelect a través de MCP stdio. SafeSelect aplica la política en Rust, almacena secretos fuera de los archivos del proyecto y llega a las bases de datos mediante un sidecar Java integrado: JDBC para backends SQL y el controlador MongoDB para MongoDB. El canal de Rust a Java es JSON-lines sobre stdin/stdout: sin sockets, sin puertos abiertos.
Contexto MCP guiado
Los clientes que admiten prompts MCP pueden invocar read_only_database_debugging para una
lista de verificación de investigación segura. Los clientes también pueden leer
safeselect://guide/read-only-database-debugging para el mismo flujo de trabajo estático
y notas sobre el límite. Ninguna de estas capacidades expone datos de base de datos, credenciales ni
acceso de escritura; usa las herramientas de base de datos a continuación para descubrimiento y lecturas limitadas.
Flujo de trabajo del agente
Los agentes deben usar SafeSelect en este orden:
database_info
list_tables y luego describe_table; inspecciona list_table_indexes o estadísticas limitadas cuando sea útil para SQL
list_databases, list_collections y luego discover_document_schema para NoSQL
select / explain, o la herramienta de lectura MongoDB limitada que coincida con la tarea
check, connect o reconnect cuando la conectividad esté desactualizada
Los agentes deben descubrir la estructura de relaciones o colecciones antes de consultar datos desconocidos y usar el next_suggestion de cada respuesta de descubrimiento en lugar de adivinar nombres de columnas o campos. Las descripciones SQL son metadatos de catálogo; los esquemas MongoDB se infieren de una muestra limitada y no exhaustiva.
Los documentos de consulta MongoDB deben permanecer como valores JSON anidados completos. Los clientes
que aplanan argumentos de herramientas anidados pueden pasar filter, projection y sort como
cadenas de objetos codificadas en JSON y pipeline como una cadena de matriz codificada en JSON.
redact_fields también acepta una matriz de cadenas codificada en JSON. Las claves aplanadas se
rechazan para que un filtro o redacción perdido nunca pueda convertirse en un respaldo menos restringido.
El JavaScript del lado del servidor de MongoDB nunca está disponible: $where, $function y
$accumulator se rechazan recursivamente en filtros, proyecciones, ordenamientos y
canalizaciones de agregación antes de que el controlador MongoDB los reciba. Cuando se rechazan,
reconstruye la solicitud con operadores MQL declarativos; SafeSelect no tiene ninguna configuración
que habilite JavaScript.
Las respuestas de consulta incluyen row_count, byte_count, elapsed_ms y un valor elapsed legible por humanos para que los agentes puedan razonar sobre el tamaño del resultado y la latencia.
Cada éxito y error de MCP incluye un next_suggestion contextual. Los agentes
deben seguir esa única acción segura, nunca repetir ciegamente una solicitud no válida
y detenerse cuando la sugerencia sea terminal. Para clientes que solo muestran un resumen
de error de MCP, SafeSelect también incluye la siguiente sugerencia confiable en ese
resumen sin exponer detalles derivados de la base de datos.
Modelo de seguridad
Fail closed: las violaciones de seguridad terminan el proceso MCP.
Solo lectura: SQL permite SELECT, EXPLAIN y WITH; los backends NoSQL permiten descubrimiento y lecturas de documentos de solo lectura.
Sin JavaScript en el servidor: $where, $function y $accumulator de MongoDB se rechazan en Rust y nuevamente en el sidecar de Java.
Acceso limitado: se pueden permitir o denegar esquemas, relaciones, bases de datos y colecciones.
Límites estrictos: se aplican límites de filas, bytes de resultados y tiempos de espera; los comandos de lectura de MongoDB reciben el mismo tiempo de espera que maxTimeMS.
Aislamiento de secretos: las contraseñas viven en el Llavero de macOS o en variables de entorno, nunca en la configuración del proyecto.
Verificación de controladores: los controladores JDBC se verifican mediante SHA-256 antes de su uso.
Rastro de auditoría: el texto de la consulta se cifra antes de registrarse; la sesión actual expone metadatos de auditoría limitados a través de audit_status y audit_recent.
Límites deliberados
SafeSelect no expone escrituras en bases de datos, migraciones, administración ni ejecución arbitraria de comandos.
PostgreSQL y MongoDB son los backends compatibles hoy; una amplia cantidad de conectores no es el objetivo.
El transporte MCP es stdio local. SafeSelect no es una puerta de enlace remota de bases de datos.
El descubrimiento de esquemas de MongoDB se muestrea y limita, no es una garantía exhaustiva de esquema.
SafeSelect complementa el privilegio mínimo nativo de la base de datos; no lo reemplaza.
get_maintenance_diagnostics admite PostgreSQL 15, 16, 17 y 18.
Cuando no existe un directorio .safeselect/, safeselect serve busca servicios
PostgreSQL de Compose. Si los encuentra, entra automáticamente en modo de configuración inicial: los importa,
escribe la configuración del proyecto e inicia un servidor MCP solo de configuración. De lo contrario, imprime
instrucciones de configuración y sale.
Una configuración existente pero vacía o inválida se rechaza, no se reemplaza por la configuración inicial.
[!IMPORTANT]
El modo de configuración inicial no expone herramientas de consulta. Los agentes pueden ayudar a importar y validar la configuración antes de que las herramientas de inspección de bases de datos estén disponibles.
Esenciales de CLI
Comando
Propósito
safeselect serve [--environment <env>]
Iniciar el servidor MCP
safeselect check [--environment <env>]
Verificar configuración, secretos, túneles, sidecar y conectividad del backend para todos los entornos de forma predeterminada
safeselect doctor [--environment <env>]
Imprimir hallazgos concisos con códigos estables para cada entorno de forma predeterminada
safeselect posture [--environment <env>]
Inspeccionar la postura de PostgreSQL para cada entorno de forma predeterminada
Eliminar binarios instalados, estado global, datos de auditoría y entradas del Llavero
safeselect uninstall --binary-only
Eliminar solo binarios locales del usuario y conservar la configuración
Galería visual de comandos
La CLI es más fácil de escanear por tarea que como una lista larga. La galería de comandos web usa las mismas capturas de demostración sintética. query se mantiene separado porque es un flujo de trabajo SQL directo; los agentes normalmente deberían descubrir el esquema primero a través de las herramientas MCP.
Importar conexiones — Trae una conexión existente de DBeaver, Docker Compose o MongoDB Compass al proyecto.
import-dbeaver
Importa una exportación de DBeaver en .safeselect/.
Las importaciones de Compass conservan los detalles de conexión de MongoDB sin exponer credenciales.
Preparar el proyecto — Valida la política local, instala controladores y conecta un cliente de IA sin repetir banderas de configuración.
config
Valida, inspecciona y mantiene la configuración del proyecto.
safeselect config show --project demo --environment postgres
La vista de configuración informa un resumen de política seguro y redactado antes de que el servidor se inicie.
driver
Registra y verifica controladores JDBC.
safeselect driver list
El registro de controladores muestra el proveedor y el artefacto local verificado.
agent
Detecta clientes e instala su entrada MCP.
safeselect agent detect
La detección lista los clientes disponibles antes de una instalación MCP explícita limitada al proyecto.
Verificar y diagnosticar — Comprueba la ruta completa desde la política del proyecto hasta la base de datos, luego inspecciona la postura efectiva de PostgreSQL.
check
Prueba configuración, secretos, túneles, sidecar y conectividad del backend.
safeselect check
Las comprobaciones siguen la convención e inspeccionan cada entorno a menos que se seleccione uno deliberadamente.
doctor
Imprime hallazgos concisos con códigos de diagnóstico estables.
safeselect doctor
Doctor convierte una conexión fallida en una próxima acción corta en lugar de un muro de registros.
posture
Inspecciona la postura de seguridad efectiva de PostgreSQL.
safeselect posture --strict
Postura muestra la política de solo lectura efectiva, los límites y la postura de la base de datos antes del uso del agente.
Gestionar una conexión — Inicia el servidor MCP local o ejercita el ciclo de vida de la conexión temporal directamente.
serve
Inicia el servidor MCP local para un entorno de proyecto.
safeselect serve
El servidor habla stdio local: la respuesta de inicialización MCP expone las capacidades de SafeSelect, no un listener de red.
connect
Prueba una conexión JDBC temporal.
safeselect connect
Connect verifica el sidecar JDBC temporal contra el fixture en vivo sin tomar el control de una sesión MCP activa.
disconnect
Cierra una conexión JDBC temporal.
safeselect disconnect
Disconnect cierra limpiamente el sidecar JDBC temporal e informa el paso del ciclo de vida completado.
reconnect
Reinicia el sidecar y verifica la conectividad.
safeselect reconnect
Reconnect reinicia el sidecar y verifica el fixture en vivo en lugar de ocultar una base de datos obsoleta.
Explorar SQL: descubrir, inspeccionar y diagnosticar — Usa query cuando ya conoces el SQL limitado que quieres inspeccionar. Los agentes normalmente deberían descubrir el esquema primero a través de las herramientas MCP.
query
Ejecuta una declaración SQL de solo lectura limitada y muestra sus resultados.
safeselect query --sql "SELECT order_id, status, subtotal FROM public.demo_orders WHERE status = 'paid' LIMIT 3"
La solicitud SQL limitada devuelve tres filas de fixture sintético con conteos de filas y bytes; las escrituras siguen rechazadas.
list_tables (MCP)
Descubre tablas PostgreSQL a través de MCP.
list_tables({"schema":"public"})
Respuesta MCP real, formateada como tabla: cinco relaciones sintéticas en public. Descubre los nombres exactos antes de inspeccionar columnas.
describe_table (MCP)
Inspecciona nombres de columnas, tipos y nulabilidad a través de MCP.
Respuesta MCP real, formateada como tabla: ocho columnas incluyendo UUID, JSONB y un rango de marcas de tiempo. No se consultan filas de datos.
get_maintenance_diagnostics (MCP)
Inspecciona señales de ANALYZE y VACUUM sin ejecutar mantenimiento.
get_maintenance_diagnostics({"schema":"public"})
Extracto de respuesta MCP real: las cinco tablas de fixture están por debajo de los umbrales de mantenimiento. Este diagnóstico de solo lectura nunca ejecuta ANALYZE o VACUUM; revisa la evidencia con un DBA.
Explorar NoSQL: descubrir, inferir y leer — Sigue el descubrimiento de MongoDB desde bases de datos hasta documentos limitados, con inferencia de esquema muestreada antes de las lecturas.
list_databases (MCP)
Descubre bases de datos MongoDB a través de MCP.
list_databases()
Respuesta MCP real: la demo aislada expone una base de datos permitida. Elígela antes de descubrir colecciones.
list_collections (MCP)
Descubre colecciones en una base de datos MongoDB permitida.
list_collections({"database":"safeselect_demo"})
Respuesta MCP real: se listan cuatro colecciones sintéticas sin leer documentos.
discover_document_schema (MCP)
Infiere campos y tipos frecuentes de una muestra MongoDB limitada.
Respuesta MCP real: tres pedidos pagados, 994 bytes, devueltos en 7ms. El filtro y el límite mantienen la lectura acotada.
Usa safeselect --help o un --help específico de comando para la CLI completa.
La desinstalación verifica tanto las ubicaciones de binarios del instalador de lanzamiento como las de Cargo.
Las importaciones de MongoDB Compass admiten conexiones mongodb+srv:// con túnel SSH resolviendo
el destino SRV y reescribiendo el endpoint local con las opciones TLS y de conexión directa
requeridas.
Configuración
El estado global vive en ~/.config/safeselect/ de forma predeterminada. La política del proyecto vive en .safeselect/ en la raíz del repositorio:
SafeSelect sube desde el directorio actual para encontrar .safeselect/. Usa --project <path> cuando un agente o script deba apuntar a un repositorio específico.
Convención antes de la configuración
Desde el interior de un repositorio configurado, los comandos infieren el proyecto a partir del directorio
.safeselect/ más cercano e infieren el entorno cuando existe exactamente un
archivo environments/*.toml. Por ejemplo, safeselect serve,
safeselect check, safeselect query --sql "SELECT 1" y
safeselect config show no necesitan indicadores de proyecto o entorno en un
proyecto de un solo entorno. --project y --environment siguen disponibles
para scripts, otros directorios de trabajo y selección deliberada. Si existen múltiples
entornos, los comandos que actúan sobre uno fallan en lugar de adivinar y te
indican que pases --environment <name>.
Los valores predeterminados difieren según la operación:
serve, query, connect, disconnect, config show y los comandos de
contraseña requieren un entorno explícito o inferido de forma única. Sin
entornos, fallan; serve tiene el comportamiento separado de primera ejecución descrito anteriormente.
check, doctor, posture, reconnect y config validate inspeccionan o
procesan todos los entornos cuando se omite el indicador. Las comprobaciones no son sin conexión:
pueden resolver secretos, establecer túneles SSH y contactar bases de datos. Usa
--environment <name> para evitar tocar entornos no relacionados o de producción.
query solo admite entornos JDBC y aún necesita SQL a través de --sql
o stdin (el stdin interactivo espera EOF). Seleccionar un entorno MongoDB
no lo convierte en un comando de consulta MongoDB.
CLI connect y disconnect operan en un sidecar JDBC temporal nuevo y lo
cierran antes de salir. No controlan una sesión MCP ya en ejecución;
usa las herramientas de conexión MCP de esa sesión en su lugar.
Los comandos de contraseña modifican el Keychain/configuración local, no la contraseña
de la base de datos en sí. config set-ssh-password cambia la autenticación SSH a
contraseña y borra la referencia de archivo de identidad configurada.
Las entradas MCP generadas fijan deliberadamente tanto el proyecto como el entorno. Mantén esos
argumentos en la configuración del cliente y en scripts desatendidos: la inferencia es una
conveniencia de CLI, no un entorno predeterminado persistente.
Agentes compatibles
Cliente
Alcance de usuario
Alcance de proyecto
Integración
OpenCode
Sí
Sí
JSON/JSONC mcp
OpenAI Codex
Sí
Sí
TOML sin pérdida mcp_servers
Claude Code
Sí
Sí
alcances nativos claude mcp
Cursor
Sí
Sí
.cursor/mcp.json
Windsurf
Sí
No
configuración MCP global de Windsurf
GitHub Copilot
Sí
Sí
servers en MCP JSON
Gemini CLI
Sí
Sí
.gemini/settings.json
SafeSelect nunca recurre silenciosamente a un alcance más amplio. En particular,
--local para Windsurf falla con una corrección clara porque Windsurf no
documenta una configuración MCP con alcance de proyecto.
Compilar desde el código fuente
# Installs makevn through Homebrew or asdf only when it is missing.
./install.sh --install-makevn
"$HOME/.local/bin/safeselect" --version
Requisitos: Rust 1.85+ y Java 17+. El arranque requiere Homebrew o
asdf; de lo contrario, instala makevn primero. sshpass es opcional para
túneles SSH basados en contraseña. Agrega ~/.local/bin a tu PATH antes de invocar
safeselect sin su ruta completa.