outlook-mcp

outlook-mcp

MCP server providing full control over Outlook.com, Hotmail, Live, or Microsoft 365 email via Microsoft Graph API, enabling reading, searching, sending, and managing messages and folders securely.

Category
Visit Server

README

outlook-mcp · MCP de Outlook / Microsoft 365 para Claude

Servidor MCP (Model Context Protocol) que da a un agente (Claude Desktop, Claude Code, Cowork…) control completo sobre el correo de una cuenta de Outlook.com, Hotmail, Live o Microsoft 365 / Office 365: leer, buscar, ver conversaciones, descargar adjuntos, crear carpetas y borradores, mover, archivar, enviar, responder y reenviar.

Usa la API oficial Microsoft Graph con OAuth2 — no IMAP, porque Microsoft desactivó la autenticación básica tanto en Exchange Online como en Outlook.com.

🔒 Sin credenciales en el repositorio. Todo se configura por variables de entorno. La sesión se crea con python authorize.py y se guarda en token.json, que está en .gitignore. Aquí no hay ningún secreto.


🧰 Herramientas (18)

Lectura (siempre disponibles)

Tool Qué hace
outlook_estado Estado de la cuenta: usuario, candados y carpetas con nº de mensajes/no leídos
outlook_listar_carpetas Todas las carpetas y subcarpetas, con su id
outlook_listar Lista los mensajes más recientes de una carpeta (paginado, no marca leído)
outlook_buscar Busca por remitente, destinatario, asunto, texto, fechas, no leídos, con adjuntos
outlook_buscar_kql Busca con la sintaxis KQL de Outlook (from:, hasAttachment:true, received>=…, AND/OR/NOT)
outlook_leer Lee un mensaje completo (cabeceras, cuerpo en texto, adjuntos)
outlook_conversacion Muestra el hilo entero al que pertenece un mensaje
outlook_descargar_adjunto Descarga un adjunto (base64 o a disco)

Escritura reversible (siempre disponibles)

Tool Qué hace
outlook_marcar_leido Marca leído / no leído
outlook_destacar Marca para seguimiento (bandera) / quita la marca
outlook_crear_carpeta Crea una carpeta (o subcarpeta)
outlook_guardar_borrador Guarda un borrador en Borradores (no envía)

Mover / archivar / eliminados — requieren OUTLOOK_ALLOW_MODIFY=1

Tool Qué hace
outlook_mover Mueve un mensaje a otra carpeta
outlook_archivar Mueve el mensaje a la carpeta Archivo (reversible)
outlook_eliminar Envía a Elementos eliminados (nunca borra permanente; recuperable)

Envío — requieren OUTLOOK_ALLOW_SEND=1

Tool Qué hace
outlook_enviar Envía un correo nuevo (con adjuntos opcionales)
outlook_responder Responde al remitente o a todos (mantiene el hilo)
outlook_reenviar Reenvía un mensaje con sus adjuntos

🔒 Seguridad

  • Candados por variable de entorno, apagados por defecto: enviar (OUTLOOK_ALLOW_SEND) y mover/archivar/eliminar (OUTLOOK_ALLOW_MODIFY). Con ellos apagados, esas tools devuelven un error claro y no hacen nada.
  • Leer nunca marca como leído (Graph no altera isRead al leer un mensaje).
  • No existe borrado permanente: no hay ninguna tool que haga DELETE en Graph; «eliminar» mueve a Elementos eliminados, recuperable.
  • El token (token.json) y el .env están en .gitignore y no se suben.

⚙️ Instalación

1) Requisitos

  • Python 3.9+
  • pip install -r requirements.txt (solo el SDK mcp; el resto es librería estándar)

2) Iniciar sesión (una vez, 1 minuto) — sin registrar nada en Azure

python authorize.py       # muestra un código -> microsoft.com/devicelogin

Por defecto usa el cliente público de Microsoft «Microsoft Graph Command Line Tools», así que no hay que registrar ninguna aplicación: abres el enlace, pegas el código, inicias sesión con tu cuenta de Outlook/Microsoft 365 y ya está. authorize.py guarda token.json y a partir de ahí el servidor refresca el token solo.

<details> <summary>Opcional: usar una aplicación propia de Entra ID</summary>

  1. https://entra.microsoft.comAplicacionesRegistros de aplicacionesNuevo registro.
  2. Nombre: outlook-mcp. Tipos de cuenta: «Cuentas en cualquier directorio organizativo y cuentas personales de Microsoft» (o solo personales, según tu caso).
  3. Copia el Id. de aplicación (cliente)OUTLOOK_CLIENT_ID.
  4. AutenticaciónConfiguración avanzada«Permitir flujos de cliente público» = Sí.
  5. (Opcional) Permisos de APIMicrosoft GraphDelegados: Mail.ReadWrite, Mail.Send, User.Read, offline_access. </details>

3) Configuración

cp .env.example .env      # candados y, si quieres, tu propia app o ruta del token

4a) Registrar en Claude Desktop

En claude_desktop_config.json:

{
  "mcpServers": {
    "outlook": {
      "command": "python",
      "args": ["C:/ruta/a/outlook-mcp/server.py"],
      "env": {
        "PYTHONUTF8": "1",
        "OUTLOOK_TENANT": "common",
        "OUTLOOK_TOKEN_PATH": "C:/ruta/a/outlook-mcp/token.json",
        "OUTLOOK_ALLOW_SEND": "0",
        "OUTLOOK_ALLOW_MODIFY": "0"
      }
    }
  }
}

Reinicia Claude Desktop después de editarlo.

4b) Instalar en Cowork / Claude Code por URL (como plugin)

Este repo incluye .claude-plugin/marketplace.json:

  1. Directorio → Plugins → Añadir marketplace → pega la URL de este repositorio → Sincronizar.
  2. Instala el plugin outlook.
  3. Configura las variables de entorno en el cliente y ejecuta python authorize.py una vez.

🧪 Validación

python test_offline.py    # sin credenciales: no necesita cuenta ni red
python test_gate.py       # contra la cuenta real (solo lectura)
  • test_offline.py comprueba, con la red simulada, que cada tool construye la llamada correcta a Graph: que ninguna hace DELETE, que «eliminar» y «archivar» son movimientos de carpeta, el mapeo de nombres de carpeta (papeleradeleteditems…), la construcción de KQL, los destinatarios, el HTML→texto y los adjuntos.
  • test_gate.py descubre todas las tools por el protocolo MCP, prueba las de lectura contra la cuenta real, comprueba que los candados bloquean envío y eliminación, y hace el handshake por stdio. No envía nada a terceros ni borra ningún correo.

💡 Ejemplos de uso

  • «¿Qué me ha llegado hoy sin leer?» → outlook_listar / outlook_buscar
  • «Busca los correos del cliente X con adjunto desde junio» → outlook_buscar_kql("from:X hasAttachment:true received>=2026-06-01")
  • «Enséñame el hilo completo de esta reclamación» → outlook_conversacion
  • «Guárdame el PDF del último correo» → outlook_descargar_adjunto
  • «Prepárame un borrador de respuesta» → outlook_guardar_borrador

❓ Problemas frecuentes

Síntoma Causa / solución
No hay sesion de Outlook Ejecuta python authorize.py una vez
AADSTS7000218 o client_assertion Falta «Permitir flujos de cliente público» = Sí en Autenticación
AADSTS50194 / cuenta no admitida El registro no admite cuentas personales: cámbialo a multiinquilino + personales, o usa OUTLOOK_TENANT=consumers
Graph 403 al enviar Falta el permiso Mail.Send o el candado OUTLOOK_ALLOW_SEND=1
Token caducado tras meses sin uso Vuelve a ejecutar python authorize.py

Genérico y sin datos personales en el código. Configúralo con tu propia cuenta.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured