MCP Emails
Servidor de correo alojado para Gmail, Fastmail, iCloud, Yahoo, Zoho, Yandex y cualquier buzón IMAP/SMTP: lee, busca, envía, organiza, redacta y programa correos desde cualquier cliente MCP, obtenidos en vivo y nunca almacenados. Documentación en https://mcpemails.com/docs
Documentación
MCPEmails
Dale a tu agente de IA una bandeja de entrada. Un servidor alojado de Model Context Protocol que permite a Claude, Cursor o cualquier cliente compatible con MCP leer, buscar, enviar, organizar y programar correos electrónicos a través de tus buzones existentes, sin almacenar tu correo.
Conecta un buzón una vez, pega una URL en tu agente, y podrá trabajar tu bandeja de entrada en vivo. El correo se obtiene bajo demanda y nunca se retiene; las credenciales están cifradas en reposo y se descifran solo en el momento de la llamada dentro de una función edge aislada.
🔗 mcpemails.com · 📚 Docs · 💳 Precios
Contenido
- Cómo funciona
- Inicio rápido (conectando un agente)
- Capacidades
- Herramientas
- Alcances de OAuth
- Proveedores compatibles
- Precios
- Arquitectura
- Estructura del repositorio
- Desarrollo local
- Variables de entorno
- Base de datos y migraciones
- Despliegue
- Autoalojamiento
- Internacionalización
- Modelo de seguridad
Cómo funciona
- Conecta un buzón. Inicia sesión en mcpemails.com y conecta Gmail (OAuth con un clic) o cualquier cuenta IMAP/SMTP (contraseña de aplicación). Las credenciales se cifran con AES‑256‑GCM antes de tocar la base de datos.
- Obtén acceso. Los clientes con capacidad OAuth (claude.ai, Claude Desktop, Cursor) se conectan con un clic mediante OAuth 2.0 + PKCE. Todo lo demás usa una clave de API con alcance restringido (
mcpe_…). - Apunta tu cliente al servidor. El endpoint de MCP es una única URL:
https://mcpemails.com/api/mcp - Tu agente trabaja la bandeja de entrada. Llama a herramientas como
inbox_list,email_read(action: "search"),email_compose(action: "send") yschedule(action: "create"). Cada solicitud obtiene datos en vivo de tu proveedor: nada se refleja ni se almacena en caché en el servidor.
Los permisos se limitan por clave, por lo que puedes darle a un agente solo read:email, o concederle envío y gestión de carpetas sin exponer nunca la eliminación.
Inicio rápido (conectando un agente)
Claude Desktop / Cursor (OAuth): añade un servidor MCP remoto apuntando a https://mcpemails.com/api/mcp y aprueba la pantalla de consentimiento. Elige los alcances que debe tener el agente.
Clave de API (cualquier cliente MCP): crea una clave en el panel, elige sus alcances y (opcionalmente) restringe a buzones específicos, luego envíala como token de portador:
// Example MCP client config
{
"mcpServers": {
"mcpemails": {
"url": "https://mcpemails.com/api/mcp",
"headers": { "Authorization": "Bearer mcpe_your_key_here" }
}
}
}
El protocolo es JSON‑RPC 2.0 sobre HTTP (MCP 2025-06-18, transporte Streamable). Inicia cada sesión con inbox_list: devuelve los buzones a los que la clave puede acceder, sus capacidades por proveedor y un perfil de compatibilidad versionado. El perfil marca las operaciones normalizadas como exact, different o unavailable, para que los agentes puedan preservar las diferencias del proveedor en lugar de debilitar silenciosamente una solicitud.
Capacidades
- En vivo, nunca almacenado — el correo se lee directamente de tu proveedor en cada llamada; no se persisten cuerpos de mensajes.
- Multi‑proveedor — Gmail vía OAuth, más cualquier buzón IMAP/SMTP (Fastmail, iCloud, Yahoo, Zoho, Yandex, autoalojado…) con contraseña de aplicación.
- Sin retransmisión — el correo saliente se envía a través del SMTP/API de tu proveedor, desde tu dirección real.
- Alcances granulares — ocho alcances de permiso, otorgables de forma independiente por clave de API y por buzón.
- Lote y búsqueda‑y‑acción — lee, mueve, elimina o marca hasta cientos de mensajes en una sola llamada, incluidos combinadores de "buscar y luego mover/eliminar".
- Borradores y programación — redacta borradores y pon mensajes en cola para envío futuro (despacho en el servidor).
- Búsqueda independiente del proveedor — sintaxis de Gmail, IMAP
SEARCHy JMAP se normalizan detrás de una única interfazemail_read(action: "search"). - Listo para equipos: espacios de trabajo, miembros, roles, SSO y un registro de auditoría en el plan Team.
Herramientas
11 herramientas. La mayoría están orientadas a recursos y toman un argumento action que selecciona la operación específica (y, para acciones que necesitan privilegios distintos, el alcance requerido):
| Herramienta | Acciones | Alcance(s) |
|---|---|---|
inbox_list | (acción única) | read:email |
email_read | list, read, read_batch, search, attachment, extract, original | read:email (search también acepta search:email) |
email_organize | move, move_batch, copy, copy_batch, flag, archive, search_and_move | manage:folders (mover/copiar/buscar_y_mover), send:email (marcar/archivar) |
email_delete | delete, delete_batch, search_and_delete | delete:email |
email_compose | send, reply, forward | send:email |
folder | list, create, rename, delete | read:email (listar), manage:folders (crear/renombrar/eliminar) |
draft | list, create, reply, update, send, delete | manage:drafts (listar/crear/responder/actualizar/eliminar), read:email (responder también), send:email (enviar) |
schedule | create, list, cancel | schedule:email |
signature | get, set | read:email (obtener), send:email (establecer) |
automation | create, list, get, update, enable, disable, delete, runs, preview | manage:automations |
contact_search | (acción única) | manage:contacts |
Notas:
- Las herramientas aceptan un
inbox_idexplícito (UUID) o una dirección de correoinbox; las claves de un solo buzón resuelven el destino automáticamente. - Las acciones por lote tienen un límite de 50 (el
read_batchdeemail_read) a 500 (mover/eliminar/marcar) mensajes por llamada. - Para una mutación específica, primero usa
email_readconaction: "search", luego pasa elmessage_idomessage_idsdevuelto aemail_organizeoemail_delete. Los campos de búsqueda solo los aceptan las acciones de mutaciónsearch_and_moveysearch_and_delete. contact_searchescanea el correo reciente en vivo: no hay libreta de direcciones almacenada.- La acción
originaldeemail_readdevuelve un mensaje MIME completo almacenado por el proveedor como archivo.emlportátil (hasta 25 MB). Es de solo lectura y nunca marca el mensaje como leído. - La acción
senddedraftrequieresend:email, nomanage:drafts— así, una clave que solo puede gestionar borradores no puede usarlos para evadir el consentimiento de envío de correo. - La acción
replydedraftcrea una respuesta no enviada, nativa del proveedor, en la conversación de origen. Necesita tantomanage:draftscomoread:email, y por defecto responde solo al remitente. automationgestiona reglas de triaje programadas sin supervisión: una búsqueda almacenada más una acción fija, evaluadas con una cadencia sin modelo en el bucle. No hay acción de eliminación, unforwardsiempre espera aprobación humana, ydraft_replysolo escribe un borrador. Verdocs/automations-trust-boundary.md.tools/listsolo devuelve las herramientas para las que tu clave (o token OAuth) tiene alcance real.
Alcances de OAuth
| Alcance | Otorga |
|---|---|
read:email | Listar buzones y carpetas; listar, leer y buscar mensajes |
search:email | Alternativa más restringida que otorga solo la acción search de email_read |
send:email | Enviar, responder, reenviar, marcar, archivar; también requerido para enviar un borrador |
manage:folders | Crear/renombrar/eliminar carpetas; mover/copiar mensajes |
delete:email | Mover a la papelera o eliminar permanentemente mensajes |
manage:drafts | Crear, editar y eliminar borradores (enviar uno también requiere send:email) |
manage:contacts | Búsqueda de contactos en vivo desde el correo reciente |
schedule:email | Poner mensajes en cola para entrega futura |
manage:automations | Crear y gestionar reglas de triaje programadas sin supervisión (sin acción de eliminación; los reenvíos permanecen sujetos a aprobación) |
Proveedores compatibles
| Proveedor | Conectar vía | Leer/Buscar | Enviar | Carpetas | Eliminación permanente | Borradores |
|---|---|---|---|---|---|---|
| Gmail / Google Workspace | OAuth 2.0 | ✅ | ✅ | Etiquetas | Solo papelera | ✅ |
| Fastmail | Contraseña de aplicación (IMAP/SMTP) | ✅ | ✅ | ✅ | ✅ | ✅ |
| iCloud, Yahoo, Zoho, Yandex | Contraseña de aplicación (IMAP/SMTP) | ✅ | ✅ | ✅ | ✅ | ✅ |
| Cualquier buzón IMAP/SMTP | Contraseña de aplicación | ✅ | ✅ | ✅ | ✅ | ✅ |
| Outlook / Microsoft 365 | OAuth 2.0 | 🚧 construido, restringido pendiente de verificación |
El OAuth de Outlook está implementado de extremo a extremo, pero actualmente está restringido detrás de la verificación de publicador de Microsoft; está oculto de la interfaz de conexión hasta que se lance.
Precios
La métrica de valor son buzones conectados. Free conecta un buzón, Personal conecta hasta tres, Pro conecta todos los buzones que poseas, y Team añade personas, roles y un espacio de trabajo separado por cliente. La facturación anual ahorra alrededor del 20%.
| Free | Personal | Pro | Team | |
|---|---|---|---|---|
| Precio | $0 | $5/mes · $48/año ($4/mes) | $29/mes · $276/año ($23/mes) | $79/mes · $756/año ($63/mes) |
| Buzones conectados | 1 | 3 | Ilimitados | Ilimitados |
| Claves de API | Ilimitadas | Ilimitadas | Ilimitadas | Ilimitadas |
| Miembros | 1 (solo propietario) | 1 (solo propietario) | 1 (solo propietario) | Ilimitados, con roles |
| Límite de tasa de uso justo | 60 req/min | 120 req/min | 300 req/min | 1,000 req/min |
| Roles y espacios de trabajo de equipo | No | No | No | ✅ |
| SSO (SAML/OIDC) + registro de auditoría | No | No | No | ✅ |
| Soporte | Comunidad | Correo | Correo | Prioritario |
También se aplican límites por clave de API (100 req/min · 1,000/hora · 10,000/día). Los límites de tasa se pueden reintentar: regresan como error JSON-RPC -32003 con data.retry_after en segundos.
Cada espacio de trabajo tiene además un techo de uso justo sobre acciones facturables por período de facturación. Es una protección contra abuso, no una característica del plan: está muy por encima de cualquier uso real observado, nunca se muestra a los clientes y no se puede superar comprando. Alcanzarlo no se puede reintentar y no es un error JSON-RPC: regresa como un resultado de herramienta normal con isError: true y un bloque _meta["com.mcpemails/usage_limit"], y se limpia en reset_at.
Los ids internos de plan son anteriores a los nombres: solo se vende como Pro y pro se vende como Team. El id más nuevo personal es el único que coincide con su nombre mostrado, Personal. Todo usuario que existía antes del cambio de precios del 2026-08-19 conserva buzones ilimitados gratis, permanentemente. Ver apps/web/src/lib/stripe/plans.ts.
Arquitectura
flowchart LR
Agent["MCP client<br/>(Claude, Cursor, …)"] -->|"JSON-RPC / OAuth or API key"| Web
subgraph Vercel["Vercel — Next.js 16"]
Web["/api/mcp route<br/>+ marketing site + dashboard"]
end
subgraph Supabase
Edge["mcp-server<br/>edge function (Deno)"]
DB[("Postgres<br/>RLS + encrypted creds")]
Cron["token-refresh<br/>edge functions"]
end
Web -->|proxies| Edge
Edge -->|decrypt creds, fetch live| Providers["Email providers<br/>Gmail API · IMAP/SMTP"]
Edge --> DB
Cron --> DB
Web --> Stripe[("Stripe<br/>billing")]
/api/mcpes un manejador de rutas delgado de Next.js que hace proxy a la función edge de Supabasemcp-server— la implementación real de MCP, donde se descifran las credenciales y se realizan las llamadas al proveedor.- La base de datos Postgres almacena espacios de trabajo, miembros, buzones (tokens/contraseñas cifrados), claves de API con hash, clientes OAuth, envíos programados y un registro de actividad — todo protegido por Seguridad a Nivel de Fila.
- Funciones edge cron actualizan los tokens OAuth de Gmail/Outlook antes de que expiren.
Stack: Next.js 16 (App Router) · React 19 · next‑intl 4 · Supabase (Auth, Postgres, Edge Functions) · Stripe · Resend · TypeScript. Análisis y saneamiento de correo vía mailparser, jsdom y isomorphic-dompurify.
Estructura del repositorio
.
├── apps/
│ └── web/ # Next.js 16 app (marketing, dashboard, /api/mcp proxy)
│ ├── app/ # App Router routes ([locale], dashboard, api, auth)
│ ├── components/ # marketing/ + dashboard/ React components
│ ├── messages/ # next-intl translations (en, nb, es, fr, zh)
│ ├── src/lib/ # stripe/, supabase/, blog/, crypto helpers
│ └── proxy.ts # middleware: i18n + Supabase session + CDN cache
├── supabase/
│ ├── functions/
│ │ ├── mcp-server/ # the MCP server (tools, auth, scopes)
│ │ ├── gmail-token-refresh/
│ │ └── outlook-token-refresh/
│ └── migrations/ # SQL migrations (schema + RLS)
└── package.json # npm workspaces (apps/*)
Desarrollo local
Requisitos previos: Node.js 20+, npm y la CLI de Supabase (para migraciones y funciones edge).
# 1. Install (npm workspaces — run from the repo root)
npm install
# 2. Configure environment
cp .env.example apps/web/.env.local
# then fill in the values (see below) and generate the two secrets:
openssl rand -hex 32 # ENCRYPTION_KEY
openssl rand -hex 32 # CSRF_SECRET
# 3. Run the web app (http://localhost:3000)
npm run dev
# 4. Production build
npm run build
next.config.jsvalida las variables de entorno requeridas en compilación/inicio y rechaza valores débiles deENCRYPTION_KEY, por lo que un entorno mal configurado falla rápido en lugar de en tiempo de ejecución.
Variables de entorno
Copia .env.example y completa con valores reales. Requeridas en todos los entornos:
| Variable | Propósito |
|---|---|
NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_ANON_KEY | Cliente de Supabase (público) |
SUPABASE_SERVICE_ROLE_KEY | Clave de administración del lado del servidor (omite RLS) — secreto |
NEXT_PUBLIC_APP_URL | URL base canónica; impulsa las URI de redirección de OAuth |
GOOGLE_SITE_VERIFICATION (opcional) | Token de verificación de etiqueta HTML de Google Search Console; configúralo solo en producción |
ENCRYPTION_KEY | Clave AES‑256‑GCM de 64 hex para credenciales en reposo — secreto |
CSRF_SECRET | Clave HMAC de 64 hex para tokens CSRF (distinta de la anterior) — secreto |
Según la funcionalidad:
| Variable(s) | Necesaria para |
|---|---|
GMAIL_CLIENT_ID / GMAIL_CLIENT_SECRET | OAuth de Gmail (gmail.readonly, gmail.send, gmail.modify) |
OUTLOOK_CLIENT_ID / OUTLOOK_CLIENT_SECRET / OUTLOOK_TENANT_ID | OAuth de Outlook (Mail.Read, Mail.Send, Mail.ReadWrite, offline_access) |
NEXT_PUBLIC_OAUTH_VERIFICATION_PENDING | Muestra la advertencia de aplicación no verificada hasta que se complete la verificación de Google/Microsoft |
STRIPE_SECRET_KEY / STRIPE_WEBHOOK_SECRET / NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY | Facturación |
STRIPE_PRICE_PERSONAL_MONTHLY / _YEARLY, STRIPE_PRICE_SOLO_MONTHLY / _YEARLY, STRIPE_PRICE_PRO_MONTHLY / _YEARLY | IDs de precios de planes (personal = Personal, solo = Pro, pro = Equipo) |
Fastmail y otros proveedores IMAP se conectan mediante contraseña de aplicación y no necesitan credenciales OAuth.
Base de datos y migraciones
El esquema y las políticas de seguridad a nivel de fila viven en supabase/migrations/. Tablas principales: workspaces, workspace_members, inboxes (credenciales cifradas, con borrado suave), api_keys (con hash, con ámbito, restringido a la bandeja de entrada), oauth_clients, scheduled_sends, workspace_invites y una activity_log particionada por mes.
# Apply migrations to the linked project
npx supabase db push
# Generate TypeScript types from the live schema
npx supabase gen types typescript --linked > apps/web/src/types/database.ts
La CLI de Supabase es la fuente de verdad para los cambios de base de datos en este proyecto.
Despliegue
Aplicación web → Vercel (proyecto mcp-emails-web):
vercel --prod --yes
Los encabezados de seguridad y los tiempos de espera de las funciones se definen en vercel.json. Las rutas de marketing se sirven con un Cache-Control almacenable en caché de CDN (configurado en proxy.ts) para que los rastreadores y los visitantes recurrentes lleguen a la caché perimetral; el panel, la autenticación y las rutas de API permanecen no-store.
Servidor MCP → función perimetral de Supabase:
npx supabase functions deploy mcp-server --project-ref <your-project-ref> --no-verify-jwt
Autoalojamiento
¿No quieres confiar tu correo al servicio alojado? Ejecuta el mismo servidor MCP en tu propia
máquina. self-host/ incluye una pila contenerizada (Postgres + PostgREST + el servidor
Deno, sin Supabase/Stripe/panel), de modo que tus credenciales se cifran con una clave que solo tú
posees y se descifran únicamente dentro de tu propio contenedor.
cd self-host
make setup # generate secrets (.env)
make up # build + start the stack
export IMAP_PASSWORD='your-app-password'
make provision EMAIL=you@example.com IMAP_HOST=imap.fastmail.com SMTP_HOST=smtp.fastmail.com SERVICE=fastmail
make key NAME="my agent" # mint an mcpe_ key, then point your client at http://localhost:8787
Es primero IMAP/SMTP (Fastmail, iCloud, Yahoo, Zoho, Yandex, genérico) mediante contraseña de aplicación; el
OAuth de Gmail/Outlook y el panel web siguen siendo solo alojados. El contenedor ejecuta supabase/functions/mcp-server/
sin modificar; consulta self-host/README.md para la guía completa.
Internacionalización
Construido con next‑intl (localePrefix: 'as-needed', localeDetection: false para URL canónicas estables). El inglés se sirve en /; otros idiomas llevan un prefijo (/nb, /es, /fr, /zh). Las traducciones viven en apps/web/messages/.
Idiomas admitidos: inglés, noruego bokmål, español, francés, chino (simplificado).
Modelo de seguridad
- Credenciales cifradas en reposo con AES‑256‑GCM; se descifran solo dentro de la función perimetral en el momento de la llamada.
- Sin almacenamiento de mensajes: los cuerpos de correo y los adjuntos se obtienen en vivo y nunca se persisten. La extracción de texto de adjuntos se ejecuta de forma transitoria en la solicitud y no devuelve bytes de adjuntos sin procesar.
- Las claves de API se almacenan con hash (solo se guarda un prefijo para mostrarlo) y tienen ámbito por permiso y por bandeja de entrada, con caducidad opcional.
- OAuth 2.0 + PKCE para la autorización del cliente; Registro dinámico de clientes (RFC 7591) para clientes MCP.
- Seguridad a nivel de fila aísla los datos de cada espacio de trabajo en la capa de base de datos.
- CSP estricto, HSTS,
X-Frame-Options: DENYy encabezados relacionados en cada respuesta.
Licencia
MCP Emails es código abierto bajo la GNU Affero General Public License v3.0 (AGPL‑3.0). El servicio alojado en mcpemails.com ejecuta el mismo servidor que puedes autoalojar, de modo que puedes leer el código, verificarlo y ejecutarlo tú mismo. Consulta /security para el modelo de confianza.
Envía y recibe correo desde cualquier agente. © MCPEmails, AGPL‑3.0.