Modular Outlook MCP Server

by ryaker

398 stars
844 downloads
Not rated
GitHub

About

MCP server for Claude to access Outlook data via Microsoft Graph API

Details

Author
ryaker
GitHub stars
398
Downloads
844
Categories
Communication

- OAuth 2.0 authentication with Microsoft Graph and Flow APIs
- Email management: list, search, read, send, mark as read/unread
- Calendar management: list, create, accept, decline, delete events
- OneDrive integration: list, search, upload, download, share files
- Power Automate: list environments/flows, trigger runs, view history
- Test mode with simulated responses for development

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Modular Outlook MCP Server
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Install dependencies with npm install, then register an Azure AD app with required permissions and configure environment variables in .env. Start the auth server with npm run auth-server, use the authenticate tool in Claude to get an OAuth URL, sign in, and tokens are saved to ~/.outlook-mcp-tokens.json. Add the server to Claude Desktop config with command: "node" and the path to index.js.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "modular outlook mcp server": {
            "outlook-mcp": {
                "command": "npx",
                "args": [
                    "kill-port",
                    "3333"
                ]
            }
        }
    }
}

McpServers

{
    "outlook-mcp": {
        "command": "npx",
        "args": [
            "kill-port",
            "3333"
        ]
    }
}
[![MseeP.ai Security Assessment Badge](https://mseep.net/pr/ryaker-outlook-mcp-badge.png)](https://mseep.ai/app/ryaker-outlook-mcp) # M365 Assistant MCP Server A comprehensive MCP (Model Context Protocol) server that connects Claude with Microsoft 365 services through the Microsoft Graph API and Power Automate API. ## Supported Services - **Outlook** - Email, calendar, folders, and rules - **OneDrive** - Files, folders, search, and sharing - **Power Automate** - Flows, environments, and run history ## Directory Structure ``` ├── 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 ``` ## Features - **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 ## Available Tools ### Outlook (Email & Calendar) | 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 | ### OneDrive | 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 | ### Power Automate | 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 | ## Quick Start 1. **Install dependencies**: `npm install` 2. **Azure setup**: Register app in Azure Portal (see detailed steps below) 3. **Configure environment**: Copy `.env.example` to `.env` and add your Azure credentials 4. **Configure Claude**: Update your Claude Desktop config with the server path 5. **Start auth server**: `npm run auth-server` 6. **Authenticate**: Use the authenticate tool in Claude to get the OAuth URL 7. **Start using**: Access your M365 data through Claude! ## Installation ### Prerequisites - Node.js 14.0.0 or higher - npm or yarn package manager - Azure account for app registration ### Install Dependencies ```bash npm install ``` ## Azure App Registration & Configuration ### App Registration 1. Open [Azure Portal](https://portal.azure.com/) 2. Search for "App registrations" 3. Click "New registration" 4. Name: "M365 MCP Server" 5. Account type: "Accounts in any organizational directory and personal Microsoft accounts" 6. Redirect URI: Web → `http://localhost:3333/auth/callback` 7. Click "Register" 8. Copy the "Application (client) ID" for your `.env` file ### App Permissions 1. Go to "API permissions" under Manage 2. Click "Add a permission" → "Microsoft Graph" → "Delegated permissions" 3. Add these permissions: - `offline_access` - `User.Read` - `Mail.Read`, `Mail.ReadWrite`, `Mail.Send` - `Calendars.Read`, `Calendars.ReadWrite` - `Files.Read`, `Files.ReadWrite` 4. Click "Add permissions" **For Power Automate** (optional): - Requires additional Azure AD configuration with Flow API scope - See Power Automate section below for details ### Client Secret 1. Go to "Certificates & secrets" → "Client secrets" 2. Click "New client secret" 3. Add description and select expiration 4. **Copy the VALUE** (not the Secret ID) ## Configuration ### 1. Environment Variables ```bash cp .env.example .env ``` Edit `.env`: ```bash # 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=false ``` **Important Notes:** - Use `MS_CLIENT_ID` and `MS_CLIENT_SECRET` in the `.env` file - Set `MS_TENANT_ID` for single-tenant apps to avoid `/common` endpoint errors - For Claude Desktop config, you'll use `OUTLOOK_CLIENT_ID` and `OUTLOOK_CLIENT_SECRET` - Always use the client secret **VALUE**, never the Secret ID ### 2. Claude Desktop Configuration Add to your Claude Desktop config: ```json { "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" } } } } ``` ## Authentication ### Graph API (Outlook + OneDrive) 1. Start auth server: `npm run auth-server` 2. Use the `authenticate` tool in Claude 3. Visit the provided URL and sign in 4. Tokens saved to `~/.outlook-mcp-tokens.json` ### Power Automate (Optional) 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 ## Troubleshooting ### Common Issues **"Cannot find module"** ```bash npm install ``` **"Port 3333 in use"** ```bash 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.json` and re-authenticate ## Testing ```bash # Run with MCP Inspector npm run inspect # Run in test mode (mock data) npm run test-mode # Run Jest tests npm test ``` ## Extending the Server 1. Create new module directory 2. Implement tool handlers in separate files 3. Export tool definitions from module index 4. Import and add to `TOOLS` array in `index.js`
No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.