Skip to main content
Glama
lswith

imap-mcp-server

by lswith

imap-mcp

Código fuente disponible, no un producto. Este es un servidor IMAP genérico → MCP que se ejecuta en Cloudflare Workers. Se publica bajo MIT para que el código pueda leerse, copiarse y aprenderse de él, pero está construido para, y se ejecuta contra, exactamente un buzón: una cuenta personal de iCloud. No hay compromiso de soporte: los problemas no se clasifican, no se solicitan pull requests, no hay lanzamientos, y nada aquí está versionado para el uso de nadie más. Si te resulta útil, haz un fork.

Es genérico por diseño más que por ambición: el host, el puerto y las credenciales son configuración, no constantes, por lo que debería funcionar con cualquier servidor IMAP. Solo iCloud se ha probado realmente.

Estado: andamiaje. Aún no se ha implementado nada funcional. Ambos workers son marcadores de posición que instalan, lintan, verifican tipos, prueban y pasan una prueba de despliegue en seco. Ver Hoja de ruta.

Qué hace

Indexa un buzón en el almacenamiento de Cloudflare y luego lo sirve a un cliente MCP como herramientas de búsqueda y recuperación, de modo que un modelo pueda responder preguntas sobre quince años de correo sin que el buzón en sí esté en el bucle en cada consulta.

   ┌────────────────────┐  IMAP over TLS   ┌──────────────┐
   │  imap-mcp-sync     │ ───────────────▶ │   mailbox    │
   │  packages/sync     │ ◀─────────────── │   (iCloud)   │
   │  cron, owns creds  │                  └──────────────┘
   └─────────┬──────────┘
             │ writes                    ▲ writes proxied over
             ▼                           │ a service binding
   ┌────────────────────┐                │
   │  D1 (+FTS5) and R2 │                │
   └─────────┬──────────┘                │
             │ reads                     │
             ▼                           │
   ┌────────────────────┐────────────────┘   ┌──────────────┐
   │  imap-mcp-server   │  Streamable HTTP   │  MCP client  │
   │  packages/mcp      │ ◀───────────────── │  behind CF   │
   │  stateless, no creds                    │  Access      │
   └────────────────────┘                    └──────────────┘

Dos workers, y la división entre ellos es el diseño de seguridad más que una elección de empaquetado:

  • packages/sync (imap-mcp-sync) es la única parte del sistema que habla IMAP. Contiene la contraseña específica de la aplicación, que en iCloud otorga acceso completo al buzón incluido el envío SMTP, por lo que esa credencial existe en exactamente un lugar.

  • packages/mcp (imap-mcp-server) es un lector sin estado. Consulta el índice, nunca el buzón, y envía las pocas operaciones de escritura de vuelta al worker de sincronización a través de un enlace de servicio en lugar de abrir una conexión propia.

Related MCP server: stalwart-mail-mcp

Inicio rápido

pnpm install         # installs both packages
pnpm run lint        # biome check (lint + format)
pnpm run typecheck   # wrangler types + tsc --noEmit
pnpm run test        # vitest, inside workerd
pnpm run dead-code   # knip
pnpm run build       # wrangler deploy --dry-run, both workers

Por paquete, desde packages/sync o packages/mcp: pnpm run dev, pnpm run test:watch, pnpm run deploy.

Configuración

Este repositorio es público, por lo que no se confirman valores específicos de despliegue: ni ID de cuenta de Cloudflare, ni etiqueta de zona, ni dominio de equipo de Cloudflare Access ni audiencia de aplicación (AUD), ni dirección de buzón. Ninguno de los wrangler.jsonc contiene un account_id, y el worker MCP no declara ninguna ruta en absoluto.

Todo lo que necesitarías proporcionar está nombrado y explicado en .env.example. Cópialo a .env y complétalo. En resumen:

Qué

Dónde va

CLOUDFLARE_ACCOUNT_ID

tu entorno; wrangler lo lee directamente

Ruta / zona para el worker MCP

una entrada routes que agregas a packages/mcp/wrangler.jsonc

ACCESS_TEAM_DOMAIN, ACCESS_AUD

vars en packages/mcp/wrangler.jsonc

IMAP_HOST, IMAP_PORT, IMAP_USER

vars en packages/sync/wrangler.jsonc

IMAP_PASSWORD

wrangler secret put, solo worker de sync — nunca una entrada vars

Localmente, los secretos van en un .dev.vars ignorado por git por paquete; cada uno tiene un .dev.vars.example para copiar.

Ambos workers son inaccesibles por defecto

workers_dev y preview_urls son false en ambos archivos wrangler.jsonc, y el worker MCP no declara ninguna ruta. Por lo tanto, un despliegue nuevo no es accesible desde Internet. Esto es deliberado: sin una valla de carpetas, el endpoint MCP es funcionalmente acceso de lectura a un buzón completo, por lo que no debe volverse accesible antes de que Cloudflare Access esté delante de él. Sin workers_dev: false, un worker está activo en <name>.<account>.workers.dev sin importar qué rutas o políticas de Access existan.

Una guía completa de despliegue desde cero (secretos, configuración de Access, bindings, migraciones y el relleno inicial) aún no está escrita; llegará con el resto del sistema.

Hoja de ruta

Seguimiento como issues en este repositorio:

#2

Andamiaje del repositorio — esto

#3

Empaquetar el cliente IMAP detrás de una interfaz interna

#4

Esquema D1 y migraciones

#5

Tracer: sincronizar una carpeta en D1

#6

Fan-out de cola para la ruta de sincronización

#7

Servidor MCP y search_messages

#8

Sincronización incremental: marcas de agua y UIDVALIDITY

#9

Adjuntos a R2, con extracción de texto

#10

Proteger el endpoint MCP con Access Managed OAuth

#11

get_message y get_thread

#12

Herramientas de escritura a través de un enlace de servicio, con un registro de auditoría

#13

Guía completa de relleno inicial y configuración

Un spike resolvió la única pregunta de la que dependía toda la arquitectura: ¿puede un Cloudflare Worker hablar IMAP con iCloud? Puede: TLS y LOGIN en el puerto 993 en 755 ms, carpetas listadas, mensajes obtenidos y decodificados en MIME, un borrador añadido y marcado. Así que la ruta de sincronización es un Worker y nada se mueve a un Contenedor. Los hallazgos que limitan el diseño — orden de CONDSTORE, sin MOVE en iCloud, SEARCH inutilizable para contenido — están escritos en los tickets que afectan.

Licencia

MIT — ver LICENSE.

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
<1hResponse time
Release cycle
1Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Connects multiple IMAP and SMTP mailboxes to MCP clients like ChatGPT without exposing credentials, enabling email search and thread retrieval via natural language.
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Connects AI agents to self-hosted Stalwart mail servers via a Cloudflare Worker and JMAP, enabling mailbox search, reading, listing, and two-step draft-and-send email operations through MCP.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables interaction with Gmail through MCP, supporting search, read, send, reply, forward, draft management, labels, and multiple accounts, deployed on Cloudflare Workers.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables connecting Gmail to MCP clients, allowing search, read, send, reply-all, forward, attachments, drafts, labels, and thread management across multiple Google accounts at once via a self-hosted Cloudflare Worker.
    MIT

View all related MCP servers

Related MCP Connectors

  • Read, search, send, organize, draft and schedule email across your inboxes from any MCP client.

  • Hosted email MCP for AI agents with inboxes, send/receive, memory, recovery, and credits.

  • Cloudflare Workers MCP server: email-validator

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lswith/imap-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server