outlook-mcp
outlook-ews-mcp
outlook-ews-mcp es un servidor MCP para Microsoft
Exchange local mediante EWS (exchangelib).
Proporciona a clientes compatibles con MCP (Claude Desktop, Claude Code y cualquier otro
cliente MCP) acceso a correo, calendario, contactos, carpetas, adjuntos y datos de
disponibilidad a través de un único servicio Python comprobable — sin necesidad de
scripting directo en el buzón.
Renombrado desde
outlook-mcp. Ese nombre ya estaba ocupado en PyPI por un proyecto no relacionado, por lo que el nombre de distribución y CLI ahora esoutlook-ews-mcp. La ruta de importación de Python no cambia. Hasta la primera versión etiquetada en PyPI, instale desde este repositorio como se muestra a continuación.
Contenido
Related MCP server: owa-mail-mcp
Aspectos destacados
Correo — listar, buscar (subcadena o sintaxis de consulta avanzada), leer, enviar, responder, reenviar, mover, copiar, eliminar, marcar, categorizar, acciones masivas, exportación MIME sin procesar, agregar/eliminar adjuntos
Sistema — reglas de la bandeja de entrada, fuera de la oficina (respuestas automáticas), listado de delegados de solo lectura
Calendario — listar, crear, actualizar, eliminar, responder a invitaciones, buscar espacios libres, ver el calendario de un buzón compartido/delegado, Room Finder, acciones masivas
Contactos — buscar, leer, crear, actualizar, eliminar
Carpetas y adjuntos — CRUD de carpetas y descarga de adjuntos
Autenticación —
NTLMyBasiccontra Exchange localTransporte —
stdioySSEArquitectura — mapeo centralizado de errores a través de una única abstracción
ExchangeClient(ver Notas del proyecto)Seguridad — una comprobación rápida más segura para la privacidad por defecto (ver Comprobación rápida)
Operaciones — imagen Docker y pipelines de CI/CD para GitHub y GitLab incluidos
Catálogo de herramientas
Cada herramienta a continuación está registrada en
tool_specs.py, la única fuente de verdad para su
nombre, descripción y esquema. Solo lectura marca las herramientas que nunca
modifican el buzón — obtienen más concurrencia (ver Cola de solicitudes)
y son seguras de llamar especulativamente.
Sistema
Herramienta | Descripción | Solo lectura |
| Comprueba la conectividad con Exchange | ✅ |
| Obtiene metadatos del buzón | ✅ |
| Lista los delegados del buzón y sus niveles de permiso de carpeta — solo lectura porque | ✅ |
| Lista las reglas de bandeja de entrada del servidor | ✅ |
| Crea una regla de bandeja de entrada del servidor, p. ej. "de este remitente → mover a carpeta" | |
| Habilita/deshabilita una regla o cambia su prioridad (otros campos no se pueden actualizar aquí) | |
| Elimina una regla de bandeja de entrada del servidor por id | |
| Obtiene la configuración de fuera de la oficina (respuesta automática) | ✅ |
| Desactiva, activa o programa una ventana de inicio/fin para las respuestas automáticas |
⚠️
create_inbox_rule/update_inbox_rule/delete_inbox_rulegestionan reglas a través de EWS, lo que elimina el blob de reglas del lado del cliente que Outlook de escritorio mantiene — esto puede borrar reglas que un usuario creó en el propio Outlook. Este es un comportamiento documentado de EWS, no un error aquí.
Correo
Herramienta | Descripción | Solo lectura |
| Lista correos en una carpeta | ✅ |
| Obtiene un correo completo por id | ✅ |
| Exporta el contenido MIME RFC 822 sin procesar de un mensaje, codificado en base64 | ✅ |
| Obtiene todos los mensajes de una conversación en orden, incluidos los cuerpos | ✅ |
| Busca por subcadena (asunto/cuerpo/remitente) o sintaxis de consulta avanzada del servidor | ✅ |
| Envía un correo nuevo | |
| Responde a un correo | |
| Reenvía un correo | |
| Mueve un correo a otra carpeta | |
| Copia un correo a otra carpeta | |
| Movimiento masivo, con resultados por elemento — un id malo no hace fallar al resto | |
| Copia masiva, con resultados por elemento | |
| Eliminación masiva, con resultados por elemento (eliminación suave a menos que | |
| Elimina un correo | |
| Actualiza el estado de lectura, la importancia o la marca de seguimiento | |
| Establece, agrega o elimina categorías de Outlook (las etiquetas de colores) | |
| Versión masiva de | |
| Versión masiva de | |
| Lista las categorías en uso con conteos, muestreadas de mensajes recientes (no de la lista maestra de categorías del buzón) | ✅ |
| Lista las carpetas del buzón | ✅ |
| Crea una carpeta en el buzón | |
| Renombra una carpeta — rechaza carpetas integradas (Bandeja de entrada, Elementos enviados, Calendario, ...) | |
| Elimina una carpeta y todo su contenido — rechaza carpetas integradas | |
| Crea un borrador de correo | |
| Actualiza un borrador; los campos omitidos se dejan sin cambios, | |
| Envía un borrador existente | |
| Adjunta un archivo local a un mensaje, típicamente un borrador — el archivo debe estar bajo | |
| Elimina un adjunto de un mensaje por id | |
| Guarda un adjunto en disco | ✅ |
Calendario
Herramienta | Descripción | Solo lectura |
| Lista eventos de calendario en un rango de tiempo; pasa | ✅ |
| Obtiene un evento de calendario por id; pasa | ✅ |
| Crea un evento de calendario | |
| Actualiza un evento de calendario | |
| Elimina un evento de calendario | |
| Acepta, rechaza o responde tentativamente a una invitación | |
| Encuentra espacios de tiempo libres para reuniones | ✅ |
| Elimina eventos en bloque, con resultados por elemento | |
| Responde a invitaciones en bloque, con resultados por elemento | |
| Obtiene espacios libres/ocupados; pasa | ✅ |
| Lista calendarios | ✅ |
| Lista listas de salas de Room Finder (grupos de salas de reuniones) | ✅ |
| Lista las salas de reuniones en una lista de salas de Room Finder | ✅ |
Contactos
Herramienta | Descripción | Solo lectura |
| Busca contactos | ✅ |
| Obtiene un contacto por id | ✅ |
| Crea un contacto personal | |
| Actualiza un contacto personal | |
| Elimina un contacto personal |
Casos de uso típicos
Conectar Claude Desktop u otro cliente MCP a Exchange local
Buscar mensajes de la bandeja de entrada y obtener el contenido completo del correo
Enviar o redactar correos desde flujos de trabajo de IA
Inspeccionar calendarios y crear reuniones
Comprobar ventanas de libre/ocupado para programar
Buscar contactos personales o la Lista de direcciones global
Exponer operaciones de Exchange a través de un límite MCP controlado en lugar de scripting directo del buzón
Notas de seguridad
Lo que hace el código actual:
Conectividad limitada | Se conecta solo al punto final de Exchange/EWS configurado en |
Sin telemetría | No contiene lógica de telemetría, análisis o exportación de datos a terceros |
Los secretos permanecen locales | Mantiene los secretos en variables de entorno / |
Payloads de error limpios | Las respuestas de error estructuradas de MCP nunca incluyen texto de excepción de Exchange, cuerpos de mensajes, contenidos de adjuntos o contraseñas; las herramientas exitosas devuelven solo los datos del buzón que se les pidieron |
Registros limpios |
|
Builds Docker limpios |
|
Con lo que aún debes tener cuidado:
EXCHANGE_VERIFY_SSL=falsedesactiva la verificación de certificados TLS — solo entornos internos/de confianza con certificados autofirmados.EXCHANGE_AUTH_TYPE=Basicenvía las credenciales en texto plano, por lo que el servidor se niega a iniciar contra unEXCHANGE_SERVERhttp://; solo anula conEXCHANGE_ALLOW_INSECURE_BASIC_AUTH=truepara un servidor local/de prueba que controles.get_attachmentescribe archivos en el disco, ysend_email/reply_email/forward_email/create_draftleen archivos locales (a través deattachments) y adjuntan su contenido al correo saliente. Combinado con contenido de correo no confiable, esta es una vía plausible para la exfiltración por inyección de prompts de cualquier archivo legible por el proceso. El acceso a archivos locales está denegado por defecto y solo funciona una vez queEXCHANGE_ATTACHMENT_ROOTse establece en un directorio absoluto, que luego confina tanto las rutas deattachmentscomo elsave_pathdeget_attachmenta ese árbol de directorios (unsave_pathno establecido aún cae al directorio temporal del sistema).outlook-ews-mcp-smokees seguro para la privacidad por defecto e imprime solo información de buzón enmascarada más recuentos; estableceOUTLOOK_MCP_SMOKE_INCLUDE_DATA=truesolo si deseas explícitamente datos reales de bandeja de entrada/eventos en stdout.Si habilitas el registro de archivos con
LOG_FILE, protege ese archivo con permisos del sistema operativo.Si publicas imágenes Docker desde CI, protege el acceso al proyecto de GitLab/GitHub y los permisos del registro.
Inicio rápido
uv venv
source .venv/bin/activate
uv pip install -e .[dev]
cp .env.example .env
outlook-ews-mcpPor defecto, el servidor se ejecuta en modo stdio. Establece MCP_TRANSPORT=sse para iniciar un servidor HTTP
en su lugar.
Configuración
.env mínimo para comenzar — todo lo demás a continuación tiene un valor predeterminado funcional:
EXCHANGE_SERVER=https://mail.company.com/EWS/Exchange.asmx
EXCHANGE_USERNAME=DOMAIN\username
EXCHANGE_PASSWORD=secret
EXCHANGE_EMAIL_ADDRESS=user@company.com
EXCHANGE_AUTH_TYPE=NTLMUna copia completamente comentada de cada variable está en .env.example.
Variable | Predeterminado | Descripción |
| (obligatorio) | URL del endpoint de EWS, p. ej. |
| (obligatorio) |
|
| (obligatorio) | Contraseña de la cuenta |
| sin establecer | Dirección SMTP; se establece cuando |
|
|
|
|
| Permitir autenticación |
|
| Verificar el certificado TLS del servidor; |
| sin establecer (auto-detectado) | Versión del servidor Exchange, p. ej. |
|
| Se usa solo cuando Exchange informa un ID de zona horaria GUID irresoluble; las operaciones normales usan la zona horaria predeterminada del buzón |
|
| Tiempo de espera por solicitud en segundos (1–300) |
|
| Presupuesto de reintento en tiempo real para llamadas de solo lectura cuando Exchange informa que está ocupado, no un número de reintentos; |
| sin establecer | Buzón a suplantar (requiere permisos de suplantación de Exchange) |
|
| Tamaño máximo por adjunto, aplicado tanto en la subida como en la descarga de |
|
| Máximo de adjuntos en una sola llamada de enviar/responder/reenviar/crear_borrador (1–100) |
|
| Tamaño máximo combinado de adjuntos en una sola llamada (1–500) |
| sin establecer (desactivado) | Directorio que limita las rutas de adjuntos. Si no se establece, rechaza todo acceso a archivos locales para |
|
| Límite para |
|
| Límite del tamaño de exportación MIME sin procesar antes de la expansión base64 (1–100) |
| sin establecer | Se añade a los cuerpos de texto salientes y a las respuestas/reenvíos. No existe una API de firma de EWS, por lo que esto es configuración, no la firma de Outlook del buzón |
| sin establecer | Se añade a los cuerpos HTML salientes. Misma advertencia que arriba; no hay conversión cruzada entre ambos. Cualquiera puede omitirse por llamada con |
|
|
|
|
| Host de enlace cuando |
|
| Puerto de enlace cuando |
|
| Llamadas de herramientas de solo lectura concurrentes (1–8); las llamadas de mutación siempre se ejecutan de forma exclusiva. Ver Cola de solicitudes |
|
| Máximo de llamadas admitidas a la vez, en ejecución + en espera (1–1000); más allá de eso, las llamadas reciben un error |
|
|
|
| sin establecer (stderr) | Ruta del archivo de registro; protégela con permisos del sistema operativo si se establece |
Notas de comportamiento que no están vinculadas a una sola variable:
list_eventsyfind_free_slotsaceptan unlimitacotado (predeterminado 200, máximo 1000); los rangos de eventos están limitados a 366 días y los rangos de espacios libres a 31 días, por lo que las consultas amplias no pueden producir respuestas EWS o MCP ilimitadas.Los listados se mantienen ligeros por diseño: los resúmenes de correo incluyen el remitente pero no las listas de destinatarios (
get_emaillas tiene),list_eventsdevuelve eventos sin cuerpos (get_eventlos tiene), yget_emaildevuelve cabeceras RFC-822 solo coninclude_headers: true.Las operaciones de envío devuelven
id: nullcuando EWS no proporciona un id duradero para la copia enviada (notablemente respuestas, reenvíos y borradores enviados).Los metadatos de adjuntos incluyen
downloadable; los adjuntos de elementos de Exchange incrustados tienendownloadable: falsey no pueden guardarse conget_attachment.
Cola de solicitudes
Los clientes emiten varias llamadas a herramientas en paralelo. El trabajo de Exchange es bloqueante, por lo que el servidor lo ejecuta en hilos de trabajo y admite llamadas a través de una única cola FIFO compartida.
MCP_MAX_CONCURRENCY(predeterminado4) establece cuántas llamadas de solo lectura se ejecutan a la vez, de modo que un agente que solicita un correo, la lista de carpetas y el calendario paga el viaje de ida y vuelta más lento en lugar de la suma. Las llamadas de mutación siempre se ejecutan de forma exclusiva — una a la vez, nunca superponiéndose a una lectura — por lo que no pueden ocurrir carreras de lectura/escritura en el estado compartido de la cuenta. Los llamadores que superan el límite esperan su turno, atendidos en orden de llegada; una mutación en espera bloquea a las lecturas posteriores para que no la adelanten.MCP_MAX_QUEUE_SIZE(predeterminado20) limita cuántas llamadas pueden admitirse a la vez, en ejecución o en espera. Una vez que ya hay esa cantidad, las llamadas adicionales reciben un errorserver_busyinmediato en lugar de unirse a una cola ilimitada.El transporte permanece receptivo mientras el trabajo está en curso. Las herramientas se esperan en lugar de ejecutarse en el hilo del bucle de eventos, por lo que las respuestas terminadas salen inmediatamente y los pings se responden mientras una llamada larga aún se está ejecutando.
No hay tiempo de espera por llamada, deliberadamente. Un hilo bloqueado en una lectura de socket no puede ser eliminado desde fuera; el runtime solo puede dejar de esperar por él, lo que abandona el hilo junto con la sesión EWS que mantiene. El grupo de sesiones de
exchangelibtiene un máximo estricto y entrega sesiones en un bucle sin ruta de rendición, por lo que las sesiones filtradas eventualmente lo agotan y cada llamada posterior se bloquea para siempre. En su lugar, se espera a que una llamada lenta termine, limitada porEXCHANGE_TIMEOUTmásEXCHANGE_MAX_RETRY_WAIT_SECONDS: la política de reintentos de la cuenta es de fallo rápido, por lo que cada llamada EWS lanza un error en su primer error transitorio en lugar de queexchangelibla reintente internamente para siempre, yExchangeClientreintenta solo llamadas de solo lectura, limitadas por ese presupuesto de tiempo real. Las escrituras nunca se reintentan automáticamente. Los excesos más allá del presupuesto esperado se registran.
Ejemplo de Claude Desktop
{
"mcpServers": {
"outlook": {
"command": "outlook-ews-mcp",
"env": {
"EXCHANGE_SERVER": "https://mail.company.com/EWS/Exchange.asmx",
"EXCHANGE_USERNAME": "DOMAIN\\username",
"EXCHANGE_PASSWORD": "secret",
"EXCHANGE_EMAIL_ADDRESS": "user@company.com",
"EXCHANGE_AUTH_TYPE": "NTLM"
}
}
}
}Prueba de humo
Después de completar .env, ejecuta:
outlook-ews-mcp-smokeLa salida predeterminada está saneada para una verificación más segura. Si quieres intencionalmente datos de muestra de buzón/eventos en la salida:
OUTLOOK_MCP_SMOKE_INCLUDE_DATA=true outlook-ews-mcp-smokeDocker
docker build -t outlook-ews-mcp .
docker run --rm --env-file .env outlook-ews-mcpCI/CD
GitHub Actions y GitLab CI ejecutan lint, formato, comprobaciones de tipos, pruebas, auditoría de dependencias y compilaciones de paquetes, usando la versión de uv fijada en pyproject.toml.
GitHub | Además publica versiones etiquetadas ( |
GitLab | Además compila y envía una imagen Docker al Registro de Contenedores de GitLab en la rama predeterminada y en las etiquetas, usando las variables integradas |
Comportamiento predeterminado de etiquetado de imágenes:
Disparador | Etiquetas enviadas |
Rama predeterminada |
|
Etiqueta Git |
|
Desarrollo
uv run --python 3.12 --with '.[dev]' ruff check .
uv run --python 3.12 --with '.[dev]' pytest -qNotas del proyecto
La implementación se centra en una única abstracción
ExchangeClientpara que la autenticación, el transporte, los reintentos y el mapeo de errores permanezcan centralizados.Los errores se devuelven en un formato JSON estructurado adecuado para el manejo de MCP
isError=true.
Contribuciones
Los informes de errores y las PRs son bienvenidos — consulta CONTRIBUTING.md para saber cómo configurar un entorno de desarrollo y ejecutar la suite de pruebas sin un servidor Exchange real. Para informes de vulnerabilidades, consulta SECURITY.md.
Licencia
MIT — consulta LICENSE.
Maintenance
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
- AlicenseAqualityDmaintenanceMCP server for any Microsoft Exchange / OWA deployment. Gives LLM agents access to email, calendar, directory search, folders, availability, and meeting analytics via 30 tools.307MIT
- FlicenseAqualityBmaintenanceMCP server for corporate Exchange that provides access to email, calendar, and people directory via OWA JSON API.20
- FlicenseAqualityBmaintenanceMCP server for Claude to access on-premises Outlook/Exchange mailboxes via EWS with NTLM authentication, providing tools for email, calendar, and contact management without relying on Microsoft 365 or Graph API.18
- AlicenseNot gradedqualityAmaintenanceA local MCP server for on-premises Microsoft Exchange, connecting via EWS and NTLM. It provides mail, template, availability, and calendar workflow tools through stdio, with draft-first safety and Windows Credential Manager integration.7MIT
Related MCP Connectors
Read, search, send, organize, draft and schedule email across your inboxes from any MCP client.
Fully-managed email as MCP tools - register domains, real mailboxes, send and receive mail.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/viartemev/outlook-ews-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server