@opencx/mcp 1.15.25 → 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/salesforce-ai-reply-templates.spec.js +58 -0
- package/dist/salesforce-ai-reply-templates.spec.js.map +1 -1
- package/dist/schema.d.ts +1137 -112
- package/dist/schema.d.ts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +6 -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/custom-statuses.d.ts +4 -0
- package/dist/tools/custom-statuses.d.ts.map +1 -0
- package/dist/tools/custom-statuses.js +107 -0
- package/dist/tools/custom-statuses.js.map +1 -0
- package/dist/tools/salesforce-ai-reply-templates.d.ts.map +1 -1
- package/dist/tools/salesforce-ai-reply-templates.js +19 -5
- package/dist/tools/salesforce-ai-reply-templates.js.map +1 -1
- package/dist/tools/sessions.d.ts.map +1 -1
- package/dist/tools/sessions.js +31 -0
- package/dist/tools/sessions.js.map +1 -1
- 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,8 @@ 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';
|
|
30
|
+
import { registerCustomStatusTools } from './tools/custom-statuses.js';
|
|
29
31
|
import { registerStructuredFieldTools } from './tools/structured-fields.js';
|
|
30
32
|
import { registerCsatTools } from './tools/csat.js';
|
|
31
33
|
import { registerWhatsAppTools } from './tools/whatsapp.js';
|
|
@@ -38,6 +40,7 @@ import { registerCampaignDiscoveryTools } from './tools/campaign-discovery.js';
|
|
|
38
40
|
import { registerCampaignQualificationTools } from './tools/campaign-qualification.js';
|
|
39
41
|
import { registerCampaignChannelTools } from './tools/campaign-channel.js';
|
|
40
42
|
import { registerCampaignSpineTools } from './tools/campaign-spine.js';
|
|
43
|
+
import { registerCampaignPersonalizationTools } from './tools/campaign-personalization.js';
|
|
41
44
|
import { registerSlaAnalyticsTools } from './tools/sla-analytics.js';
|
|
42
45
|
import { registerCoworkerTools } from './tools/coworker.js';
|
|
43
46
|
import { registerWorkflowTools } from './tools/workflows.js';
|
|
@@ -83,6 +86,8 @@ export function createServer(apiKey, baseUrl, options = {}) {
|
|
|
83
86
|
registerSlaTools(server, client);
|
|
84
87
|
registerOfficeHoursTools(server, client);
|
|
85
88
|
registerTagTools(server, client);
|
|
89
|
+
registerSkillTools(server, client);
|
|
90
|
+
registerCustomStatusTools(server, client);
|
|
86
91
|
registerStructuredFieldTools(server, client);
|
|
87
92
|
registerCsatTools(server, client);
|
|
88
93
|
registerWhatsAppTools(server, client);
|
|
@@ -95,6 +100,7 @@ export function createServer(apiKey, baseUrl, options = {}) {
|
|
|
95
100
|
registerCampaignQualificationTools(server, client);
|
|
96
101
|
registerCampaignChannelTools(server, client);
|
|
97
102
|
registerCampaignSpineTools(server, client);
|
|
103
|
+
registerCampaignPersonalizationTools(server, client);
|
|
98
104
|
registerSlaAnalyticsTools(server, client);
|
|
99
105
|
registerWorkflowTools(server, client);
|
|
100
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":"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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 registerCustomStatusTools(server: McpServer, client: OpenCXClient): void;
|
|
4
|
+
//# sourceMappingURL=custom-statuses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-statuses.d.ts","sourceRoot":"","sources":["../../src/tools/custom-statuses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQrD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAsIhF"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonContent } from '../api-client.js';
|
|
3
|
+
const parentStatusSchema = z.enum(['open', 'closed_resolved', 'closed_unresolved']);
|
|
4
|
+
const hexColorSchema = z.string().regex(/^#[0-9a-fA-F]{6}$/, 'Expected #RRGGBB');
|
|
5
|
+
const PARENT_STATUS_DESCRIPTION = 'Built-in status this custom status refines: "open", "closed_resolved", or "closed_unresolved". Applying the custom status to a session (set_session_sub_status) moves the session to this built-in status — an "open"-parented status reopens a closed session, a "closed_*"-parented one closes it.';
|
|
6
|
+
export function registerCustomStatusTools(server, client) {
|
|
7
|
+
server.registerTool('list_custom_statuses', {
|
|
8
|
+
description: 'List the custom session statuses defined for the organization. A custom status refines one of the built-in statuses (open / closed_resolved / closed_unresolved) with an agent-facing name and optional customer-facing label, color, and icon. Sessions reference one by id in `sub_status_id`; use this to resolve that id to a name, or to pick an id for set_session_sub_status / filter_sessions.',
|
|
9
|
+
}, async () => {
|
|
10
|
+
const data = (await client.GET('/custom-statuses')).data;
|
|
11
|
+
return jsonContent(data);
|
|
12
|
+
});
|
|
13
|
+
server.registerTool('get_custom_status', {
|
|
14
|
+
description: 'Get one custom session status by id.',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
id: z.string().uuid().describe('The custom status id'),
|
|
17
|
+
},
|
|
18
|
+
}, async ({ id }) => {
|
|
19
|
+
const data = (await client.GET('/custom-statuses/{id}', { params: { path: { id } } })).data;
|
|
20
|
+
return jsonContent(data);
|
|
21
|
+
});
|
|
22
|
+
server.registerTool('create_custom_status', {
|
|
23
|
+
description: 'Create a custom session status under a built-in parent status. Names are unique per organization. Once created, apply it to sessions with set_session_sub_status.',
|
|
24
|
+
inputSchema: {
|
|
25
|
+
name: z
|
|
26
|
+
.string()
|
|
27
|
+
.trim()
|
|
28
|
+
.min(1)
|
|
29
|
+
.max(100)
|
|
30
|
+
.describe('Internal name shown to agents in the inbox (unique per org, 1-100 chars)'),
|
|
31
|
+
description: z
|
|
32
|
+
.string()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('Internal note for agents on when to use this status. Never shown to customers.'),
|
|
35
|
+
parent_status: parentStatusSchema.describe(PARENT_STATUS_DESCRIPTION),
|
|
36
|
+
display_name: z
|
|
37
|
+
.string()
|
|
38
|
+
.max(100)
|
|
39
|
+
.optional()
|
|
40
|
+
.describe('Customer-facing label (max 100 chars). Falls back to `name` when omitted.'),
|
|
41
|
+
display_description: z
|
|
42
|
+
.string()
|
|
43
|
+
.optional()
|
|
44
|
+
.describe('Customer-facing explanation. No fallback: when omitted, customers see no description.'),
|
|
45
|
+
color: hexColorSchema
|
|
46
|
+
.optional()
|
|
47
|
+
.describe('Badge color as #RRGGBB. Omit to inherit the parent status color.'),
|
|
48
|
+
icon: z
|
|
49
|
+
.string()
|
|
50
|
+
.optional()
|
|
51
|
+
.describe('Inline SVG markup for the badge icon (sanitized server-side). Omit for the default icon.'),
|
|
52
|
+
},
|
|
53
|
+
}, async (body) => {
|
|
54
|
+
const data = (await client.POST('/custom-statuses', { body })).data;
|
|
55
|
+
return jsonContent(data);
|
|
56
|
+
});
|
|
57
|
+
server.registerTool('update_custom_status', {
|
|
58
|
+
description: 'Update any subset of a custom status. Omitted fields are left unchanged; pass null for display_name, display_description, color, or icon to clear them. Sessions already carrying the status keep it. Moving a status across the open/closed boundary drops its ticketing-system stage mappings.',
|
|
59
|
+
inputSchema: {
|
|
60
|
+
id: z.string().uuid().describe('The custom status id to update'),
|
|
61
|
+
name: z
|
|
62
|
+
.string()
|
|
63
|
+
.trim()
|
|
64
|
+
.min(1)
|
|
65
|
+
.max(100)
|
|
66
|
+
.optional()
|
|
67
|
+
.describe('New internal name (unique per org, 1-100 chars)'),
|
|
68
|
+
description: z.string().optional().describe('New internal note for agents'),
|
|
69
|
+
parent_status: parentStatusSchema.optional().describe(PARENT_STATUS_DESCRIPTION),
|
|
70
|
+
display_name: z
|
|
71
|
+
.string()
|
|
72
|
+
.max(100)
|
|
73
|
+
.nullable()
|
|
74
|
+
.optional()
|
|
75
|
+
.describe('Customer-facing label; null clears it back to `name`'),
|
|
76
|
+
display_description: z
|
|
77
|
+
.string()
|
|
78
|
+
.nullable()
|
|
79
|
+
.optional()
|
|
80
|
+
.describe('Customer-facing explanation; null clears it'),
|
|
81
|
+
color: hexColorSchema
|
|
82
|
+
.nullable()
|
|
83
|
+
.optional()
|
|
84
|
+
.describe('Badge color as #RRGGBB; null restores the parent status color'),
|
|
85
|
+
icon: z
|
|
86
|
+
.string()
|
|
87
|
+
.nullable()
|
|
88
|
+
.optional()
|
|
89
|
+
.describe('Inline SVG markup for the badge icon; null restores the default icon'),
|
|
90
|
+
},
|
|
91
|
+
}, async ({ id, ...body }) => {
|
|
92
|
+
const data = (await client.PATCH('/custom-statuses/{id}', { params: { path: { id } }, body }))
|
|
93
|
+
.data;
|
|
94
|
+
return jsonContent(data);
|
|
95
|
+
});
|
|
96
|
+
server.registerTool('delete_custom_status', {
|
|
97
|
+
description: 'Delete a custom status. Sessions that carried it fall back to their built-in status (sub_status_id becomes null); their timeline history keeps the id.',
|
|
98
|
+
inputSchema: {
|
|
99
|
+
id: z.string().uuid().describe('The custom status id to delete'),
|
|
100
|
+
},
|
|
101
|
+
}, async ({ id }) => {
|
|
102
|
+
const data = (await client.DELETE('/custom-statuses/{id}', { params: { path: { id } } }))
|
|
103
|
+
.data;
|
|
104
|
+
return jsonContent(data);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=custom-statuses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-statuses.js","sourceRoot":"","sources":["../../src/tools/custom-statuses.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"salesforce-ai-reply-templates.d.ts","sourceRoot":"","sources":["../../src/tools/salesforce-ai-reply-templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"salesforce-ai-reply-templates.d.ts","sourceRoot":"","sources":["../../src/tools/salesforce-ai-reply-templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAyCrD,wBAAgB,sCAAsC,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAiH7F"}
|