Deja que tu IA envíe secretos sin dárselos.
Cómo el MCP de PrivateNote entrega archivos por correo, Slack, Discord y WhatsApp — sin que el modelo los lea
Tu asistente puede enviar hoy un contrato, una contraseña o un CSV. No debería tener que leer esos archivos para hacerlo. Pasa rutas locales al MCP de PrivateNote y pon solo un enlace que se autodestruye en el canal que ya usas.
Ideas clave
- Pasa rutas de archivo, no los bytes: el MCP local cifra para que el modelo no necesite la carga.
- Apruebas una vista previa que fija los bytes exactos, las opciones y el destino. Crear una nota no es permiso para enviarla.
- El correo, Slack, Discord y WhatsApp solo deben llevar la URL de PrivateNote cuando sendAuthorized sea verdadero — nunca el archivo. Deja desactivado el modo de un solo paso si el agente también puede enviar mensajes.
- La URL descifrable es una capacidad al portador que el agente puede ver tras confirmar. No la registres. Después del envío, consulta si se abrió o revoca una nota sin abrir.
Lo útil de un asistente de IA no es que pueda leer un contrato, un archivo de contraseñas o una exportación de clientes. Lo útil es que pueda hacer llegar esa carga a la persona correcta, en el canal donde ya vive, sin convertir al asistente en una copia del secreto.
Ese es el trabajo de cada día: enviar un PDF a un cliente por correo, dejar una contraseña de staging a un compañero en Slack, entregar un token de bot a un moderador en Discord o poner un acceso de un solo uso en un hilo de WhatsApp. La gente ya lo hace pegando. Los agentes hacen el pegado más rápido — y la filtración más grande, porque el secreto queda también en el contexto del modelo, la transcripción del chat y cada registro que guarda el host.
El servidor MCP de PrivateNote está hecho para la separación contraria. El agente orquesta. Un proceso local maneja el secreto. Tú apruebas el archivo exacto y el destino. El correo, Slack, Discord y WhatsApp solo llevan un enlace. Al modelo se le dice que pase rutas de archivo, no bytes. El cifrado ocurre en tu máquina después de que confirmas. Lo que vuelve es una URL cuyo fragmento guarda la clave — el mismo modelo de enlace secreto de un solo uso que la app web. Crear una nota no es permiso para enviarla.
El trabajo es enviar, no saber
La mayoría de los consejos de «IA + secretos» siguen suponiendo que el modelo debe ver la credencial para ayudar. Eso es cierto si quieres que el modelo explique el archivo, reescriba el contrato o depure la clave. No lo es si quieres que lo entregue.
La entrega es un problema de logística: qué archivo, qué persona, qué canal, cuánto debe durar el acceso, si debe quemarse tras la primera vista. Ninguna de esas decisiones exige el texto en claro. Exigen una herramienta que pueda leer una ruta local, cifrar y devolver un handle que el resto de la pila tiene permitido ver.
Para eso está privatenote-mcp. Los hosts que respetan las instrucciones MCP reciben, en orden: si el usuario nombró un archivo local, pasa la ruta absoluta; no lo abras, no hagas cat ni lo resumas; llama a create_private_note (una vista previa); espera a que apruebes; luego llama a confirm_private_note. Solo después otra herramienta puede enviar la URL — y solo al destino que aprobaste.
La regla
Si el asistente puede completar la tarea con una ruta, no debe completarla con el contenido. Pegar en el prompt es el último recurso — cuando el secreto ya está en el chat.
Por qué los canales que ya usas guardan la copia equivocada
El correo, Slack, Discord y WhatsApp son buenos para la conversación. Son malas cajas fuertes. El cifrado en tránsito, incluso de extremo a extremo, no decide cuánto tiempo permanece una copia buscable en dispositivos, exportaciones del espacio, copias en la nube o vistas previas de notificaciones. Es la misma distinción que por qué el correo es el peor lugar para los secretos y por qué los secretos nunca deben pegarse en el chat.
- El correo guarda los adjuntos en ambos buzones, en los servidores de correo, en retenciones legales y en «buscar todo el correo». Reenviar multiplica copias que luego no puedes revocar.
- Slack está indexado por el espacio de trabajo. Los administradores, las exportaciones de cumplimiento y las funciones de IA que resumen canales pueden redescubrir una contraseña meses después.
- Discord parece efímero en un servidor activo. No lo es. Los pines, la búsqueda y los MD conservan tokens de bot y secretos de admin junto a los memes.
- WhatsApp suele ser el único canal que un contratista o un cliente abrirá de verdad. También es una bandeja familiar: las capturas viajan, los ordenadores vinculados se sincronizan y las copias de seguridad sobreviven al encargo.
El punto no es abandonar esas herramientas. El punto es dejar de poner en ellas la carga. Siguen siendo el sobre. La nota es la carta. Los destinatarios siguen sin necesitar cuenta de PrivateNote: abren el enlace en un navegador, igual que cualquier otra URL que ya les envías.
La división en tres
| Rol | Qué puede ver | Qué no debe ver |
|---|---|---|
| Agente de IA (Cursor, Claude, Codex) | Quién, qué ruta, qué canal, caducidad, burn-after-read. Después de que confirmas: la URL descifrable | Bytes del archivo, contraseñas, cuerpo de la nota. No debe enviar la URL hasta que apruebes ese destino |
| MCP de PrivateNote (proceso Node local) | Los archivos en disco, solo para cifrar | Nada que luego devuelva como texto en claro |
| Correo / Slack / Discord / WhatsApp | La URL de PrivateNote (y un asunto legible) | El adjunto, la credencial, la frase de paso |
El MCP no envía el correo ni el mensaje de Slack por ti. Crear una nota no es autorización para enviarla. Después de que apruebas una vista previa que nombra un canal y un destinatario exactos, el resultado puede incluir sendAuthorized: true — entonces una herramienta de correo o chat puede enviar solo la URL a ese destino. Si no se aprobó ningún destino, sendAuthorized es false y el agente debe darte la URL para pegar, no disparar otra herramienta.
La URL es una capacidad al portador: quien la tiene puede abrir la nota. El host MCP actual devuelve secureUrl en el resultado de la herramienta, así que el agente puede observar el enlace aunque no pueda observar los bytes del archivo. No la registres, no la hagas commit ni la copies en herramientas ajenas. Trátala como el secreto.
El resto de lo devuelto es pequeño: noteId, expiresAt, burnAfterReading y, cuando aplica, passwordProtected y attachedFileNames. Los nombres de archivo son metadatos, no contenido — evita igualmente poner un secreto en el nombre.
Qué hace de verdad el MCP en tu máquina
Cuando el agente llama a create_private_note, un proceso local de Node.js — no el modelo — canoniza la ruta, la comprueba contra la lista permitida del espacio de trabajo, hace hash del archivo y te muestra una vista previa. Aún no devuelve una URL descifrable. Después de que apruebas, confirm_private_note vuelve a abrir ese mismo archivo, verifica dispositivo, inode, tamaño y SHA-256, y cifra esos bytes. Si el archivo cambió, la confirmación falla; el agente debe empezar de nuevo. El texto cifrado AES-256-GCM se envía por POST a PrivateNote. La clave de descifrado va en el fragmento de la URL (#…). Los navegadores no envían fragmentos a los servidores. La API guarda un blob cifrado. Sin el fragmento, ese blob es ruido.
Prefiere parámetros de ruta para que el host nunca tenga que poner el secreto en los argumentos de la llamada que construyó el modelo:
contentFilePath— archivo UTF-8 que se convierte en el cuerpo de la nota (una contraseña, un código de recuperación, una instrucción breve).filePath/filePaths— adjuntos locales (PDF, CSV, imágenes). Requieresign_in. Máximo combinado de 20 archivos.passwordFilePath— la primera línea de un archivo local se convierte en la frase de paso de revelado (envoltorio Argon2id). Envía esa frase por otro canal, nunca en el mismo mensaje que el enlace.contentypassword— último recurso, solo si el usuario ya pegó el secreto en el chat y no existe un archivo.
La política por defecto encaja con una entrega, no con un archivo: burnAfterReading es true, expiresIn es 24 horas por defecto. Más corto es mejor cuando el destinatario espera al otro lado de Slack. La vista múltiple (burnAfterReading: false) necesita una cuenta Premium. Adjuntar archivos, verificación del destinatario, avisos de apertura y listar o revocar necesitan una sesión iniciada; las puertas y las alertas también necesitan un plan de pago.
Las rutas están limitadas. Por defecto solo se pueden leer archivos bajo el espacio de trabajo (el directorio de trabajo del proceso MCP). Define PRIVATENOTE_MCP_ALLOWED_ROOTS si debes añadir carpetas. Las claves SSH, los directorios de credenciales en la nube y el archivo de sesión del MCP están siempre bloqueados, aunque permitas $HOME o /.
Apruebas la entrega exacta — no un nombre de ruta
Un agente que puede crear un enlace descifrable y enviar correo o Slack es un confused deputy: podría cifrar el archivo equivocado, o enviar el enlace correcto a la persona equivocada, en un solo turno. El valor por defecto de PrivateNote es que tú autorizas tres cosas juntas: los bytes exactos del archivo, las opciones exactas de la nota (caducidad, burn-after-read) y el destino exacto.
La vista previa debe mostrar el destino cuando se pide el envío, por ejemplo «Send via: Email / Recipient: alice@example.com». Aprobar eso nunca debe autorizar otra dirección u otro canal de Slack. confirm_private_note solo acepta confirmationId. El agente no puede cambiar la ruta, el destinatario, el canal, la caducidad ni la política de destrucción al confirmar.
Crear una nota sin destino devuelve sendAuthorized: false. Es a propósito. Un enlace en el chat sigue siendo sensible — pero no es permiso para enviarlo por correo.
No actives el modo de un solo paso si el agente puede enviar
PRIVATENOTE_MCP_ALLOW_ONE_SHOT se salta la vista previa humana. El agente no puede activarlo como argumento de herramienta, y cambiar la variable de entorno más tarde no surte efecto hasta que reinicies el servidor MCP. Déjalo apagado. Activarlo mientras el mismo host puede enviar correo, Slack, Discord o archivos deja que el modelo cree un enlace descifrable y lo despache en un paso — incluido el archivo equivocado o el destinatario equivocado. La lista de rutas sigue aplicando; no sustituye tu aprobación.
Conéctalo una vez
Requiere Node.js 18+. Después de guardar, reinicia el cliente MCP para que cargue los esquemas e instrucciones actuales. Las notas de instalación completas están en la página de integración MCP.
{
"mcpServers": {
"privatenote": {
"command": "npx",
"args": ["-y", "privatenote-mcp"]
}
}
}Codex CLI: codex mcp add privatenote -- npx -y privatenote-mcp. Eso escribe ~/.codex/config.toml. Las notas específicas de Codex están en Usar PrivateNote con OpenAI Codex.
Autoalojado: define PRIVATENOTE_API_BASE_URL y PRIVATENOTE_WEB_ORIGIN en el bloque env del MCP para que el texto cifrado no salga de tu infraestructura. Opcionalmente PRIVATENOTE_MCP_ALLOWED_ROOTS. No añadas PRIVATENOTE_MCP_ALLOW_ONE_SHOT salvo que tengas un host de automatización muy acotado y sin herramientas de envío.
Uso diario: correo
El correo sigue siendo cómo las empresas envían contratos, NDA, facturas con datos bancarios y exportaciones de clientes. El fallo es adjuntar el archivo. El buzón conserva entonces una copia descifrable durante años, también del lado del destinatario, en rastros BCC y en el e-discovery.
El patrón MCP: el agente ya conoce la dirección de Alice y los dos PDF locales. No debe abrir esos PDF. Inicia sesión si hace falta, llama a create_private_note con filePaths, sendChannel y sendRecipient para que la vista previa nombre a Alice, espera a que apruebes y luego confirm_private_note. Solo entonces la herramienta de correo puede poner únicamente secureUrl en el cuerpo. Si usas verificación del destinatario, quien lee debe demostrar que posee la dirección antes de que la nota se abra — esa puerta no envía el correo; tu herramienta de correo sigue haciéndolo.
Envía estos dos archivos a Alice por correo. Protégelos con la contraseña de /absolute/path/client-password.txt. No expongas los archivos ni la contraseña al modelo: /absolute/path/contract.pdf /absolute/path/nda.pdf
- El agente llama a
sign_insi no hay sesión del plugin, luego acreate_private_noteconfilePaths,passwordFilePath,sendChannel: "email"ysendRecipient. Apruebas la vista previa. Luegoconfirm_private_note. - El asunto puede decir «paquete del contrato» — no debe citar cláusulas del PDF.
- Envía la frase de paso en un segundo mensaje, una llamada o un uso compartido del gestor de contraseñas — nunca en el mismo correo que el enlace. Mira cómo compartir una contraseña de forma segura.
- Para un destinatario con nombre en un plan de pago:
requireRecipientVerification: trueyrecipientEmail: "alice@example.com".
Es el mismo modelo de entrega que enviar documentos sensibles de forma segura, salvo que el asistente puede ejecutarlo sin convertirse en lector del paquete.
Uso diario: Slack
Slack es donde ocurre la guardia. Las contraseñas de la base de staging, los tokens de despliegue y «el CSV de finanzas» caen en un hilo porque todo el mundo ya está ahí. La búsqueda del espacio convierte ese depósito en una wiki interna permanente de secretos.
Pide una entrega basada en ruta y una mecha corta. Quince minutos bastan si el compañero está en línea. Quema tras la lectura para que un acierto de búsqueda posterior sea un enlace muerto, no una credencial viva. Trata la URL como el secreto: no la publiques en un canal público; usa un MD o un canal privado dedicado.
Envía a Mark la contraseña de la base de /absolute/path/secrets/db-password.txt en Slack. Lectura única y caduca en 15 minutos. No leas el archivo en el chat.
create_private_noteconcontentFilePath,expiresIn: "15m",burnAfterReading: truey el destino de Slack fijado en la vista previa. Aprueba y luegoconfirm_private_note.- Si Slack está conectado como otra herramienta MCP, el agente solo puede publicar
secureUrlen el destino aprobado cuandosendAuthorizedes true. Si no, te da la URL para pegar. - Después de que Mark la abra, rota la contraseña si era un secreto de staging compartido — la nota redujo copias sobrantes; no hizo única una credencial compartida.
Uso diario: Discord
Discord es el canal de operaciones por defecto de muchas comunidades de producto y equipos cercanos al juego. Tokens de bot, claves de Cloudflare y «aquí la hoja de usuarios reportados» se pegan en MD de moderación porque Discord es donde están los mods.
Un mensaje de Discord sigue siendo un mensaje almacenado. Los miembros del servidor con el rol adecuado, las copias de los dispositivos y la propia búsqueda de Discord lo conservarán. El patrón MCP es idéntico al de Slack: cifra el archivo o el token en local, pon el enlace en el MD, fija una caducidad corta. Si el token ya se pegó antes en el mismo servidor, rótalo — envolver un secreto filtrado no deshace la filtración.
Manda por MD al responsable de la comunidad el token del bot en /absolute/path/secrets/discord-bot.txt y la exportación de moderación en /absolute/path/reports/export.csv. Lectura única, 1 hora, no abras esos archivos.
- Los adjuntos necesitan
sign_in. Una nota que solo es un token puede usarcontentFilePathsin sesión. - Fija el destino de Discord en la vista previa, apruébalo y luego
confirm_private_note. Solo entonces una herramienta de Discord puede enviar la URL. - Prefiere un MD de usuario a pegar en el canal de mods. Un «canal privado» sigue siendo una transcripción.
- Si la exportación incluye datos personales, añade un archivo de frase de paso y dile la frase al responsable en una llamada de voz.
Uso diario: WhatsApp
WhatsApp es el canal que usas cuando la otra persona no va a unirse a Slack y no mirará el correo hasta el lunes. Un contratista, un asistente de family office, un cliente en el teléfono. El cifrado de extremo a extremo es real. La persistencia también: el chat es un registro, a menudo en varios dispositivos, a menudo con copia de seguridad.
No necesitas que instalen PrivateNote. Necesitas que toquen un enlace. El trabajo del asistente es preparar ese enlace a partir de un archivo local que ya tienes — PDF de factura, contraseña del Wi-Fi, código de portal de un solo uso — sin leerlo antes en el hilo de Cursor o Claude. Sigues aprobando la vista previa (archivo exacto y destino de WhatsApp) antes de que confirm_private_note cree la URL.
Envía el paquete de onboarding de /absolute/path/client/onboarding.pdf a Ana por WhatsApp. Quema tras la lectura, caduca mañana. No leas el PDF.
WhatsApp previsualiza las URL. Esa vista previa es la página de PrivateNote, no el archivo descifrado. Aun así: no pongas la frase de paso en el mismo chat. Si el número puede estar mal, crea la nota, envía el enlace y revócala si nunca la abrió. Quienes envían de forma profesional y necesitan una página de revelado con marca en lugar de una burbuja verde deberían leer entrega segura a clientes para abogados.
Inicia sesión cuando la carga es un archivo
Las notas solo de texto desde contentFilePath pueden crearse sin cuenta, con los mismos límites públicos que el sitio. Adjuntar un archivo es distinto. El MCP debe llamar primero a sign_in. Eso abre una página de aprobación en el navegador (la concesión ya va en la URL — no hay un código que escribir). Después de que pulsas Approve, el agente vuelve a llamar a sign_in con pollDeviceCode. La sesión se guarda en ~/.config/privatenote/mcp-session.json y se envía como Authorization: Bearer. No sustituye la sesión de cookie del sitio.
- El agente ejecuta sign_in() — se abre el navegador
- Pulsas Approve en la página de PrivateNote
- El agente consulta con pollDeviceCode y luego whoami()
- El agente llama a create_private_note con rutas de archivo (vista previa — aún no hay URL)
- Apruebas los archivos exactos, la caducidad y el destino
- El agente llama a confirm_private_note y luego tú (u otra herramienta) enviáis solo secureUrl por el canal humano
whoami muestra la cuenta con sesión iniciada. sign_out borra el archivo de sesión del plugin. Trata ese archivo como una credencial de esta máquina.
Instala privatenote-mcp en Cursor, Claude Desktop o Codex. El agente conserva el flujo; el proceso local conserva el secreto.
Abrir la guía de configuración del MCPDespués de enviar el enlace
Una buena entrega no termina cuando el mensaje sale de Slack. Las sesiones de pago con sesión iniciada pueden tratar la entrega como eventos, no como contenido: creada, abierta, caducada, revocada. list_sent_notes devuelve ids, estado y openedAt — nunca el texto en claro. revoke_sent_note invalida una nota sin abrir. notifyOnOpen envía un correo a tu cuenta de PrivateNote cuando la nota se abre por primera vez; el agente se entera de la apertura consultando list_sent_notes. No hay un webhook push hacia Cursor.
sign_in()
create_private_note({
filePaths: [
"/absolute/path/signed-contract.pdf",
"/absolute/path/customer-export.csv"
],
expiresIn: "24h",
burnAfterReading: true,
requireRecipientVerification: true,
recipientEmail: "john@example.com",
notifyOnOpen: true,
label: "contract-for-john",
sendChannel: "email",
sendRecipient: "john@example.com"
})
# wait for user approval of that exact destination
confirm_private_note({ confirmationId: "<from preview>" })
# email or Slack only secureUrl to John
# later: list_sent_notes() and look for openedAt on that noteIdLa verificación del destinatario es una puerta de desbloqueo en PrivateNote, no un sustituto de enviar el mensaje. Las alertas de apertura exigen un correo de remitente verificado en la cuenta. Los recibos solo de estado se explican en saber cuándo se abrió un enlace secreto. Los agentes con acceso amplio a herramientas siguen necesitando el modelo de permisos de proteger a los agentes de IA como a empleados.
La reserva honesta de privacidad
La afirmación fuerte — «la IA nunca vio los bytes del archivo» — se sostiene cuando el host respeta las instrucciones de ruta primero y nunca pegaste la carga en el prompt. No significa que el agente no pueda ver secureUrl después de confirmar. Una llamada normal de herramienta MCP puede seguir exponiendo los argumentos al host. Por eso las herramientas prefieren rutas: el argumento es /Users/you/secrets/db-password.txt, no la contraseña.
Si escribes create a PrivateNote for sk_live_abc123, un proveedor de modelos en la nube puede procesar esa cadena antes de que corra el MCP. PrivateNote seguirá guardando solo texto cifrado, y Slack seguirá recibiendo solo un enlace. Has mejorado la filtración aguas abajo. No has mantenido el secreto fuera del modelo. Para la máxima privacidad, deja los secretos en archivos (o usa la extensión de VS Code / Cursor para que el editor cifre sin el agente) y dile al asistente la ruta.
- No pidas al modelo que «revise primero el PDF» ni que lo resuma. Eso fuerza una lectura con otra herramienta.
- No pongas la frase de paso en el mismo Slack, WhatsApp o correo que la URL.
- Trata
secureUrlcomo el secreto. El agente puede verla en el resultado de la herramienta. No la hagas commit, no la registres ni la pegues en un canal público de Discord. - Recarga el cliente MCP después de actualizar
privatenote-mcppara que instrucciones y esquemas sigan al día. Deja apagado el modo de un solo paso.
Preguntas frecuentes
¿El MCP de PrivateNote envía Slack, Discord, WhatsApp o correo por sí mismo?
No. Cifra en local y devuelve una URL más metadatos. La entrega usa lo que ya usas — otro servidor MCP (Gmail, Slack, …) o tú pegando el enlace. Crear una nota no es permiso para enviarla. sendAuthorized solo es true si aprobaste ese canal y ese destinatario exactos en la vista previa.
¿Por qué tengo que confirmar antes de que se cree el enlace?
La confirmación fija los bytes exactos del archivo, las opciones de la nota y el destino. Sin ella, un agente que también tiene herramientas de correo o chat podría cifrar el archivo equivocado o enviar el enlace correcto a la persona equivocada en un turno. El modo de un solo paso se salta esta vista previa. Déjalo apagado, sobre todo si el mismo host puede enviar mensajes o archivos.
¿Puede el agente ver la URL descifrable?
Sí, en el host MCP actual. secureUrl se devuelve en el resultado de la herramienta para que una herramienta de entrega pueda enviarla. El agente sigue sin deber ver los bytes del archivo. Poseer la URL puede abrir la nota — trátala como una capacidad al portador, no como «el modelo no puede acceder al secreto».
¿El destinatario tiene que instalar algo?
No. Abre el enlace completo en un navegador normal. No hace falta cuenta de PrivateNote para revelar una nota. Puede seguir necesitando una frase de paso o verificación por correo si activaste esas puertas.
¿Puedo adjuntar archivos sin iniciar sesión?
No. Adjuntar archivos, listar o revocar, la verificación del destinatario y los avisos de apertura requieren sign_in. Una nota solo de texto desde contentFilePath puede crearse sin sesión, dentro de los límites públicos.
¿Qué pasa si el asistente lee el archivo de todos modos?
Entonces el límite de privacidad ya se rompió en ese turno. Las instrucciones MCP dicen a los hosts que no lo hagan. Si tu cliente las ignora, sigue usando la extensión del editor o la app web, y no apuntes al agente hacia el archivo. Aun así puedes enviar la URL que produjo la extensión.
¿El burn-after-read detiene las capturas de pantalla?
No. Cuando un destinatario legítimo descifra la nota, puede copiar, fotografiar o volver a subir. El burn-after-read y la caducidad reducen copias sobrantes en el servicio y en el historial del chat. No pueden borrar en remoto lo que alguien ya capturó. Para documentos, el acceso de solo lectura en Business reduce la descarga casual; no es una prohibición de fotografiar.
Deja que el agente envíe el enlace. Mantén el archivo fuera del modelo.
Instala privatenote-mcp, apúntalo a rutas locales y sigue usando el correo, Slack, Discord y WhatsApp como sobres — no como cajas fuertes. Deja apagado el modo de un solo paso si el mismo host puede enviar mensajes o archivos.