ryaker/outlook-mcp
This is a modular implementation of the Outlook MCP server that connects Claude with Microsoft Outlook through the Microsoft Graph API.
Modular Outlook MCP Server
This is a modular implementation of the Outlook MCP (Model Context Protocol) server that connects Claude with Microsoft Outlook through the Microsoft Graph API. Certified by MCPHub
Directory Structure
/modular/
āāā index.js # Main entry point
āāā config.js # Configuration settings
āāā auth/ # Authentication modules
ā āāā index.js # Authentication exports
ā āāā token-manager.js # Token storage and refresh
ā āāā 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
ā āāā accept.js # Accept event
ā āāā tentative.js # Tentatively 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
āāā 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
- Email Management: List, search, read, and send emails
- Calendar Management: List, create, accept, decline, and delete calendar events
- Modular Structure: Clean separation of concerns for better maintainability
- OData Filter Handling: Proper escaping and formatting of OData queries
- Test Mode: Simulated responses for testing without real API calls
Quick Start
- 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 Outlook data through Claude!
Installation
Prerequisites
- Node.js 14.0.0 or higher
- npm or yarn package manager
- Azure account for app registration
Install Dependencies
npm install
This will install the required dependencies including:
@modelcontextprotocol/sdk- MCP protocol implementationdotenv- Environment variable management
Azure App Registration & Configuration
To use this MCP server you need to first register and configure an app in Azure Portal. The following steps will take you through the process of registering a new app, configuring its permissions, and generating a client secret.
App Registration
- Open Azure Portal in your browser
- Sign in with a Microsoft Work or Personal account
- Search for or cilck on "App registrations"
- Click on "New registration"
- Enter a name for the app, for example "Outlook MCP Server"
- Select the "Accounts in any organizational directory and personal Microsoft accounts" option
- In the "Redirect URI" section, select "Web" from the dropdown and enter "http://localhost:3333/auth/callback" in the textbox
- Click on "Register"
- From the Overview section of the app settings page, copy the "Application (client) ID" and enter it as the MS_CLIENT_ID in the .env file as well as the OUTLOOK_CLIENT_ID in the claude-config-sample.json file
App Permissions
- From the app settings page in Azure Portal select the "API permissions" option under the Manage section
- Click on "Add a permission"
- Click on "Microsoft Graph"
- Select "Delegated permissions"
- Search for the following permissions and slect the checkbox next to each one
- offline_access
- User.Read
- Mail.Read
- Mail.Send
- Calendars.Read
- Calendars.ReadWrite
- Contacts.Read
- Click on "Add permissions"
Client Secret
- From the app settings page in Azure Portal select the "Certificates & secrets" option under the Manage section
- Switch to the "Client secrets" tab
- Click on "New client secret"
- Enter a description, for example "Client Secret"
- Select the longest possible expiration time
- Click on "Add"
- ā ļø IMPORTANT: Copy the secret VALUE (not the Secret ID) and save it for the next step
Configuration
1. Environment Variables
Create a .env file in the project root by copying the example:
cp .env.example .env
Edit .env and add your Azure credentials:
# 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
USE_TEST_MODE=false
Important Notes:
- Use
MS_CLIENT_IDandMS_CLIENT_SECRETin the.envfile - For Claude Desktop config, you'll use
OUTLOOK_CLIENT_IDandOUTLOOK_CLIENT_SECRET - Always use the client secret VALUE, never the Secret ID
2. Claude Desktop Configuration
Copy the configuration from claude-config-sample.json to your Claude Desktop config file and update the paths and credentials:
{
"mcpServers": {
"outlook-assistant": {
"command": "node",
"args": [
"/absolute/path/to/outlook-mcp/index.js"
],
"env": {
"USE_TEST_MODE": "false",
"OUTLOOK_CLIENT_ID": "your-client-id-here",
"OUTLOOK_CLIENT_SECRET": "your-client-secret-here"
}
}
}
}
3. Advanced Configuration (Optional)
To configure server behavior, you can edit config.js to change:
- Server name and version
- Test mode settings
- Authentication parameters
- Email field selections
- API endpoints
Usage with Claude Desktop
- Configure Claude Desktop: Add the server configuration (see Configuration section above)
- Restart Claude Desktop: Close and reopen Claude Desktop to load the new MCP server
- Start Authentication Server: Open a terminal and run
npm run auth-server - Authenticate: In Claude Desktop, use the
authenticatetool to get an OAuth URL - Complete OAuth Flow: Visit the URL in your browser and sign in with Microsoft
- Start Using: Once authenticated, you can use all the Outlook tools in Claude!
Running Standalone
You can test the server using:
./test-modular-server.sh
This will use the MCP Inspector to directly connect to the server and let you test the available tools.
Authentication Flow
The authentication process requires two steps:
Step 1: Start the Authentication Server
npm run auth-server
This starts a local server on port 3333 that handles the OAuth callback from Microsoft.
ā ļø Important: The auth server MUST be running before you try to authenticate. The authentication URL will not work if the server isn't running.
Step 2: Authenticate with Microsoft
- In Claude Desktop, use the
authenticatetool - Claude will provide a URL like:
http://localhost:3333/auth?client_id=your-client-id - Visit this URL in your browser
- Sign in with your Microsoft account
- Grant the requested permissions
- You'll be redirected back to a success page
- Tokens are automatically stored in
~/.outlook-mcp-tokens.json
The authentication server can be stopped after successful authentication (tokens are saved). However, you'll need to restart it if you need to re-authenticate.
Troubleshooting
Common Installation Issues
"Cannot find module '@modelcontextprotocol/sdk/server/index.js'"
Solution: Install dependencies first:
npm install
"Error: listen EADDRINUSE: address already in use :::3333"
Solution: Port 3333 is already in use. Kill the existing process:
npx kill-port 3333
Then restart the auth server: npm run auth-server
Authentication Issues
"Invalid client secret provided" (Error AADSTS7000215)
Root Cause: You're using the Secret ID instead of the Secret Value.
Solution:
- Go to Azure Portal > App Registrations > Your App > Certificates & secrets
- Copy the Value column (not the Secret ID column)
- Update both:
.envfile:MS_CLIENT_SECRET=actual-secret-value- Claude Desktop config:
OUTLOOK_CLIENT_SECRET=actual-secret-value
- Restart the auth server:
npm run auth-server
Authentication URL doesn't work / "This site can't be reached"
Root Cause: Authentication server isn't running.
Solution:
- Start the auth server first:
npm run auth-server - Wait for "Authentication server running at http://localhost:3333"
- Then try the authentication URL in Claude
"Authentication required" after successful setup
Root Cause: Token may have expired or been corrupted.
Solutions:
- Check if token file exists:
~/.outlook-mcp-tokens.json - If corrupted, delete the file and re-authenticate
- Restart the auth server and authenticate again
Configuration Issues
Server doesn't start in Claude Desktop
Solutions:
- Check the absolute path in your Claude Desktop config
- Ensure
OUTLOOK_CLIENT_IDandOUTLOOK_CLIENT_SECRETare set in Claude config - Restart Claude Desktop after config changes
Environment variables not loading
Solutions:
- Ensure
.envfile exists in the project root - Use
MS_CLIENT_IDandMS_CLIENT_SECRETin.env - Don't add quotes around values in
.envfile
API and Runtime Issues
- OData Filter Errors: Check server logs for escape sequence issues
- API Call Failures: Look for detailed error messages in the response
- Token Refresh Issues: Delete
~/.outlook-mcp-tokens.jsonand re-authenticate
Getting Help
If you're still having issues:
- Check the console output from
npm run auth-serverfor detailed error messages - Verify your Azure app registration settings match the documentation
- Ensure you have the required Microsoft Graph API permissions
Extending the Server
To add more functionality:
- Create new module directories (e.g.,
calendar/) - Implement tool handlers in separate files
- Export tool definitions from module index files
- Import and add tools to
TOOLSarray inindex.js
