ews-outlook-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ews-outlook-mcp Summarize my unread emails and today's schedule."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ews-outlook-mcp
Personal MCP server that lets Claude read and manage an on-prem Outlook/Exchange mailbox via EWS (Exchange Web Services) with NTLM authentication — no dependency on OAuth or Microsoft 365, built for pure on-prem Exchange (no Microsoft 365/Graph).
Exposed tools
ews_list_inbox— lists the most recent Inbox messagesews_search_inbox— searches the Inbox by subjectews_get_message— fetches the full body of a messageews_reply_message— replies (or reply-all) to an existing messageews_send_message— composes and sends a new emailews_move_message— moves a message to another folder (archive, etc.)ews_list_calendar— calendar events between two datesews_create_event— creates a calendar event/meeting, with optional attendeesews_update_event— reschedules/edits the time, subject, or location of an existing eventews_add_attendee— adds an attendee to an existing event without touching the restews_accept_event/ews_decline_event— responds to received meeting invitationsews_delete_event— deletes a calendar event (sends a cancellation to attendees by default)ews_resolve_contact— looks up a name in the GAL (corporate address book) to get their email before inviting themews_today_summary— unread messages + today's events, at a glanceews_forward_message— forwards a message to new recipients with an optional commentews_flag_message— flags/unflags/completes the follow-up flag on a messageews_list_folders— lists mailbox folders (including custom ones) with their unread counts
Related MCP server: Claude-Read-Outlook-Attachments
Installation
git clone git@github.com:devsergioherrera/Outlook-Exchange-MCP-Server.git
cd Outlook-Exchange-MCP-Server
npm install
npm run buildInstalling for a non-technical user (with Claude Desktop)
To hand this server to another person (not a copy of the same credentials — each user needs their own), the only requirement is having Node.js installed (https://nodejs.org, LTS version — an officially signed installer, which usually clears corporate policies without issue) and Claude Desktop having been opened at least once.
Steps:
Copy this whole folder (without
node_modules, without.env, withoutdist) to the target machine — zip, USB, whatever works.node_modulesanddistregenerate on their own;.envgets written locally with that person's own credentials.Double-click
Instalar.bat.The script (
setup.ps1):Verifies Node.js is installed (if not, it warns and stops).
Runs
npm installandnpm run build.Interactively asks for the Exchange URL, username, and password, and saves them to a local
.envfile (never sent anywhere — it just stays on that machine's disk).Automatically registers the server in
%APPDATA%\Claude\claude_desktop_config.json(creates themcpServers.ews-outlookentry pointing atdist\index.jswith the--openssl-legacy-providerflag), with no manual JSON editing required.
Claude Desktop needs to be fully quit (including the system tray icon) and reopened afterward.
None of this requires admin rights or running an unsigned .exe — just
Node.js (signed, standard installer) and a local PowerShell script, which
tends to sail through corporate IT policies that do block loose executables.
Setting up credentials
The .env file needs to be created manually (never paste a password into a
chat with an AI assistant):
cp .env.example .env
notepad .envFill in EWS_PASSWORD with the account's domain password. The .env file is
in .gitignore and must never be pushed to any repository.
Registering the server in Claude Code
Add this to the MCP server config (claude mcp add or the corresponding
config file). Requires the --openssl-legacy-provider flag (see
"Technical notes" below — without it, NTLMv2 authentication fails on Node 17+
because of the MD4 hash being disabled in OpenSSL 3.x):
{
"mcpServers": {
"ews-outlook": {
"command": "node",
"args": ["--openssl-legacy-provider", "C:\\path\\to\\Outlook-Exchange-MCP-Server\\dist\\index.js"]
}
}
}Or, from an interactive Claude Code session:
claude mcp add ews-outlook -- node --openssl-legacy-provider C:\path\to\Outlook-Exchange-MCP-Server\dist\index.jsRestart Claude Code so it picks up the new server.
.env credentials format
EWS_HOST: only the base host of the on-prem Exchange, e.g.https://mail.yourcompany.com— without a trailing/EWS/Exchange.asmx(node-ews builds that path internally; adding it manually makes calls fail withHTTP 400: Bad Request).EWS_USERNAME: only the Windows/domain username, e.g.jdoe— no domain prefix (yourcompany.com\jdoeproduces an incorrect NTLMv2 hash and Exchange responds withHTTP 401: Unauthorized; the domain is negotiated automatically, coming from the server's own NTLM challenge).EWS_PASSWORD: the account's domain password, as-is.
Technical notes (fixes already applied — leave alone unless the reason is clear)
Patch to
ntlm-client(patches/ntlm-client+0.1.1.patch, applied automatically bynpm installviapostinstall: patch-package): the library (unmaintained) has two compatibility bugs with IIS 10 / modern Exchange:decodeType2Messagereceived the entireresponseobject instead of theWWW-Authenticateheader string, andhasOwnProperty('headers')silently failed on that object → every NTLM auth attempt failed with the generic message"The server didnt respond properly".The regex extracting the NTLM token required the header to start with
NTLM(/^NTLM .../), but IIS returnsWWW-Authenticatewith several schemes together (NTLM <token>, NegotiateorNegotiate, NTLM <token>), so the anchored rule failed depending on order. The^was removed.
--openssl-legacy-provider: NTLMv2 depends on MD4, which OpenSSL 3.x (shipped with Node 17+) disables by default. Without this flag, the final handshake step (createType3Message) blows up witherror:0308010C:digital envelope routines::unsupported.
Security notes
The EWS endpoint is usually
https://<exchange-server>/EWS/Exchange.asmx, over HTTPS/443 — not to be confused with other ports the organization might use for SMTP or other services on the same server.If the Exchange certificate is self-signed, the HTTPS connection may fail certificate validation. If that happens, confirmation is needed before disabling TLS verification — it's not a default fix to apply.
ews_reply_messagesends a real email immediately (SendAndSaveCopy). There's no additional confirmation at this server's level — the confirmation happens in the Claude chat before the tool is invoked.
Available Tools
18 toolsews_accept_eventAceptar invitación a reuniónA
Acepta una invitación de reunión recibida (por ItemId del mensaje de invitación).
Inputs: eventId (required), comment.
ews_add_attendeeAgregar invitado a un evento existenteA
Agrega un asistente requerido a una reunión ya creada (UpdateItem) y le envía la invitación, sin tocar al resto de invitados.
Inputs: eventId (required), attendeeEmail (required).
ews_create_eventCrear evento de calendarioA
Crea un evento en el calendario (CreateItem CalendarItem). Si se pasan attendees, envía invitaciones de reunión.
Inputs: end (required), start (required), subject (required), body, +2 more.
ews_decline_eventRechazar invitación a reuniónA
Rechaza una invitación de reunión recibida (por ItemId del mensaje de invitación).
Inputs: eventId (required), comment.
ews_delete_eventEliminar evento de calendarioADestructive
Elimina un evento del calendario (DeleteItem). Si tiene invitados, les envía cancelación por defecto.
Inputs: eventId (required), notifyAttendees.
ews_flag_messageMarcar/desmarcar un correo para seguimientoA
Pone, quita o completa la bandera de seguimiento ('flag') de un correo, equivalente a la banderita de Outlook para marcar pendientes.
Inputs: itemId (required), status.
ews_forward_messageReenviar un correoA
Reenvía un correo existente (por ItemId) a nuevos destinatarios, con un comentario opcional, y lo envía inmediatamente. Distinto de responder: el hilo original no lleva a los destinatarios anteriores salvo que los repitas en 'to'.
Inputs: to (required), itemId (required), comment.
ews_get_messageObtener un correo completoARead-only
Obtiene el contenido completo (cuerpo, remitente, destinatarios) de un mensaje dado su ItemId (obtenido de ews_list_inbox o ews_search_inbox).
Inputs: itemId (required).
ews_list_calendarListar eventos de calendarioARead-only
Lista los eventos del calendario entre dos fechas (ISO 8601, ej. 2026-07-30T00:00:00-05:00).
Inputs: end (required), start (required).
ews_list_foldersListar carpetas del buzónARead-only
Lista las carpetas del buzón (Inbox, Archivo, y cualquier carpeta personalizada creada por el usuario), con su cantidad de correos no leídos. Úsalo antes de mover un correo a una carpeta que no sea una de las estándar (inbox/sentitems/deleteditems/archive).
Inputs: no named parameters.
ews_list_inboxListar bandeja de entradaARead-only
Lista los mensajes más recientes de la bandeja de entrada (Inbox), del más nuevo al más viejo.
Inputs: limit, unreadOnly.
ews_move_messageMover correo a otra carpetaA
Mueve un mensaje a otra carpeta del buzón (ej. archivar, mover a una carpeta de seguimiento).
Inputs: folder (required), itemId (required).
ews_reply_messageResponder un correoA
Responde un correo existente (por ItemId) y lo envía inmediatamente. Usa replyAll=true para 'Responder a todos'.
Inputs: body (required), itemId (required), replyAll.
ews_resolve_contactBuscar contacto en la libreta de la empresa (GAL)ARead-only
Busca por nombre parcial en la Global Address List de Integral de Empaques (la libreta corporativa de Outlook) y devuelve coincidencias con su correo. Úsalo antes de invitar a alguien por nombre a una reunión, para confirmar el correo correcto.
Inputs: nombre (required).
ews_search_inboxBuscar en bandeja de entradaARead-only
Busca mensajes en Inbox cuyo Asunto contenga el texto indicado (búsqueda simple por substring).
Inputs: query (required), limit.
ews_send_messageEnviar correo nuevoA
Redacta y envía un correo nuevo (no una respuesta).
Inputs: to (required), body (required), subject (required), cc.
ews_today_summaryResumen del díaARead-only
Resumen rápido: cantidad de correos no leídos en Inbox + eventos de calendario de hoy.
Inputs: no named parameters.
ews_update_eventReprogramar/editar un eventoA
Cambia horario, asunto o lugar de un evento existente (UpdateItem). Solo actualiza los campos que pases.
Inputs: eventId (required), end, start, subject, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 18 tools
Each tool targets a distinct resource/action combination: email operations (list, search, get, send, reply, forward, move, flag) are clearly separated from calendar operations (list, create, update, delete, accept, decline, add_attendee) and contact resolution. No two tools have overlapping or ambiguous purposes.
The vast majority of tools follow the ews_verb_noun pattern consistently (e.g., ews_list_inbox, ews_create_event, ews_forward_message). The only deviation is ews_today_summary, which lacks a verb and breaks the otherwise uniform convention.
At 18 tools, the set is slightly above the typical well-scoped range, but the count is justified by covering two major Outlook domains (email and calendar) plus contacts. Each tool has a clear role, so the size feels reasonable rather than bloated.
Core workflows for email (list, read, send, reply, forward, move, flag) and calendar (list, create, update, delete, accept/decline invitations, add attendees) are covered. Notable gaps include lack of email deletion and no dedicated get-event tool, but these are workaroundable via list and update/delete.
Related MCP Connectors
Hosted MCP server for your Gmail, Outlook and IMAP mail, with mailboxes and scopes set per agent.
MCP server for Nylas — read email, calendars, events and contacts, and send email or create events.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Hosted email MCP for your own Gmail, Outlook.com, Microsoft 365, iCloud or IMAP inbox: read, search, draft, reply in thread, forward and file mail. It moves or flags up to 500 messages in one call, and a send leaves exactly one copy in Sent. A calendar is a separate connection, and connecting one adds diary and scheduling tools.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for Claude to access Outlook data via Microsoft Graph API2081 npm1MIT
- AlicenseBqualityDmaintenanceA MCP server for Claude that reads Outlook emails its attachments through the Microsoft Graph API.619MIT
- FlicenseNot gradedqualityDmaintenanceA Python-based MCP server for Microsoft Outlook integration using Microsoft Graph API, enabling email reading/sending, calendar management, and contact operations through Claude Desktop.1-
- AlicenseNot gradedqualityDmaintenanceMCP server that enables Claude to manage Outlook emails, including reading, sending, organizing, drafting, and bulk operations via Microsoft Graph API.15 npm1MIT