UNPKG

n8n-nodes-genesys-cloud-mcp-plus

Version:

n8n community node for Genesys Cloud MCP Plus - 15 comprehensive tools for contact center analytics, real-time monitoring, and wrap-up code analysis

544 lines (543 loc) 26.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GenesysCloudMcpPlus = void 0; const GenesysCloudMcpPlusService_1 = require("./GenesysCloudMcpPlusService"); class GenesysCloudMcpPlus { constructor() { this.description = { displayName: 'Genesys Cloud MCP Plus', name: 'genesysCloudMcpPlus', icon: 'file:genesys-cloud-mcp-plus.png', group: ['transform'], version: 1, description: 'Genesys Cloud MCP Plus - 15 comprehensive tools for contact center analytics', defaults: { name: 'Genesys Cloud MCP Plus', }, inputs: ['main'], outputs: ['main'], credentials: [ { name: 'genesysCloudMcpPlusApi', required: true, }, ], properties: [ { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, options: [ { name: 'Search Queues', value: 'searchQueues', description: 'Search for routing queues by name', action: 'Search for routing queues by name', }, { name: 'Query Queue Volumes', value: 'queryQueueVolumes', description: 'Compare conversation volumes across queues', action: 'Compare conversation volumes across queues', }, { name: 'Sample Conversations by Queue', value: 'sampleConversationsByQueue', description: 'Get conversation samples from specific queues', action: 'Get conversation samples from specific queues', }, { name: 'Voice Call Quality', value: 'voiceCallQuality', description: 'Analyze voice call quality metrics', action: 'Analyze voice call quality metrics', }, { name: 'Conversation Sentiment', value: 'conversationSentiment', description: 'Analyze sentiment across conversations', action: 'Analyze sentiment across conversations', }, { name: 'Conversation Topics', value: 'conversationTopics', description: 'Extract conversation topics and intents', action: 'Extract conversation topics and intents', }, { name: 'Conversation Transcript', value: 'conversationTranscript', description: 'Get full conversation transcripts', action: 'Get full conversation transcripts', }, { name: 'Enhanced Conversation Search', value: 'enhancedConversationSearch', description: 'Multi-media conversation search', action: 'Multi-media conversation search', }, { name: 'Agent Media Type Performance', value: 'agentMediaTypePerformance', description: 'Analyze agent performance by media type', action: 'Analyze agent performance by media type', }, { name: 'Real Time Queue Status', value: 'realTimeQueueStatus', description: 'Monitor live queue metrics', action: 'Monitor live queue metrics', }, { name: 'Real Time Agent Presence', value: 'realTimeAgentPresence', description: 'Track agent availability and status', action: 'Track agent availability and status', }, { name: 'Live Conversation Monitoring', value: 'liveConversationMonitoring', description: 'Monitor active customer interactions', action: 'Monitor active customer interactions', }, { name: 'Wrap Up Code Analytics', value: 'wrapUpCodeAnalytics', description: 'Analyze interaction types and volumes', action: 'Analyze interaction types and volumes', }, { name: 'Agent Status Monitoring', value: 'agentStatusMonitoring', description: 'Monitor agent directory and status', action: 'Monitor agent directory and status', }, { name: 'Search Voice Conversations', value: 'searchVoiceConversations', description: 'Search specifically for voice conversations', action: 'Search specifically for voice conversations', }, ], default: 'searchQueues', }, // Search Queues Parameters { displayName: 'Queue Name', name: 'queueName', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['searchQueues'], }, }, description: 'Queue name or pattern (supports wildcards like *Support*)', }, { displayName: 'Page Size', name: 'pageSize', type: 'number', default: 100, displayOptions: { show: { operation: ['searchQueues'], }, }, description: 'Number of results per page (max 500)', }, // Query Queue Volumes Parameters { displayName: 'Queue IDs', name: 'queueIds', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['queryQueueVolumes'], }, }, description: 'Comma-separated list of queue IDs (max 300)', }, { displayName: 'Start Date', name: 'startDate', type: 'dateTime', default: '', required: true, displayOptions: { show: { operation: ['queryQueueVolumes', 'sampleConversationsByQueue', 'enhancedConversationSearch', 'agentMediaTypePerformance', 'wrapUpCodeAnalytics', 'searchVoiceConversations'], }, }, description: 'Start date for the query period', }, { displayName: 'End Date', name: 'endDate', type: 'dateTime', default: '', required: true, displayOptions: { show: { operation: ['queryQueueVolumes', 'sampleConversationsByQueue', 'enhancedConversationSearch', 'agentMediaTypePerformance', 'wrapUpCodeAnalytics', 'searchVoiceConversations'], }, }, description: 'End date for the query period', }, // Sample Conversations by Queue Parameters { displayName: 'Queue ID', name: 'singleQueueId', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['sampleConversationsByQueue'], }, }, description: 'Single queue ID to get conversation samples from', }, // Voice Call Quality Parameters { displayName: 'Conversation IDs', name: 'conversationIds', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['voiceCallQuality', 'conversationSentiment'], }, }, description: 'Comma-separated list of conversation IDs (max 100)', }, // Conversation Topics Parameters { displayName: 'Conversation ID', name: 'singleConversationId', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['conversationTopics', 'conversationTranscript'], }, }, description: 'Single conversation ID', }, // Enhanced Conversation Search Parameters { displayName: 'Phone Number', name: 'phoneNumber', type: 'string', default: '', displayOptions: { show: { operation: ['enhancedConversationSearch', 'searchVoiceConversations'], }, }, description: 'Phone number to filter conversations (optional)', }, { displayName: 'Media Types', name: 'mediaTypes', type: 'multiOptions', options: [ { name: 'Voice', value: 'voice' }, { name: 'Chat', value: 'chat' }, { name: 'Email', value: 'email' }, { name: 'SMS', value: 'sms' }, { name: 'Messaging', value: 'messaging' }, { name: 'Callback', value: 'callback' }, { name: 'Social', value: 'social' }, { name: 'Video', value: 'video' }, ], default: [], displayOptions: { show: { operation: ['enhancedConversationSearch'], }, }, description: 'Media types to filter by (optional)', }, // Real Time Queue Status Parameters { displayName: 'Queue IDs for Real Time', name: 'realTimeQueueIds', type: 'string', default: '', required: true, displayOptions: { show: { operation: ['realTimeQueueStatus'], }, }, description: 'Comma-separated list of queue IDs to monitor (max 100)', }, // Real Time Agent Presence Parameters { displayName: 'Agent IDs', name: 'agentIds', type: 'string', default: '', displayOptions: { show: { operation: ['realTimeAgentPresence', 'agentStatusMonitoring'], }, }, description: 'Comma-separated list of agent IDs (optional, max 100)', }, // Live Conversation Monitoring Parameters { displayName: 'Queue IDs for Live Monitoring', name: 'liveQueueIds', type: 'string', default: '', displayOptions: { show: { operation: ['liveConversationMonitoring'], }, }, description: 'Comma-separated list of queue IDs to monitor (max 50)', }, { displayName: 'Max Results', name: 'maxResults', type: 'number', default: 50, displayOptions: { show: { operation: ['liveConversationMonitoring'], }, }, description: 'Maximum number of conversations to return', }, // Wrap Up Code Analytics Parameters { displayName: 'Queue IDs for Wrap Up', name: 'wrapUpQueueIds', type: 'string', default: '', displayOptions: { show: { operation: ['wrapUpCodeAnalytics'], }, }, description: 'Comma-separated list of queue IDs to filter by (optional)', }, { displayName: 'Wrap Up Codes', name: 'wrapUpCodes', type: 'string', default: '', displayOptions: { show: { operation: ['wrapUpCodeAnalytics'], }, }, description: 'Comma-separated list of specific wrap-up codes (optional)', }, // Agent Media Type Performance Parameters { displayName: 'Include Media Breakdown', name: 'includeMediaBreakdown', type: 'boolean', default: true, displayOptions: { show: { operation: ['agentMediaTypePerformance'], }, }, description: 'Include detailed performance breakdown by media type', }, { displayName: 'Page Size for Agents', name: 'agentPageSize', type: 'number', default: 10, displayOptions: { show: { operation: ['agentMediaTypePerformance', 'agentStatusMonitoring'], }, }, description: 'Number of agents to include in results', }, // Agent Status Monitoring Parameters { displayName: 'Include Inactive', name: 'includeInactive', type: 'boolean', default: false, displayOptions: { show: { operation: ['agentStatusMonitoring'], }, }, description: 'Include inactive/disabled agents in results', }, ], }; } async execute() { const items = this.getInputData(); const returnData = []; for (let i = 0; i < items.length; i++) { try { const operation = this.getNodeParameter('operation', i); const credentials = await this.getCredentials('genesysCloudMcpPlusApi'); const service = new GenesysCloudMcpPlusService_1.GenesysCloudMcpPlusService(credentials); let result; switch (operation) { case 'searchQueues': const queueName = this.getNodeParameter('queueName', i); const pageSize = this.getNodeParameter('pageSize', i, 100); result = await service.searchQueues({ name: queueName, pageSize }); break; case 'queryQueueVolumes': const queueIds = this.getNodeParameter('queueIds', i); const startDate = this.getNodeParameter('startDate', i); const endDate = this.getNodeParameter('endDate', i); result = await service.queryQueueVolumes({ queueIds: queueIds.split(',').map(id => id.trim()), startDate, endDate, }); break; case 'sampleConversationsByQueue': const singleQueueId = this.getNodeParameter('singleQueueId', i); const sampleStartDate = this.getNodeParameter('startDate', i); const sampleEndDate = this.getNodeParameter('endDate', i); result = await service.sampleConversationsByQueue({ queueId: singleQueueId, startDate: sampleStartDate, endDate: sampleEndDate, }); break; case 'voiceCallQuality': const voiceConversationIds = this.getNodeParameter('conversationIds', i); result = await service.voiceCallQuality({ conversationIds: voiceConversationIds.split(',').map(id => id.trim()), }); break; case 'conversationSentiment': const sentimentConversationIds = this.getNodeParameter('conversationIds', i); result = await service.conversationSentiment({ conversationIds: sentimentConversationIds.split(',').map(id => id.trim()), }); break; case 'conversationTopics': const topicsConversationId = this.getNodeParameter('singleConversationId', i); result = await service.conversationTopics({ conversationId: topicsConversationId, }); break; case 'conversationTranscript': const transcriptConversationId = this.getNodeParameter('singleConversationId', i); result = await service.conversationTranscript({ conversationId: transcriptConversationId, }); break; case 'enhancedConversationSearch': const searchStartDate = this.getNodeParameter('startDate', i); const searchEndDate = this.getNodeParameter('endDate', i); const searchPhoneNumber = this.getNodeParameter('phoneNumber', i, ''); const searchMediaTypes = this.getNodeParameter('mediaTypes', i, []); const ecsParams = { startDate: searchStartDate, endDate: searchEndDate }; if (searchPhoneNumber) ecsParams.phoneNumber = searchPhoneNumber; if (searchMediaTypes.length > 0) ecsParams.mediaTypes = searchMediaTypes; result = await service.enhancedConversationSearch(ecsParams); break; case 'agentMediaTypePerformance': const perfStartDate = this.getNodeParameter('startDate', i); const perfEndDate = this.getNodeParameter('endDate', i); const perfAgentIds = this.getNodeParameter('agentIds', i, ''); const includeMediaBreakdown = this.getNodeParameter('includeMediaBreakdown', i, true); const agentPageSize = this.getNodeParameter('agentPageSize', i, 10); const ampParams = { startDate: perfStartDate, endDate: perfEndDate, includeMediaBreakdown, pageSize: agentPageSize }; if (perfAgentIds) ampParams.userIds = perfAgentIds.split(',').map(id => id.trim()); result = await service.agentMediaTypePerformance(ampParams); break; case 'realTimeQueueStatus': const realTimeQueueIds = this.getNodeParameter('realTimeQueueIds', i); result = await service.realTimeQueueStatus({ queueIds: realTimeQueueIds.split(',').map(id => id.trim()), }); break; case 'realTimeAgentPresence': const presenceAgentIds = this.getNodeParameter('agentIds', i, ''); result = await service.realTimeAgentPresence({ userIds: presenceAgentIds ? presenceAgentIds.split(',').map(id => id.trim()) : [], }); break; case 'liveConversationMonitoring': const liveQueueIds = this.getNodeParameter('liveQueueIds', i, ''); const maxResults = this.getNodeParameter('maxResults', i, 50); result = await service.liveConversationMonitoring({ queueIds: liveQueueIds ? liveQueueIds.split(',').map(id => id.trim()) : [], maxResults, }); break; case 'wrapUpCodeAnalytics': const wrapUpStartDate = this.getNodeParameter('startDate', i); const wrapUpEndDate = this.getNodeParameter('endDate', i); const wrapUpQueueIds = this.getNodeParameter('wrapUpQueueIds', i, ''); const wrapUpCodes = this.getNodeParameter('wrapUpCodes', i, ''); const wucaParams = { startDate: wrapUpStartDate, endDate: wrapUpEndDate }; if (wrapUpQueueIds) wucaParams.queueIds = wrapUpQueueIds.split(',').map(id => id.trim()); if (wrapUpCodes) wucaParams.wrapUpCodes = wrapUpCodes.split(',').map(code => code.trim()); result = await service.wrapUpCodeAnalytics(wucaParams); break; case 'agentStatusMonitoring': const statusAgentIds = this.getNodeParameter('agentIds', i, ''); const includeInactive = this.getNodeParameter('includeInactive', i, false); const statusPageSize = this.getNodeParameter('agentPageSize', i, 10); result = await service.agentStatusMonitoring({ userIds: statusAgentIds ? statusAgentIds.split(',').map(id => id.trim()) : [], includeInactive, pageSize: statusPageSize, }); break; case 'searchVoiceConversations': const voiceStartDate = this.getNodeParameter('startDate', i); const voiceEndDate = this.getNodeParameter('endDate', i); const voicePhoneNumber = this.getNodeParameter('phoneNumber', i, ''); const svcParams = { startDate: voiceStartDate, endDate: voiceEndDate }; if (voicePhoneNumber) svcParams.phoneNumber = voicePhoneNumber; result = await service.searchVoiceConversations(svcParams); break; default: throw new Error(`Operation ${operation} not supported`); } const executionData = { json: result, }; returnData.push(executionData); } catch (error) { if (this.continueOnFail()) { const executionData = { json: { error: error instanceof Error ? error.message : String(error), }, }; returnData.push(executionData); continue; } throw error; } } return [returnData]; } } exports.GenesysCloudMcpPlus = GenesysCloudMcpPlus;