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
JavaScript
/**
* 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;