Skip to main content
Glama

outlook-ews-mcp

Python MCP Exchange Status License

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 es outlook-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ónNTLM y Basic contra Exchange local

  • Transportestdio y SSE

  • Arquitectura — 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

ping_exchange

Comprueba la conectividad con Exchange

get_mailbox_info

Obtiene metadatos del buzón

list_delegates

Lista los delegados del buzón y sus niveles de permiso de carpeta — solo lectura porque exchangelib no tiene soporte de escritura para delegados

list_inbox_rules

Lista las reglas de bandeja de entrada del servidor

create_inbox_rule

Crea una regla de bandeja de entrada del servidor, p. ej. "de este remitente → mover a carpeta"

update_inbox_rule

Habilita/deshabilita una regla o cambia su prioridad (otros campos no se pueden actualizar aquí)

delete_inbox_rule

Elimina una regla de bandeja de entrada del servidor por id

get_out_of_office

Obtiene la configuración de fuera de la oficina (respuesta automática)

set_out_of_office

Desactiva, activa o programa una ventana de inicio/fin para las respuestas automáticas

⚠️ create_inbox_rule / update_inbox_rule / delete_inbox_rule gestionan 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

list_emails

Lista correos en una carpeta

get_email

Obtiene un correo completo por id

get_email_mime

Exporta el contenido MIME RFC 822 sin procesar de un mensaje, codificado en base64

get_thread

Obtiene todos los mensajes de una conversación en orden, incluidos los cuerpos

search_emails

Busca por subcadena (asunto/cuerpo/remitente) o sintaxis de consulta avanzada del servidor

send_email

Envía un correo nuevo

reply_email

Responde a un correo

forward_email

Reenvía un correo

move_email

Mueve un correo a otra carpeta

copy_email

Copia un correo a otra carpeta

move_emails

Movimiento masivo, con resultados por elemento — un id malo no hace fallar al resto

copy_emails

Copia masiva, con resultados por elemento

delete_emails

Eliminación masiva, con resultados por elemento (eliminación suave a menos que hard_delete)

delete_email

Elimina un correo

mark_email

Actualiza el estado de lectura, la importancia o la marca de seguimiento

categorize_email

Establece, agrega o elimina categorías de Outlook (las etiquetas de colores)

mark_emails

Versión masiva de mark_email, con resultados por elemento

categorize_emails

Versión masiva de categorize_email, con resultados por elemento

list_categories

Lista las categorías en uso con conteos, muestreadas de mensajes recientes (no de la lista maestra de categorías del buzón)

list_folders

Lista las carpetas del buzón

create_folder

Crea una carpeta en el buzón

rename_folder

Renombra una carpeta — rechaza carpetas integradas (Bandeja de entrada, Elementos enviados, Calendario, ...)

delete_folder

Elimina una carpeta y todo su contenido — rechaza carpetas integradas

create_draft

Crea un borrador de correo

update_draft

Actualiza un borrador; los campos omitidos se dejan sin cambios, attachments (si se proporciona) reemplaza todo el conjunto

send_draft

Envía un borrador existente

add_attachment

Adjunta un archivo local a un mensaje, típicamente un borrador — el archivo debe estar bajo EXCHANGE_ATTACHMENT_ROOT

delete_attachment

Elimina un adjunto de un mensaje por id

get_attachment

Guarda un adjunto en disco

Calendario

Herramienta

Descripción

Solo lectura

list_events

Lista eventos de calendario en un rango de tiempo; pasa mailbox para el calendario predeterminado de un colega (requiere acceso de delegado/impersonación, no combinable con calendar_id)

get_event

Obtiene un evento de calendario por id; pasa mailbox para el calendario de un colega

create_event

Crea un evento de calendario

update_event

Actualiza un evento de calendario

delete_event

Elimina un evento de calendario

respond_to_invite

Acepta, rechaza o responde tentativamente a una invitación

find_free_slots

Encuentra espacios de tiempo libres para reuniones

delete_events

Elimina eventos en bloque, con resultados por elemento

respond_to_invites

Responde a invitaciones en bloque, con resultados por elemento

get_my_availability

Obtiene espacios libres/ocupados; pasa mailbox para el calendario de un colega

list_calendars

Lista calendarios

list_room_lists

Lista listas de salas de Room Finder (grupos de salas de reuniones)

list_rooms

Lista las salas de reuniones en una lista de salas de Room Finder

Contactos

Herramienta

Descripción

Solo lectura

search_contacts

Busca contactos

get_contact

Obtiene un contacto por id

create_contact

Crea un contacto personal

update_contact

Actualiza un contacto personal

delete_contact

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 EXCHANGE_SERVER

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 / .env, ignorados por .gitignore (.env, .env.*, mientras se conserva .env.example)

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

LOG_LEVEL solo controla los registradores propios de la aplicación outlook_mcp.*; los registradores de XML SOAP de exchangelib — que de otro modo volcarían el XML completo de solicitud/respuesta, incluso a nivel ERROR en errores de transporte — siempre se silencian por la fuerza

Builds Docker limpios

.dockerignore excluye .env, pruebas, cachés y metadatos de VCS del contexto de compilación

Con lo que aún debes tener cuidado:

  • EXCHANGE_VERIFY_SSL=false desactiva la verificación de certificados TLS — solo entornos internos/de confianza con certificados autofirmados.

  • EXCHANGE_AUTH_TYPE=Basic envía las credenciales en texto plano, por lo que el servidor se niega a iniciar contra un EXCHANGE_SERVER http://; solo anula con EXCHANGE_ALLOW_INSECURE_BASIC_AUTH=true para un servidor local/de prueba que controles.

  • get_attachment escribe archivos en el disco, y send_email/reply_email/forward_email/ create_draft leen archivos locales (a través de attachments) 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 que EXCHANGE_ATTACHMENT_ROOT se establece en un directorio absoluto, que luego confina tanto las rutas de attachments como el save_path de get_attachment a ese árbol de directorios (un save_path no establecido aún cae al directorio temporal del sistema).

  • outlook-ews-mcp-smoke es seguro para la privacidad por defecto e imprime solo información de buzón enmascarada más recuentos; establece OUTLOOK_MCP_SMOKE_INCLUDE_DATA=true solo 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-mcp

Por 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=NTLM

Una copia completamente comentada de cada variable está en .env.example.

Variable

Predeterminado

Descripción

EXCHANGE_SERVER

(obligatorio)

URL del endpoint de EWS, p. ej. https://mail.company.com/EWS/Exchange.asmx

EXCHANGE_USERNAME

(obligatorio)

DOMAIN\username o un UPN. Exactamente una barra invertida: dotenv no procesa secuencias de escape

EXCHANGE_PASSWORD

(obligatorio)

Contraseña de la cuenta

EXCHANGE_EMAIL_ADDRESS

sin establecer

Dirección SMTP; se establece cuando EXCHANGE_USERNAME no es una

EXCHANGE_AUTH_TYPE

NTLM

NTLM o Basic

EXCHANGE_ALLOW_INSECURE_BASIC_AUTH

false

Permitir autenticación Basic sobre http:// — solo servidores locales/de prueba

EXCHANGE_VERIFY_SSL

true

Verificar el certificado TLS del servidor; false solo para configuraciones internas/de confianza o autofirmadas

EXCHANGE_VERSION

sin establecer (auto-detectado)

Versión del servidor Exchange, p. ej. EXCHANGE_2016

EXCHANGE_TIMEZONE_FALLBACK

Europe/Moscow

Se usa solo cuando Exchange informa un ID de zona horaria GUID irresoluble; las operaciones normales usan la zona horaria predeterminada del buzón

EXCHANGE_TIMEOUT

30

Tiempo de espera por solicitud en segundos (1–300)

EXCHANGE_MAX_RETRY_WAIT_SECONDS

90

Presupuesto de reintento en tiempo real para llamadas de solo lectura cuando Exchange informa que está ocupado, no un número de reintentos; 0 desactiva los reintentos. Las escrituras nunca se reintentan automáticamente

EXCHANGE_IMPERSONATE_AS

sin establecer

Buzón a suplantar (requiere permisos de suplantación de Exchange)

EXCHANGE_ATTACHMENT_MAX_SIZE_MB

10

Tamaño máximo por adjunto, aplicado tanto en la subida como en la descarga de get_attachment (1–100)

EXCHANGE_ATTACHMENT_MAX_COUNT

10

Máximo de adjuntos en una sola llamada de enviar/responder/reenviar/crear_borrador (1–100)

EXCHANGE_ATTACHMENT_MAX_TOTAL_SIZE_MB

25

Tamaño máximo combinado de adjuntos en una sola llamada (1–500)

EXCHANGE_ATTACHMENT_ROOT

sin establecer (desactivado)

Directorio que limita las rutas de adjuntos. Si no se establece, rechaza todo acceso a archivos locales para attachments/save_path; si se establece a un directorio absoluto, permite rutas dentro de él

EXCHANGE_EMAIL_BODY_MAX_CHARS

200000

Límite para body_text/body_html de get_email (1,000–5,000,000); los cuerpos más largos se truncan con truncated: true

EXCHANGE_EMAIL_MIME_MAX_SIZE_MB

25

Límite del tamaño de exportación MIME sin procesar antes de la expansión base64 (1–100)

EXCHANGE_SIGNATURE_TEXT

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

EXCHANGE_SIGNATURE_HTML

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 include_signature: false

MCP_TRANSPORT

stdio

stdio o sse

MCP_SSE_HOST

127.0.0.1

Host de enlace cuando MCP_TRANSPORT=sse

MCP_SSE_PORT

8080

Puerto de enlace cuando MCP_TRANSPORT=sse

MCP_MAX_CONCURRENCY

4

Llamadas de herramientas de solo lectura concurrentes (1–8); las llamadas de mutación siempre se ejecutan de forma exclusiva. Ver Cola de solicitudes

MCP_MAX_QUEUE_SIZE

20

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 server_busy inmediato

LOG_LEVEL

INFO

DEBUG, INFO, WARNING o ERROR

LOG_FILE

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_events y find_free_slots aceptan un limit acotado (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_email las tiene), list_events devuelve eventos sin cuerpos (get_event los tiene), y get_email devuelve cabeceras RFC-822 solo con include_headers: true.

  • Las operaciones de envío devuelven id: null cuando 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 tienen downloadable: false y no pueden guardarse con get_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 (predeterminado 4) 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 (predeterminado 20) 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 error server_busy inmediato 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 exchangelib tiene 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 por EXCHANGE_TIMEOUT más EXCHANGE_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 que exchangelib la reintente internamente para siempre, y ExchangeClient reintenta 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-smoke

La 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-smoke

Docker

docker build -t outlook-ews-mcp .
docker run --rm --env-file .env outlook-ews-mcp

CI/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 (v*) en PyPI mediante publicación confiable OIDC. Antes del primer lanzamiento, configura un editor pendiente de PyPI para el repositorio viartemev/outlook-ews-mcp, el flujo de trabajo ci.yml y el entorno pypi — no se almacena ningún token de PyPI de larga duración en GitHub.

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 CI_REGISTRY / CI_REGISTRY_USER / CI_REGISTRY_PASSWORD / CI_REGISTRY_IMAGE.

Comportamiento predeterminado de etiquetado de imágenes:

Disparador

Etiquetas enviadas

Rama predeterminada

:$CI_COMMIT_SHORT_SHA y :latest

Etiqueta Git

:$CI_COMMIT_TAG

Desarrollo

uv run --python 3.12 --with '.[dev]' ruff check .
uv run --python 3.12 --with '.[dev]' pytest -q

Notas del proyecto

  • La implementación se centra en una única abstracción ExchangeClient para 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.

Install Server
A
license - permissive license
C
quality
A
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity
Issues opened vs closed

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
    A
    quality
    D
    maintenance
    MCP server for any Microsoft Exchange / OWA deployment. Gives LLM agents access to email, calendar, directory search, folders, availability, and meeting analytics via 30 tools.
    30
    7
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    A 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.
    7
    MIT

View all related MCP servers

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.

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/viartemev/outlook-ews-mcp'

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