@opencx/mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/api-client.d.ts +24 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +84 -0
- package/dist/api-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +35 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/contacts.d.ts +4 -0
- package/dist/tools/contacts.d.ts.map +1 -0
- package/dist/tools/contacts.js +45 -0
- package/dist/tools/contacts.js.map +1 -0
- package/dist/tools/crawl.d.ts +4 -0
- package/dist/tools/crawl.d.ts.map +1 -0
- package/dist/tools/crawl.js +44 -0
- package/dist/tools/crawl.js.map +1 -0
- package/dist/tools/csat.d.ts +4 -0
- package/dist/tools/csat.d.ts.map +1 -0
- package/dist/tools/csat.js +23 -0
- package/dist/tools/csat.js.map +1 -0
- package/dist/tools/email.d.ts +4 -0
- package/dist/tools/email.d.ts.map +1 -0
- package/dist/tools/email.js +49 -0
- package/dist/tools/email.js.map +1 -0
- package/dist/tools/insights.d.ts +4 -0
- package/dist/tools/insights.d.ts.map +1 -0
- package/dist/tools/insights.js +32 -0
- package/dist/tools/insights.js.map +1 -0
- package/dist/tools/org.d.ts +4 -0
- package/dist/tools/org.d.ts.map +1 -0
- package/dist/tools/org.js +12 -0
- package/dist/tools/org.js.map +1 -0
- package/dist/tools/phone.d.ts +4 -0
- package/dist/tools/phone.d.ts.map +1 -0
- package/dist/tools/phone.js +52 -0
- package/dist/tools/phone.js.map +1 -0
- package/dist/tools/sequences.d.ts +4 -0
- package/dist/tools/sequences.d.ts.map +1 -0
- package/dist/tools/sequences.js +54 -0
- package/dist/tools/sequences.js.map +1 -0
- package/dist/tools/sessions.d.ts +4 -0
- package/dist/tools/sessions.d.ts.map +1 -0
- package/dist/tools/sessions.js +111 -0
- package/dist/tools/sessions.js.map +1 -0
- package/dist/tools/teams.d.ts +4 -0
- package/dist/tools/teams.d.ts.map +1 -0
- package/dist/tools/teams.js +52 -0
- package/dist/tools/teams.js.map +1 -0
- package/dist/tools/training.d.ts +4 -0
- package/dist/tools/training.d.ts.map +1 -0
- package/dist/tools/training.js +28 -0
- package/dist/tools/training.js.map +1 -0
- package/dist/tools/whatsapp.d.ts +4 -0
- package/dist/tools/whatsapp.d.ts.map +1 -0
- package/dist/tools/whatsapp.js +28 -0
- package/dist/tools/whatsapp.js.map +1 -0
- package/package.json +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 OpenCopilot
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare class ApiError extends Error {
|
|
2
|
+
readonly status: number;
|
|
3
|
+
readonly statusText: string;
|
|
4
|
+
readonly body: string;
|
|
5
|
+
constructor(status: number, statusText: string, body: string);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Validates that a value is safe to interpolate into a URL path segment.
|
|
9
|
+
* Rejects slashes, `..`, encoded slashes, and empty strings to prevent
|
|
10
|
+
* path traversal attacks (e.g. `../../backend/internal-route`).
|
|
11
|
+
*/
|
|
12
|
+
export declare function safePath(segment: string): string;
|
|
13
|
+
export declare class OpenCXClient {
|
|
14
|
+
private readonly baseUrl;
|
|
15
|
+
private readonly headers;
|
|
16
|
+
constructor(apiKey: string, baseUrl: string);
|
|
17
|
+
get<T = unknown>(path: string, query?: Record<string, string | undefined>): Promise<T>;
|
|
18
|
+
post<T = unknown>(path: string, body?: unknown): Promise<T>;
|
|
19
|
+
patch<T = unknown>(path: string, body?: unknown): Promise<T>;
|
|
20
|
+
put<T = unknown>(path: string, body?: unknown): Promise<T>;
|
|
21
|
+
delete<T = unknown>(path: string): Promise<T>;
|
|
22
|
+
private request;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;aAEf,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,IAAI,EAAE,MAAM;gBAFZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM;CAK/B;AAID;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYhD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAQrC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAItF,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAI3D,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5D,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1D,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;YAIrC,OAAO;CAgCtB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export class ApiError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
statusText;
|
|
4
|
+
body;
|
|
5
|
+
constructor(status, statusText, body) {
|
|
6
|
+
super(`OpenCX API error ${status} ${statusText}: ${body}`);
|
|
7
|
+
this.status = status;
|
|
8
|
+
this.statusText = statusText;
|
|
9
|
+
this.body = body;
|
|
10
|
+
this.name = 'ApiError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const PATH_SEGMENT_RE = /^[a-zA-Z0-9._~:@!$&'()*+,;=-]+$/;
|
|
14
|
+
/**
|
|
15
|
+
* Validates that a value is safe to interpolate into a URL path segment.
|
|
16
|
+
* Rejects slashes, `..`, encoded slashes, and empty strings to prevent
|
|
17
|
+
* path traversal attacks (e.g. `../../backend/internal-route`).
|
|
18
|
+
*/
|
|
19
|
+
export function safePath(segment) {
|
|
20
|
+
if (!segment || segment.includes('/') || segment.includes('\\') || segment === '..') {
|
|
21
|
+
throw new Error(`Invalid path parameter: "${segment}"`);
|
|
22
|
+
}
|
|
23
|
+
const decoded = decodeURIComponent(segment);
|
|
24
|
+
if (decoded.includes('/') || decoded.includes('\\') || decoded === '..') {
|
|
25
|
+
throw new Error(`Invalid path parameter: "${segment}"`);
|
|
26
|
+
}
|
|
27
|
+
if (!PATH_SEGMENT_RE.test(segment)) {
|
|
28
|
+
throw new Error(`Invalid path parameter: "${segment}"`);
|
|
29
|
+
}
|
|
30
|
+
return segment;
|
|
31
|
+
}
|
|
32
|
+
export class OpenCXClient {
|
|
33
|
+
baseUrl;
|
|
34
|
+
headers;
|
|
35
|
+
constructor(apiKey, baseUrl) {
|
|
36
|
+
this.baseUrl = baseUrl.replace(/\/$/, '');
|
|
37
|
+
this.headers = {
|
|
38
|
+
Authorization: `Bearer ${apiKey}`,
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async get(path, query) {
|
|
43
|
+
return this.request('GET', path, undefined, query);
|
|
44
|
+
}
|
|
45
|
+
async post(path, body) {
|
|
46
|
+
return this.request('POST', path, body);
|
|
47
|
+
}
|
|
48
|
+
async patch(path, body) {
|
|
49
|
+
return this.request('PATCH', path, body);
|
|
50
|
+
}
|
|
51
|
+
async put(path, body) {
|
|
52
|
+
return this.request('PUT', path, body);
|
|
53
|
+
}
|
|
54
|
+
async delete(path) {
|
|
55
|
+
return this.request('DELETE', path);
|
|
56
|
+
}
|
|
57
|
+
async request(method, path, body, query) {
|
|
58
|
+
let url = `${this.baseUrl}${path}`;
|
|
59
|
+
if (query) {
|
|
60
|
+
const params = new URLSearchParams();
|
|
61
|
+
for (const [key, value] of Object.entries(query)) {
|
|
62
|
+
if (value !== undefined)
|
|
63
|
+
params.set(key, value);
|
|
64
|
+
}
|
|
65
|
+
const qs = params.toString();
|
|
66
|
+
if (qs)
|
|
67
|
+
url += `?${qs}`;
|
|
68
|
+
}
|
|
69
|
+
const res = await fetch(url, {
|
|
70
|
+
method,
|
|
71
|
+
headers: this.headers,
|
|
72
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
73
|
+
});
|
|
74
|
+
if (!res.ok) {
|
|
75
|
+
const text = await res.text().catch(() => '');
|
|
76
|
+
throw new ApiError(res.status, res.statusText, text);
|
|
77
|
+
}
|
|
78
|
+
const text = await res.text();
|
|
79
|
+
if (!text)
|
|
80
|
+
return undefined;
|
|
81
|
+
return JSON.parse(text);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { createServer } from './server.js';
|
|
4
|
+
const DEFAULT_BASE_URL = 'https://api.open.cx';
|
|
5
|
+
function main() {
|
|
6
|
+
const apiKey = process.env.OPENCX_API_KEY;
|
|
7
|
+
if (!apiKey) {
|
|
8
|
+
console.error('Error: OPENCX_API_KEY environment variable is required.\n\n' +
|
|
9
|
+
'Get your API key from the OpenCX dashboard:\n' +
|
|
10
|
+
' Settings → API Keys → Create API Key\n\n' +
|
|
11
|
+
'Then set it in your MCP client configuration:\n' +
|
|
12
|
+
' {\n' +
|
|
13
|
+
' "mcpServers": {\n' +
|
|
14
|
+
' "opencx": {\n' +
|
|
15
|
+
' "command": "npx",\n' +
|
|
16
|
+
' "args": ["-y", "@opencx/mcp"],\n' +
|
|
17
|
+
' "env": { "OPENCX_API_KEY": "your-key-here" }\n' +
|
|
18
|
+
' }\n' +
|
|
19
|
+
' }\n' +
|
|
20
|
+
' }');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
const baseUrl = process.env.OPENCX_BASE_URL || DEFAULT_BASE_URL;
|
|
24
|
+
try {
|
|
25
|
+
const parsed = new URL(baseUrl);
|
|
26
|
+
const isLocalDev = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';
|
|
27
|
+
if (parsed.protocol !== 'https:' && !isLocalDev) {
|
|
28
|
+
console.error('Error: OPENCX_BASE_URL must use HTTPS (unless targeting localhost for development).');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
console.error(`Error: OPENCX_BASE_URL is not a valid URL: "${baseUrl}"`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
const server = createServer(apiKey, baseUrl);
|
|
37
|
+
const transport = new StdioServerTransport();
|
|
38
|
+
server.connect(transport).catch((err) => {
|
|
39
|
+
console.error('Failed to start OpenCX MCP server:', err);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
main();
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAE/C,SAAS,IAAI;IACX,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CACX,6DAA6D;YAC3D,+CAA+C;YAC/C,4CAA4C;YAC5C,iDAAiD;YACjD,OAAO;YACP,uBAAuB;YACvB,qBAAqB;YACrB,6BAA6B;YAC7B,0CAA0C;YAC1C,wDAAwD;YACxD,WAAW;YACX,SAAS;YACT,KAAK,CACR,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,gBAAgB,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,UAAU,GACd,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC;QACrE,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;YAChD,OAAO,CAAC,KAAK,CACX,qFAAqF,CACtF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,+CAA+C,OAAO,GAAG,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QAC/C,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAepE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAsBvE"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { OpenCXClient } from './api-client.js';
|
|
3
|
+
import { registerContactTools } from './tools/contacts.js';
|
|
4
|
+
import { registerSessionTools } from './tools/sessions.js';
|
|
5
|
+
import { registerTrainingTools } from './tools/training.js';
|
|
6
|
+
import { registerCrawlTools } from './tools/crawl.js';
|
|
7
|
+
import { registerInsightTools } from './tools/insights.js';
|
|
8
|
+
import { registerTeamTools } from './tools/teams.js';
|
|
9
|
+
import { registerEmailTools } from './tools/email.js';
|
|
10
|
+
import { registerPhoneTools } from './tools/phone.js';
|
|
11
|
+
import { registerOrgTools } from './tools/org.js';
|
|
12
|
+
import { registerSequenceTools } from './tools/sequences.js';
|
|
13
|
+
import { registerCsatTools } from './tools/csat.js';
|
|
14
|
+
import { registerWhatsAppTools } from './tools/whatsapp.js';
|
|
15
|
+
export function createServer(apiKey, baseUrl) {
|
|
16
|
+
const server = new McpServer({
|
|
17
|
+
name: 'OpenCX',
|
|
18
|
+
version: '0.1.0',
|
|
19
|
+
});
|
|
20
|
+
const client = new OpenCXClient(apiKey, baseUrl);
|
|
21
|
+
registerContactTools(server, client);
|
|
22
|
+
registerSessionTools(server, client);
|
|
23
|
+
registerTrainingTools(server, client);
|
|
24
|
+
registerCrawlTools(server, client);
|
|
25
|
+
registerInsightTools(server, client);
|
|
26
|
+
registerTeamTools(server, client);
|
|
27
|
+
registerEmailTools(server, client);
|
|
28
|
+
registerPhoneTools(server, client);
|
|
29
|
+
registerOrgTools(server, client);
|
|
30
|
+
registerSequenceTools(server, client);
|
|
31
|
+
registerCsatTools(server, client);
|
|
32
|
+
registerWhatsAppTools(server, client);
|
|
33
|
+
return server;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,OAAe;IAC1D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjD,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/tools/contacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAgE3E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { safePath } from '../api-client.js';
|
|
3
|
+
export function registerContactTools(server, client) {
|
|
4
|
+
server.tool('list_contacts', 'List contacts in your organization. Returns a paginated list of contacts with their email, phone, name, and custom data. Use the cursor from the response to fetch the next page.', { cursor: z.string().optional().describe('Pagination cursor from a previous response') }, async ({ cursor }) => {
|
|
5
|
+
const data = await client.get('/contacts/', { cursor });
|
|
6
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
7
|
+
});
|
|
8
|
+
server.tool('create_contact', 'Create a new contact in your organization. At least one of email or phone is recommended for identification. Custom data can store arbitrary key-value pairs.', {
|
|
9
|
+
email: z.string().email().optional().describe('Contact email address'),
|
|
10
|
+
phone: z.string().optional().describe('Contact phone number'),
|
|
11
|
+
name: z.string().optional().describe('Contact display name'),
|
|
12
|
+
custom_data: z
|
|
13
|
+
.record(z.string(), z.unknown())
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('Arbitrary key-value pairs to store on the contact'),
|
|
16
|
+
}, async (params) => {
|
|
17
|
+
const data = await client.post('/contacts/', {
|
|
18
|
+
contact: {
|
|
19
|
+
email: params.email,
|
|
20
|
+
phone: params.phone,
|
|
21
|
+
name: params.name,
|
|
22
|
+
custom_data: params.custom_data,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
26
|
+
});
|
|
27
|
+
server.tool('update_contact', 'Update an existing contact. Only the provided fields will be changed; omitted fields remain unchanged.', {
|
|
28
|
+
contact_id: z.string().describe('The ID of the contact to update'),
|
|
29
|
+
email: z.string().email().optional().describe('New email address'),
|
|
30
|
+
phone: z.string().optional().describe('New phone number'),
|
|
31
|
+
name: z.string().optional().describe('New display name'),
|
|
32
|
+
custom_data: z
|
|
33
|
+
.record(z.string(), z.unknown())
|
|
34
|
+
.optional()
|
|
35
|
+
.describe('Key-value pairs to merge into existing custom data'),
|
|
36
|
+
}, async ({ contact_id, ...fields }) => {
|
|
37
|
+
const data = await client.patch(`/contacts/${safePath(contact_id)}`, { contact: fields });
|
|
38
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
39
|
+
});
|
|
40
|
+
server.tool('delete_contact', 'Permanently delete a contact by ID. This action cannot be undone.', { contact_id: z.string().describe('The ID of the contact to delete') }, async ({ contact_id }) => {
|
|
41
|
+
await client.delete(`/contacts/${safePath(contact_id)}`);
|
|
42
|
+
return { content: [{ type: 'text', text: `Contact ${contact_id} deleted successfully.` }] };
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=contacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/tools/contacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl.d.ts","sourceRoot":"","sources":["../../src/tools/crawl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QA2EzE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { safePath } from '../api-client.js';
|
|
3
|
+
export function registerCrawlTools(server, client) {
|
|
4
|
+
server.tool('list_datasources', 'List website datasources configured for knowledge base crawling. Each datasource represents a website whose pages are crawled and synced into the AI knowledge base.', {
|
|
5
|
+
page: z.string().optional().describe('Page number (1-based)'),
|
|
6
|
+
limit: z.string().optional().describe('Results per page (default 20)'),
|
|
7
|
+
}, async (params) => {
|
|
8
|
+
const data = await client.get('/crawl/', { page: params.page, limit: params.limit });
|
|
9
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
10
|
+
});
|
|
11
|
+
server.tool('create_datasource', 'Create a new website datasource for crawling. The URL is the root page to start crawling from. Pages discovered during the crawl will be added to the knowledge base.', {
|
|
12
|
+
url: z.string().url().describe('The root URL of the website to crawl'),
|
|
13
|
+
name: z.string().optional().describe('A friendly name for this datasource'),
|
|
14
|
+
}, async (params) => {
|
|
15
|
+
const data = await client.post('/crawl/', params);
|
|
16
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
17
|
+
});
|
|
18
|
+
server.tool('get_datasource', 'Get details of a specific website datasource, including its configuration and crawl status.', { id: z.string().describe('The datasource ID') }, async ({ id }) => {
|
|
19
|
+
const data = await client.get(`/crawl/${safePath(id)}`);
|
|
20
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
21
|
+
});
|
|
22
|
+
server.tool('start_crawl', 'Trigger a new crawl for a website datasource. This will discover and sync new pages into the knowledge base. Only one crawl can run at a time per datasource.', { id: z.string().describe('The datasource ID to crawl') }, async ({ id }) => {
|
|
23
|
+
const data = await client.post(`/crawl/${safePath(id)}/crawl`);
|
|
24
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
25
|
+
});
|
|
26
|
+
server.tool('get_crawl_status', 'Get the status and progress of a specific crawl job.', {
|
|
27
|
+
datasource_id: z.string().describe('The datasource ID'),
|
|
28
|
+
job_id: z.string().describe('The crawl job ID'),
|
|
29
|
+
}, async ({ datasource_id, job_id }) => {
|
|
30
|
+
const data = await client.get(`/crawl/${safePath(datasource_id)}/crawls/${safePath(job_id)}`);
|
|
31
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
32
|
+
});
|
|
33
|
+
server.tool('list_crawled_pages', 'List pages discovered by a website datasource crawl. Can filter by sync status and search by URL or title.', {
|
|
34
|
+
datasource_id: z.string().describe('The datasource ID'),
|
|
35
|
+
page: z.string().optional().describe('Page number (1-based)'),
|
|
36
|
+
limit: z.string().optional().describe('Results per page'),
|
|
37
|
+
sync_status: z.string().optional().describe('Filter by sync status'),
|
|
38
|
+
search: z.string().optional().describe('Search pages by URL or title'),
|
|
39
|
+
}, async ({ datasource_id, ...query }) => {
|
|
40
|
+
const data = await client.get(`/crawl/${safePath(datasource_id)}/pages`, query);
|
|
41
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=crawl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl.js","sourceRoot":"","sources":["../../src/tools/crawl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csat.d.ts","sourceRoot":"","sources":["../../src/tools/csat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAoCxE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { safePath } from '../api-client.js';
|
|
3
|
+
export function registerCsatTools(server, client) {
|
|
4
|
+
server.tool('list_csat_scores', 'List customer satisfaction (CSAT) scores with pagination. CSAT scores are collected after chat sessions to measure customer satisfaction.', {
|
|
5
|
+
page: z.string().optional().describe('Page number (1-based, default 1)'),
|
|
6
|
+
per_page: z.string().optional().describe('Results per page (default 20)'),
|
|
7
|
+
}, async (params) => {
|
|
8
|
+
const data = await client.get('/csat/scores', {
|
|
9
|
+
page: params.page,
|
|
10
|
+
per_page: params.per_page,
|
|
11
|
+
});
|
|
12
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
13
|
+
});
|
|
14
|
+
server.tool('get_csat_score', 'Get a specific CSAT score by its ID.', { score_id: z.string().describe('The CSAT score ID') }, async ({ score_id }) => {
|
|
15
|
+
const data = await client.get(`/csat/scores/${safePath(score_id)}`);
|
|
16
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
17
|
+
});
|
|
18
|
+
server.tool('get_session_csat', 'Get the CSAT score for a specific chat session, if one was submitted.', { session_id: z.string().describe('The session ID to look up CSAT for') }, async ({ session_id }) => {
|
|
19
|
+
const data = await client.get(`/csat/scores/session/${safePath(session_id)}`);
|
|
20
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=csat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csat.js","sourceRoot":"","sources":["../../src/tools/csat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAgB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAoB;IACvE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,2IAA2I,EAC3I;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QACxE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KAC1E,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE;YAC5C,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,sCAAsC,EACtC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EACtD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,uEAAuE,EACvE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAAE,EACzE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,wBAAwB,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC9E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/tools/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAsEzE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { safePath } from '../api-client.js';
|
|
3
|
+
export function registerEmailTools(server, client) {
|
|
4
|
+
server.tool('send_email', 'Send AI-generated emails to one or more contacts. The AI composes the email content based on the contact context. You must have a verified sending domain configured.', {
|
|
5
|
+
from_email: z.string().email().describe('The sender email address (must be from a verified domain)'),
|
|
6
|
+
recipients: z
|
|
7
|
+
.array(z.object({
|
|
8
|
+
contact_id: z.string().describe('The contact ID to send to'),
|
|
9
|
+
}))
|
|
10
|
+
.min(1)
|
|
11
|
+
.describe('List of contacts to send the email to'),
|
|
12
|
+
delay_in_minutes: z
|
|
13
|
+
.number()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('Delay before sending, in minutes (default: send immediately)'),
|
|
16
|
+
fallback_email_subject: z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Subject line to use if AI generation fails'),
|
|
20
|
+
fallback_email_sender_name: z
|
|
21
|
+
.string()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe('Sender display name to use if AI generation fails'),
|
|
24
|
+
fallback_email_body: z
|
|
25
|
+
.string()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Email body to use if AI generation fails'),
|
|
28
|
+
}, async (params) => {
|
|
29
|
+
const data = await client.post('/email/', params);
|
|
30
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
31
|
+
});
|
|
32
|
+
server.tool('list_email_domains', 'List all custom email sending domains configured for your organization, including their verification status.', {}, async () => {
|
|
33
|
+
const data = await client.get('/email/domains');
|
|
34
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
35
|
+
});
|
|
36
|
+
server.tool('add_email_domain', 'Add a custom domain for sending emails. Returns DNS records that must be configured for verification.', {
|
|
37
|
+
domain_name: z.string().describe('The domain name to add (e.g. "example.com")'),
|
|
38
|
+
}, async ({ domain_name }) => {
|
|
39
|
+
const data = await client.put('/email/domains', { domainName: domain_name });
|
|
40
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
41
|
+
});
|
|
42
|
+
server.tool('verify_email_domain', 'Trigger verification of a custom email domain. The domain DNS records must be configured before verification will succeed.', {
|
|
43
|
+
domain_name: z.string().describe('The domain name to verify'),
|
|
44
|
+
}, async ({ domain_name }) => {
|
|
45
|
+
const data = await client.patch(`/email/domains/${safePath(domain_name)}/verify`);
|
|
46
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=email.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/tools/email.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insights.d.ts","sourceRoot":"","sources":["../../src/tools/insights.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAyD3E"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { safePath } from '../api-client.js';
|
|
3
|
+
export function registerInsightTools(server, client) {
|
|
4
|
+
server.tool('list_insights', 'List customer insights (Voice of Customer) with pagination. Insights are automatically generated from chat sessions and represent recurring customer themes, issues, or feedback patterns.', {
|
|
5
|
+
cursor: z.string().optional().describe('Pagination cursor from a previous response'),
|
|
6
|
+
}, async ({ cursor }) => {
|
|
7
|
+
const data = await client.post('/insights/', { cursor });
|
|
8
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
9
|
+
});
|
|
10
|
+
server.tool('get_insight', 'Get full details of a specific customer insight by ID, including its category, related sessions, and resolution status.', { id: z.string().describe('The insight ID') }, async ({ id }) => {
|
|
11
|
+
const data = await client.get(`/insights/${safePath(id)}`);
|
|
12
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
13
|
+
});
|
|
14
|
+
server.tool('resolve_insight', 'Mark a customer insight as resolved. Use this when the underlying issue has been addressed.', { id: z.string().describe('The insight ID to resolve') }, async ({ id }) => {
|
|
15
|
+
const data = await client.post(`/insights/${safePath(id)}/resolve`);
|
|
16
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
17
|
+
});
|
|
18
|
+
server.tool('assign_insight', 'Assign a customer insight to a specific team for follow-up.', {
|
|
19
|
+
id: z.string().describe('The insight ID to assign'),
|
|
20
|
+
group_id: z.string().describe('The team/group ID to assign the insight to'),
|
|
21
|
+
}, async ({ id, group_id }) => {
|
|
22
|
+
const data = await client.post(`/insights/${safePath(id)}/assign`, { groupId: group_id });
|
|
23
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
24
|
+
});
|
|
25
|
+
server.tool('list_insight_categories', 'List all insight categories. Categories organize customer insights by theme (e.g. "billing issues", "feature requests").', {
|
|
26
|
+
type: z.string().optional().describe('Filter categories by type'),
|
|
27
|
+
}, async ({ type }) => {
|
|
28
|
+
const data = await client.get('/insights/categories', { type });
|
|
29
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=insights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insights.js","sourceRoot":"","sources":["../../src/tools/insights.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org.d.ts","sourceRoot":"","sources":["../../src/tools/org.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAoBvE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerOrgTools(server, client) {
|
|
3
|
+
server.tool('get_organization', 'Get information about your OpenCX organization, including its name and creation date.', {}, async () => {
|
|
4
|
+
const data = await client.get('/org/');
|
|
5
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
6
|
+
});
|
|
7
|
+
server.tool('update_organization', 'Update your organization name.', { name: z.string().describe('The new organization name') }, async ({ name }) => {
|
|
8
|
+
const data = await client.patch('/org/', { name });
|
|
9
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=org.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org.js","sourceRoot":"","sources":["../../src/tools/org.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAoB;IACtE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,uFAAuF,EACvF,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,gCAAgC,EAChC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,EAC1D,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phone.d.ts","sourceRoot":"","sources":["../../src/tools/phone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAmFzE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { safePath } from '../api-client.js';
|
|
3
|
+
export function registerPhoneTools(server, client) {
|
|
4
|
+
server.tool('list_phone_agents', 'List all AI phone agents in your organization. Phone agents handle inbound and outbound voice calls with AI.', {
|
|
5
|
+
cursor: z.string().optional().describe('Pagination cursor from a previous response'),
|
|
6
|
+
}, async ({ cursor }) => {
|
|
7
|
+
const data = await client.get('/phone/', { cursor });
|
|
8
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
9
|
+
});
|
|
10
|
+
server.tool('get_phone_agent', 'Get details of a specific AI phone agent.', { phone_agent_id: z.string().describe('The phone agent ID') }, async ({ phone_agent_id }) => {
|
|
11
|
+
const data = await client.get(`/phone/${safePath(phone_agent_id)}`);
|
|
12
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
13
|
+
});
|
|
14
|
+
server.tool('create_phone_agent', 'Create a new AI phone agent. This provisions a phone number and configures the AI agent for handling voice calls.', {
|
|
15
|
+
name: z.string().describe('A name for the phone agent'),
|
|
16
|
+
instructions: z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Custom instructions for how the AI agent should behave on calls'),
|
|
20
|
+
voice: z.string().optional().describe('The voice ID to use for text-to-speech'),
|
|
21
|
+
language: z.string().optional().describe('Primary language for the agent (e.g. "en")'),
|
|
22
|
+
}, async (params) => {
|
|
23
|
+
const data = await client.post('/phone/', params);
|
|
24
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
25
|
+
});
|
|
26
|
+
server.tool('update_phone_agent', 'Update an existing AI phone agent configuration.', {
|
|
27
|
+
phone_agent_id: z.string().describe('The phone agent ID to update'),
|
|
28
|
+
name: z.string().optional().describe('New name'),
|
|
29
|
+
instructions: z.string().optional().describe('New instructions'),
|
|
30
|
+
voice: z.string().optional().describe('New voice ID'),
|
|
31
|
+
language: z.string().optional().describe('New primary language'),
|
|
32
|
+
}, async ({ phone_agent_id, ...body }) => {
|
|
33
|
+
const data = await client.patch(`/phone/${safePath(phone_agent_id)}`, body);
|
|
34
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
35
|
+
});
|
|
36
|
+
server.tool('delete_phone_agent', 'Permanently delete an AI phone agent and release its phone number. This action cannot be undone.', { phone_agent_id: z.string().describe('The phone agent ID to delete') }, async ({ phone_agent_id }) => {
|
|
37
|
+
await client.delete(`/phone/${safePath(phone_agent_id)}`);
|
|
38
|
+
return {
|
|
39
|
+
content: [{ type: 'text', text: `Phone agent ${phone_agent_id} deleted successfully.` }],
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
server.tool('make_outbound_call', 'Trigger an outbound AI phone call to a phone number using a specific phone agent.', {
|
|
43
|
+
phone_agent_id: z.string().describe('The phone agent ID to make the call with'),
|
|
44
|
+
phone_number: z
|
|
45
|
+
.string()
|
|
46
|
+
.describe('The phone number to call (E.164 format, e.g. "+14155551234")'),
|
|
47
|
+
}, async (params) => {
|
|
48
|
+
const data = await client.post('/phone/outbound-call', params);
|
|
49
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=phone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phone.js","sourceRoot":"","sources":["../../src/tools/phone.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequences.d.ts","sourceRoot":"","sources":["../../src/tools/sequences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAyF5E"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { safePath } from '../api-client.js';
|
|
3
|
+
export function registerSequenceTools(server, client) {
|
|
4
|
+
server.tool('create_sequence', 'Create an outbound AI sequence. Sequences automate multi-step outreach to contacts via email, SMS, or other channels with AI-generated content.', {
|
|
5
|
+
name: z.string().describe('A name for the sequence'),
|
|
6
|
+
is_continuous: z
|
|
7
|
+
.boolean()
|
|
8
|
+
.optional()
|
|
9
|
+
.describe('If true, the sequence runs continuously and contacts can be added over time'),
|
|
10
|
+
steps: z
|
|
11
|
+
.array(z.object({
|
|
12
|
+
channel: z.string().describe('Channel for this step (e.g. "email", "sms")'),
|
|
13
|
+
delay_minutes: z.number().optional().describe('Delay before this step in minutes'),
|
|
14
|
+
}))
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('The sequence steps to execute in order'),
|
|
17
|
+
}, async (params) => {
|
|
18
|
+
const data = await client.post('/sequences/', params);
|
|
19
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
20
|
+
});
|
|
21
|
+
server.tool('get_sequence', 'Get details of a specific outbound sequence, including its steps and status.', { sequence_id: z.string().describe('The sequence ID') }, async ({ sequence_id }) => {
|
|
22
|
+
const data = await client.get(`/sequences/${safePath(sequence_id)}`);
|
|
23
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
24
|
+
});
|
|
25
|
+
server.tool('update_sequence', 'Update an existing sequence configuration.', {
|
|
26
|
+
sequence_id: z.string().describe('The sequence ID to update'),
|
|
27
|
+
name: z.string().optional().describe('New name'),
|
|
28
|
+
is_continuous: z.boolean().optional().describe('Update continuous mode'),
|
|
29
|
+
}, async ({ sequence_id, ...body }) => {
|
|
30
|
+
const data = await client.patch(`/sequences/${safePath(sequence_id)}`, body);
|
|
31
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
32
|
+
});
|
|
33
|
+
server.tool('start_sequence', 'Start a sequence. Once started, the sequence will begin executing its steps for the enrolled contacts.', { sequence_id: z.string().describe('The sequence ID to start') }, async ({ sequence_id }) => {
|
|
34
|
+
const data = await client.put(`/sequences/${safePath(sequence_id)}/start`);
|
|
35
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
36
|
+
});
|
|
37
|
+
server.tool('cancel_sequence', 'Cancel a running sequence. Contacts that have not yet been processed will not receive further messages.', { sequence_id: z.string().describe('The sequence ID to cancel') }, async ({ sequence_id }) => {
|
|
38
|
+
const data = await client.put(`/sequences/${safePath(sequence_id)}/cancel`);
|
|
39
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
40
|
+
});
|
|
41
|
+
server.tool('add_contacts_to_sequence', 'Add contacts to a continuous sequence. The contacts will be enrolled and start receiving sequence steps.', {
|
|
42
|
+
sequence_id: z.string().describe('The sequence ID'),
|
|
43
|
+
contacts: z
|
|
44
|
+
.array(z.object({
|
|
45
|
+
contact_id: z.string().describe('The contact ID to enroll'),
|
|
46
|
+
}))
|
|
47
|
+
.min(1)
|
|
48
|
+
.describe('List of contacts to add to the sequence'),
|
|
49
|
+
}, async ({ sequence_id, contacts }) => {
|
|
50
|
+
const data = await client.post(`/sequences/${safePath(sequence_id)}/contacts`, { contacts });
|
|
51
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=sequences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequences.js","sourceRoot":"","sources":["../../src/tools/sequences.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/tools/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QA6I3E"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { safePath } from '../api-client.js';
|
|
3
|
+
export function registerSessionTools(server, client) {
|
|
4
|
+
server.tool('list_sessions', 'List chat sessions with optional filters. Returns paginated results with session metadata including status, channel, contact info, and timestamps.', {
|
|
5
|
+
cursor: z.string().optional().describe('Pagination cursor from a previous response'),
|
|
6
|
+
status: z
|
|
7
|
+
.enum(['open', 'closed', 'handoff'])
|
|
8
|
+
.optional()
|
|
9
|
+
.describe('Filter by session status'),
|
|
10
|
+
channel_type: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe('Filter by channel type (e.g. "web", "whatsapp", "email")'),
|
|
14
|
+
handed_off: z
|
|
15
|
+
.enum(['true', 'false'])
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('Filter for sessions that have been handed off to a human'),
|
|
18
|
+
created_after: z
|
|
19
|
+
.string()
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('ISO 8601 date — only return sessions created after this time'),
|
|
22
|
+
created_before: z
|
|
23
|
+
.string()
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('ISO 8601 date — only return sessions created before this time'),
|
|
26
|
+
updated_after: z
|
|
27
|
+
.string()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe('ISO 8601 date — only return sessions updated after this time'),
|
|
30
|
+
updated_before: z
|
|
31
|
+
.string()
|
|
32
|
+
.optional()
|
|
33
|
+
.describe('ISO 8601 date — only return sessions updated before this time'),
|
|
34
|
+
}, async (params) => {
|
|
35
|
+
const data = await client.get('/chat/sessions/', {
|
|
36
|
+
cursor: params.cursor,
|
|
37
|
+
status: params.status,
|
|
38
|
+
channel_type: params.channel_type,
|
|
39
|
+
handed_off: params.handed_off,
|
|
40
|
+
created_after: params.created_after,
|
|
41
|
+
created_before: params.created_before,
|
|
42
|
+
updated_after: params.updated_after,
|
|
43
|
+
updated_before: params.updated_before,
|
|
44
|
+
});
|
|
45
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
46
|
+
});
|
|
47
|
+
server.tool('get_session', 'Get full details of a single chat session by its ID, including status, channel, contact, assignee, team, custom data, and timestamps.', { session_id: z.string().describe('The session ID to retrieve') }, async ({ session_id }) => {
|
|
48
|
+
const data = await client.get(`/chat/sessions/${safePath(session_id)}`);
|
|
49
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
50
|
+
});
|
|
51
|
+
server.tool('create_session', 'Create a new chat session for an existing contact. The session starts in an open state and can receive messages.', {
|
|
52
|
+
contact_id: z.string().describe('The contact ID to create a session for'),
|
|
53
|
+
channel: z
|
|
54
|
+
.string()
|
|
55
|
+
.optional()
|
|
56
|
+
.describe('Channel type for the session (e.g. "web", "api")'),
|
|
57
|
+
}, async (params) => {
|
|
58
|
+
const data = await client.post('/chat/sessions/', {
|
|
59
|
+
contact_id: params.contact_id,
|
|
60
|
+
channel: params.channel,
|
|
61
|
+
});
|
|
62
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
63
|
+
});
|
|
64
|
+
server.tool('update_session', 'Update a chat session status. Use this to resolve, close, or reopen sessions.', {
|
|
65
|
+
session_id: z.string().describe('The session ID to update'),
|
|
66
|
+
status: z
|
|
67
|
+
.enum(['open', 'closed', 'handoff'])
|
|
68
|
+
.describe('The new status for the session'),
|
|
69
|
+
}, async ({ session_id, status }) => {
|
|
70
|
+
const data = await client.patch(`/chat/sessions/${safePath(session_id)}`, { status });
|
|
71
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
72
|
+
});
|
|
73
|
+
server.tool('send_message', 'Send a message in an existing chat session. Messages can be sent as either a contact or an agent. Supports text content and optional attachments.', {
|
|
74
|
+
session_id: z.string().describe('The session ID to send the message in'),
|
|
75
|
+
sender: z
|
|
76
|
+
.enum(['contact', 'agent'])
|
|
77
|
+
.describe('Who is sending the message — "contact" or "agent"'),
|
|
78
|
+
text: z.string().describe('The message text content'),
|
|
79
|
+
contact: z
|
|
80
|
+
.object({
|
|
81
|
+
email: z.string().optional(),
|
|
82
|
+
phone: z.string().optional(),
|
|
83
|
+
name: z.string().optional(),
|
|
84
|
+
})
|
|
85
|
+
.optional()
|
|
86
|
+
.describe('Contact identity when sender is "contact"'),
|
|
87
|
+
agent: z
|
|
88
|
+
.object({ email: z.string().optional(), name: z.string().optional() })
|
|
89
|
+
.optional()
|
|
90
|
+
.describe('Agent identity when sender is "agent"'),
|
|
91
|
+
}, async ({ session_id, sender, text, contact, agent }) => {
|
|
92
|
+
const body = {
|
|
93
|
+
sender,
|
|
94
|
+
message: { text },
|
|
95
|
+
};
|
|
96
|
+
if (sender === 'contact' && contact)
|
|
97
|
+
body.contact = contact;
|
|
98
|
+
if (sender === 'agent' && agent)
|
|
99
|
+
body.agent = agent;
|
|
100
|
+
const data = await client.post(`/chat/sessions/${safePath(session_id)}/send`, body);
|
|
101
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
102
|
+
});
|
|
103
|
+
server.tool('get_session_history', 'Get the message history for a chat session. Returns paginated messages, events, and status changes in chronological order.', {
|
|
104
|
+
session_id: z.string().describe('The session ID to get history for'),
|
|
105
|
+
cursor: z.string().optional().describe('Pagination cursor from a previous response'),
|
|
106
|
+
}, async ({ session_id, cursor }) => {
|
|
107
|
+
const data = await client.get(`/chat/sessions/${safePath(session_id)}/history`, { cursor });
|
|
108
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/tools/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../src/tools/teams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QA+FxE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { safePath } from '../api-client.js';
|
|
3
|
+
export function registerTeamTools(server, client) {
|
|
4
|
+
server.tool('list_teams', 'List all teams in your organization. Teams are used to group agents for routing, assignment, and reporting.', {}, async () => {
|
|
5
|
+
const data = await client.get('/teams/');
|
|
6
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
7
|
+
});
|
|
8
|
+
server.tool('get_team', 'Get details of a specific team by ID.', { team_id: z.string().describe('The team ID') }, async ({ team_id }) => {
|
|
9
|
+
const data = await client.get(`/teams/${safePath(team_id)}`);
|
|
10
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
11
|
+
});
|
|
12
|
+
server.tool('create_team', 'Create a new team in your organization.', {
|
|
13
|
+
name: z.string().describe('The team name'),
|
|
14
|
+
description: z.string().optional().describe('A description of the team'),
|
|
15
|
+
}, async (params) => {
|
|
16
|
+
const data = await client.post('/teams/', params);
|
|
17
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
18
|
+
});
|
|
19
|
+
server.tool('update_team', 'Update an existing team name or description.', {
|
|
20
|
+
team_id: z.string().describe('The team ID to update'),
|
|
21
|
+
name: z.string().describe('New team name'),
|
|
22
|
+
description: z.string().optional().describe('New description'),
|
|
23
|
+
}, async ({ team_id, ...body }) => {
|
|
24
|
+
const data = await client.put(`/teams/${safePath(team_id)}`, body);
|
|
25
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
26
|
+
});
|
|
27
|
+
server.tool('delete_team', 'Permanently delete a team by ID. This action cannot be undone. Members will be unassigned from the team.', { team_id: z.string().describe('The team ID to delete') }, async ({ team_id }) => {
|
|
28
|
+
await client.delete(`/teams/${safePath(team_id)}`);
|
|
29
|
+
return { content: [{ type: 'text', text: `Team ${team_id} deleted successfully.` }] };
|
|
30
|
+
});
|
|
31
|
+
server.tool('list_team_members', 'List all users (agents) assigned to a specific team.', { team_id: z.string().describe('The team ID') }, async ({ team_id }) => {
|
|
32
|
+
const data = await client.get(`/teams/${safePath(team_id)}/users`);
|
|
33
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
34
|
+
});
|
|
35
|
+
server.tool('add_team_member', 'Add a user (agent) to a team.', {
|
|
36
|
+
team_id: z.string().describe('The team ID'),
|
|
37
|
+
user_id: z.string().describe('The user ID to add to the team'),
|
|
38
|
+
}, async ({ team_id, user_id }) => {
|
|
39
|
+
const data = await client.post(`/teams/${safePath(team_id)}/users`, { userId: user_id });
|
|
40
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
41
|
+
});
|
|
42
|
+
server.tool('remove_team_member', 'Remove a user (agent) from a team.', {
|
|
43
|
+
team_id: z.string().describe('The team ID'),
|
|
44
|
+
user_id: z.string().describe('The user ID to remove from the team'),
|
|
45
|
+
}, async ({ team_id, user_id }) => {
|
|
46
|
+
await client.delete(`/teams/${safePath(team_id)}/users/${safePath(user_id)}`);
|
|
47
|
+
return {
|
|
48
|
+
content: [{ type: 'text', text: `User ${user_id} removed from team ${team_id}.` }],
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=teams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teams.js","sourceRoot":"","sources":["../../src/tools/teams.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"training.d.ts","sourceRoot":"","sources":["../../src/tools/training.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QA+C5E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { safePath } from '../api-client.js';
|
|
3
|
+
export function registerTrainingTools(server, client) {
|
|
4
|
+
server.tool('list_training_scenarios', 'List all custom training scenarios for your AI agent. Training scenarios teach the AI how to handle specific customer situations with example conversations.', {}, async () => {
|
|
5
|
+
const data = await client.get('/training/');
|
|
6
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
7
|
+
});
|
|
8
|
+
server.tool('create_training_scenario', 'Create a new training scenario to teach the AI agent how to handle a specific situation. Provide a title and the scenario content describing the expected behavior.', {
|
|
9
|
+
title: z.string().describe('Short descriptive title for the training scenario'),
|
|
10
|
+
scenario: z.string().describe('The scenario content — describes how the AI should handle this situation'),
|
|
11
|
+
}, async (params) => {
|
|
12
|
+
const data = await client.post('/training/', params);
|
|
13
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
14
|
+
});
|
|
15
|
+
server.tool('update_training_scenario', 'Update an existing training scenario. Both title and scenario content can be changed.', {
|
|
16
|
+
id: z.string().describe('The training scenario ID to update'),
|
|
17
|
+
title: z.string().describe('Updated title'),
|
|
18
|
+
scenario: z.string().describe('Updated scenario content'),
|
|
19
|
+
}, async ({ id, ...body }) => {
|
|
20
|
+
const data = await client.put(`/training/${safePath(id)}`, body);
|
|
21
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
22
|
+
});
|
|
23
|
+
server.tool('delete_training_scenario', 'Permanently delete a training scenario by ID. This action cannot be undone.', { id: z.string().describe('The training scenario ID to delete') }, async ({ id }) => {
|
|
24
|
+
await client.delete(`/training/${safePath(id)}`);
|
|
25
|
+
return { content: [{ type: 'text', text: `Training scenario ${id} deleted successfully.` }] };
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=training.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"training.js","sourceRoot":"","sources":["../../src/tools/training.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAgB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAoB;IAC3E,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,8JAA8J,EAC9J,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC5C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,qKAAqK,EACrK;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QAC/E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;KAC1G,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,uFAAuF,EACvF;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC7D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KAC1D,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,6EAA6E,EAC7E,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAAE,EACjE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACjD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,CAAC,EAAE,CAAC;IAChG,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp.d.ts","sourceRoot":"","sources":["../../src/tools/whatsapp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QA8B5E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerWhatsAppTools(server, client) {
|
|
3
|
+
server.tool('send_whatsapp_template', 'Send a WhatsApp template message to a contact. Templates must be pre-approved by WhatsApp. This creates or continues a chat session with the contact.', {
|
|
4
|
+
template_id: z.string().describe('The WhatsApp template ID to send'),
|
|
5
|
+
phone_number_id: z
|
|
6
|
+
.string()
|
|
7
|
+
.describe('The WhatsApp business phone number ID to send from'),
|
|
8
|
+
contact: z
|
|
9
|
+
.object({
|
|
10
|
+
phone: z.string().describe('Contact phone number in E.164 format'),
|
|
11
|
+
name: z.string().optional().describe('Contact display name'),
|
|
12
|
+
email: z.string().optional().describe('Contact email'),
|
|
13
|
+
})
|
|
14
|
+
.describe('The contact to send the template to'),
|
|
15
|
+
variables: z
|
|
16
|
+
.record(z.string(), z.string())
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('Template variable values keyed by variable name'),
|
|
19
|
+
session_id: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Existing session ID to associate the message with'),
|
|
23
|
+
}, async (params) => {
|
|
24
|
+
const data = await client.post('/whatsapp/send-template', params);
|
|
25
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=whatsapp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../src/tools/whatsapp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAoB;IAC3E,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,uJAAuJ,EACvJ;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QACpE,eAAe,EAAE,CAAC;aACf,MAAM,EAAE;aACR,QAAQ,CAAC,oDAAoD,CAAC;QACjE,OAAO,EAAE,CAAC;aACP,MAAM,CAAC;YACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YAClE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAC5D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;SACvD,CAAC;aACD,QAAQ,CAAC,qCAAqC,CAAC;QAClD,SAAS,EAAE,CAAC;aACT,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;aAC9B,QAAQ,EAAE;aACV,QAAQ,CAAC,iDAAiD,CAAC;QAC9D,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,mDAAmD,CAAC;KACjE,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@opencx/mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "MCP server for OpenCX — manage contacts, sessions, training, and more from Claude Desktop, Cursor, or any MCP client.",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"opencx-mcp": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"mcp",
|
|
19
|
+
"opencx",
|
|
20
|
+
"model-context-protocol",
|
|
21
|
+
"ai",
|
|
22
|
+
"customer-support"
|
|
23
|
+
],
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=18.0.0"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
30
|
+
"zod": "^3.25.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^25.3.0",
|
|
34
|
+
"typescript": "^5.9.3"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc",
|
|
38
|
+
"dev": "tsc --watch",
|
|
39
|
+
"start": "node dist/index.js"
|
|
40
|
+
}
|
|
41
|
+
}
|