Skip to content

Commit 7dd30d6

Browse files
authored
Add tool to Search Voice Conversations (#19)
1 parent 9706302 commit 7dd30d6

12 files changed

+1074
-345
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ in the [tools doc](/docs/tools.md).
1818
| [Voice Call Quality](/docs/tools.md#voice-call-quality) | Retrieves voice call quality metrics for one or more conversations by ID |
1919
| [Conversation Sentiment](/docs/tools.md#conversation-sentiment) | Retrieves the sentiment for one or more conversations by ID |
2020
| [Conversation Topics](/docs/tools.md#conversation-topics) | Retrieves the topics for a conversation by ID |
21+
| [Search Voice Conversation](/docs/tools.md#search-voice-conversations) | Searches voice conversations by optional criteria |
2122

2223
## Authentication
2324

docs/tools.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,34 @@ Platform API endpoints used:
164164
- [GET /api/v2/speechandtextanalytics/topics](https://developer.genesys.cloud/analyticsdatamanagement/speechtextanalytics/#get-api-v2-speechandtextanalytics-topics)
165165
- [GET /api/v2/analytics/conversations/{conversationId}/details](https://developer.genesys.cloud/analyticsdatamanagement/analytics/analytics-apis#get-api-v2-analytics-conversations--conversationId--details)
166166
- [POST /api/v2/analytics/transcripts/aggregates/query](https://developer.genesys.cloud/analyticsdatamanagement/analytics/analytics-apis#post-api-v2-analytics-transcripts-aggregates-query)
167+
168+
## Search Voice Conversations
169+
170+
**Tool name:** `search_voice_conversations`
171+
172+
Searches for voice conversations within a specified time window, optionally filtering by phone number. Returns a paginated list of conversation metadata for use in further analysis or tool calls.
173+
174+
[Source file](/src/tools/searchVoiceConversations.ts).
175+
176+
### Input
177+
178+
- `phoneNumber`
179+
- Optional. Filters results to only include conversations involving this phone number (e.g., '+440000000000')
180+
- `pageNumber`
181+
- The page number of the results to retrieve, starting from 1. Defaults to 1 if not specified. Used with 'pageSize' for navigating large result sets
182+
- `pageSize`
183+
- The maximum number of conversations to return per page. Defaults to 100 if not specified. Used with 'pageNumber' for pagination. The maximum value is 500
184+
- `startDate`
185+
- The start date/time in ISO-8601 format (e.g., '2024-01-01T00:00:00Z')
186+
- `endDate`
187+
- The end date/time in ISO-8601 format (e.g., '2024-01-07T23:59:59Z')
188+
189+
### Security
190+
191+
Required Permissions:
192+
193+
- `analytics:conversationDetail:view`
194+
195+
Platform API endpoints used:
196+
197+
- [POST /api/v2/analytics/conversations/details/query](https://developer.genesys.cloud/devapps/api-explorer-standalone#post-api-v2-analytics-conversations-details-query)

package-lock.json

Lines changed: 384 additions & 321 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@makingchatbots/genesys-cloud-mcp-server",
3-
"version": "0.0.7",
4-
"description": "A MCP server for connecting LLMs to Genesys Cloud's Platform API",
3+
"version": "0.0.8",
4+
"description": "A Model Context Protocol (MCP) server exposing Genesys Cloud tools for LLMs, including sentiment analysis, conversation search, topic detection and more.",
55
"exports": "./dist/index.js",
66
"type": "module",
77
"license": "ISC",
@@ -35,26 +35,27 @@
3535
"prepublishOnly": "npm run test && npm run build"
3636
},
3737
"dependencies": {
38-
"@modelcontextprotocol/sdk": "^1.11.4",
39-
"purecloud-platform-client-v2": "^221.0.0",
40-
"zod": "^3.24.4"
38+
"@modelcontextprotocol/sdk": "^1.12.1",
39+
"date-fns": "^4.1.0",
40+
"purecloud-platform-client-v2": "^223.0.0",
41+
"zod": "^3.25.48"
4142
},
4243
"devDependencies": {
4344
"@eslint/eslintrc": "^3.3.1",
44-
"@eslint/js": "^9.27.0",
45+
"@eslint/js": "^9.28.0",
4546
"@types/eslint-config-prettier": "^6.11.3",
46-
"@types/node": "^22.15.18",
47-
"@typescript-eslint/eslint-plugin": "^8.32.1",
48-
"@typescript-eslint/parser": "^8.32.1",
49-
"eslint": "^9.27.0",
47+
"@types/node": "^22.15.29",
48+
"@typescript-eslint/eslint-plugin": "^8.33.1",
49+
"@typescript-eslint/parser": "^8.33.1",
50+
"eslint": "^9.28.0",
5051
"eslint-config-prettier": "^10.1.5",
51-
"eslint-import-resolver-typescript": "^4.3.5",
52-
"lint-staged": "^16.0.0",
52+
"eslint-import-resolver-typescript": "^4.4.2",
53+
"lint-staged": "^16.1.0",
5354
"prettier": "^3.5.3",
5455
"tsx": "^4.19.4",
5556
"typescript": "^5.8.3",
56-
"typescript-eslint": "^8.32.1",
57-
"vitest": "^3.1.3"
57+
"typescript-eslint": "^8.33.1",
58+
"vitest": "^3.2.0"
5859
},
5960
"lint-staged": {
6061
"src/*.ts": [
@@ -78,6 +79,11 @@
7879
"keywords": [
7980
"mcp",
8081
"modelcontextprotocol",
81-
"genesys cloud"
82+
"tool-calling",
83+
"llm-integration",
84+
"genesys-cloud",
85+
"speech-and-text-analytics",
86+
"sentiment-analysis",
87+
"conversation-analysis"
8288
]
8389
}

src/index.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { queryQueueVolumes } from "./tools/queryQueueVolumes.js";
99
import { voiceCallQuality } from "./tools/voiceCallQuality.js";
1010
import { conversationSentiment } from "./tools/conversationSentiment.js";
1111
import { conversationTopics } from "./tools/conversationTopics.js";
12+
import { searchVoiceConversations } from "./tools/searchVoiceConversations.js";
1213

1314
const configResult = loadConfig(process.env);
1415
if (!configResult.success) {
@@ -106,6 +107,20 @@ server.tool(
106107
),
107108
);
108109

110+
const searchVoiceConversationsTool = searchVoiceConversations({
111+
analyticsApi,
112+
});
113+
server.tool(
114+
searchVoiceConversationsTool.schema.name,
115+
searchVoiceConversationsTool.schema.description,
116+
searchVoiceConversationsTool.schema.paramsSchema.shape,
117+
withAuth(
118+
searchVoiceConversationsTool.call,
119+
config.genesysCloud,
120+
platformClient.ApiClient.instance,
121+
),
122+
);
123+
109124
const transport = new StdioServerTransport();
110125
await server.connect(transport);
111126
console.log("Started...");

src/tools/searchQueues.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ describe("Search Queues Tool", () => {
170170
Found the following queues matching "test-queue":
171171
• Name: test-queue
172172
• ID: ${queueId}
173+
173174
--- Pagination Info ---
174175
Page Number: N/A
175176
Page Size: N/A

src/tools/searchQueues.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { z } from "zod";
22
import type { Models, RoutingApi } from "purecloud-platform-client-v2";
33
import { isUnauthorisedError } from "./utils/genesys/isUnauthorisedError.js";
44
import { createTool, type ToolFactory } from "./utils/createTool.js";
5+
import { paginationSection } from "./utils/paginationSection.js";
56

67
type PartRequired<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
78

@@ -25,14 +26,6 @@ function formatQueues(
2526
total?: number;
2627
},
2728
) {
28-
const paginationDetails = [
29-
"--- Pagination Info ---",
30-
`Page Number: ${pagination.pageNumber ? String(pagination.pageNumber) : "N/A"}`,
31-
`Page Size: ${pagination.pageSize ? String(pagination.pageSize) : "N/A"}`,
32-
`Total Pages: ${pagination.pageCount ? String(pagination.pageCount) : "N/A"}`,
33-
`Total Matching Queues: ${pagination.total ? String(pagination.total) : "N/A"}`,
34-
].join("\n");
35-
3629
const queueItems = queues.flatMap((q) => [
3730
`• Name: ${q.name}`,
3831
` • ID: ${q.id}`,
@@ -45,7 +38,8 @@ function formatQueues(
4538
return [
4639
`Found the following queues matching "${inputQueueName}":`,
4740
...queueItems,
48-
paginationDetails,
41+
"",
42+
...paginationSection("Total Matching Queues", pagination),
4943
].join("\n");
5044
}
5145

0 commit comments

Comments
 (0)