outlook-mcp
Version:
Comprehensive MCP server for Claude to access Microsoft Outlook and Teams via Microsoft Graph API - including Email, Calendar, Contacts, Tasks, Teams, Chats, and Online Meetings
121 lines (106 loc) • 3.23 kB
JavaScript
/**
* Create folder functionality
*/
const { callGraphAPI } = require('../utils/graph-api');
const { ensureAuthenticated, createAuthRequiredResponse } = require('../auth');
const { getFolderIdByName } = require('../email/folder-utils');
/**
* Create folder handler
* @param {object} args - Tool arguments
* @returns {object} - MCP response
*/
async function handleCreateFolder(args) {
const folderName = args.name;
const parentFolder = args.parentFolder || '';
if (!folderName) {
return {
content: [{
type: "text",
text: "Folder name is required."
}]
};
}
try {
// Get access token
const accessToken = await ensureAuthenticated();
// Check if authentication is required
if (!accessToken) {
return await createAuthRequiredResponse('create-folder');
}
// Create folder with appropriate parent
const result = await createMailFolder(accessToken, folderName, parentFolder);
return {
content: [{
type: "text",
text: result.message
}]
};
} catch (error) {
return {
content: [{
type: "text",
text: `Error creating folder: ${error.message}`
}]
};
}
}
/**
* Create a new mail folder
* @param {string} accessToken - Access token
* @param {string} folderName - Name of the folder to create
* @param {string} parentFolderName - Name of the parent folder (optional)
* @returns {Promise<object>} - Result object with status and message
*/
async function createMailFolder(accessToken, folderName, parentFolderName) {
try {
// Check if a folder with this name already exists
const existingFolder = await getFolderIdByName(accessToken, folderName);
if (existingFolder) {
return {
success: false,
message: `A folder named "${folderName}" already exists.`
};
}
// If parent folder specified, find its ID
let endpoint = 'me/mailFolders';
if (parentFolderName) {
const parentId = await getFolderIdByName(accessToken, parentFolderName);
if (!parentId) {
return {
success: false,
message: `Parent folder "${parentFolderName}" not found. Please specify a valid parent folder or leave it blank to create at the root level.`
};
}
endpoint = `me/mailFolders/${parentId}/childFolders`;
}
// Create the folder
const folderData = {
displayName: folderName
};
const response = await callGraphAPI(
accessToken,
'POST',
endpoint,
folderData
);
if (response && response.id) {
const locationInfo = parentFolderName
? `inside "${parentFolderName}"`
: "at the root level";
return {
success: true,
message: `Successfully created folder "${folderName}" ${locationInfo}.`,
folderId: response.id
};
} else {
return {
success: false,
message: "Failed to create folder. The server didn't return a folder ID."
};
}
} catch (error) {
console.error(`Error creating folder "${folderName}": ${error.message}`);
throw error;
}
}
module.exports = handleCreateFolder;