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

  1. 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.
  2. 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_…).
  3. Apunta tu cliente al servidor. El endpoint de MCP es una única URL:
    https://mcpemails.com/api/mcp
    
  4. Tu agente trabaja la bandeja de entrada. Llama a herramientas como inbox_list, email_read (action: "search"), email_compose (action: "send") y schedule (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 SEARCH y JMAP se normalizan detrás de una única interfaz email_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):

HerramientaAccionesAlcance(s)
inbox_list(acción única)read:email
email_readlist, read, read_batch, search, attachment, extract, originalread:email (search también acepta search:email)
email_organizemove, move_batch, copy, copy_batch, flag, archive, search_and_movemanage:folders (mover/copiar/buscar_y_mover), send:email (marcar/archivar)
email_deletedelete, delete_batch, search_and_deletedelete:email
email_composesend, reply, forwardsend:email
folderlist, create, rename, deleteread:email (listar), manage:folders (crear/renombrar/eliminar)
draftlist, create, reply, update, send, deletemanage:drafts (listar/crear/responder/actualizar/eliminar), read:email (responder también), send:email (enviar)
schedulecreate, list, cancelschedule:email
signatureget, setread:email (obtener), send:email (establecer)
automationcreate, list, get, update, enable, disable, delete, runs, previewmanage:automations
contact_search(acción única)manage:contacts

Notas:

  • Las herramientas aceptan un inbox_id explícito (UUID) o una dirección de correo inbox; las claves de un solo buzón resuelven el destino automáticamente.
  • Las acciones por lote tienen un límite de 50 (el read_batch de email_read) a 500 (mover/eliminar/marcar) mensajes por llamada.
  • Para una mutación específica, primero usa email_read con action: "search", luego pasa el message_id o message_ids devuelto a email_organize o email_delete. Los campos de búsqueda solo los aceptan las acciones de mutación search_and_move y search_and_delete.
  • contact_search escanea el correo reciente en vivo: no hay libreta de direcciones almacenada.
  • La acción original de email_read devuelve un mensaje MIME completo almacenado por el proveedor como archivo .eml portátil (hasta 25 MB). Es de solo lectura y nunca marca el mensaje como leído.
  • La acción send de draft requiere send:email, no manage:drafts — así, una clave que solo puede gestionar borradores no puede usarlos para evadir el consentimiento de envío de correo.
  • La acción reply de draft crea una respuesta no enviada, nativa del proveedor, en la conversación de origen. Necesita tanto manage:drafts como read:email, y por defecto responde solo al remitente.
  • automation gestiona 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, un forward siempre espera aprobación humana, y draft_reply solo escribe un borrador. Ver docs/automations-trust-boundary.md.
  • tools/list solo devuelve las herramientas para las que tu clave (o token OAuth) tiene alcance real.

Alcances de OAuth

AlcanceOtorga
read:emailListar buzones y carpetas; listar, leer y buscar mensajes
search:emailAlternativa más restringida que otorga solo la acción search de email_read
send:emailEnviar, responder, reenviar, marcar, archivar; también requerido para enviar un borrador
manage:foldersCrear/renombrar/eliminar carpetas; mover/copiar mensajes
delete:emailMover a la papelera o eliminar permanentemente mensajes
manage:draftsCrear, editar y eliminar borradores (enviar uno también requiere send:email)
manage:contactsBúsqueda de contactos en vivo desde el correo reciente
schedule:emailPoner mensajes en cola para entrega futura
manage:automationsCrear 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

ProveedorConectar víaLeer/BuscarEnviarCarpetasEliminación permanenteBorradores
Gmail / Google WorkspaceOAuth 2.0EtiquetasSolo papelera
FastmailContraseña de aplicación (IMAP/SMTP)
iCloud, Yahoo, Zoho, YandexContraseña de aplicación (IMAP/SMTP)
Cualquier buzón IMAP/SMTPContraseña de aplicación
Outlook / Microsoft 365OAuth 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%.

FreePersonalProTeam
Precio$0$5/mes · $48/año ($4/mes)$29/mes · $276/año ($23/mes)$79/mes · $756/año ($63/mes)
Buzones conectados13IlimitadosIlimitados
Claves de APIIlimitadasIlimitadasIlimitadasIlimitadas
Miembros1 (solo propietario)1 (solo propietario)1 (solo propietario)Ilimitados, con roles
Límite de tasa de uso justo60 req/min120 req/min300 req/min1,000 req/min
Roles y espacios de trabajo de equipoNoNoNo
SSO (SAML/OIDC) + registro de auditoríaNoNoNo
SoporteComunidadCorreoCorreoPrioritario

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/mcp es un manejador de rutas delgado de Next.js que hace proxy a la función edge de Supabase mcp-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.js valida las variables de entorno requeridas en compilación/inicio y rechaza valores débiles de ENCRYPTION_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:

VariablePropósito
NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_ANON_KEYCliente de Supabase (público)
SUPABASE_SERVICE_ROLE_KEYClave de administración del lado del servidor (omite RLS) — secreto
NEXT_PUBLIC_APP_URLURL 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_KEYClave AES‑256‑GCM de 64 hex para credenciales en reposo — secreto
CSRF_SECRETClave 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_SECRETOAuth de Gmail (gmail.readonly, gmail.send, gmail.modify)
OUTLOOK_CLIENT_ID / OUTLOOK_CLIENT_SECRET / OUTLOOK_TENANT_IDOAuth de Outlook (Mail.Read, Mail.Send, Mail.ReadWrite, offline_access)
NEXT_PUBLIC_OAUTH_VERIFICATION_PENDINGMuestra 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_KEYFacturación
STRIPE_PRICE_PERSONAL_MONTHLY / _YEARLY, STRIPE_PRICE_SOLO_MONTHLY / _YEARLY, STRIPE_PRICE_PRO_MONTHLY / _YEARLYIDs 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: DENY y 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.