MCP server providing Microsoft Outlook integration via Graph API: - Email: list, search, read, send, thread reconstruction - Calendar: list, create, decline, cancel, delete events - Folders: list, create, move emails - Inbox rules: list, create, reorder - MSAL device code flow auth with persistent token cache - Test mode with mock data - Comprehensive README with setup, config, and tool reference 20 MCP tools across 5 modules. Node.js >= 14. MIT license.
124 lines
3.3 KiB
JavaScript
124 lines
3.3 KiB
JavaScript
/**
|
|
* Create folder functionality
|
|
*/
|
|
const { callGraphAPI } = require('../utils/graph-api');
|
|
const { ensureAuthenticated } = 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();
|
|
|
|
// Create folder with appropriate parent
|
|
const result = await createMailFolder(accessToken, folderName, parentFolder);
|
|
|
|
return {
|
|
content: [{
|
|
type: "text",
|
|
text: result.message
|
|
}]
|
|
};
|
|
} catch (error) {
|
|
if (error.message === 'Authentication required') {
|
|
return {
|
|
content: [{
|
|
type: "text",
|
|
text: "Authentication required. Please use the 'authenticate' tool first."
|
|
}]
|
|
};
|
|
}
|
|
|
|
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;
|