m365-mcp
Production-grade Microsoft 365 MCP server combining the best of office365-connector (delegated OAuth, multi-account) and mcp-microsoft365 (MCP protocol, full scope), with production-ready features: pagination, rate limiting, retry logic, and full TypeScript.
Requirements
- Node.js 18+
- Azure Entra ID App Registration with delegated Microsoft Graph permissions
- Device code OAuth (no client-credentials, no tenant-wide access)
Capabilities
Email (9 tools)
- List, read, send, reply, search, move, delete, mark read/unread, list folders
Calendar (9 tools)
- List events with organizer/response status, today view, week view, create (with Teams meeting), update, explicit organizer cancellation, attendee decline, free/busy
Contacts (12 tools)
- Rich contact CRUD, exact category assignment and any/all filtering, category enumeration, folder-scoped contacts, contact-folder CRUD, and relevance-ranked People API recipient search across mailbox and optional directory sources. People results support fuzzy search, identity-type filters, relevance scores, and optional profile details. Private Outlook Contact Lists and their membership are not exposed by Microsoft Graph.
OneDrive (5 tools)
- List files, search, read content, metadata, create folders
Teams (3 tools)
- List chats, read messages, send messages
Tasks (5 tools)
- List lists, list tasks, create, update, delete
Users (3 tools)
- List org users, profile lookup, manager lookup
Security and consent
- The server contacts only Microsoft's OAuth and Graph services:
login.microsoftonline.comandgraph.microsoft.com. - Device-code OAuth grants delegated access as the signed-in user. Read tools can expose private mail, files, calendars, contacts, Teams chats, tasks, and user data.
- Send, reply, move, create, update, cancel, decline, and delete tools change real Microsoft 365 data. Configure the MCP client to require explicit user approval for those tools.
- Tools publish standard MCP read-only, destructive, idempotent, and open-world annotations so compatible clients can apply confirmation policies.
- Set
M365_MCP_READ_ONLY=truefor an enforced least-privilege mode. It requests read-only OAuth scopes, omits mutating tools from discovery, and rejects direct calls to them. - Refresh and access tokens are stored as plaintext JSON under
~/.m365-mcp/auth/(orM365_MCP_AUTH_DIR), protected with directory mode0700and file mode0600where supported. Protect that directory and revoke the app's Microsoft account consent if a token or device is compromised.
Setup
ClawHub installs the prebuilt npm package automatically. For a manual install:
npm install --global @sam2kb/m365-mcp
# Add account
m365-mcp-auth add work <tenantId> <clientId> you@company.com
# Authenticate
m365-mcp-auth login --account=work
Then configure m365-mcp as a stdio MCP server in your client.
See the project README for the full Azure setup guide.
