UNPKG

ms365-mcp-server

Version:

Microsoft 365 MCP Server for managing Microsoft 365 email through natural language interactions with full OAuth2 authentication support

525 lines (435 loc) 12.6 kB
# ✉️ Microsoft 365 MCP Server A powerful **Model Context Protocol (MCP) server** that enables seamless Microsoft 365 email integration through natural language interactions. Built for **SIYA Desktop**, **LLMs**, and any MCP-compatible application with **production-ready security**. ## ✨ Key Features - **🎯 Optimized Tool Architecture** - Only 6 unified tools (67% reduction from 18 tools) - **📧 Complete Email Management** - Send, read, search, organize, and manage attachments - **🔐 Bulletproof Authentication** - Proactive token refresh prevents chat interruptions - **🤖 AI-First Design** - Intuitive action-based tools perfect for LLM interactions - **🔒 Enterprise Security** - OAuth2 with secure keychain storage and automatic refresh - **📁 Smart Contact Management** - Search and retrieve your Microsoft 365 contacts - **🌐 Cross-Platform** - Works on macOS, Linux, and Windows ## 📚 Documentation For detailed technical documentation, enhancement reports, and guides, see the **[docs/](./docs/)** directory: - **[Enhancement Reports](./docs/MS365-MCP-Server-Enhancement-Report.md)** - Recent fixes and improvements - **[Technical Guides](./docs/)** - Batch operations and Graph API implementation guides ## 🛠️ Available Tools (6 Total) ### **📧 Email Management** - **`send_email`** - Send emails with attachments and rich formatting - **`manage_email`** - **UNIFIED**: Read, search, list, mark, move, delete, or draft emails - **`get_attachment`** - Download email attachments with metadata - **`list_folders`** - Browse mailbox folders with item counts ### **👥 Contacts & Authentication** - **`manage_contacts`** - **UNIFIED**: List all contacts or search by name/email - **`authenticate`** - **UNIFIED**: Complete authentication management (login, status, logout) ## 🚀 Quick Start ### 1. Installation **Option A: Global Installation** ```bash # Install globally npm install -g ms365-mcp-server # Authenticate (no Azure setup needed!) ms365-mcp-server --login # Start the server ms365-mcp-server # Start with custom server URL ms365-mcp-server --server-url https://your-domain.com ``` **Option B: Run with npx (no installation needed)** ```bash # Authenticate npx ms365-mcp-server --login # Start the server npx ms365-mcp-server # Start with custom server URL npx ms365-mcp-server --server-url https://your-domain.com ``` ### 2. SIYA Desktop Integration **For Global Installation:** ```json { "mcpServers": { "ms365": { "command": "ms365-mcp-server", "args": ["--server-url", "https://your-domain.com"] } } } ``` **For npx Usage:** ```json { "mcpServers": { "ms365": { "command": "npx", "args": ["ms365-mcp-server", "--server-url", "https://your-domain.com"] } } } ``` ### 3. Start Using Chat with SIYA and ask it to help with your emails! The tools are designed for natural language interaction. ## 🔐 Authentication ### Simple Setup (Recommended) ```bash # One-command authentication ms365-mcp-server --login # Authentication with custom server URL ms365-mcp-server --login --server-url https://your-domain.com ``` ### Environment Variables ```bash # Set server URL via environment variable export SERVER_URL=https://your-domain.com ms365-mcp-server ``` ### MCP Tool Authentication ```javascript // Check authentication status { "tool": "authenticate", "arguments": { "action": "status" } } // Login with device code { "tool": "authenticate", "arguments": { "action": "login" } } // Logout { "tool": "authenticate", "arguments": { "action": "logout" } } ``` ## 💡 Tool Usage Examples ### Email Operations ```javascript // Send an email with attachment { "tool": "send_email", "arguments": { "to": ["colleague@company.com"], "subject": "Project Update", "body": "<h2>Status Report</h2><p>Project is on track!</p>", "bodyType": "html", "attachments": [{ "name": "report.pdf", "contentBytes": "base64_encoded_content" }] } } // Search emails with smart name matching { "tool": "manage_email", "arguments": { "action": "search", "from": "John Smith", // Works with names or emails "after": "2024-01-01", "hasAttachment": true } } // List recent inbox emails { "tool": "manage_email", "arguments": { "action": "list", "folderId": "inbox", "maxResults": 10 } } // Find emails sent to you (TO or CC) { "tool": "manage_email", "arguments": { "action": "search_to_me", "from": "boss@company.com", "isUnread": true } } // Read a specific email { "tool": "manage_email", "arguments": { "action": "read", "messageId": "email_id_here" } } // Mark email as read { "tool": "manage_email", "arguments": { "action": "mark", "messageId": "email_id", "isRead": true } } // Move email to folder { "tool": "manage_email", "arguments": { "action": "move", "messageId": "email_id", "destinationFolderId": "archive" } } // Delete email { "tool": "manage_email", "arguments": { "action": "delete", "messageId": "email_id" } } // Create draft email { "tool": "manage_email", "arguments": { "action": "draft", "draftTo": ["colleague@company.com"], "draftSubject": "Draft: Project Update", "draftBody": "<h2>Status Report</h2><p>Project is on track!</p>", "draftBodyType": "html", "draftCc": ["manager@company.com"], "draftImportance": "normal" } } ``` ### Contact & Authentication ```javascript // List all contacts { "tool": "manage_contacts", "arguments": { "action": "list", "maxResults": 100 } } // Search contacts by name { "tool": "manage_contacts", "arguments": { "action": "search", "query": "John" } } // Get attachment from email { "tool": "get_attachment", "arguments": { "messageId": "email_id", "attachmentId": "attachment_id" } } // List mailbox folders { "tool": "list_folders", "arguments": {} } ``` ### Attachment Management ```javascript // Download a specific attachment { "tool": "get_attachment", "arguments": { "messageId": "email_id", "attachmentId": "attachment_id" } } // Download all attachments from an email { "tool": "get_attachment", "arguments": { "messageId": "email_id" } } ``` ### File Serving The server automatically serves downloaded attachments. By default, files are served at `http://localhost:55000/attachments/`. For production environments, configure the server URL using the `SERVER_URL` environment variable: ```bash # Local development (default) SERVER_URL=http://localhost:55000 ms365-mcp-server # Production environment SERVER_URL=https://your-domain.com ms365-mcp-server ``` Files are: - Stored with unique names to prevent collisions - Available for 24 hours - Served with proper content types - Accessible via the configured server URL ### Cleanup Attachments are automatically cleaned up after 24 hours. You can also manually delete files from the `public/attachments` directory. ### Enhanced Draft Email Operations ```javascript // Create a basic draft { "tool": "manage_email", "arguments": { "action": "draft", "draftTo": ["colleague@company.com"], "draftSubject": "Project Update", "draftBody": "Draft content here...", "draftBodyType": "text" } } // Create a threaded reply draft (automatically appears in email thread) { "tool": "manage_email", "arguments": { "action": "reply_draft", "originalMessageId": "original_email_id", "draftBody": "My reply content...", // Optional comment "replyToAll": false } } // Create a forward draft (automatically includes original content) { "tool": "manage_email", "arguments": { "action": "forward_draft", "originalMessageId": "original_email_id", "draftBody": "Forwarding this for your review..." // Optional comment } } // Update an existing draft { "tool": "manage_email", "arguments": { "action": "update_draft", "draftId": "draft_email_id", "draftSubject": "Updated Subject", "draftBody": "Updated content..." } } // Send a saved draft { "tool": "manage_email", "arguments": { "action": "send_draft", "draftId": "draft_email_id" } } // List all draft emails { "tool": "manage_email", "arguments": { "action": "list_drafts", "maxResults": 20 } } ``` ### Folder Operations ```javascript // List all folders including subfolders with hierarchy { "tool": "list_folders" } // List only child folders of a specific parent folder { "tool": "list_folders", "arguments": { "parentFolderId": "inbox_folder_id" } } // Search for folders by name (case-insensitive) { "tool": "list_folders", "arguments": { "searchName": "projects" } } ``` ## 🎯 Command Line Options ```bash # Authentication ms365-mcp-server --login # Authenticate using device code ms365-mcp-server --logout # Clear stored tokens ms365-mcp-server --verify-login # Check authentication status # Management ms365-mcp-server --setup-auth # Interactive credential setup ms365-mcp-server --reset-auth # Clear all authentication data ms365-mcp-server --debug # Enable detailed logging ``` ## 🛡️ Security & Reliability - **🔄 Proactive Token Refresh** - Prevents authentication interruptions during long conversations - **🔐 Secure Storage** - OS keychain integration with encrypted fallback - **🛡️ OAuth2 Compliance** - Microsoft MSAL library with enterprise-grade security - **🏠 Privacy First** - All processing happens locally, no data sent to third parties - **🔒 Single-User Model** - Simplified security without account enumeration risks ## 🚨 Troubleshooting ### Authentication Issues ```bash # Check current status ms365-mcp-server --verify-login # Reset and re-authenticate ms365-mcp-server --logout ms365-mcp-server --login ``` ### Debug Mode ```bash # Enable detailed logging ms365-mcp-server --debug # Logs location: /tmp/ms365-mcp-server.log ``` ### Common Solutions - **"Credentials not configured"** → Run `--login` - **"Token expired"** → Authentication auto-refreshes, or run `--login` - **Device code timeout** → Codes expire in 15 minutes, try `--login` again ## 🧠 Perfect for AI Assistants - **📞 Natural Language Interface** - Ask SIYA to "check my emails from John today" - **🤖 Smart Email Processing** - Let AI help organize, respond, and analyze emails - **⚡ Optimized for LLMs** - Unified tools reduce context switching and improve performance - **🔄 Reliable Sessions** - Proactive authentication prevents chat interruptions - **📊 Email Analytics** - Extract insights and patterns from your email data ## 🔧 Development ```bash # Local development npm run dev # Build and test npm run build npm test # Version management npm run version-bump [patch|minor|major] ``` ## 📈 What's New in v1.1.0 - **🎯 67% Fewer Tools** - Consolidated 18 tools into 6 unified tools - **🔄 Bulletproof Auth** - Proactive token refresh prevents interruptions - **⚡ Better Performance** - Optimized tool architecture for faster responses - **🧠 AI-Optimized** - Action-based design perfect for LLM interactions - **🛡️ Enhanced Security** - Improved error handling and retry logic ## 📝 License MIT License - see LICENSE file for details. ## 🤝 Contributing Contributions welcome! Please submit issues and pull requests. --- **Built with 🔒 Security and ❤️ for the AI community** *Production-ready Microsoft 365 integration for SIYA Desktop and MCP applications* ## 🔧 Configuration Options ### Server Configuration - `--server-url URL`: Set custom server URL for attachments and authentication (default: http://localhost:55000) - `SERVER_URL`: Environment variable to set server URL ### Authentication Options - `--setup-auth`: Set up MS365 API credentials - `--reset-auth`: Clear stored authentication tokens - `--multi-user`: Enable multi-user authentication mode - `--login`: Login to MS365 - `--logout`: Logout from MS365 - `--verify-login`: Verify login status ### General Options - `--debug`: Enable debug output - `--non-interactive`, `-n`: Run in non-interactive mode (no prompt) - `--help`, `-h`: Show help message ## 📝 Notes - The server URL is used for: 1. Serving email attachments 2. Generating attachment URLs 3. OAuth redirect URIs 4. Authentication callbacks - Attachments are served for 24 hours before automatic cleanup - Default server port is 55000 - For production use, set a custom server URL with HTTPS