CLI y MCP de escritorio desatendidos
El acceso desatendido es una capacidad explícita, exclusivamente local y de solo lectura para determinadas bóvedas activas. Incluye recuerdos/tarjetas ordinarios y privados, archivos binarios originales, historial de revisiones y texto sin cifrar de credenciales solicitado explícitamente. Habilítelo únicamente si confía en el cliente receptor para todos los activos y secretos de esas bóvedas. No equivale a la autorización MCP ordinaria ni a una sesión sudo permanente.
Inscribirse y seleccionar la custodia
Inicie el daemon en otro terminal, utilizando el mismo directorio home absoluto y dedicado para cada comando. Primero inicialice su biblioteca y cree las bóvedas de la forma habitual. Las rutas siguientes son ejemplos; utilice su propio directorio privado en cada plataforma.
memories --home /absolute/private/home daemon
Seleccione explícitamente un backend en su terminal interactivo:
memories --home /absolute/private/home unattended enable --backend linux-secret-service
La inscripción advierte que los clientes podrán leer las contraseñas guardadas, solicita escribir
ENABLE y pide su contraseña local para desbloquear y de nuevo para sudo.
Esta configuración de consentimiento/contraseña se requiere una vez al inscribirse, no en cada
lectura desatendida. No pase contraseñas mediante argumentos ni variables de entorno.
La administración posterior sigue requiriendo un terminal desbloqueado con contraseña y autorizado
con sudo de forma ordinaria.
| Backend | Custodia y requisitos |
|---|---|
windows-dpapi |
DPAPI de Windows para el usuario actual; los archivos protegidos usan permisos exclusivos del propietario. Sin ámbito de toda la máquina ni interfaz de autenticación. |
macos-keychain |
Entrada del Llavero de macOS sin sincronización; el acceso bloqueado o que requiera aprobación se deniega en vez de mostrar una solicitud. |
linux-secret-service |
Secret Service en el bus de sesión con una colección/elemento ya desbloqueado. No solicita Unlock ni invoca Prompt. |
owner-file |
Opción explícita de menor protección en escritorio: material de envoltura en texto sin cifrar dentro de un archivo privado del propietario, sin protección criptográfica frente a la cuenta del SO. |
Por ejemplo, seleccionar deliberadamente la opción de menor protección utiliza
unattended enable --backend owner-file. No hay alternativa automática cuando un
backend nativo no está disponible o requiere interacción. Secret Service depende de
la frontera local entre cuenta del SO y D-Bus; el cliente no puede controlar comportamientos
arbitrarios de interfaz específicos del proveedor. El backend solo se selecciona al crear la inscripción. No edite sus
metadatos para cambiarlo. La custodia queda vinculada a la ruta canónica del almacenamiento y a la identidad
actual de la cabecera, por lo que copiarla a otro almacenamiento no constituye una inscripción.
La envoltura de contraseña sigue disponible para desbloqueo y recuperación normales. La inscripción añade otra envoltura de la clave maestra, cuya clave de envoltura permanece fuera de la base de datos; no sustituye la autenticación por contraseña.
Emitir un archivo de cliente
En el mismo terminal autorizado, emita una autorización para las bóvedas que necesita el cliente:
memories --home /absolute/private/home unattended mint --vault VAULT_ID --client-file /absolute/private/home/client.json
# Repeat --vault VAULT_ID to include another vault in this grant.
El directorio padre debe existir previamente y ser privado del propietario. La emisión publica el archivo de forma atómica sin sobrescribir uno existente y rechaza propietarios, permisos o enlaces inseguros. Si falla la publicación, intenta revocar la nueva autorización y notifica cualquier fallo de revocación. La salida contiene el ID de autorización y la ruta, nunca el token Bearer. Conserve el ID para revocarla.
Este archivo de cliente es distinto de los archivos de autorización MCP ordinarios. Protéjalo como una
contraseña; no imprima su contenido, no lo incluya en commits ni ponga su token en argumentos
de comandos. Las lecturas CLI/MCP requieren seleccionar explícitamente --client-file y el mismo
home/almacenamiento. El alcance es read_only_all_assets para las bóvedas seleccionadas, no una
autorización por activo ni limitada a contenido ordinario. Cada lectura vuelve a comprobar la pertenencia
actual del dispositivo local y el alcance de la bóveda.
Inicio y lecturas
Reinicie el daemon después de inscribirse para utilizar el inicio solo con claves. Deténgalo sin
emitir memories lock y vuelva a iniciarlo con el mismo home. Un inicio correcto
carga las claves desatendidas, pero informa de unlocked: false para el acceso ordinario: las lecturas
ordinarias, escrituras, sudo, operaciones en la nube y RAG siguen bloqueados hasta desbloquear con contraseña. Un fallo
del backend deja las claves desatendidas sin cargar, sin recurrir a contraseña ni autenticación implícita.
En Unix, una terminación forzada puede dejar service.sock en el directorio home. Elimine
ese socket obsoleto solo después de confirmar que su daemon se ha detenido.
memories --home /absolute/private/home unattended list VAULT_ID --client-file /absolute/private/home/client.json
memories --home /absolute/private/home unattended history VAULT_ID ASSET_ID --client-file /absolute/private/home/client.json
memories --home /absolute/private/home unattended read VAULT_ID ASSET_ID --client-file /absolute/private/home/client.json
memories --home /absolute/private/home unattended credential-bytes VAULT_ID CREDENTIAL_ID --client-file /absolute/private/home/client.json
La lista devuelve metadatos de activos, incluidos activos privados, archivos y credenciales, pero no sus cuerpos; omite las marcas de eliminación. El historial devuelve metadatos de revisiones, incluidas las marcas de cabeza/eliminación/cuarentena, sin cuerpos de credenciales. Un activo actual con conflictos requiere una revisión coincidente explícita. Las revisiones históricas y eliminadas pueden leerse explícitamente, pero las que están en cuarentena se deniegan. Esta vía lee el historial de bóvedas activas, no archivos de recuperación.
read devuelve los bytes JSON de Content de recuerdos/tarjetas o los bytes originales de un archivo.
Rechaza las credenciales. credential-bytes solo acepta credenciales y devuelve los
bytes UTF-8 del cuerpo guardado, incluidos valores históricos seleccionados explícitamente.
No añade almacenamiento de credenciales binarias arbitrarias. Las referencias a secretos de tarjetas protegidas y wiki
siguen siendo referencias; solicite la credencial referenciada
por separado si la necesita.
Reconstruir los bytes completos
Las respuestas incluyen data con base64url sin relleno, offset con índice desde cero,
total en bytes, next (null al finalizar), la revision real y
encoding (content_json o raw_bytes). Para recuperar todo el contenido:
- Solicite el desplazamiento 0 con
--limitentre 1 y 65536 bytes (predeterminado: 65536). - Decodifique por separado el
datade cada respuesta como base64url sin relleno. - Use
nextcomo siguiente--offsety fije la primera revisión devuelta con--revision REVISION_IDen todas las solicitudes posteriores. - Continúe hasta que
nextsea null y concatene en orden los intervalos de bytes decodificados. Solo entonces decodifique UTF-8/JSON si corresponde; un intervalo puede dividir un carácter UTF-8.
Por ejemplo, un intervalo posterior utiliza:
memories --home /absolute/private/home unattended read VAULT_ID ASSET_ID --client-file /absolute/private/home/client.json --revision REVISION_ID --offset NEXT_OFFSET --limit 65536
Use las mismas opciones con credential-bytes. No concatene las cadenas codificadas
ni considere el primer intervalo como el activo completo. Lista/historial usan --offset y
--limit entre 1 y 100 elementos (predeterminado: 100); las páginas reflejan el estado actual,
no una instantánea, por lo que cambios entre solicitudes pueden alterar el orden y los totales.
Conectar un cliente de IA mediante MCP
Configure un comando independiente de servidor stdio con el mismo home y archivo de cliente:
memories --home /absolute/private/home mcp serve-unattended --client-file /absolute/private/home/client.json
Solo anuncia unattended_list, unattended_history, unattended_read y
unattended_credential_bytes. Los argumentos de herramientas son vault, asset (excepto en la lista),
revision opcional (lecturas de bytes), offset y limit. Los resultados contienen el
mismo JSON paginado/por intervalos en contenido de texto MCP; las descargas completas siguen el contrato
de intervalos de bytes anterior. No hay herramientas de modificación de activos, ejecución, administración, sincronización,
volcado de copias de seguridad, búsqueda/ejecución de modelos ni avance del contador OTP. Las lecturas guardan
intenciones de entrega firmadas antes de devolver la salida; los fallos de auditoría/almacenamiento la deniegan.
El mcp serve --grant-file ordinario no cambia y sigue excluyendo contenido privado,
archivos y lecturas de credenciales. Ningún servidor hereda sudo del terminal. Los almacenamientos gestionados por Center
rechazan inscripción/inicio/uso desatendidos. HTTP/WebSocket, RPC por relé,
FFI móvil/Share y WebUI no pueden usar la autorización desatendida. Estos comandos rechazan opciones remotas,
opciones de conexión del entorno y valores remotos predeterminados guardados,
aunque las opciones remotas globales aparezcan en la ayuda del ejecutable.
Base64 de credenciales es codificación, no cifrado. MCP desatendido entrega intencionadamente bytes secretos al cliente receptor. Proveedores de IA, transcripciones, registros de herramientas, cachés o plugins pueden conservar o transmitir el valor codificado o el texto sin cifrar decodificado. El alcance de solo lectura impide modificaciones mediante esta capacidad, pero no la divulgación ni el uso de un secreto copiado en otros lugares. Use secretos sintéticos para pruebas.
Bloquear, reanudar, revocar y deshabilitar
memories --home /absolute/private/home lock
El bloqueo manual borra las claves e inhibe de forma persistente el inicio desatendido entre reinicios. Desbloquear solo con contraseña no lo reanuda. Si fallan las escrituras persistentes, el bloqueo devuelve un error; no presuponga que la inhibición persistió en un dispositivo sin capacidad de escritura. La limpieza por inactividad/apagado no es una inhibición manual.
La administración requiere desbloqueo con contraseña y sudo en el terminal local:
memories --home /absolute/private/home unlock
memories --home /absolute/private/home sudo
memories --home /absolute/private/home unattended status
memories --home /absolute/private/home unattended resume
El estado informa de habilitación/inhibición y de los ID de autorizaciones, no de tokens. Tras reanudar, reinicie el daemon sin bloquearlo manualmente para volver al estado solo con claves. Para eliminar un cliente o deshabilitar todo el acceso desatendido:
memories --home /absolute/private/home unattended revoke GRANT_ID
memories --home /absolute/private/home unattended disable
La revocación es persistente e idempotente. Deshabilitar desactiva la autorización de forma persistente y revoca todas las autorizaciones antes de limpiar el backend. Eliminar únicamente el archivo de cliente no es revocación si alguien lo ha copiado. Bloquear, revocar y deshabilitar no permiten recuperar texto sin cifrar ya entregado; cambie las credenciales expuestas con su proveedor.
Límites de recuperación y validación
Los registros de envoltura/autorización desatendidos no se incluyen en copias de seguridad lógicas exportadas, emparejamiento de dispositivos ni sincronización de bóvedas. Restaurar una copia lógica no restaura la inscripción desatendida. Una copia íntegra en bruto de la base de datos local sí incluye la tabla auxiliar, y las copias del sistema de archivos pueden copiar archivos de cliente o material de custodia. Los procesos de la misma cuenta, administradores del SO, memoria de procesos, reversión completa del dispositivo y borrado seguro quedan fuera de las garantías de SECURITY.md.
Los adaptadores implementados cubren Windows DPAPI, Llavero de macOS, Secret Service de Linux y custodia owner-file. La validación de extremo a extremo de Linux usa custodia owner-file con el daemon real, recuerdos privados, un archivo binario original y una credencial UTF-8 sintética. Cubre reinicio solo con claves, CLI/MCP mediante entrada-salida estándar, denegación ordinaria/nube/RAG, inhibición manual entre reinicios, reanudación, revocación y deshabilitación. Las pruebas de custodia de Linux y un fixture aislado del protocolo D-Bus ofrecen cobertura adicional, pero el fixture no es una prueba de un llavero de escritorio real.
Los ciclos completos nativos de Windows/macOS, el comportamiento nativo bloqueado/con aprobación pendiente y sin interfaz, y la verificación del llavero de un escritorio real siguen siendo requisitos de publicación. Las compilaciones para otros destinos o pruebas de traducción de errores no demuestran esos comportamientos nativos. La revisión independiente está pendiente; superar las pruebas no constituye una auditoría de seguridad. Consulte las notas de implementación de la CLI y el contrato del núcleo para los comandos de validación específicos.