A comprehensive MCP (Model Context Protocol) server that connects Claude with Microsoft 365 services through the Microsoft Graph API and Power Automate API.
- Outlook - Email, calendar, folders, and rules
- OneDrive - Files, folders, search, and sharing
- Power Automate - Flows, environments, and run history
├── index.js # Main entry point
├── config.js # Configuration settings
├── auth/ # Authentication modules
│ ├── index.js # Authentication exports
│ ├── token-manager.js # Token storage and refresh (Graph + Flow)
│ └── tools.js # Auth-related tools
├── calendar/ # Calendar functionality
│ ├── index.js # Calendar exports
│ ├── list.js # List events
│ ├── create.js # Create event
│ ├── delete.js # Delete event
│ ├── cancel.js # Cancel event
│ ├── accept.js # Accept event
│ └── decline.js # Decline event
├── email/ # Email functionality
│ ├── index.js # Email exports
│ ├── list.js # List emails
│ ├── search.js # Search emails
│ ├── read.js # Read email
│ ├── send.js # Send email
│ └── mark-as-read.js # Mark email read/unread
├── folder/ # Folder functionality
│ ├── index.js # Folder exports
│ ├── list.js # List folders
│ ├── create.js # Create folder
│ └── move.js # Move emails
├── rules/ # Email rules functionality
│ ├── index.js # Rules exports
│ ├── list.js # List rules
│ └── create.js # Create rule
├── onedrive/ # OneDrive functionality
│ ├── index.js # OneDrive exports
│ ├── list.js # List files/folders
│ ├── search.js # Search files
│ ├── download.js # Get download URL
│ ├── upload.js # Simple upload (<4MB)
│ ├── upload-large.js # Chunked upload (>4MB)
│ ├── share.js # Create sharing link
│ └── folder.js # Create/delete folders
├── power-automate/ # Power Automate functionality
│ ├── index.js # Power Automate exports
│ ├── flow-api.js # Flow API client
│ ├── list-environments.js # List environments
│ ├── list-flows.js # List flows
│ ├── run-flow.js # Trigger flow
│ ├── list-runs.js # Run history
│ └── toggle-flow.js # Enable/disable flow
└── utils/ # Utility functions
├── graph-api.js # Microsoft Graph API helper
├── odata-helpers.js # OData query building
└── mock-data.js # Test mode data
- Authentication: OAuth 2.0 authentication with Microsoft Graph API (+ Flow API for Power Automate)
- Email Management: List, search, read, send, and organize emails
- Calendar Management: List, create, accept, decline, and delete calendar events
- OneDrive Integration: List, search, upload, download, and share files
- Power Automate: List environments/flows, trigger flows, view run history
- Modular Structure: Clean separation of concerns for maintainability
- Test Mode: Simulated responses for testing without real API calls
| Tool | Description |
|---|---|
list-emails |
List recent emails from inbox |
search-emails |
Search emails with filters |
read-email |
Read email content |
send-email |
Send a new email |
mark-as-read |
Mark email as read/unread |
list-events |
List calendar events |
create-event |
Create calendar event |
accept-event |
Accept event invitation |
decline-event |
Decline event invitation |
delete-event |
Delete calendar event |
list-folders |
List mail folders |
create-folder |
Create mail folder |
move-emails |
Move emails between folders |
list-rules |
List inbox rules |
create-rule |
Create inbox rule |
| Tool | Description |
|---|---|
onedrive-list |
List files in a path |
onedrive-search |
Search files by query |
onedrive-download |
Get download URL |
onedrive-upload |
Upload small file (<4MB) |
onedrive-upload-large |
Chunked upload (>4MB) |
onedrive-share |
Create sharing link |
onedrive-create-folder |
Create folder |
onedrive-delete |
Delete file or folder |
| Tool | Description |
|---|---|
flow-list-environments |
List Power Platform environments |
flow-list |
List flows in environment |
flow-run |
Trigger a manual flow |
flow-list-runs |
Get flow run history |
flow-toggle |
Enable/disable a flow |
- Install dependencies:
npm install - Azure setup: Register app in Azure Portal (see detailed steps below)
- Configure environment: Copy
.env.exampleto.envand add your Azure credentials - Configure Claude: Update your Claude Desktop config with the server path
- Start auth server:
npm run auth-server - Authenticate: Use the authenticate tool in Claude to get the OAuth URL
- Start using: Access your M365 data through Claude!
- Node.js 14.0.0 or higher
- npm or yarn package manager
- Azure account for app registration
npm install- Open Azure Portal
- Search for "App registrations"
- Click "New registration"
- Name: "M365 MCP Server"
- Account type: "Accounts in any organizational directory and personal Microsoft accounts"
- Redirect URI: Web →
http://localhost:3333/auth/callback - Click "Register"
- Copy the "Application (client) ID" for your
.envfile
- Go to "API permissions" under Manage
- Click "Add a permission" → "Microsoft Graph" → "Delegated permissions"
- Add these permissions:
offline_accessUser.ReadMail.Read,Mail.ReadWrite,Mail.SendCalendars.Read,Calendars.ReadWriteFiles.Read,Files.ReadWrite
- Click "Add permissions"
For Power Automate (optional):
- Requires additional Azure AD configuration with Flow API scope
- See Power Automate section below for details
- Go to "Certificates & secrets" → "Client secrets"
- Click "New client secret"
- Add description and select expiration
- Copy the VALUE (not the Secret ID)
cp .env.example .envEdit .env:
# Get these values from Azure Portal > App Registrations > Your App
MS_CLIENT_ID=your-application-client-id-here
MS_CLIENT_SECRET=your-client-secret-VALUE-here
MS_TENANT_ID=your-tenant-id-here
USE_TEST_MODE=falseImportant Notes:
- Use
MS_CLIENT_IDandMS_CLIENT_SECRETin the.envfile - Set
MS_TENANT_IDfor single-tenant apps to avoid/commonendpoint errors - For Claude Desktop config, you'll use
OUTLOOK_CLIENT_IDandOUTLOOK_CLIENT_SECRET - Always use the client secret VALUE, never the Secret ID
Add to your Claude Desktop config:
{
"mcpServers": {
"m365-assistant": {
"command": "node",
"args": ["/path/to/outlook-mcp/index.js"],
"env": {
"USE_TEST_MODE": "false",
"OUTLOOK_CLIENT_ID": "your-client-id",
"OUTLOOK_CLIENT_SECRET": "your-client-secret"
}
}
}
}- Start auth server:
npm run auth-server - Use the
authenticatetool in Claude - Visit the provided URL and sign in
- Tokens saved to
~/.outlook-mcp-tokens.json
Power Automate requires a separate token with the Flow API scope. Configure additional Azure AD permissions for https://service.flow.microsoft.com//.default scope.
Limitations:
- Only solution-aware flows are accessible
- Only manual trigger flows can be run via API
- Requires environment ID for most operations
"Cannot find module"
npm install"Port 3333 in use"
npx kill-port 3333
npm run auth-server"Invalid client secret" (AADSTS7000215)
- Use the secret VALUE, not the Secret ID
"Authentication required"
- Delete
~/.outlook-mcp-tokens.jsonand re-authenticate
# Run with MCP Inspector
npm run inspect
# Run in test mode (mock data)
npm run test-mode
# Run Jest tests
npm test- Create new module directory
- Implement tool handlers in separate files
- Export tool definitions from module index
- Import and add to
TOOLSarray inindex.js
