Files
Henry Heng 2387a06ce4 Feature/GoogleDocs (#4613)
* add teams, gmail, outlook tools

* update docs link

* update credentials for oauth2

* add jira tool

* add google drive, google calendar, google sheets tools, powerpoint, excel, word doc loader

* update jira logo

* Refactor Gmail and Outlook tools to remove maxOutputLength parameter and enhance request handling. Update response formatting to include parameters in the output. Adjust Google Drive tools to simplify success messages by removing unnecessary parameter details.

* Update pnpm-lock.yaml

* add google docs
2025-06-09 00:30:03 +01:00

823 lines
33 KiB
TypeScript

import { convertMultiOptionsToStringArray, getCredentialData, getCredentialParam, refreshOAuth2Token } from '../../../src/utils'
import { createOutlookTools } from './core'
import type { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
class MicrosoftOutlook_Tools implements INode {
label: string
name: string
version: number
type: string
icon: string
category: string
description: string
baseClasses: string[]
credential: INodeParams
inputs: INodeParams[]
constructor() {
this.label = 'Microsoft Outlook'
this.name = 'microsoftOutlook'
this.version = 1.0
this.type = 'MicrosoftOutlook'
this.icon = 'outlook.svg'
this.category = 'Tools'
this.description = 'Perform Microsoft Outlook operations for calendars, events, and messages'
this.baseClasses = [this.type, 'Tool']
this.credential = {
label: 'Connect Credential',
name: 'credential',
type: 'credential',
credentialNames: ['microsoftOutlookOAuth2']
}
this.inputs = [
{
label: 'Type',
name: 'outlookType',
type: 'options',
options: [
{
label: 'Calendar',
name: 'calendar'
},
{
label: 'Message',
name: 'message'
}
]
},
// Calendar Actions
{
label: 'Calendar Actions',
name: 'calendarActions',
type: 'multiOptions',
options: [
{
label: 'List Calendars',
name: 'listCalendars'
},
{
label: 'Get Calendar',
name: 'getCalendar'
},
{
label: 'Create Calendar',
name: 'createCalendar'
},
{
label: 'Update Calendar',
name: 'updateCalendar'
},
{
label: 'Delete Calendar',
name: 'deleteCalendar'
},
{
label: 'List Events',
name: 'listEvents'
},
{
label: 'Get Event',
name: 'getEvent'
},
{
label: 'Create Event',
name: 'createEvent'
},
{
label: 'Update Event',
name: 'updateEvent'
},
{
label: 'Delete Event',
name: 'deleteEvent'
}
],
show: {
outlookType: ['calendar']
}
},
// Message Actions
{
label: 'Message Actions',
name: 'messageActions',
type: 'multiOptions',
options: [
{
label: 'List Messages',
name: 'listMessages'
},
{
label: 'Get Message',
name: 'getMessage'
},
{
label: 'Create Draft Message',
name: 'createDraftMessage'
},
{
label: 'Send Message',
name: 'sendMessage'
},
{
label: 'Update Message',
name: 'updateMessage'
},
{
label: 'Delete Message',
name: 'deleteMessage'
},
{
label: 'Copy Message',
name: 'copyMessage'
},
{
label: 'Move Message',
name: 'moveMessage'
},
{
label: 'Reply to Message',
name: 'replyMessage'
},
{
label: 'Forward Message',
name: 'forwardMessage'
}
],
show: {
outlookType: ['message']
}
},
// CALENDAR PARAMETERS
// List Calendars Parameters
{
label: 'Max Results [List Calendars]',
name: 'maxResultsListCalendars',
type: 'number',
description: 'Maximum number of calendars to return',
default: 50,
show: {
outlookType: ['calendar'],
calendarActions: ['listCalendars']
},
additionalParams: true,
optional: true
},
// Get Calendar Parameters
{
label: 'Calendar ID [Get Calendar]',
name: 'calendarIdGetCalendar',
type: 'string',
description: 'ID of the calendar to retrieve',
show: {
outlookType: ['calendar'],
calendarActions: ['getCalendar']
},
additionalParams: true,
optional: true
},
// Create Calendar Parameters
{
label: 'Calendar Name [Create Calendar]',
name: 'calendarNameCreateCalendar',
type: 'string',
description: 'Name of the calendar',
placeholder: 'My New Calendar',
show: {
outlookType: ['calendar'],
calendarActions: ['createCalendar']
},
additionalParams: true,
optional: true
},
// Update Calendar Parameters
{
label: 'Calendar ID [Update Calendar]',
name: 'calendarIdUpdateCalendar',
type: 'string',
description: 'ID of the calendar to update',
show: {
outlookType: ['calendar'],
calendarActions: ['updateCalendar']
},
additionalParams: true,
optional: true
},
{
label: 'Calendar Name [Update Calendar]',
name: 'calendarNameUpdateCalendar',
type: 'string',
description: 'New name of the calendar',
show: {
outlookType: ['calendar'],
calendarActions: ['updateCalendar']
},
additionalParams: true,
optional: true
},
// Delete Calendar Parameters
{
label: 'Calendar ID [Delete Calendar]',
name: 'calendarIdDeleteCalendar',
type: 'string',
description: 'ID of the calendar to delete',
show: {
outlookType: ['calendar'],
calendarActions: ['deleteCalendar']
},
additionalParams: true,
optional: true
},
// List Events Parameters
{
label: 'Calendar ID [List Events]',
name: 'calendarIdListEvents',
type: 'string',
description: 'ID of the calendar (leave empty for primary calendar)',
show: {
outlookType: ['calendar'],
calendarActions: ['listEvents']
},
additionalParams: true,
optional: true
},
{
label: 'Max Results [List Events]',
name: 'maxResultsListEvents',
type: 'number',
description: 'Maximum number of events to return',
default: 50,
show: {
outlookType: ['calendar'],
calendarActions: ['listEvents']
},
additionalParams: true,
optional: true
},
{
label: 'Start Date Time [List Events]',
name: 'startDateTimeListEvents',
type: 'string',
description: 'Start date time filter in ISO format',
placeholder: '2024-01-01T00:00:00Z',
show: {
outlookType: ['calendar'],
calendarActions: ['listEvents']
},
additionalParams: true,
optional: true
},
{
label: 'End Date Time [List Events]',
name: 'endDateTimeListEvents',
type: 'string',
description: 'End date time filter in ISO format',
placeholder: '2024-12-31T23:59:59Z',
show: {
outlookType: ['calendar'],
calendarActions: ['listEvents']
},
additionalParams: true,
optional: true
},
// Get Event Parameters
{
label: 'Event ID [Get Event]',
name: 'eventIdGetEvent',
type: 'string',
description: 'ID of the event to retrieve',
show: {
outlookType: ['calendar'],
calendarActions: ['getEvent']
},
additionalParams: true,
optional: true
},
// Create Event Parameters
{
label: 'Subject [Create Event]',
name: 'subjectCreateEvent',
type: 'string',
description: 'Subject/title of the event',
placeholder: 'Meeting Title',
show: {
outlookType: ['calendar'],
calendarActions: ['createEvent']
},
additionalParams: true,
optional: true
},
{
label: 'Body [Create Event]',
name: 'bodyCreateEvent',
type: 'string',
description: 'Body/description of the event',
placeholder: 'Meeting description',
rows: 3,
show: {
outlookType: ['calendar'],
calendarActions: ['createEvent']
},
additionalParams: true,
optional: true
},
{
label: 'Start Date Time [Create Event]',
name: 'startDateTimeCreateEvent',
type: 'string',
description: 'Start date and time in ISO format',
placeholder: '2024-01-15T10:00:00',
show: {
outlookType: ['calendar'],
calendarActions: ['createEvent']
},
additionalParams: true,
optional: true
},
{
label: 'End Date Time [Create Event]',
name: 'endDateTimeCreateEvent',
type: 'string',
description: 'End date and time in ISO format',
placeholder: '2024-01-15T11:00:00',
show: {
outlookType: ['calendar'],
calendarActions: ['createEvent']
},
additionalParams: true,
optional: true
},
{
label: 'Time Zone [Create Event]',
name: 'timeZoneCreateEvent',
type: 'string',
description: 'Time zone for the event',
placeholder: 'UTC',
default: 'UTC',
show: {
outlookType: ['calendar'],
calendarActions: ['createEvent']
},
additionalParams: true,
optional: true
},
{
label: 'Location [Create Event]',
name: 'locationCreateEvent',
type: 'string',
description: 'Location of the event',
placeholder: 'Conference Room A',
show: {
outlookType: ['calendar'],
calendarActions: ['createEvent']
},
additionalParams: true,
optional: true
},
{
label: 'Attendees [Create Event]',
name: 'attendeesCreateEvent',
type: 'string',
description: 'Comma-separated list of attendee email addresses',
placeholder: 'user1@example.com,user2@example.com',
show: {
outlookType: ['calendar'],
calendarActions: ['createEvent']
},
additionalParams: true,
optional: true
},
// Update Event Parameters
{
label: 'Event ID [Update Event]',
name: 'eventIdUpdateEvent',
type: 'string',
description: 'ID of the event to update',
show: {
outlookType: ['calendar'],
calendarActions: ['updateEvent']
},
additionalParams: true,
optional: true
},
{
label: 'Subject [Update Event]',
name: 'subjectUpdateEvent',
type: 'string',
description: 'New subject/title of the event',
show: {
outlookType: ['calendar'],
calendarActions: ['updateEvent']
},
additionalParams: true,
optional: true
},
// Delete Event Parameters
{
label: 'Event ID [Delete Event]',
name: 'eventIdDeleteEvent',
type: 'string',
description: 'ID of the event to delete',
show: {
outlookType: ['calendar'],
calendarActions: ['deleteEvent']
},
additionalParams: true,
optional: true
},
// MESSAGE PARAMETERS
// List Messages Parameters
{
label: 'Max Results [List Messages]',
name: 'maxResultsListMessages',
type: 'number',
description: 'Maximum number of messages to return',
default: 50,
show: {
outlookType: ['message'],
messageActions: ['listMessages']
},
additionalParams: true,
optional: true
},
{
label: 'Filter [List Messages]',
name: 'filterListMessages',
type: 'string',
description: 'Filter query (e.g., "isRead eq false")',
show: {
outlookType: ['message'],
messageActions: ['listMessages']
},
additionalParams: true,
optional: true
},
// Get Message Parameters
{
label: 'Message ID [Get Message]',
name: 'messageIdGetMessage',
type: 'string',
description: 'ID of the message to retrieve',
show: {
outlookType: ['message'],
messageActions: ['getMessage']
},
additionalParams: true,
optional: true
},
// Create Draft Message Parameters
{
label: 'To [Create Draft Message]',
name: 'toCreateDraftMessage',
type: 'string',
description: 'Recipient email address(es), comma-separated',
placeholder: 'user@example.com',
show: {
outlookType: ['message'],
messageActions: ['createDraftMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Subject [Create Draft Message]',
name: 'subjectCreateDraftMessage',
type: 'string',
description: 'Subject of the message',
placeholder: 'Email Subject',
show: {
outlookType: ['message'],
messageActions: ['createDraftMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Body [Create Draft Message]',
name: 'bodyCreateDraftMessage',
type: 'string',
description: 'Body content of the message',
placeholder: 'Email body content',
rows: 4,
show: {
outlookType: ['message'],
messageActions: ['createDraftMessage']
},
additionalParams: true,
optional: true
},
{
label: 'CC [Create Draft Message]',
name: 'ccCreateDraftMessage',
type: 'string',
description: 'CC email address(es), comma-separated',
placeholder: 'cc@example.com',
show: {
outlookType: ['message'],
messageActions: ['createDraftMessage']
},
additionalParams: true,
optional: true
},
{
label: 'BCC [Create Draft Message]',
name: 'bccCreateDraftMessage',
type: 'string',
description: 'BCC email address(es), comma-separated',
placeholder: 'bcc@example.com',
show: {
outlookType: ['message'],
messageActions: ['createDraftMessage']
},
additionalParams: true,
optional: true
},
// Send Message Parameters
{
label: 'To [Send Message]',
name: 'toSendMessage',
type: 'string',
description: 'Recipient email address(es), comma-separated',
placeholder: 'user@example.com',
show: {
outlookType: ['message'],
messageActions: ['sendMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Subject [Send Message]',
name: 'subjectSendMessage',
type: 'string',
description: 'Subject of the message',
placeholder: 'Email Subject',
show: {
outlookType: ['message'],
messageActions: ['sendMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Body [Send Message]',
name: 'bodySendMessage',
type: 'string',
description: 'Body content of the message',
placeholder: 'Email body content',
rows: 4,
show: {
outlookType: ['message'],
messageActions: ['sendMessage']
},
additionalParams: true,
optional: true
},
// Update Message Parameters
{
label: 'Message ID [Update Message]',
name: 'messageIdUpdateMessage',
type: 'string',
description: 'ID of the message to update',
show: {
outlookType: ['message'],
messageActions: ['updateMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Is Read [Update Message]',
name: 'isReadUpdateMessage',
type: 'boolean',
description: 'Mark message as read/unread',
show: {
outlookType: ['message'],
messageActions: ['updateMessage']
},
additionalParams: true,
optional: true
},
// Delete Message Parameters
{
label: 'Message ID [Delete Message]',
name: 'messageIdDeleteMessage',
type: 'string',
description: 'ID of the message to delete',
show: {
outlookType: ['message'],
messageActions: ['deleteMessage']
},
additionalParams: true,
optional: true
},
// Copy Message Parameters
{
label: 'Message ID [Copy Message]',
name: 'messageIdCopyMessage',
type: 'string',
description: 'ID of the message to copy',
show: {
outlookType: ['message'],
messageActions: ['copyMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Destination Folder ID [Copy Message]',
name: 'destinationFolderIdCopyMessage',
type: 'string',
description: 'ID of the destination folder',
show: {
outlookType: ['message'],
messageActions: ['copyMessage']
},
additionalParams: true,
optional: true
},
// Move Message Parameters
{
label: 'Message ID [Move Message]',
name: 'messageIdMoveMessage',
type: 'string',
description: 'ID of the message to move',
show: {
outlookType: ['message'],
messageActions: ['moveMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Destination Folder ID [Move Message]',
name: 'destinationFolderIdMoveMessage',
type: 'string',
description: 'ID of the destination folder',
show: {
outlookType: ['message'],
messageActions: ['moveMessage']
},
additionalParams: true,
optional: true
},
// Reply Message Parameters
{
label: 'Message ID [Reply Message]',
name: 'messageIdReplyMessage',
type: 'string',
description: 'ID of the message to reply to',
show: {
outlookType: ['message'],
messageActions: ['replyMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Reply Body [Reply Message]',
name: 'replyBodyReplyMessage',
type: 'string',
description: 'Reply message body',
rows: 4,
show: {
outlookType: ['message'],
messageActions: ['replyMessage']
},
additionalParams: true,
optional: true
},
// Forward Message Parameters
{
label: 'Message ID [Forward Message]',
name: 'messageIdForwardMessage',
type: 'string',
description: 'ID of the message to forward',
show: {
outlookType: ['message'],
messageActions: ['forwardMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Forward To [Forward Message]',
name: 'forwardToForwardMessage',
type: 'string',
description: 'Email address(es) to forward to, comma-separated',
show: {
outlookType: ['message'],
messageActions: ['forwardMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Forward Comment [Forward Message]',
name: 'forwardCommentForwardMessage',
type: 'string',
description: 'Additional comment to include with forward',
rows: 2,
show: {
outlookType: ['message'],
messageActions: ['forwardMessage']
},
additionalParams: true,
optional: true
}
]
}
async init(nodeData: INodeData, _: string, options: ICommonObject): Promise<any> {
const outlookType = nodeData.inputs?.outlookType as string
const calendarActions = nodeData.inputs?.calendarActions as string
const messageActions = nodeData.inputs?.messageActions as string
let credentialData = await getCredentialData(nodeData.credential ?? '', options)
credentialData = await refreshOAuth2Token(nodeData.credential ?? '', credentialData, options)
const accessToken = getCredentialParam('access_token', credentialData, nodeData)
if (!accessToken) {
throw new Error('No access token found in credential')
}
let actions: string[] = []
if (outlookType === 'calendar') {
actions = convertMultiOptionsToStringArray(calendarActions)
} else if (outlookType === 'message') {
actions = convertMultiOptionsToStringArray(messageActions)
}
const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
const outlookTools = createOutlookTools({
accessToken,
actions,
defaultParams
})
return outlookTools
}
transformNodeInputsToToolArgs(nodeData: INodeData): Record<string, any> {
// Collect default parameters from inputs
const defaultParams: Record<string, any> = {}
// Calendar parameters
if (nodeData.inputs?.maxResultsListCalendars) defaultParams.maxResultsListCalendars = nodeData.inputs.maxResultsListCalendars
if (nodeData.inputs?.calendarIdGetCalendar) defaultParams.calendarIdGetCalendar = nodeData.inputs.calendarIdGetCalendar
if (nodeData.inputs?.calendarNameCreateCalendar)
defaultParams.calendarNameCreateCalendar = nodeData.inputs.calendarNameCreateCalendar
if (nodeData.inputs?.calendarIdUpdateCalendar) defaultParams.calendarIdUpdateCalendar = nodeData.inputs.calendarIdUpdateCalendar
if (nodeData.inputs?.calendarNameUpdateCalendar)
defaultParams.calendarNameUpdateCalendar = nodeData.inputs.calendarNameUpdateCalendar
if (nodeData.inputs?.calendarIdDeleteCalendar) defaultParams.calendarIdDeleteCalendar = nodeData.inputs.calendarIdDeleteCalendar
if (nodeData.inputs?.calendarIdListEvents) defaultParams.calendarIdListEvents = nodeData.inputs.calendarIdListEvents
if (nodeData.inputs?.maxResultsListEvents) defaultParams.maxResultsListEvents = nodeData.inputs.maxResultsListEvents
if (nodeData.inputs?.startDateTimeListEvents) defaultParams.startDateTimeListEvents = nodeData.inputs.startDateTimeListEvents
if (nodeData.inputs?.endDateTimeListEvents) defaultParams.endDateTimeListEvents = nodeData.inputs.endDateTimeListEvents
if (nodeData.inputs?.eventIdGetEvent) defaultParams.eventIdGetEvent = nodeData.inputs.eventIdGetEvent
if (nodeData.inputs?.subjectCreateEvent) defaultParams.subjectCreateEvent = nodeData.inputs.subjectCreateEvent
if (nodeData.inputs?.bodyCreateEvent) defaultParams.bodyCreateEvent = nodeData.inputs.bodyCreateEvent
if (nodeData.inputs?.startDateTimeCreateEvent) defaultParams.startDateTimeCreateEvent = nodeData.inputs.startDateTimeCreateEvent
if (nodeData.inputs?.endDateTimeCreateEvent) defaultParams.endDateTimeCreateEvent = nodeData.inputs.endDateTimeCreateEvent
if (nodeData.inputs?.timeZoneCreateEvent) defaultParams.timeZoneCreateEvent = nodeData.inputs.timeZoneCreateEvent
if (nodeData.inputs?.locationCreateEvent) defaultParams.locationCreateEvent = nodeData.inputs.locationCreateEvent
if (nodeData.inputs?.attendeesCreateEvent) defaultParams.attendeesCreateEvent = nodeData.inputs.attendeesCreateEvent
if (nodeData.inputs?.eventIdUpdateEvent) defaultParams.eventIdUpdateEvent = nodeData.inputs.eventIdUpdateEvent
if (nodeData.inputs?.subjectUpdateEvent) defaultParams.subjectUpdateEvent = nodeData.inputs.subjectUpdateEvent
if (nodeData.inputs?.eventIdDeleteEvent) defaultParams.eventIdDeleteEvent = nodeData.inputs.eventIdDeleteEvent
// Message parameters
if (nodeData.inputs?.maxResultsListMessages) defaultParams.maxResultsListMessages = nodeData.inputs.maxResultsListMessages
if (nodeData.inputs?.filterListMessages) defaultParams.filterListMessages = nodeData.inputs.filterListMessages
if (nodeData.inputs?.messageIdGetMessage) defaultParams.messageIdGetMessage = nodeData.inputs.messageIdGetMessage
if (nodeData.inputs?.toCreateDraftMessage) defaultParams.toCreateDraftMessage = nodeData.inputs.toCreateDraftMessage
if (nodeData.inputs?.subjectCreateDraftMessage) defaultParams.subjectCreateDraftMessage = nodeData.inputs.subjectCreateDraftMessage
if (nodeData.inputs?.bodyCreateDraftMessage) defaultParams.bodyCreateDraftMessage = nodeData.inputs.bodyCreateDraftMessage
if (nodeData.inputs?.ccCreateDraftMessage) defaultParams.ccCreateDraftMessage = nodeData.inputs.ccCreateDraftMessage
if (nodeData.inputs?.bccCreateDraftMessage) defaultParams.bccCreateDraftMessage = nodeData.inputs.bccCreateDraftMessage
if (nodeData.inputs?.toSendMessage) defaultParams.toSendMessage = nodeData.inputs.toSendMessage
if (nodeData.inputs?.subjectSendMessage) defaultParams.subjectSendMessage = nodeData.inputs.subjectSendMessage
if (nodeData.inputs?.bodySendMessage) defaultParams.bodySendMessage = nodeData.inputs.bodySendMessage
if (nodeData.inputs?.messageIdUpdateMessage) defaultParams.messageIdUpdateMessage = nodeData.inputs.messageIdUpdateMessage
if (nodeData.inputs?.isReadUpdateMessage !== undefined) defaultParams.isReadUpdateMessage = nodeData.inputs.isReadUpdateMessage
if (nodeData.inputs?.messageIdDeleteMessage) defaultParams.messageIdDeleteMessage = nodeData.inputs.messageIdDeleteMessage
if (nodeData.inputs?.messageIdCopyMessage) defaultParams.messageIdCopyMessage = nodeData.inputs.messageIdCopyMessage
if (nodeData.inputs?.destinationFolderIdCopyMessage)
defaultParams.destinationFolderIdCopyMessage = nodeData.inputs.destinationFolderIdCopyMessage
if (nodeData.inputs?.messageIdMoveMessage) defaultParams.messageIdMoveMessage = nodeData.inputs.messageIdMoveMessage
if (nodeData.inputs?.destinationFolderIdMoveMessage)
defaultParams.destinationFolderIdMoveMessage = nodeData.inputs.destinationFolderIdMoveMessage
if (nodeData.inputs?.messageIdReplyMessage) defaultParams.messageIdReplyMessage = nodeData.inputs.messageIdReplyMessage
if (nodeData.inputs?.replyBodyReplyMessage) defaultParams.replyBodyReplyMessage = nodeData.inputs.replyBodyReplyMessage
if (nodeData.inputs?.messageIdForwardMessage) defaultParams.messageIdForwardMessage = nodeData.inputs.messageIdForwardMessage
if (nodeData.inputs?.forwardToForwardMessage) defaultParams.forwardToForwardMessage = nodeData.inputs.forwardToForwardMessage
if (nodeData.inputs?.forwardCommentForwardMessage)
defaultParams.forwardCommentForwardMessage = nodeData.inputs.forwardCommentForwardMessage
return defaultParams
}
}
module.exports = { nodeClass: MicrosoftOutlook_Tools }