UNPKG

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

139 lines (121 loc) 3.7 kB
/** * Create contact functionality */ const { callGraphAPI } = require('../utils/graph-api'); const { ensureAuthenticated } = require('../auth'); /** * Create contact handler * @param {object} args - Tool arguments * @returns {object} - MCP response */ async function handleCreateContact(args) { try { const { displayName, givenName = '', surname = '', middleName = '', nickname = '', emailAddresses = [], businessPhones = [], homePhones = [], mobilePhone = '', companyName = '', jobTitle = '', department = '', officeLocation = '', businessAddress = {}, homeAddress = {}, personalNotes = '', birthday = '', categories = [], folder = 'contacts' } = args; if (!displayName) { return { error: { code: -32602, message: "displayName is required" } }; } // Ensure user is authenticated const accessToken = await ensureAuthenticated(); // Build the contact object const contactData = { displayName, givenName, surname, middleName, nickname, companyName, jobTitle, department, officeLocation, personalNotes, categories: Array.isArray(categories) ? categories : [] }; // Add email addresses if (Array.isArray(emailAddresses) && emailAddresses.length > 0) { contactData.emailAddresses = emailAddresses.map(email => { if (typeof email === 'string') { return { address: email, name: displayName }; } return email; }); } // Add phone numbers if (Array.isArray(businessPhones) && businessPhones.length > 0) { contactData.businessPhones = businessPhones; } if (Array.isArray(homePhones) && homePhones.length > 0) { contactData.homePhones = homePhones; } if (mobilePhone) { contactData.mobilePhone = mobilePhone; } // Add addresses if (businessAddress && Object.keys(businessAddress).length > 0) { contactData.businessAddress = businessAddress; } if (homeAddress && Object.keys(homeAddress).length > 0) { contactData.homeAddress = homeAddress; } // Add birthday if (birthday) { contactData.birthday = birthday; } // Build the API path let apiPath = 'me/contacts'; if (folder && folder !== 'contacts') { apiPath = `me/contactFolders/${folder}/contacts`; } console.error(`Creating contact: ${displayName}`); // Make API call const newContact = await callGraphAPI(accessToken, 'POST', apiPath, contactData); return { content: [ { type: "text", text: `✅ Contact created successfully! **Name:** ${newContact.displayName} **Contact ID:** ${newContact.id} **Company:** ${newContact.companyName || 'Not provided'} **Job Title:** ${newContact.jobTitle || 'Not provided'} **Email:** ${newContact.emailAddresses && newContact.emailAddresses.length > 0 ? newContact.emailAddresses[0].address : 'Not provided'} **Phone:** ${newContact.businessPhones && newContact.businessPhones.length > 0 ? newContact.businessPhones[0] : newContact.mobilePhone || 'Not provided'} The contact has been saved to your ${folder === 'contacts' ? 'default contacts folder' : folder + ' folder'}.` } ] }; } catch (error) { console.error('Error in handleCreateContact:', error); return { error: { code: -32603, message: `Failed to create contact: ${error.message}` } }; } } module.exports = handleCreateContact;