MCP Email Service
Un servicio para gestionar múltiples cuentas de correo electrónico de varios proveedores como 163, Gmail, QQ y Outlook.
Documentación
mail-use
Correo electrónico, como algo que un agente de IA puede operar de verdad. Una CLI sobre Gmail, QQ,
163, Outlook y cualquier servidor IMAP/SMTP — cada comando habla JSON, cada uno
destructivo es de prueba en seco hasta que pases --confirm.
mail-use code --json # the newest verification code, one live pass
mail-use email recent --format compact --json
mail-use email delete --from newsletter@shop.com --confirm --json
Parte de la familia *-use — pequeñas herramientas que dan a cada agente
manos sobre una cosa real.
Por qué esto y no un fragmento de IMAP
- Un contrato JSON estable, no texto extraído. Cada respuesta lleva
success: boolean, y los fallos llevanerror_codede un conjunto fijo (auth_failed,folder_not_found,imap_error, …). Documentado endocs/CLI_JSON_CONTRACT.md. - Te dice cuándo podría estar equivocado. Las lecturas en caché reportan
from_cache,cache_age_secondsycache_stale, y una instantánea lo suficientemente antigua como para significar "nada se está sincronizando" se rechaza en favor de una obtención en vivo. Una bandeja de entrada vacía nunca es un silencioso "no llegó nada". - Destructivo solo con consentimiento.
delete/mark/move/senddevuelven una vista previa de prueba en seco — agrupada por cuenta y carpeta, con asuntos de muestra — y no cambian nada hasta--confirm.--all-foldersomite Enviados/Borradores/Spam/Papelera a menos que se pida. - Construido para presupuestos de tokens.
--format compactproyecta cada correo a los diez campos que valen la pena escanear (~30% más pequeño que la forma completa),--with-previewpliega un fragmento del cuerpo en la llamada de listado, y el loteshowreutiliza una conexión IMAP. - Suficientemente rápido para llamar en un bucle. Un demonio persistente agrupa conexiones IMAP y
sincroniza a SQLite local en segundo plano: cinco llamadas secuenciales
email listpasan de 25s a 0.83s. Ver la tabla a continuación. - MCP también.
mail-use mcp config --jsonimprime una entrada lista para pegar; el servidor expone 16 herramientas con los mismos valores predeterminados de prueba en seco.
Renombrado de Mailbox a mail-use. El comando ahora es
mail-use;mailboxtodavía funciona como alias, y tu configuración en~/.config/mailboxno se toca.
Proveedores compatibles
163 / 126 · QQ · Gmail · Outlook / Hotmail · cualquier servidor IMAP+SMTP personalizado.
La búsqueda se comporta de manera diferente según el proveedor y la CLI lo dice: Gmail busca cuerpos
del lado del servidor vía X-GM-RAW, mientras que QQ/163/Outlook tienen búsqueda IMAP TEXT rota, por lo que
--query recurre a coincidir solo asunto + remitente. Usa --from / --subject
allí para resultados predecibles.
Instalación
Una línea, sin npm, sin Node
curl -fsSL https://raw.githubusercontent.com/leeguooooo/mail-use/main/install.sh | sh
mail-use --help
Descarga el binario precompilado para tu plataforma (macOS arm64/x64, Linux x64) desde el
último lanzamiento de GitHub, verifica su
checksum, e instala en ~/.local/bin. Fija una versión con MAIL_USE_VERSION=v2.11.2, o
cambia el directorio con MAIL_USE_INSTALL_DIR=....
El instalador también coloca un enlace simbólico mailbox junto a él, para que los scripts escritos con el nombre
antiguo sigan funcionando.
No hay paquete npm. La distribución es solo binarios de GitHub Release — eso mantiene
los lanzamientos libres de NPM_TOKEN y avisos de 2FA, y mantiene la instalación libre de un toolchain de Node.
Los paquetes @leeguoo/mailbox-cli previos al renombrado en npm están congelados y ya no se actualizan.
Actualización
mail-use upgrade --check # is there a newer release?
mail-use upgrade # download, verify sha256, replace in place, restart the daemon
mail-use upgrade --tag v3.1.0 # pin an exact release (also the way to roll back)
Cuando el demonio está en ejecución, nota nuevos lanzamientos por ti: un GET no autenticado a
la API de lanzamientos de GitHub por día (MAILBOX_UPDATE_CHECK_HOURS, 0 lo desactiva), mostrado como
update en mail-use daemon status --json. Solo informa — nunca descarga
o instala nada.
upgrade nunca es automático y nunca se ejecuta solo: una herramienta que reemplaza silenciosamente
su propio ejecutable es una sorpresa en la cadena de suministro, no una conveniencia. Se niega a instalar
un tarball cuyo .sha256 publicado no coincide, y se niega a ejecutarse desde un checkout
de desarrollo (donde process.execPath es tu node). Volver a ejecutar la línea curl … install.sh | sh
hace el mismo trabajo.
Como una habilidad de IA (Claude Code / Cursor / etc.)
# Project scope — installs into ./.claude/skills/mail-use (or ./.cursor/skills/...):
npx skills add leeguooooo/mail-use --skill mail-use
# User scope — installs into ~/.claude/skills/mail-use:
npx skills add leeguooooo/mail-use --skill mail-use -g
La habilidad asume que la CLI está en PATH (instala vía el curl … install.sh | sh anterior).
Para la mayor aceleración, también ejecuta mail-use daemon install una vez.
Servidor MCP (Claude Desktop / Code / Cursor)
mail-use mcp config --json # prints a paste-ready mcpServers entry
Desde el código fuente (desarrollo)
pnpm install
pnpm test
# build a local platform binary into dist/mail-use
pnpm build:binary
Si una ejecución de pruebas se interrumpe (tarea del editor eliminada, sesión de agente cerrada), sus
trabajadores de Vitest pueden quedar atrás y retener memoria. Verifica con
pgrep -fl vitest y mata lo que quede.
Configurar cuentas
mkdir -p ~/.config/mailbox
cp examples/accounts.example.json ~/.config/mailbox/auth.json
Ubicaciones de configuración:
- Credenciales:
~/.config/mailbox/auth.json - Otras configuraciones:
~/.config/mailbox/config.toml
Comandos comunes
# CLI help
mail-use --help
# newest verification code across all accounts, one live pass
mail-use code --json
# list accounts
mail-use account list --json
# list unread emails (cache by default; --from filters cache-side)
mail-use email list --unread-only --limit 20 --json
mail-use email list --account-id my_account_id --from "newsletter" --json
# show one email (response includes list_unsubscribe when the header is set)
mail-use email show 123456 --account-id my_account_id --json
# mark read (use --dry-run to validate first)
mail-use email mark 123456 --read --account-id my_account_id --folder INBOX --dry-run --json
mail-use email mark 123456 --read --account-id my_account_id --folder INBOX --confirm --json
# delete
mail-use email delete 123456 --account-id my_account_id --folder INBOX --confirm --json
# bulk mutate by sender or subject (no UID list needed)
mail-use email mark --from "support@npmjs.com" --read --confirm --account-id my_account_id --json
mail-use email delete --from "newsletter" --account-id my_account_id --json # dry-run preview
mail-use email delete --subject "[ad]" --account-id my_account_id --confirm --json
Caché + sincronización
- Base de datos de caché predeterminada:
~/.local/share/mailbox/email_sync.db - El listado usa caché por defecto cuando es posible. Agrega
--livepara forzar IMAP.
mail-use sync status --json
mail-use sync force --json
mail-use sync init
mail-use sync daemon
Demonio persistente (llamadas CLI 5-30× más rápidas)
Cada invocación de una sola vez gasta de otro modo 1-3s en TCP+TLS+IMAP LOGIN. Con el demonio
en ejecución, las llamadas reutilizan conexiones agrupadas y una sincronización SQLite en segundo plano significa que email list
normalmente no toca IMAP en absoluto.
El instalador curl … install.sh | sh configura esto por ti cuando las cuentas ya están
configuradas (MAIL_USE_NO_DAEMON=1 opta por no participar). De lo contrario:
mail-use daemon install # autostart at login (macOS launchd / Linux systemd-user)
mail-use daemon status --json
mail-use daemon reload # drop pooled connections after editing auth.json
Medido en Gmail INBOX, M2 MacBook sobre WAN residencial:
| Operación | Sin demonio | Demonio (--live) | Demonio (en caché) |
|---|---|---|---|
email list único | 5.0s | 1.0s | 0.17s |
email folders | 5.0s | 0.85s | n/a |
5 email list secuenciales | 25s | 5.3s | 0.83s |
3 email show en paralelo | ~15s | 2.7s | 0.88s |
Huella de recursos (muchas sesiones de agente en una máquina)
El demonio es un proceso por usuario, compartido por cada sesión de agente a través de un socket Unix — así que más sesiones no significan más conexiones IMAP. Medido en reposo en macOS con 3 cuentas conectadas:
| CPU en reposo | ~0.15% |
| RSS en reposo | 3-15 MB |
| Conexiones | máx. 3 por cuenta (MAILBOX_POOL_MAX), reducidas a 1 después de 10 min en reposo |
| 12 llamadas concurrentes | 1.6s de tiempo real, el grupo se mantuvo en 1 conexión por cuenta |
Perillas, si los valores predeterminados no te convienen:
| Env | Predeterminado | Efecto |
|---|---|---|
MAILBOX_POOL_MAX | 3 | Máx. conexiones IMAP concurrentes por cuenta |
MAILBOX_POOL_IDLE_MS | 600000 | Cierra conexiones inactivas este tiempo (0 desactiva la reducción) |
MAILBOX_POOL_KEEP_WARM | 1 | Conexiones por cuenta mantenidas calientes a través de la reducción |
MAILBOX_NO_DAEMON | sin definir | 1 hace que la CLI omita el demonio por completo |
MAILBOX_UPDATE_CHECK_HOURS | 24 | Verificación de actualización pasiva del demonio (0 desactiva) |
Guía de uso para IA
Si estás integrando esta CLI en un agente de IA, comienza aquí:
docs/AI_SKILL_MAIL_USE.md
Integración con OpenClaw
Este repositorio incluye una habilidad de OpenClaw en skills/mail-use/SKILL.md.
OpenClaw carga habilidades desde:
<workspace>/skills~/.openclaw/skills
Ayudante de enlace rápido (enlace simbólico en ~/.openclaw/skills):
./scripts/link_openclaw_skill.sh
Forzar reemplazo de un enlace existente:
./scripts/link_openclaw_skill.sh --force
Para usar este repositorio sin copiar archivos, agrega el directorio de habilidades del repositorio a
skills.load.extraDirs en ~/.openclaw/openclaw.json:
{
"skills": {
"load": {
"extraDirs": [
"/path/to/mcp-email-service/skills"
]
}
}
}
OpenClaw maneja la entrega de canales y la programación; mail-use devuelve salidas JSON estructuradas y resúmenes de texto opcionales.
Verifica que OpenClaw haya recogido la habilidad:
openclaw skills list --eligible
openclaw skills check
La familia *-use
CLIs pequeñas y componibles que dan a un agente de IA manos sobre una cosa real. Misma forma
en todas partes: curl … install.sh | sh para instalar, npx skills add leeguooooo/<name>
para enseñar a tu agente, JSON en stdout.
| Repo | Da a tu agente |
|---|---|
| chrome-use | Un navegador real — sesiones iniciadas, formularios, scraping, capturas de pantalla |
| mail-use | Correo electrónico — leer, buscar, enviar, triage en Gmail / QQ / 163 / cualquier IMAP |
| iphone-use | Un iPhone real — tocar, escribir, capturar, extraer datos del dispositivo |
| wechat-use | WeChat en macOS — enviar mensajes, consultar contactos e historial |
| discord-use | Discord — mensajes, canales, foros, webhooks (solo REST, Rust) |
| cookie-use | Muchas cuentas iniciadas por sitio — capturar, cambiar, aplicar sesiones |
| profile-use | Tu perfil personal, de forma segura — llenar formularios de registro / KYC / pago |
| bitwarden-use | Bitwarden / Vaultwarden — inicio de sesión sin cabeza con passkey (FIDO2) |
| chatgpt-use | Tu suscripción de ChatGPT como backend de agente de codificación — sin clave API |
| computer-use | El escritorio de macOS en sí |
| pixcake-use | Sondeo de PixCake de solo lectura — instantánea / diff / inspección de SQLite |
Contrato
docs/CLI_JSON_CONTRACT.md
Construido por leeguooooo — notas de campo sobre agentes de IA, ingeniería inversa y Cloudflare Workers en blog.misonote.com · sigue en X @leeguooooo