@opencx/mcp 1.15.26 → 1.15.27
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/dist/campaign-tools.spec.js +107 -0
- package/dist/campaign-tools.spec.js.map +1 -1
- package/dist/schema.d.ts +616 -3
- package/dist/schema.d.ts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/dist/skills.spec.d.ts +2 -0
- package/dist/skills.spec.d.ts.map +1 -0
- package/dist/skills.spec.js +175 -0
- package/dist/skills.spec.js.map +1 -0
- package/dist/tools/campaign-personalization.d.ts +4 -0
- package/dist/tools/campaign-personalization.d.ts.map +1 -0
- package/dist/tools/campaign-personalization.js +149 -0
- package/dist/tools/campaign-personalization.js.map +1 -0
- package/dist/tools/skills.d.ts +4 -0
- package/dist/tools/skills.d.ts.map +1 -0
- package/dist/tools/skills.js +80 -0
- package/dist/tools/skills.js.map +1 -0
- package/package.json +1 -1
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuDpE,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,SAAS,CAgEX"}
|
package/dist/server.js
CHANGED
|
@@ -26,6 +26,7 @@ import { registerSlackTools } from './tools/slack.js';
|
|
|
26
26
|
import { registerSlaTools } from './tools/sla.js';
|
|
27
27
|
import { registerOfficeHoursTools } from './tools/office-hours.js';
|
|
28
28
|
import { registerTagTools } from './tools/tags.js';
|
|
29
|
+
import { registerSkillTools } from './tools/skills.js';
|
|
29
30
|
import { registerCustomStatusTools } from './tools/custom-statuses.js';
|
|
30
31
|
import { registerStructuredFieldTools } from './tools/structured-fields.js';
|
|
31
32
|
import { registerCsatTools } from './tools/csat.js';
|
|
@@ -39,6 +40,7 @@ import { registerCampaignDiscoveryTools } from './tools/campaign-discovery.js';
|
|
|
39
40
|
import { registerCampaignQualificationTools } from './tools/campaign-qualification.js';
|
|
40
41
|
import { registerCampaignChannelTools } from './tools/campaign-channel.js';
|
|
41
42
|
import { registerCampaignSpineTools } from './tools/campaign-spine.js';
|
|
43
|
+
import { registerCampaignPersonalizationTools } from './tools/campaign-personalization.js';
|
|
42
44
|
import { registerSlaAnalyticsTools } from './tools/sla-analytics.js';
|
|
43
45
|
import { registerCoworkerTools } from './tools/coworker.js';
|
|
44
46
|
import { registerWorkflowTools } from './tools/workflows.js';
|
|
@@ -84,6 +86,7 @@ export function createServer(apiKey, baseUrl, options = {}) {
|
|
|
84
86
|
registerSlaTools(server, client);
|
|
85
87
|
registerOfficeHoursTools(server, client);
|
|
86
88
|
registerTagTools(server, client);
|
|
89
|
+
registerSkillTools(server, client);
|
|
87
90
|
registerCustomStatusTools(server, client);
|
|
88
91
|
registerStructuredFieldTools(server, client);
|
|
89
92
|
registerCsatTools(server, client);
|
|
@@ -97,6 +100,7 @@ export function createServer(apiKey, baseUrl, options = {}) {
|
|
|
97
100
|
registerCampaignQualificationTools(server, client);
|
|
98
101
|
registerCampaignChannelTools(server, client);
|
|
99
102
|
registerCampaignSpineTools(server, client);
|
|
103
|
+
registerCampaignPersonalizationTools(server, client);
|
|
100
104
|
registerSlaAnalyticsTools(server, client);
|
|
101
105
|
registerWorkflowTools(server, client);
|
|
102
106
|
registerCoworkerTools(server, client);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.spec.d.ts","sourceRoot":"","sources":["../src/skills.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
3
|
+
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
|
|
4
|
+
import { createServer } from './server.js';
|
|
5
|
+
function mockResponse(body, status = 200, statusText = 'OK') {
|
|
6
|
+
return new Response(body === null ? null : JSON.stringify(body), { status, statusText });
|
|
7
|
+
}
|
|
8
|
+
function getRequestUrl(call) {
|
|
9
|
+
const arg = call[0];
|
|
10
|
+
if (arg instanceof Request)
|
|
11
|
+
return arg.url;
|
|
12
|
+
return String(arg);
|
|
13
|
+
}
|
|
14
|
+
function getRequestMethod(call) {
|
|
15
|
+
const arg = call[0];
|
|
16
|
+
if (arg instanceof Request)
|
|
17
|
+
return arg.method;
|
|
18
|
+
const opts = call[1];
|
|
19
|
+
return opts.method ?? 'GET';
|
|
20
|
+
}
|
|
21
|
+
async function getRequestBody(call) {
|
|
22
|
+
const arg = call[0];
|
|
23
|
+
if (arg instanceof Request) {
|
|
24
|
+
const text = await arg.clone().text();
|
|
25
|
+
return text ? JSON.parse(text) : undefined;
|
|
26
|
+
}
|
|
27
|
+
const opts = call[1];
|
|
28
|
+
return opts.body ? JSON.parse(opts.body) : undefined;
|
|
29
|
+
}
|
|
30
|
+
function contentJson(content) {
|
|
31
|
+
const parsed = content;
|
|
32
|
+
return JSON.parse(parsed[0].text);
|
|
33
|
+
}
|
|
34
|
+
const SKILL_ID = '5c1a9c2e-3f0b-4d7a-9e6c-1b2a3c4d5e6f';
|
|
35
|
+
const skill = {
|
|
36
|
+
id: SKILL_ID,
|
|
37
|
+
org_id: 'org-1',
|
|
38
|
+
name: 'billing',
|
|
39
|
+
description: 'Refunds and invoices',
|
|
40
|
+
};
|
|
41
|
+
describe('skill tools', () => {
|
|
42
|
+
let client;
|
|
43
|
+
let cleanup;
|
|
44
|
+
let fetchSpy;
|
|
45
|
+
beforeEach(async () => {
|
|
46
|
+
fetchSpy = vi.fn();
|
|
47
|
+
vi.stubGlobal('fetch', fetchSpy);
|
|
48
|
+
const server = createServer('test-api-key', 'https://api.test.com');
|
|
49
|
+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
50
|
+
await server.connect(serverTransport);
|
|
51
|
+
client = new Client({ name: 'test-client', version: '1.0.0' });
|
|
52
|
+
await client.connect(clientTransport);
|
|
53
|
+
cleanup = async () => {
|
|
54
|
+
await client.close();
|
|
55
|
+
await server.close();
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
afterEach(async () => {
|
|
59
|
+
await cleanup();
|
|
60
|
+
vi.restoreAllMocks();
|
|
61
|
+
});
|
|
62
|
+
it('registers the catalog and agent-assignment tools and NO session-skill writer', async () => {
|
|
63
|
+
const { tools } = await client.listTools();
|
|
64
|
+
const toolNames = tools.map((t) => t.name);
|
|
65
|
+
for (const name of [
|
|
66
|
+
'list_skills',
|
|
67
|
+
'get_skill',
|
|
68
|
+
'create_skill',
|
|
69
|
+
'update_skill',
|
|
70
|
+
'delete_skill',
|
|
71
|
+
'get_user_skills',
|
|
72
|
+
'set_user_skills',
|
|
73
|
+
]) {
|
|
74
|
+
expect(toolNames).toContain(name);
|
|
75
|
+
}
|
|
76
|
+
// Session skills are written only by the "Assign Skills to Ticket" workflow
|
|
77
|
+
// action; the matcher is self-checked so an empty result means "absent".
|
|
78
|
+
const sessionSkillTool = /session.*skill|skill.*session/;
|
|
79
|
+
expect(['set_session_skills', 'add_skills_to_session'].every((n) => sessionSkillTool.test(n))).toBe(true);
|
|
80
|
+
expect(toolNames.filter((n) => sessionSkillTool.test(n))).toEqual([]);
|
|
81
|
+
});
|
|
82
|
+
it('list_skills GETs /skills', async () => {
|
|
83
|
+
fetchSpy.mockResolvedValueOnce(mockResponse([skill]));
|
|
84
|
+
const result = await client.callTool({ name: 'list_skills', arguments: {} });
|
|
85
|
+
expect(fetchSpy).toHaveBeenCalledOnce();
|
|
86
|
+
const call = fetchSpy.mock.calls[0];
|
|
87
|
+
expect(getRequestUrl(call)).toBe('https://api.test.com/skills');
|
|
88
|
+
expect(getRequestMethod(call)).toBe('GET');
|
|
89
|
+
expect(contentJson(result.content)).toEqual([skill]);
|
|
90
|
+
});
|
|
91
|
+
it('get_skill GETs /skills/{skill_id}', async () => {
|
|
92
|
+
fetchSpy.mockResolvedValueOnce(mockResponse(skill));
|
|
93
|
+
const result = await client.callTool({ name: 'get_skill', arguments: { skill_id: SKILL_ID } });
|
|
94
|
+
const call = fetchSpy.mock.calls[0];
|
|
95
|
+
expect(getRequestUrl(call)).toBe(`https://api.test.com/skills/${SKILL_ID}`);
|
|
96
|
+
expect(getRequestMethod(call)).toBe('GET');
|
|
97
|
+
expect(contentJson(result.content)).toEqual(skill);
|
|
98
|
+
});
|
|
99
|
+
it('create_skill POSTs name + description', async () => {
|
|
100
|
+
fetchSpy.mockResolvedValueOnce(mockResponse(skill, 201, 'Created'));
|
|
101
|
+
const result = await client.callTool({
|
|
102
|
+
name: 'create_skill',
|
|
103
|
+
arguments: { name: 'billing', description: 'Refunds and invoices' },
|
|
104
|
+
});
|
|
105
|
+
const call = fetchSpy.mock.calls[0];
|
|
106
|
+
expect(getRequestUrl(call)).toBe('https://api.test.com/skills');
|
|
107
|
+
expect(getRequestMethod(call)).toBe('POST');
|
|
108
|
+
expect(await getRequestBody(call)).toEqual({
|
|
109
|
+
name: 'billing',
|
|
110
|
+
description: 'Refunds and invoices',
|
|
111
|
+
});
|
|
112
|
+
expect(contentJson(result.content)).toEqual(skill);
|
|
113
|
+
});
|
|
114
|
+
it('update_skill PATCHes only the provided fields', async () => {
|
|
115
|
+
fetchSpy.mockResolvedValueOnce(mockResponse({ ...skill, name: 'payments' }));
|
|
116
|
+
await client.callTool({
|
|
117
|
+
name: 'update_skill',
|
|
118
|
+
arguments: { skill_id: SKILL_ID, name: 'payments' },
|
|
119
|
+
});
|
|
120
|
+
const call = fetchSpy.mock.calls[0];
|
|
121
|
+
expect(getRequestUrl(call)).toBe(`https://api.test.com/skills/${SKILL_ID}`);
|
|
122
|
+
expect(getRequestMethod(call)).toBe('PATCH');
|
|
123
|
+
expect(await getRequestBody(call)).toEqual({ name: 'payments' });
|
|
124
|
+
});
|
|
125
|
+
it('update_skill forwards an explicit null description so it can be cleared', async () => {
|
|
126
|
+
fetchSpy.mockResolvedValueOnce(mockResponse({ ...skill, description: null }));
|
|
127
|
+
await client.callTool({
|
|
128
|
+
name: 'update_skill',
|
|
129
|
+
arguments: { skill_id: SKILL_ID, description: null },
|
|
130
|
+
});
|
|
131
|
+
const call = fetchSpy.mock.calls[0];
|
|
132
|
+
expect(await getRequestBody(call)).toEqual({ description: null });
|
|
133
|
+
});
|
|
134
|
+
it('delete_skill surfaces a non-2xx as a tool error instead of success', async () => {
|
|
135
|
+
fetchSpy.mockResolvedValueOnce(mockResponse({ message: 'Skill not found' }, 404, 'Not Found'));
|
|
136
|
+
const result = await client.callTool({
|
|
137
|
+
name: 'delete_skill',
|
|
138
|
+
arguments: { skill_id: SKILL_ID },
|
|
139
|
+
});
|
|
140
|
+
expect(fetchSpy).toHaveBeenCalledOnce();
|
|
141
|
+
expect(result.isError).toBe(true);
|
|
142
|
+
expect(JSON.stringify(result.content)).toContain('404');
|
|
143
|
+
});
|
|
144
|
+
it('delete_skill DELETEs /skills/{skill_id} and reports success', async () => {
|
|
145
|
+
fetchSpy.mockResolvedValueOnce(mockResponse(null, 204, 'No Content'));
|
|
146
|
+
const result = await client.callTool({
|
|
147
|
+
name: 'delete_skill',
|
|
148
|
+
arguments: { skill_id: SKILL_ID },
|
|
149
|
+
});
|
|
150
|
+
const call = fetchSpy.mock.calls[0];
|
|
151
|
+
expect(getRequestUrl(call)).toBe(`https://api.test.com/skills/${SKILL_ID}`);
|
|
152
|
+
expect(getRequestMethod(call)).toBe('DELETE');
|
|
153
|
+
expect(contentJson(result.content)).toEqual({ success: true, skill_id: SKILL_ID });
|
|
154
|
+
});
|
|
155
|
+
it('get_user_skills GETs /skills/users/{user_id}', async () => {
|
|
156
|
+
fetchSpy.mockResolvedValueOnce(mockResponse([skill]));
|
|
157
|
+
const result = await client.callTool({ name: 'get_user_skills', arguments: { user_id: 7 } });
|
|
158
|
+
const call = fetchSpy.mock.calls[0];
|
|
159
|
+
expect(getRequestUrl(call)).toBe('https://api.test.com/skills/users/7');
|
|
160
|
+
expect(getRequestMethod(call)).toBe('GET');
|
|
161
|
+
expect(contentJson(result.content)).toEqual([skill]);
|
|
162
|
+
});
|
|
163
|
+
it('set_user_skills PUTs the full skill_ids set', async () => {
|
|
164
|
+
fetchSpy.mockResolvedValueOnce(mockResponse([skill]));
|
|
165
|
+
await client.callTool({
|
|
166
|
+
name: 'set_user_skills',
|
|
167
|
+
arguments: { user_id: 7, skill_ids: [SKILL_ID] },
|
|
168
|
+
});
|
|
169
|
+
const call = fetchSpy.mock.calls[0];
|
|
170
|
+
expect(getRequestUrl(call)).toBe('https://api.test.com/skills/users/7');
|
|
171
|
+
expect(getRequestMethod(call)).toBe('PUT');
|
|
172
|
+
expect(await getRequestBody(call)).toEqual({ skill_ids: [SKILL_ID] });
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
//# sourceMappingURL=skills.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.spec.js","sourceRoot":"","sources":["../src/skills.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { OpenCXClient } from '../api-client.js';
|
|
3
|
+
export declare function registerCampaignPersonalizationTools(server: McpServer, client: OpenCXClient): void;
|
|
4
|
+
//# sourceMappingURL=campaign-personalization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"campaign-personalization.d.ts","sourceRoot":"","sources":["../../src/tools/campaign-personalization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAqErD,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAgH3F"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ApiError, jsonContent } from '../api-client.js';
|
|
3
|
+
// Per-person step personalization: preview what ONE person will receive at a
|
|
4
|
+
// step, hand-write their version, or return them to the template. The same
|
|
5
|
+
// services the dashboard's Steps tab uses — parity by construction.
|
|
6
|
+
//
|
|
7
|
+
// THE RULE, worth stating where every tool reads it: personalizing is the
|
|
8
|
+
// USER's move, never the agent's. These tools run only when the user asked
|
|
9
|
+
// for a specific person (or named specific people) — never sweep an audience
|
|
10
|
+
// personalizing on the agent's own judgment, however good the idea seems.
|
|
11
|
+
// One person asked for = one write.
|
|
12
|
+
const stepAddress = {
|
|
13
|
+
sequence_id: z.string().uuid().describe('The sequence.'),
|
|
14
|
+
contact_id: z.string().uuid().describe("The person's contact id (from list_sequence_contacts)."),
|
|
15
|
+
step_index: z.number().int().min(0).describe('The step, 0-based.'),
|
|
16
|
+
};
|
|
17
|
+
const emailContent = z
|
|
18
|
+
.object({
|
|
19
|
+
type: z.literal('email'),
|
|
20
|
+
subject: z
|
|
21
|
+
.string()
|
|
22
|
+
.min(1)
|
|
23
|
+
.max(998)
|
|
24
|
+
.describe('Single line, no line breaks, no {{tokens}} at all — {{signature}} is body-only.'),
|
|
25
|
+
html: z
|
|
26
|
+
.string()
|
|
27
|
+
.min(1)
|
|
28
|
+
.max(65_536)
|
|
29
|
+
.describe('The FULL message this person gets, ready to send — not a template: no {{tokens}} ' +
|
|
30
|
+
'except the literal {{signature}}, which stays and is filled by the sending mailbox. ' +
|
|
31
|
+
'Max 64KB.'),
|
|
32
|
+
})
|
|
33
|
+
.describe('Email: a hand-written subject + body. The text alternative is derived server-side.');
|
|
34
|
+
const voiceContent = z
|
|
35
|
+
.object({
|
|
36
|
+
type: z.literal('voice_call'),
|
|
37
|
+
extra_instructions: z
|
|
38
|
+
.string()
|
|
39
|
+
.min(1)
|
|
40
|
+
.max(10_000)
|
|
41
|
+
.nullable()
|
|
42
|
+
.describe("The call brief the agent gets for THIS person, verbatim — or null for 'no brief: the " +
|
|
43
|
+
"agent's own persona carries the whole call', which is a deliberate choice."),
|
|
44
|
+
})
|
|
45
|
+
.describe('Voice: a per-person call brief.');
|
|
46
|
+
const whatsappContent = z
|
|
47
|
+
.object({
|
|
48
|
+
type: z.literal('whatsapp_template'),
|
|
49
|
+
template_name: z
|
|
50
|
+
.string()
|
|
51
|
+
.min(1)
|
|
52
|
+
.describe("The step's OWN template — changing it is authoring, not personalization."),
|
|
53
|
+
template_language: z.string().min(1),
|
|
54
|
+
values: z
|
|
55
|
+
.record(z.string().regex(/^\d+$/), z.string().min(1).max(1024))
|
|
56
|
+
.describe('Literal slot values, e.g. {"1": "Ahmed"} — every slot the template has, no extras.'),
|
|
57
|
+
})
|
|
58
|
+
.describe("WhatsApp: the same template with this person's literal slot values.");
|
|
59
|
+
export function registerCampaignPersonalizationTools(server, client) {
|
|
60
|
+
server.registerTool('preview_sequence_step_for_person', {
|
|
61
|
+
description: 'What ONE person will receive at a step — rendered by the same code the send path runs: ' +
|
|
62
|
+
'the template filled in for them, their personalization if they have one, or (once sent) ' +
|
|
63
|
+
'the record of what actually went out. Also answers whether the step is still editable ' +
|
|
64
|
+
'for them (`editable`) and whether a stored personalization went stale. ALWAYS preview ' +
|
|
65
|
+
'before writing: it is the only way to quote their current version back to the user.',
|
|
66
|
+
inputSchema: stepAddress,
|
|
67
|
+
}, async (params) => {
|
|
68
|
+
try {
|
|
69
|
+
const { data } = await client.GET('/sequences/{sequenceId}/contacts/{contactId}/steps/{stepIndex}/preview', {
|
|
70
|
+
params: {
|
|
71
|
+
path: {
|
|
72
|
+
sequenceId: params.sequence_id,
|
|
73
|
+
contactId: params.contact_id,
|
|
74
|
+
stepIndex: params.step_index,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
return jsonContent(data);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
if (e instanceof ApiError)
|
|
82
|
+
return jsonContent({ ok: false, status: e.status, error: e.body });
|
|
83
|
+
throw e;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
server.registerTool('personalize_sequence_step', {
|
|
87
|
+
description: 'Hand-write what ONE person receives at ONE step, replacing the template for them only ' +
|
|
88
|
+
'(a rendered snapshot — it survives later template edits). USER-INITIATED ONLY: call ' +
|
|
89
|
+
'this when the user asked to personalize for this specific person; NEVER sweep an ' +
|
|
90
|
+
'audience personalizing on your own judgment, and treat "personalize for everyone who…" ' +
|
|
91
|
+
'as N explicit confirmations to collect, not one. Refused (with the reason) for steps ' +
|
|
92
|
+
'the person already passed, sends in flight, or an ended journey. Writing one un-parks ' +
|
|
93
|
+
'a person parked for missing data — but the response separates `unparked` from `armed`: ' +
|
|
94
|
+
'armed=false means released yet nothing sends until a judgment or the cutoff arms them, ' +
|
|
95
|
+
'so report which happened. The content must be COMPLETE — render it yourself; no ' +
|
|
96
|
+
"{{tokens}} except email's literal {{signature}}, in the BODY only.",
|
|
97
|
+
inputSchema: {
|
|
98
|
+
...stepAddress,
|
|
99
|
+
content: z
|
|
100
|
+
.discriminatedUnion('type', [emailContent, voiceContent, whatsappContent])
|
|
101
|
+
.describe("Must match the step's channel."),
|
|
102
|
+
},
|
|
103
|
+
}, async (params) => {
|
|
104
|
+
try {
|
|
105
|
+
const { data } = await client.PUT('/sequences/{sequenceId}/contacts/{contactId}/steps/{stepIndex}/personalization', {
|
|
106
|
+
params: {
|
|
107
|
+
path: {
|
|
108
|
+
sequenceId: params.sequence_id,
|
|
109
|
+
contactId: params.contact_id,
|
|
110
|
+
stepIndex: params.step_index,
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
body: { content: params.content },
|
|
114
|
+
});
|
|
115
|
+
return jsonContent(data);
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
if (e instanceof ApiError)
|
|
119
|
+
return jsonContent({ ok: false, status: e.status, error: e.body });
|
|
120
|
+
throw e;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
server.registerTool('clear_sequence_step_personalization', {
|
|
124
|
+
description: "Remove ONE person's hand-written version of a step — they go back to receiving the " +
|
|
125
|
+
'template. USER-INITIATED ONLY, same as writing one. The response only confirms the ' +
|
|
126
|
+
'clear; if the user may want their words back, preview FIRST and quote them before ' +
|
|
127
|
+
'clearing.',
|
|
128
|
+
inputSchema: stepAddress,
|
|
129
|
+
}, async (params) => {
|
|
130
|
+
try {
|
|
131
|
+
const { data } = await client.DELETE('/sequences/{sequenceId}/contacts/{contactId}/steps/{stepIndex}/personalization', {
|
|
132
|
+
params: {
|
|
133
|
+
path: {
|
|
134
|
+
sequenceId: params.sequence_id,
|
|
135
|
+
contactId: params.contact_id,
|
|
136
|
+
stepIndex: params.step_index,
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
return jsonContent(data);
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
if (e instanceof ApiError)
|
|
144
|
+
return jsonContent({ ok: false, status: e.status, error: e.body });
|
|
145
|
+
throw e;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=campaign-personalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"campaign-personalization.js","sourceRoot":"","sources":["../../src/tools/campaign-personalization.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGzD,6EAA6E;AAC7E,2EAA2E;AAC3E,oEAAoE;AACpE,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,6EAA6E;AAC7E,0EAA0E;AAC1E,oCAAoC;AAEpC,MAAM,WAAW,GAAG;IAClB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IACxD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IAChG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;CACnE,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC;KACnB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACxB,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,CAAC,iFAAiF,CAAC;IAC9F,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,MAAM,CAAC;SACX,QAAQ,CACP,mFAAmF;QACjF,sFAAsF;QACtF,WAAW,CACd;CACJ,CAAC;KACD,QAAQ,CAAC,oFAAoF,CAAC,CAAC;AAElG,MAAM,YAAY,GAAG,CAAC;KACnB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC7B,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,MAAM,CAAC;SACX,QAAQ,EAAE;SACV,QAAQ,CACP,uFAAuF;QACrF,4EAA4E,CAC/E;CACJ,CAAC;KACD,QAAQ,CAAC,iCAAiC,CAAC,CAAC;AAE/C,MAAM,eAAe,GAAG,CAAC;KACtB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACpC,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,0EAA0E,CAAC;IACvF,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC;SACN,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SAC9D,QAAQ,CACP,oFAAoF,CACrF;CACJ,CAAC;KACD,QAAQ,CAAC,qEAAqE,CAAC,CAAC;AAEnF,MAAM,UAAU,oCAAoC,CAAC,MAAiB,EAAE,MAAoB;IAC1F,MAAM,CAAC,YAAY,CACjB,kCAAkC,EAClC;QACE,WAAW,EACT,yFAAyF;YACzF,0FAA0F;YAC1F,wFAAwF;YACxF,wFAAwF;YACxF,qFAAqF;QACvF,WAAW,EAAE,WAAW;KACzB,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,wEAAwE,EACxE;gBACE,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,UAAU,EAAE,MAAM,CAAC,WAAW;wBAC9B,SAAS,EAAE,MAAM,CAAC,UAAU;wBAC5B,SAAS,EAAE,MAAM,CAAC,UAAU;qBAC7B;iBACF;aACF,CACF,CAAC;YACF,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,QAAQ;gBACvB,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,WAAW,EACT,wFAAwF;YACxF,sFAAsF;YACtF,mFAAmF;YACnF,yFAAyF;YACzF,uFAAuF;YACvF,wFAAwF;YACxF,yFAAyF;YACzF,yFAAyF;YACzF,kFAAkF;YAClF,oEAAoE;QACtE,WAAW,EAAE;YACX,GAAG,WAAW;YACd,OAAO,EAAE,CAAC;iBACP,kBAAkB,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;iBACzE,QAAQ,CAAC,gCAAgC,CAAC;SAC9C;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,gFAAgF,EAChF;gBACE,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,UAAU,EAAE,MAAM,CAAC,WAAW;wBAC9B,SAAS,EAAE,MAAM,CAAC,UAAU;wBAC5B,SAAS,EAAE,MAAM,CAAC,UAAU;qBAC7B;iBACF;gBACD,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;aAClC,CACF,CAAC;YACF,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,QAAQ;gBACvB,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,qCAAqC,EACrC;QACE,WAAW,EACT,qFAAqF;YACrF,qFAAqF;YACrF,oFAAoF;YACpF,WAAW;QACb,WAAW,EAAE,WAAW;KACzB,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAClC,gFAAgF,EAChF;gBACE,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,UAAU,EAAE,MAAM,CAAC,WAAW;wBAC9B,SAAS,EAAE,MAAM,CAAC,UAAU;wBAC5B,SAAS,EAAE,MAAM,CAAC,UAAU;qBAC7B;iBACF;aACF,CACF,CAAC;YACF,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,QAAQ;gBACvB,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/tools/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAarD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAgHzE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonContent } from '../api-client.js';
|
|
3
|
+
const ROUTING_NOTE = 'Skills drive skills-based routing: a session carries required skills (set only by the "Assign Skills to Ticket" workflow action — there is no tool to set them directly), and when "Assign Ticket to Support Team" / "Auto Assign to Support Team" runs with skill-based routing enabled, only team members holding every required skill are eligible. Load the "skills-routing" skill for the full setup.';
|
|
4
|
+
const skillDescriptionField = z
|
|
5
|
+
.string()
|
|
6
|
+
.nullable()
|
|
7
|
+
.optional()
|
|
8
|
+
.describe('What the skill covers, written as the condition under which a session needs it (e.g. "Billing disputes, refunds, invoice questions"). AI workflow steps read this via {{routingSkills}} to decide which skills to put on a session, so keep it concrete.');
|
|
9
|
+
export function registerSkillTools(server, client) {
|
|
10
|
+
server.registerTool('list_skills', {
|
|
11
|
+
description: `List every routing skill defined for the organization, newest first. ${ROUTING_NOTE}`,
|
|
12
|
+
}, async () => {
|
|
13
|
+
const data = (await client.GET('/skills')).data;
|
|
14
|
+
return jsonContent(data);
|
|
15
|
+
});
|
|
16
|
+
server.registerTool('get_skill', {
|
|
17
|
+
description: 'Get a single routing skill by ID.',
|
|
18
|
+
inputSchema: {
|
|
19
|
+
skill_id: z.string().uuid().describe('Skill ID'),
|
|
20
|
+
},
|
|
21
|
+
}, async ({ skill_id }) => {
|
|
22
|
+
const data = (await client.GET('/skills/{skill_id}', { params: { path: { skill_id } } }))
|
|
23
|
+
.data;
|
|
24
|
+
return jsonContent(data);
|
|
25
|
+
});
|
|
26
|
+
server.registerTool('create_skill', {
|
|
27
|
+
description: `Create a routing skill. Names are unique per organization (case-insensitive). Always provide a description — it is what the AI reads when deciding which skills a session needs. ${ROUTING_NOTE}`,
|
|
28
|
+
inputSchema: {
|
|
29
|
+
name: z.string().min(1).describe('Skill name (e.g. "billing", "spanish", "enterprise")'),
|
|
30
|
+
description: skillDescriptionField,
|
|
31
|
+
},
|
|
32
|
+
}, async (body) => {
|
|
33
|
+
const data = (await client.POST('/skills', { body })).data;
|
|
34
|
+
return jsonContent(data);
|
|
35
|
+
});
|
|
36
|
+
server.registerTool('update_skill', {
|
|
37
|
+
description: 'Rename a routing skill and/or change its description. Only provided fields change. Renaming is safe: agents and sessions reference skills by ID.',
|
|
38
|
+
inputSchema: {
|
|
39
|
+
skill_id: z.string().uuid().describe('Skill ID'),
|
|
40
|
+
name: z.string().min(1).optional().describe('New skill name'),
|
|
41
|
+
description: skillDescriptionField,
|
|
42
|
+
},
|
|
43
|
+
}, async ({ skill_id, ...body }) => {
|
|
44
|
+
const data = (await client.PATCH('/skills/{skill_id}', { params: { path: { skill_id } }, body })).data;
|
|
45
|
+
return jsonContent(data);
|
|
46
|
+
});
|
|
47
|
+
server.registerTool('delete_skill', {
|
|
48
|
+
description: 'Delete a routing skill. Agents that held it and sessions that required it simply stop referencing it. Confirm with the user first — a deleted skill silently loosens routing for every session that required it.',
|
|
49
|
+
inputSchema: {
|
|
50
|
+
skill_id: z.string().uuid().describe('Skill ID'),
|
|
51
|
+
},
|
|
52
|
+
}, async ({ skill_id }) => {
|
|
53
|
+
await client.DELETE('/skills/{skill_id}', { params: { path: { skill_id } } });
|
|
54
|
+
return jsonContent({ success: true, skill_id });
|
|
55
|
+
});
|
|
56
|
+
server.registerTool('get_user_skills', {
|
|
57
|
+
description: 'List the routing skills an organization member (agent) holds. Use list_org_users to find the user ID.',
|
|
58
|
+
inputSchema: {
|
|
59
|
+
user_id: z.number().int().positive().describe('Organization user ID'),
|
|
60
|
+
},
|
|
61
|
+
}, async ({ user_id }) => {
|
|
62
|
+
const data = (await client.GET('/skills/users/{user_id}', { params: { path: { user_id } } }))
|
|
63
|
+
.data;
|
|
64
|
+
return jsonContent(data);
|
|
65
|
+
});
|
|
66
|
+
server.registerTool('set_user_skills', {
|
|
67
|
+
description: 'Replace the full set of routing skills an organization member (agent) holds. Skills not in skill_ids are REMOVED — call get_user_skills first and merge when adding. Every ID must be a skill of this organization. Returns the resolved skills now assigned.',
|
|
68
|
+
inputSchema: {
|
|
69
|
+
user_id: z.number().int().positive().describe('Organization user ID'),
|
|
70
|
+
skill_ids: z.array(z.string().uuid()).describe('The complete set of skill IDs to hold'),
|
|
71
|
+
},
|
|
72
|
+
}, async ({ user_id, skill_ids }) => {
|
|
73
|
+
const data = (await client.PUT('/skills/users/{user_id}', {
|
|
74
|
+
params: { path: { user_id } },
|
|
75
|
+
body: { skill_ids },
|
|
76
|
+
})).data;
|
|
77
|
+
return jsonContent(data);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/tools/skills.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED