outlook-mcp
outlook-ews-mcp
outlook-ews-mcp ist ein MCP-Server für lokales Microsoft
Exchange über EWS (exchangelib). Er bietet
MCP-kompatiblen Clients (Claude Desktop, Claude Code und jedem anderen MCP-Client) Zugriff auf
E-Mail, Kalender, Kontakte, Ordner, Anhänge und Verfügbarkeitsdaten über einen einzigen,
testbaren Python-Dienst – ohne direkte Mailbox-Skripte.
Umbenannt von
outlook-mcp. Dieser Name war auf PyPI bereits von einem unabhängigen Projekt belegt, daher heißen Distribution und CLI jetztoutlook-ews-mcp. Der Python-Importpfad ist unverändert. Bis zur ersten getaggten PyPI-Veröffentlichung installieren Sie aus diesem Repository wie unten gezeigt.
Inhalt
Related MCP server: owa-mail-mcp
Highlights
E-Mail – auflisten, suchen (Teilstring oder Advanced Query Syntax), lesen, senden, antworten, weiterleiten, verschieben, kopieren, löschen, markieren, kategorisieren, Massenaktionen, roher MIME-Export, Anhänge hinzufügen/löschen
System – Posteingangsregeln, Abwesenheitsnotiz (automatische Antworten), schreibgeschützte Delegiertenliste
Kalender – auflisten, erstellen, aktualisieren, löschen, auf Einladungen antworten, freie Zeitfenster finden, Kalender eines freigegebenen/delegierten Postfachs anzeigen, Raumfinder, Massenaktionen
Kontakte – suchen, lesen, erstellen, aktualisieren, löschen
Ordner & Anhänge – Ordner-CRUD und Anhangs-Download
Authentifizierung –
NTLMundBasicgegen lokales ExchangeTransport –
stdioundSSEArchitektur – zentrales Fehler-Mapping durch eine einzige
ExchangeClient-Abstraktion (siehe Projektnotizen)Sicherheit – ein datenschutzfreundlicherer Rauchtest standardmäßig (siehe Rauchtest)
Betrieb – Docker-Image sowie GitHub- und GitLab-CI/CD-Pipelines enthalten
Werkzeugkatalog
Jedes unten aufgeführte Werkzeug ist in tool_specs.py registriert,
der einzigen Quelle der Wahrheit für Name, Beschreibung und Schema. Schreibgeschützt markiert
Werkzeuge, die das Postfach nie verändern – sie erhalten mehr Parallelität (siehe
Anfragewarteschlange) und können bedenkenlos spekulativ aufgerufen werden.
System
Werkzeug | Beschreibung | Schreibgeschützt |
| Konnektivität zu Exchange prüfen | ✅ |
| Postfach-Metadaten abrufen | ✅ |
| Postfach-Delegierte und deren Ordnerberechtigungsstufen auflisten – schreibgeschützt, da | ✅ |
| Serverseitige Posteingangsregeln auflisten | ✅ |
| Serverseitige Posteingangsregel erstellen, z. B. „von diesem Absender → in Ordner verschieben“ | |
| Regel aktivieren/deaktivieren oder Priorität ändern (andere Felder sind hier nicht aktualisierbar) | |
| Serverseitige Posteingangsregel per ID löschen | |
| Abwesenheitsnotiz-Einstellungen (automatische Antworten) abrufen | ✅ |
| Automatische Antworten deaktivieren, aktivieren oder ein Start-/Endfenster planen |
⚠️
create_inbox_rule/update_inbox_rule/delete_inbox_ruleverwalten Regeln über EWS, wodurch der clientseitige Regel-Blob entfernt wird, den Desktop-Outlook behält – dies kann Regeln löschen, die ein Benutzer in Outlook selbst erstellt hat. Dies ist dokumentiertes EWS-Verhalten, kein Fehler hier.
Werkzeug | Beschreibung | Schreibgeschützt |
| E-Mails in einem Ordner auflisten | ✅ |
| Vollständige E-Mail per ID abrufen | ✅ |
| Rohen RFC-822-MIME-Inhalt einer Nachricht exportieren, base64-kodiert | ✅ |
| Alle Nachrichten einer Unterhaltung in Reihenfolge abrufen, einschließlich Textkörper | ✅ |
| Nach Teilstring (Betreff/Text/Absender) oder serverseitiger Advanced Query Syntax suchen | ✅ |
| Neue E-Mail senden | |
| Auf eine E-Mail antworten | |
| E-Mail weiterleiten | |
| E-Mail in einen anderen Ordner verschieben | |
| E-Mail in einen anderen Ordner kopieren | |
| Massenverschieben mit Ergebnissen pro Element – eine fehlerhafte ID lässt den Rest nicht scheitern | |
| Massenkopieren mit Ergebnissen pro Element | |
| Massenlöschen mit Ergebnissen pro Element (weiches Löschen, außer | |
| E-Mail löschen | |
| Gelesen-Status, Wichtigkeit oder Folgekennzeichnung aktualisieren | |
| Outlook-Kategorien (die farbigen Bezeichnungen) setzen, hinzufügen oder entfernen | |
| Massenversion von | |
| Massenversion von | |
| Verwendete Kategorien mit Anzahl auflisten, aus aktuellen Nachrichten gesampelt (nicht die Postfach-Masterkategorieliste) | ✅ |
| Postfachordner auflisten | ✅ |
| Postfachordner erstellen | |
| Ordner umbenennen – verweigert integrierte Ordner (Posteingang, Gesendete Elemente, Kalender, ...) | |
| Ordner und alles darin löschen – verweigert integrierte Ordner | |
| E-Mail-Entwurf erstellen | |
| Entwurf aktualisieren; weggelassene Felder bleiben unverändert, | |
| Vorhandenen Entwurf senden | |
| Lokale Datei an eine Nachricht anhängen, typischerweise einen Entwurf – die Datei muss unter | |
| Einen Anhang per ID aus einer Nachricht entfernen | |
| Anhang auf der Festplatte speichern | ✅ |
Kalender
Tool | Beschreibung | Schreibgeschützt |
| Kalenderereignisse in einem Zeitraum auflisten; | ✅ |
| Kalenderereignis per ID abrufen; | ✅ |
| Kalenderereignis erstellen | |
| Kalenderereignis aktualisieren | |
| Kalenderereignis löschen | |
| Einladung annehmen, ablehnen oder vorläufig beantworten | |
| Freie Meeting-Zeitfenster finden | ✅ |
| Ereignisse in Bulk löschen, mit Ergebnissen pro Element | |
| In Bulk auf Einladungen antworten, mit Ergebnissen pro Element | |
| Frei/Gebucht-Zeitfenster abrufen; | ✅ |
| Kalender auflisten | ✅ |
| Room-Finder-Raumlisten (Gruppen von Besprechungsräumen) auflisten | ✅ |
| Besprechungsräume in einer Room-Finder-Raumliste auflisten | ✅ |
Kontakte
Tool | Beschreibung | Schreibgeschützt |
| Kontakte durchsuchen | ✅ |
| Kontakt per ID abrufen | ✅ |
| Persönlichen Kontakt erstellen | |
| Persönlichen Kontakt aktualisieren | |
| Persönlichen Kontakt löschen |
Typische Anwendungsfälle
Claude Desktop oder einen anderen MCP-Client mit lokalem Exchange verbinden
Posteingangsnachrichten durchsuchen und vollständigen E-Mail-Inhalt abrufen
E-Mails aus KI-Workflows senden oder entwerfen
Kalender einsehen und Besprechungen erstellen
Frei/Gebucht-Zeitfenster für die Terminplanung prüfen
Persönliche Kontakte oder die globale Adressliste durchsuchen
Exchange-Operationen über eine kontrollierte MCP-Grenze bereitstellen, statt direkt per Skript auf Postfächer zuzugreifen
Sicherheitshinweise
Was der aktuelle Code tut:
Eingeschränkte Konnektivität | Verbindet sich nur mit dem in |
Keine Telemetrie | Enthält keine Telemetrie-, Analyse- oder Drittanbieter-Datenexportlogik |
Geheimnisse bleiben lokal | Bewahrt Geheimnisse in Umgebungsvariablen / |
Saubere Fehlerantworten | Strukturierte MCP-Fehlerantworten enthalten niemals rohen Exchange-Ausnahmetext, Nachrichtentexte, Anhängeinhalte oder Passwörter; erfolgreiche Tools geben nur die angeforderten Postfachdaten zurück |
Saubere Protokolle |
|
Saubere Docker-Builds |
|
Worauf Sie weiterhin achten sollten:
EXCHANGE_VERIFY_SSL=falsedeaktiviert die TLS-Zertifikatsprüfung – nur für vertrauenswürdige interne/self-signed Umgebungen.EXCHANGE_AUTH_TYPE=Basicsendet Anmeldedaten im Klartext, daher weigert sich der Server, gegen einenhttp://-EXCHANGE_SERVERzu starten; nur mitEXCHANGE_ALLOW_INSECURE_BASIC_AUTH=truefür einen lokalen/Test-Server, den Sie kontrollieren, überschreiben.get_attachmentschreibt Dateien auf die Festplatte, undsend_email/reply_email/forward_email/create_draftlesen lokale Dateien (überattachments) und hängen deren Inhalte an ausgehende E-Mails an. In Kombination mit nicht vertrauenswürdigem E-Mail-Inhalt ist dies ein plausibler Weg für prompt-injizierte Exfiltration beliebiger Dateien, die der Prozess lesen kann. Lokaler Dateizugriff ist standardmäßig verweigert und funktioniert erst, wennEXCHANGE_ATTACHMENT_ROOTauf ein absolutes Verzeichnis gesetzt ist, das dann sowohlattachments-Pfade als auchsave_pathvonget_attachment's auf diesen Verzeichnisbaum beschränkt (ein nicht gesetztessave_pathfällt weiterhin auf das System-Temp-Verzeichnis zurück).outlook-ews-mcp-smokeist standardmäßig datenschutzsicher und gibt nur maskierte Postfachinformationen plus Zähler aus; setzen SieOUTLOOK_MCP_SMOKE_INCLUDE_DATA=truenur, wenn Sie explizit echte Posteingangs-/Ereignisdaten in stdout möchten.Wenn Sie Dateiprotokollierung mit
LOG_FILEaktivieren, schützen Sie diese Datei mit Betriebssystemberechtigungen.Wenn Sie Docker-Images aus CI veröffentlichen, schützen Sie den GitLab/GitHub-Projektzugriff und die Registry-Berechtigungen.
Schnellstart
uv venv
source .venv/bin/activate
uv pip install -e .[dev]
cp .env.example .env
outlook-ews-mcpStandardmäßig läuft der Server im stdio-Modus. Setzen Sie MCP_TRANSPORT=sse, um stattdessen einen HTTP-Server zu starten.
Konfiguration
Minimale .env für den Einstieg – alles andere unten hat einen funktionierenden Standardwert:
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=NTLMEine vollständig kommentierte Kopie jeder Variable befindet sich in .env.example.
Variable | Standard | Beschreibung |
| (erforderlich) | EWS-Endpunkt-URL, z. B. |
| (erforderlich) |
|
| (erforderlich) | Kontopasswort |
| nicht gesetzt | SMTP-Adresse; setzen, wenn |
|
|
|
|
|
|
|
| TLS-Zertifikat des Servers verifizieren; |
| nicht gesetzt (auto-erkannt) | Exchange-Serverversion, z. B. |
|
| Wird nur verwendet, wenn Exchange eine nicht auflösbare GUID-Zeitzonen-ID meldet; im Normalbetrieb wird die Standardzeitzone des Postfachs verwendet |
|
| Timeout pro Anfrage in Sekunden (1–300) |
|
| Wanduhr-Retry-Budget für schreibgeschützte Aufrufe, wenn Exchange sich selbst als ausgelastet meldet, keine Retry-Anzahl; |
| nicht gesetzt | Postfach, das imitiert werden soll (erfordert Exchange-Impersonierungsberechtigungen) |
|
| Maximale Größe pro Anhang, durchgesetzt sowohl beim Hochladen als auch beim |
|
| Maximale Anzahl von Anhängen bei einem einzelnen Senden/Antworten/Weiterleiten/create_draft-Aufruf (1–100) |
|
| Maximale kombinierte Anhangsgröße bei einem einzelnen Aufruf (1–500) |
| nicht gesetzt (deaktiviert) | Verzeichnis, das Anhangspfade begrenzt. Nicht gesetzt verweigert jeglichen lokalen Dateizugriff für |
|
| Obergrenze für |
|
| Obergrenze für die Roh-MIME-Exportgröße vor der base64-Erweiterung (1–100) |
| nicht gesetzt | Wird an ausgehende Textnachrichten und Antworten/Weiterleitungen angehängt. Es gibt keine EWS-Signatur-API, daher ist dies Konfiguration, nicht die Outlook-Signatur des Postfachs |
| nicht gesetzt | Wird an ausgehende HTML-Nachrichten angehängt. Gleicher Vorbehalt wie oben; keine Konvertierung zwischen den beiden. Beide können pro Aufruf mit |
|
|
|
|
| Bind-Host, wenn |
|
| Bind-Port, wenn |
|
| Gleichzeitige schreibgeschützte Tool-Aufrufe (1–8); mutierende Aufrufe laufen immer exklusiv. Siehe Anfragewarteschlange |
|
| Maximale Anzahl gleichzeitig zugelassener Aufrufe, laufend + wartend (1–1000); darüber hinaus erhalten Aufrufe sofort einen |
|
|
|
| nicht gesetzt (stderr) | Pfad zur Logdatei; bei Setzen mit Betriebssystem-Berechtigungen schützen |
Verhaltenshinweise, die nicht an eine einzelne Variable gebunden sind:
list_eventsundfind_free_slotsakzeptieren ein begrenzteslimit(Standard 200, Maximum 1000); Ereigniszeiträume sind auf 366 Tage und Zeitfenster für freie Slots auf 31 Tage begrenzt, sodass breite Abfragen keine unbegrenzten EWS- oder MCP-Antworten erzeugen können.Auflistungen bleiben bewusst schlank: E-Mail-Zusammenfassungen enthalten den Absender, aber keine Empfängerlisten (
get_emailhat sie),list_eventsgibt Ereignisse ohne Textkörper zurück (get_eventhat sie), undget_emailgibt RFC-822-Header nur mitinclude_headers: truezurück.Sendevorgänge geben
id: nullzurück, wenn EWS keine dauerhafte ID für die gesendete Kopie bereitstellt (insbesondere Antworten, Weiterleitungen und gesendete Entwürfe).Anhangsmetadaten enthalten
downloadable; eingebettete Exchange-Elementanhänge habendownloadable: falseund können nicht mitget_attachmentgespeichert werden.
Anfragewarteschlange
Clients geben mehrere Tool-Aufrufe parallel aus. Exchange-Arbeit ist blockierend, daher führt der Server sie in Worker-Threads aus und lässt Aufrufe über eine gemeinsame FIFO-Warteschlange zu.
MCP_MAX_CONCURRENCY(Standard4) legt fest, wie viele schreibgeschützte Aufrufe gleichzeitig laufen, sodass ein Agent, der eine E-Mail, die Ordnerliste und den Kalender anfordert, die langsamste Roundtrip-Zeit zahlt statt der Summe. Mutierende Aufrufe laufen immer exklusiv — einer nach dem anderen, nie überlappend mit einem Lesevorgang — sodass Lese-/Schreib-Wettläufe auf gemeinsamen Kontozustand nicht auftreten können. Aufrufer über dem Limit warten, in der Reihenfolge ihres Eintreffens; ein wartender Schreibvorgang verhindert, dass spätere Lesevorgänge ihn überholen.MCP_MAX_QUEUE_SIZE(Standard20) begrenzt, wie viele Aufrufe gleichzeitig zugelassen werden können, laufend oder wartend. Sobald so viele bereits in der Warteschlange sind, erhalten weitere Aufrufe sofort einenserver_busy-Fehler, statt sich einer unbegrenzten Warteschlange anzuschließen.Der Transport bleibt reaktionsfähig, während Arbeit läuft. Tools werden awaited statt auf dem Event-Loop-Thread ausgeführt, sodass fertige Antworten sofort hinausgehen und Pings beantwortet werden, während ein langer Aufruf noch läuft.
Es gibt bewusst kein Timeout pro Aufruf. Ein Thread, der auf einem Socket-Read blockiert, kann von außen nicht beendet werden; die Laufzeit kann nur aufhören, auf ihn zu warten, was den Thread zusammen mit der EWS-Sitzung, die er hält, aufgibt. Der Sitzungspool von
exchangelibhat ein hartes Maximum und gibt Sitzungen in einer Schleife ohne Aufgabepfad aus, sodass verlorene Sitzungen ihn schließlich aushungern und jeder spätere Aufruf für immer blockiert. Ein langsamer Aufruf wird stattdessen ausgesessen, begrenzt durchEXCHANGE_TIMEOUTplusEXCHANGE_MAX_RETRY_WAIT_SECONDS: Die Retry-Richtlinie des Kontos ist Fail-Fast, sodass jeder EWS-Aufruf bei seinem ersten transienten Fehler eine Ausnahme auslöst, statt dassexchangelibintern endlos wiederholt, undExchangeClientwiederholt selbst nur schreibgeschützte Aufrufe, begrenzt durch dieses Wanduhr-Budget. Schreibvorgänge werden nie automatisch wiederholt. Überschreitungen über das erwartete Budget hinaus werden protokolliert.
Claude Desktop-Beispiel
{
"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"
}
}
}
}Smoke-Check
Nach dem Ausfüllen von .env ausführen:
outlook-ews-mcp-smokeDie Standardausgabe wird zur sichereren Überprüfung bereinigt. Wenn Sie absichtlich Beispieldaten für Postfach/Ereignisse in der Ausgabe wünschen:
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 und GitLab CI führen beide Lint, Formatierung, Typprüfungen, Tests,
Abhängigkeitsaudit und Paket-Builds aus, unter Verwendung der in pyproject.toml
festgelegten uv-Version.
GitHub | Veröffentlicht zusätzlich getaggte Releases ( |
GitLab | Erstellt und pusht zusätzlich ein Docker-Image in die GitLab Container Registry auf dem Standard-Branch und auf Tags, unter Verwendung der eingebauten Variablen |
Standardmäßiges Image-Tagging-Verhalten:
Auslöser | Gepushte Tags |
Standard-Branch |
|
Git-Tag |
|
Entwicklung
uv run --python 3.12 --with '.[dev]' ruff check .
uv run --python 3.12 --with '.[dev]' pytest -qProjektnotizen
Die Implementierung ist um eine einzige
ExchangeClient-Abstraktion zentriert, sodass Authentifizierung, Transport, Retries und Fehlerzuordnung zentralisiert bleiben.Fehler werden in einer strukturierten JSON-Form zurückgegeben, die für die MCP-
isError=true-Behandlung geeignet ist.
Mitwirken
Fehlerberichte und PRs sind willkommen — siehe CONTRIBUTING.md für die Einrichtung einer Entwicklungsumgebung und das Ausführen der Testsuite ohne einen echten Exchange-Server. Für Sicherheitsmeldungen siehe SECURITY.md.
Lizenz
MIT — siehe 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