Skip to main content
Glama

Enhanced Outlook MCP Server

by jibberish69
move.js7.86 kB
const config = require('../config'); const logger = require('../utils/logger'); const { GraphApiClient } = require('../utils/graph-api'); /** * Move emails to a folder * @param {Object} params - Tool parameters * @returns {Promise<Object>} - Move result */ async function moveEmailsHandler(params = {}) { const userId = params.userId || 'default'; const emailIds = params.emailIds; const destinationFolderId = params.destinationFolderId; if (!emailIds || !Array.isArray(emailIds) || emailIds.length === 0) { return { status: 'error', message: 'At least one email ID is required' }; } if (!destinationFolderId) { return { status: 'error', message: 'Destination folder ID is required' }; } try { logger.info(`Moving ${emailIds.length} emails to folder ${destinationFolderId} for user ${userId}`); const graphClient = new GraphApiClient(userId); // Track successful and failed moves const results = { success: [], failed: [] }; // Move each email (could be batched for better performance) for (const emailId of emailIds) { try { await graphClient.post(`/me/messages/${emailId}/move`, { destinationId: destinationFolderId }); results.success.push(emailId); } catch (error) { logger.error(`Error moving email ${emailId}: ${error.message}`); results.failed.push({ id: emailId, error: error.message }); } } return { status: results.failed.length === 0 ? 'success' : 'partial', message: `Moved ${results.success.length} of ${emailIds.length} emails to folder`, destinationFolderId, results }; } catch (error) { logger.error(`Error moving emails: ${error.message}`); return { status: 'error', message: `Failed to move emails: ${error.message}` }; } } /** * Move a folder to another parent folder * @param {Object} params - Tool parameters * @returns {Promise<Object>} - Move result */ async function moveFolderHandler(params = {}) { const userId = params.userId || 'default'; const folderId = params.folderId; const destinationFolderId = params.destinationFolderId; if (!folderId) { return { status: 'error', message: 'Folder ID is required' }; } if (!destinationFolderId) { return { status: 'error', message: 'Destination parent folder ID is required' }; } // Check that we're not trying to move to itself if (folderId === destinationFolderId) { return { status: 'error', message: 'Cannot move a folder to itself' }; } try { logger.info(`Moving folder ${folderId} to parent folder ${destinationFolderId} for user ${userId}`); const graphClient = new GraphApiClient(userId); // Get the folder to preserve its name const folder = await graphClient.get(`/me/mailFolders/${folderId}`, { $select: 'displayName' }); if (!folder) { return { status: 'error', message: 'Source folder not found' }; } // Verify destination folder exists const destinationFolder = await graphClient.get(`/me/mailFolders/${destinationFolderId}`, { $select: 'id' }); if (!destinationFolder) { return { status: 'error', message: 'Destination folder not found' }; } // Create a new folder with the same name under the destination const newFolder = await graphClient.post(`/me/mailFolders/${destinationFolderId}/childFolders`, { displayName: folder.displayName }); // Move all messages from the old folder to the new one const messages = await graphClient.get(`/me/mailFolders/${folderId}/messages`, { $select: 'id', $top: 1000 // Note: might need pagination for large folders }); let movedMessageCount = 0; if (messages && messages.value && messages.value.length > 0) { for (const message of messages.value) { await graphClient.post(`/me/messages/${message.id}/move`, { destinationId: newFolder.id }); movedMessageCount++; } } // Move all child folders recursively // This would be implemented as a recursive function for a complete solution // For brevity, we'll just handle the first level of child folders const childFolders = await graphClient.get(`/me/mailFolders/${folderId}/childFolders`, { $select: 'id,displayName' }); let movedChildFolderCount = 0; if (childFolders && childFolders.value && childFolders.value.length > 0) { for (const childFolder of childFolders.value) { const newChildFolder = await graphClient.post(`/me/mailFolders/${newFolder.id}/childFolders`, { displayName: childFolder.displayName }); // Move messages from the child folder const childMessages = await graphClient.get(`/me/mailFolders/${childFolder.id}/messages`, { $select: 'id', $top: 1000 }); if (childMessages && childMessages.value && childMessages.value.length > 0) { for (const message of childMessages.value) { await graphClient.post(`/me/messages/${message.id}/move`, { destinationId: newChildFolder.id }); } } movedChildFolderCount++; } } // Delete the original folder after moving everything await graphClient.delete(`/me/mailFolders/${folderId}`); return { status: 'success', message: 'Folder moved successfully', newFolderId: newFolder.id, movedMessageCount, movedChildFolderCount }; } catch (error) { logger.error(`Error moving folder: ${error.message}`); return { status: 'error', message: `Failed to move folder: ${error.message}` }; } } /** * Copy emails to a folder * @param {Object} params - Tool parameters * @returns {Promise<Object>} - Copy result */ async function copyEmailsHandler(params = {}) { const userId = params.userId || 'default'; const emailIds = params.emailIds; const destinationFolderId = params.destinationFolderId; if (!emailIds || !Array.isArray(emailIds) || emailIds.length === 0) { return { status: 'error', message: 'At least one email ID is required' }; } if (!destinationFolderId) { return { status: 'error', message: 'Destination folder ID is required' }; } try { logger.info(`Copying ${emailIds.length} emails to folder ${destinationFolderId} for user ${userId}`); const graphClient = new GraphApiClient(userId); // Track successful and failed copies const results = { success: [], failed: [] }; // Copy each email for (const emailId of emailIds) { try { await graphClient.post(`/me/messages/${emailId}/copy`, { destinationId: destinationFolderId }); results.success.push(emailId); } catch (error) { logger.error(`Error copying email ${emailId}: ${error.message}`); results.failed.push({ id: emailId, error: error.message }); } } return { status: results.failed.length === 0 ? 'success' : 'partial', message: `Copied ${results.success.length} of ${emailIds.length} emails to folder`, destinationFolderId, results }; } catch (error) { logger.error(`Error copying emails: ${error.message}`); return { status: 'error', message: `Failed to copy emails: ${error.message}` }; } } module.exports = { moveEmailsHandler, moveFolderHandler, copyEmailsHandler };

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jibberish69/enhanced-outlook-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server