Microsoft Outlook (mail) MCP server β read, search, and send email through Microsoft Graph.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Β Β
Β Β
Β Β
Β Β ![]()
Model Context Protocol servers for Microsoft 365.
Calendar Β· Contacts Β· OneDrive Β· Outlook Β· SharePoint β on the official
@modelcontextprotocol/sdk,
over stdio or Streamable HTTP.
Each server speaks the real MCP protocol and runs over either transport:
Authorization: Bearer.| Server | npm package (and binary) | Tools | |
|---|---|---|---|
| Calendar | ms-calendar-mcp | 9 | |
| Contacts | ms-contacts-mcp | 7 | |
| OneDrive | ms-onedrive-mcp | 9 | |
| Outlook | microsoft-outlook-mcp | 14 | |
| SharePoint | ms-sharepoint-mcp | 23 |
All tools are thin wrappers over the Microsoft Graph v1.0 API.
A server is just a list of tools handed to run():
confirmationPolicy ("always" for mutating/destructive tools, "never" for read-only) is surfaced to clients as MCP readOnlyHint / destructiveHint annotations.
corepack enable)Tests live next to the code as *.test.ts and run on TypeScript source directly (no build step). The shared packages/* are covered by unit and integration tests β including a full Streamable-HTTP round-trip against a live server β and CI enforces a coverage floor on them. Each apps/* server ships an invariant suite that locks its tool surface (unique snake_case names, valid schemas and confirmation policies).
Every push and pull request to master runs CI: typecheck β build β tests with coverage. The coverage badge is regenerated from the run.
You sign in once with your Microsoft account; the server then caches a refresh token and acquires access tokens silently from then on β no pasting, no 1-hour expiry. Sign-in uses your own Microsoft Entra ID app registration (free) so the servers act on your behalf.
Azure Portal β Microsoft Entra ID β App registrations β New registration. Name it anything; pick the Supported account types that fit (single-tenant, multi-tenant, and/or personal accounts).
Authentication β Add a platform β Mobile and desktop applications β add redirect URI http://localhost, and set Allow public client flows to Yes (enables the --device-code fallback).
API permissions β Add a permission β Microsoft Graph β Delegated permissions β add the scopes for the servers you use (then Grant admin consent if your tenant requires it):
| Server | Delegated scopes |
|---|---|
| Calendar | Calendars.ReadWrite |
| Contacts | Contacts.ReadWrite |
| OneDrive | Files.ReadWrite.All |
| Outlook | Mail.ReadWrite, Mail.Send |
| SharePoint | Sites.ReadWrite.All |
All servers also use User.Read. (offline_access is requested automatically for refresh.)
Copy the Application (client) ID.
Set MICROSOFT_CLIENT_ID, then run the server's login command. A browser opens; after you consent, the token is cached under ~/.config/microsoft-mcp/:
From then on the server refreshes tokens automatically. Use a non-default tenant with MICROSOFT_TENANT_ID (default common).
To bypass the built-in flow, supply a pre-acquired Graph token directly:
MICROSOFT_ACCESS_TOKEN (takes precedence over the cached sign-in). Good for quick tests β mint one with az account get-access-token --resource https://graph.microsoft.com --query accessToken -o tsv.Authorization: Bearer <token> on each POST /mcp request. Each request is stateless with its own token, so callers never share credentials β this is the model for hosted/remote deployments, which handle their own auth.Each server is published to npm and runnable with npx β no clone or build. Sign in once first (npx -y ms-calendar-mcp login, see Authentication), then:
Or point at a local build instead of npm:
During development you can skip the build and run the TypeScript directly:
The server exposes POST /mcp (the MCP endpoint) and GET /healthz. Point any Streamable-HTTP MCP client at http://localhost:3000/mcp with an Authorization: Bearer header.
Resolved in this order: --stdio / --http flag β MCP_TRANSPORT=stdio|http β default stdio.
HTTP port: --port <n> β PORT β 3000.
| Variable | Used by | Description |
|---|---|---|
MICROSOFT_CLIENT_ID | stdio | Entra ID app (client) ID for sign-in. Required for the login flow. |
MICROSOFT_TENANT_ID | stdio | Tenant for sign-in: common (default), organizations, consumers, or a tenant ID. |
MICROSOFT_ACCESS_TOKEN | stdio | Pre-acquired Graph token; overrides the cached sign-in when set. |
MICROSOFT_MCP_CACHE_DIR | stdio | Override the token-cache directory (default ~/.config/microsoft-mcp). |
MCP_TRANSPORT | both | stdio (default) or http. |
PORT | http | Listen port (default 3000). |
MCP_HTTP_BODY_LIMIT | http | Max request body size (default 50mb) for base64 uploads. |
MCP_DEBUG | both | Any non-empty value enables debug logs (to stderr). |
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/microsoft-outlook-mcp)<a href="https://allmcps.com/mcp/microsoft-outlook-mcp"><img src="https://allmcps.com/api/badge/microsoft-outlook-mcp?style=directory" alt="Microsoft Outlook Mcp on AllMCPs" /></a>