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
JavaScript
"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;