@makingchatbots/genesys-cloud-mcp-server
Version:
A Model Context Protocol (MCP) server exposing Genesys Cloud tools for LLMs, including sentiment analysis, conversation search, topic detection and more.
64 lines (63 loc) • 2.78 kB
JavaScript
import { z } from "zod";
import { createTool } from "../utils/createTool.js";
import { errorResult } from "../utils/errorResult.js";
import { isUnauthorisedError } from "../utils/genesys/isUnauthorisedError.js";
import { interpretCallQuality } from "./interpretCallQuality.js";
const paramsSchema = z.object({
conversationIds: z
.array(z
.string()
.uuid()
.describe("A UUID for a conversation. (e.g., 00000000-0000-0000-0000-000000000000)"))
.min(1)
.max(100)
.describe("A list of up to 100 conversation IDs to evaluate voice call quality for"),
});
export const voiceCallQuality = ({ analyticsApi }) => createTool({
schema: {
name: "voice_call_quality",
annotations: { title: "Voice Call Quality" },
description: "Retrieves voice call quality metrics for one or more conversations by ID. This tool specifically focuses on voice interactions and returns the minimum Mean Opinion Score (MOS) observed in each conversation as structured JSON. MOS is a measure of perceived audio quality based on factors such as jitter, latency, packet loss, and codec. Use the following legend to interpret MOS values:\n\n" +
" • Poor: MOS < 3.5\n" +
" • Acceptable: 3.5 ≤ MOS < 4.3\n" +
" • Excellent: MOS ≥ 4.3",
paramsSchema,
},
call: async ({ conversationIds }) => {
let conversationDetails;
try {
conversationDetails =
await analyticsApi.getAnalyticsConversationsDetails({
id: conversationIds,
});
}
catch (error) {
const errorMessage = isUnauthorisedError(error)
? "Failed to query conversations call quality: Unauthorised access. Please check API credentials or permissions"
: `Failed to query conversations call quality: ${error instanceof Error ? error.message : JSON.stringify(error)}`;
return errorResult(errorMessage);
}
const output = [];
for (const convo of conversationDetails.conversations ?? []) {
if (!convo.conversationId || !convo.mediaStatsMinConversationMos) {
continue;
}
const mos = convo.mediaStatsMinConversationMos;
output.push({
conversationId: convo.conversationId,
minimumMos: mos.toFixed(2),
qualityLabel: interpretCallQuality(mos),
});
}
return {
content: [
{
type: "text",
text: JSON.stringify({
conversations: output,
}),
},
],
};
},
});