@opencx/mcp 1.15.16 → 1.15.22
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.d.ts +2 -0
- package/dist/campaign-tools.spec.d.ts.map +1 -0
- package/dist/campaign-tools.spec.js +508 -0
- package/dist/campaign-tools.spec.js.map +1 -0
- package/dist/phone-caller-number-tool.spec.d.ts +2 -0
- package/dist/phone-caller-number-tool.spec.d.ts.map +1 -0
- package/dist/phone-caller-number-tool.spec.js +97 -0
- package/dist/phone-caller-number-tool.spec.js.map +1 -0
- package/dist/schema.d.ts +10802 -7640
- package/dist/schema.d.ts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +12 -2
- package/dist/server.js.map +1 -1
- package/dist/slack-tools.spec.d.ts +2 -0
- package/dist/slack-tools.spec.d.ts.map +1 -0
- package/dist/slack-tools.spec.js +148 -0
- package/dist/slack-tools.spec.js.map +1 -0
- package/dist/tools/campaign-channel.d.ts +4 -0
- package/dist/tools/campaign-channel.d.ts.map +1 -0
- package/dist/tools/campaign-channel.js +250 -0
- package/dist/tools/campaign-channel.js.map +1 -0
- package/dist/tools/campaign-discovery.d.ts +4 -0
- package/dist/tools/campaign-discovery.d.ts.map +1 -0
- package/dist/tools/campaign-discovery.js +70 -0
- package/dist/tools/campaign-discovery.js.map +1 -0
- package/dist/tools/campaign-qualification.d.ts +4 -0
- package/dist/tools/campaign-qualification.d.ts.map +1 -0
- package/dist/tools/campaign-qualification.js +289 -0
- package/dist/tools/campaign-qualification.js.map +1 -0
- package/dist/tools/campaign-spine.d.ts +4 -0
- package/dist/tools/campaign-spine.d.ts.map +1 -0
- package/dist/tools/campaign-spine.js +630 -0
- package/dist/tools/campaign-spine.js.map +1 -0
- package/dist/tools/macros.js +1 -1
- package/dist/tools/macros.js.map +1 -1
- package/dist/tools/media.js +1 -1
- package/dist/tools/media.js.map +1 -1
- package/dist/tools/phone.d.ts.map +1 -1
- package/dist/tools/phone.js +54 -2
- package/dist/tools/phone.js.map +1 -1
- package/dist/tools/reports.d.ts.map +1 -1
- package/dist/tools/reports.js +1 -0
- package/dist/tools/reports.js.map +1 -1
- package/dist/tools/sessions.js +1 -1
- package/dist/tools/sessions.js.map +1 -1
- package/dist/tools/sla.d.ts.map +1 -1
- package/dist/tools/sla.js +3 -3
- package/dist/tools/sla.js.map +1 -1
- package/dist/tools/slack.d.ts +4 -0
- package/dist/tools/slack.d.ts.map +1 -0
- package/dist/tools/slack.js +76 -0
- package/dist/tools/slack.js.map +1 -0
- package/dist/tools/structured-fields.d.ts +4 -0
- package/dist/tools/structured-fields.d.ts.map +1 -0
- package/dist/tools/structured-fields.js +107 -0
- package/dist/tools/structured-fields.js.map +1 -0
- package/dist/utils/session-channel.d.ts +2 -2
- package/dist/utils/session-channel.d.ts.map +1 -1
- package/dist/utils/session-channel.js +1 -0
- package/dist/utils/session-channel.js.map +1 -1
- package/package.json +1 -1
- package/dist/tools/sequences.d.ts +0 -4
- package/dist/tools/sequences.d.ts.map +0 -1
- package/dist/tools/sequences.js +0 -182
- package/dist/tools/sequences.js.map +0 -1
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ApiError, jsonContent } from '../api-client.js';
|
|
3
|
+
const scopeSchema = z
|
|
4
|
+
.union([
|
|
5
|
+
z.object({
|
|
6
|
+
kind: z.literal('batch_key'),
|
|
7
|
+
batch_key: z.string().describe('The wave label passed at enroll time.'),
|
|
8
|
+
}),
|
|
9
|
+
z.object({
|
|
10
|
+
kind: z.literal('contact_ids'),
|
|
11
|
+
contact_ids: z
|
|
12
|
+
.array(z.string())
|
|
13
|
+
.min(1)
|
|
14
|
+
.max(10_000)
|
|
15
|
+
.describe('Contact ids — from enroll results or list_sequence_contacts.'),
|
|
16
|
+
}),
|
|
17
|
+
z.object({ kind: z.literal('all_candidates') }),
|
|
18
|
+
])
|
|
19
|
+
.describe('Which of the sequence\'s people to cover: a labeled enrollment wave ("batch_key"), an ' +
|
|
20
|
+
'explicit contact-id set, or every non-exited person ("all_candidates").');
|
|
21
|
+
// A criterion is TWO fields with two different readers. `label` is what the
|
|
22
|
+
// user scans in the dashboard — a few words, like a column name. `text` is the
|
|
23
|
+
// instruction YOU are judged by, and it has to be long and exact, because a
|
|
24
|
+
// criterion without a stated boundary returns different verdicts over identical
|
|
25
|
+
// evidence. Writing one string for both jobs makes it either too vague to judge
|
|
26
|
+
// or too long to read.
|
|
27
|
+
const criterionLabel = z
|
|
28
|
+
.string()
|
|
29
|
+
.min(2)
|
|
30
|
+
.max(60)
|
|
31
|
+
.describe('A few words naming this criterion, shown in the dashboard: "Recent invoicing complaint", "Business account". Not a sentence, no trailing period.');
|
|
32
|
+
const criterionText = z
|
|
33
|
+
.string()
|
|
34
|
+
.min(3)
|
|
35
|
+
.max(500)
|
|
36
|
+
.describe('The full instruction the judge reads. State the boundary explicitly — what counts and what does not. Never shown in the table, so length costs nothing here.');
|
|
37
|
+
const criteriaSchema = z
|
|
38
|
+
.object({
|
|
39
|
+
must: z
|
|
40
|
+
.array(z.object({ label: criterionLabel, text: criterionText }))
|
|
41
|
+
.max(20)
|
|
42
|
+
.describe('Binary gates — ANY fail or unsure disqualifies (fit ≤ 74, held from launch).'),
|
|
43
|
+
nice: z
|
|
44
|
+
.array(z.object({
|
|
45
|
+
label: criterionLabel,
|
|
46
|
+
text: criterionText,
|
|
47
|
+
grade: z.enum(['high', 'medium', 'low']).describe('Rank weight 3/2/1 — never gates.'),
|
|
48
|
+
}))
|
|
49
|
+
.max(20),
|
|
50
|
+
})
|
|
51
|
+
.describe("The qualification checklist, written from the user's own words for this sequence.");
|
|
52
|
+
// Awaiting is for the SAMPLE loop (enrich 25 → judge 25 → read aggregates →
|
|
53
|
+
// fix a criterion → re-judge), which only works if the result lands in the same
|
|
54
|
+
// turn. The 50-person ceiling is enforced server-side, not trusted to a prompt:
|
|
55
|
+
// a population is ten minutes of work the dashboard already streams live, and
|
|
56
|
+
// holding the turn open for it buys nothing.
|
|
57
|
+
const waitSchema = z
|
|
58
|
+
.boolean()
|
|
59
|
+
.optional()
|
|
60
|
+
.describe('Hold the response until the run finishes (up to ~50s) and return it in `run`. Use for a ' +
|
|
61
|
+
'sample you need to reason about NOW. Silently ignored above 50 people — those come back ' +
|
|
62
|
+
'as an immediate ack and stream into the dashboard.');
|
|
63
|
+
export function registerCampaignQualificationTools(server, client) {
|
|
64
|
+
server.registerTool('enrich_people', {
|
|
65
|
+
description: 'Snapshot everything the org knows about scoped sequence people (profile, latest ' +
|
|
66
|
+
'sessions, VOC insights, compacted transcripts) onto their rows — the evidence the judge ' +
|
|
67
|
+
'reads. Run this BEFORE judge_people for anyone the org may know — the judge reads ' +
|
|
68
|
+
'ONLY stored data: org enrichment plus any extra_data attached at enroll (a cold list ' +
|
|
69
|
+
'with extra_data is judgeable without enriching; someone with NEITHER is skipped). ' +
|
|
70
|
+
'Pass wait:true for a sample (<=50 people) and the finished run comes back in `run`, so ' +
|
|
71
|
+
'you can enrich and judge in the same turn. Larger scopes return {run_id, scoped_count} ' +
|
|
72
|
+
'immediately and the dashboard shows them filling in live — read the result later with ' +
|
|
73
|
+
'read_qualification_run. NEVER poll this from Bash: waiting is what `wait` is for, and ' +
|
|
74
|
+
'a population is meant to run while you get on with the messages.',
|
|
75
|
+
inputSchema: {
|
|
76
|
+
sequence_id: z.string().describe('The sequence id'),
|
|
77
|
+
scope: scopeSchema,
|
|
78
|
+
wait: waitSchema,
|
|
79
|
+
},
|
|
80
|
+
}, async (params) => {
|
|
81
|
+
try {
|
|
82
|
+
const { data } = await client.POST('/sequences/{sequenceId}/enrich', {
|
|
83
|
+
params: { path: { sequenceId: params.sequence_id } },
|
|
84
|
+
body: { scope: params.scope, wait: params.wait },
|
|
85
|
+
});
|
|
86
|
+
return jsonContent(data);
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
if (e instanceof ApiError)
|
|
90
|
+
return jsonContent({ ok: false, status: e.status, error: e.body });
|
|
91
|
+
throw e;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
server.registerTool('judge_people', {
|
|
95
|
+
description: 'Judge scoped sequence people against the criteria checklist — one verdict per criterion ' +
|
|
96
|
+
'per person (pass/fail/unsure with reasoning + evidence citations), over their STORED ' +
|
|
97
|
+
'enrichment only. Rollup writes fit: 75-100 = cleared every must-have (armable), 0-74 = ' +
|
|
98
|
+
'not qualified (held; 60+ usually means one must-have short), NULL stays never-judged. ' +
|
|
99
|
+
'Judge a SAMPLE of ~25 with wait:true — the finished run comes back in `run`, and its ' +
|
|
100
|
+
'aggregates show WHERE fails and unsures concentrate, so you can fix the criterion and ' +
|
|
101
|
+
're-judge in the same turn (re-judging unchanged evidence is free). Then dispatch the ' +
|
|
102
|
+
'population WITHOUT wait and move on to the messages — the dashboard shows it filling ' +
|
|
103
|
+
'in live. NEVER poll this from Bash. People with no data at all (no enrichment AND no ' +
|
|
104
|
+
'extra_data) are skipped and counted. ' +
|
|
105
|
+
"Omit criteria to reuse the sequence's stored checklist; passing criteria also saves " +
|
|
106
|
+
"them as the sequence's new current checklist. Re-judge after every enrollment wave — " +
|
|
107
|
+
'judging is cheap by design.',
|
|
108
|
+
inputSchema: {
|
|
109
|
+
sequence_id: z.string().describe('The sequence id'),
|
|
110
|
+
scope: scopeSchema,
|
|
111
|
+
criteria: criteriaSchema.optional(),
|
|
112
|
+
wait: waitSchema,
|
|
113
|
+
},
|
|
114
|
+
}, async (params) => {
|
|
115
|
+
try {
|
|
116
|
+
const { data } = await client.POST('/sequences/{sequenceId}/judge', {
|
|
117
|
+
params: { path: { sequenceId: params.sequence_id } },
|
|
118
|
+
body: {
|
|
119
|
+
scope: params.scope,
|
|
120
|
+
wait: params.wait,
|
|
121
|
+
...(params.criteria !== undefined ? { criteria: params.criteria } : {}),
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
return jsonContent(data);
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
if (e instanceof ApiError)
|
|
128
|
+
return jsonContent({ ok: false, status: e.status, error: e.body });
|
|
129
|
+
throw e;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
server.registerTool('read_qualification_run', {
|
|
133
|
+
description: 'Read one enrich/judge run: status (queued/running/completed/failed), live counts ' +
|
|
134
|
+
'(processed, skipped_no_enrichment, qualified, disqualified, errors), and — once ' +
|
|
135
|
+
'completed — per-criterion pass/fail/unsure concentrations plus the fit distribution. ' +
|
|
136
|
+
'Counts and aggregates cover everyone judged in scope, including unchanged people the ' +
|
|
137
|
+
'run skipped for free (their stored verdicts fold in). ' +
|
|
138
|
+
'This is the audit read: reason from the aggregates, then peek 3-5 individual people via ' +
|
|
139
|
+
'list_sequence_contacts/get_sequence_contact — never page through the whole population. ' +
|
|
140
|
+
"updated_at is the run's heartbeat (touched every batch): a 'running' run whose " +
|
|
141
|
+
'updated_at is many minutes stale died with its worker — stop polling and re-dispatch ' +
|
|
142
|
+
'(progress is durable; completed work is not redone).',
|
|
143
|
+
inputSchema: {
|
|
144
|
+
sequence_id: z.string().describe('The sequence id'),
|
|
145
|
+
run_id: z.string().describe('From the enrich_people / judge_people ack'),
|
|
146
|
+
},
|
|
147
|
+
}, async (params) => {
|
|
148
|
+
try {
|
|
149
|
+
const { data } = await client.GET('/sequences/{sequenceId}/qualification-runs/{runId}', {
|
|
150
|
+
params: { path: { sequenceId: params.sequence_id, runId: params.run_id } },
|
|
151
|
+
});
|
|
152
|
+
return jsonContent(data);
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
if (e instanceof ApiError)
|
|
156
|
+
return jsonContent({ ok: false, status: e.status, error: e.body });
|
|
157
|
+
throw e;
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
server.registerTool('list_sequence_contacts', {
|
|
161
|
+
description: "Page through a sequence's people: identities, status, fit, judgment tallies (never the " +
|
|
162
|
+
'verdict paragraphs). Sorted fit-highest-first, never-judged last. Filter by status, ' +
|
|
163
|
+
'judgment band (qualified / not_qualified / never_judged), or batch_key (enrollment ' +
|
|
164
|
+
'wave). Use small limits to sample; for bulk pulls call the API endpoint from Bash and ' +
|
|
165
|
+
'write to a file instead of paging in a loop.',
|
|
166
|
+
inputSchema: {
|
|
167
|
+
sequence_id: z.string().describe('The sequence id'),
|
|
168
|
+
status: z.enum(['candidate', 'active', 'parked', 'exited', 'completed']).optional(),
|
|
169
|
+
band: z.enum(['qualified', 'not_qualified', 'never_judged']).optional(),
|
|
170
|
+
batch_key: z.string().optional(),
|
|
171
|
+
cursor: z.string().optional().describe('next_cursor from the previous page'),
|
|
172
|
+
limit: z.number().int().min(1).max(200).optional().describe('Default 50.'),
|
|
173
|
+
},
|
|
174
|
+
}, async (params) => {
|
|
175
|
+
try {
|
|
176
|
+
const { data } = await client.GET('/sequences/{sequenceId}/contacts', {
|
|
177
|
+
params: {
|
|
178
|
+
path: { sequenceId: params.sequence_id },
|
|
179
|
+
query: {
|
|
180
|
+
...(params.status !== undefined ? { status: params.status } : {}),
|
|
181
|
+
...(params.band !== undefined ? { band: params.band } : {}),
|
|
182
|
+
...(params.batch_key !== undefined ? { batch_key: params.batch_key } : {}),
|
|
183
|
+
...(params.cursor !== undefined ? { cursor: params.cursor } : {}),
|
|
184
|
+
...(params.limit !== undefined ? { limit: params.limit } : {}),
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
return jsonContent(data);
|
|
189
|
+
}
|
|
190
|
+
catch (e) {
|
|
191
|
+
if (e instanceof ApiError)
|
|
192
|
+
return jsonContent({ ok: false, status: e.status, error: e.body });
|
|
193
|
+
throw e;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
server.registerTool('list_custom_data_keys', {
|
|
197
|
+
description: "List the org's observed custom-data keys (names only, per bag: contact/session, " +
|
|
198
|
+
'verified/unverified) — the same registry the dashboard filter dropdowns use. Check it ' +
|
|
199
|
+
'BEFORE authoring analytics filters or sequence judge criteria that reference custom ' +
|
|
200
|
+
'fields, so criteria name fields that actually exist; sample real values with ' +
|
|
201
|
+
'run_analytics_query.',
|
|
202
|
+
inputSchema: {
|
|
203
|
+
sources: z
|
|
204
|
+
.array(z.enum([
|
|
205
|
+
'contact_custom_data',
|
|
206
|
+
'contact_non_verified_custom_data',
|
|
207
|
+
'session_custom_data',
|
|
208
|
+
'session_editable_custom_data',
|
|
209
|
+
]))
|
|
210
|
+
.optional()
|
|
211
|
+
.describe('Default: all four bags.'),
|
|
212
|
+
search: z.string().optional().describe('Case-insensitive substring match on the key.'),
|
|
213
|
+
limit: z.number().int().min(1).max(1000).optional().describe('Default 500.'),
|
|
214
|
+
},
|
|
215
|
+
}, async (params) => {
|
|
216
|
+
try {
|
|
217
|
+
const { data } = await client.GET('/custom-data-keys', {
|
|
218
|
+
params: {
|
|
219
|
+
query: {
|
|
220
|
+
...(params.sources !== undefined ? { sources: params.sources } : {}),
|
|
221
|
+
...(params.search !== undefined ? { search: params.search } : {}),
|
|
222
|
+
...(params.limit !== undefined ? { limit: params.limit } : {}),
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
return jsonContent(data);
|
|
227
|
+
}
|
|
228
|
+
catch (e) {
|
|
229
|
+
if (e instanceof ApiError)
|
|
230
|
+
return jsonContent({ ok: false, status: e.status, error: e.body });
|
|
231
|
+
throw e;
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
server.registerTool('get_sequence_contact', {
|
|
235
|
+
description: "One person's full record: per-criterion verdicts with reasonings and evidence " +
|
|
236
|
+
'citations, and the stored enrichment bundle. The peek tool — ' +
|
|
237
|
+
'spot-check a few people after an enrich/judge run instead of paging the population.',
|
|
238
|
+
inputSchema: {
|
|
239
|
+
sequence_id: z.string().describe('The sequence id'),
|
|
240
|
+
contact_id: z
|
|
241
|
+
.string()
|
|
242
|
+
.describe("The person's contact id — from enroll results or list_sequence_contacts"),
|
|
243
|
+
},
|
|
244
|
+
}, async (params) => {
|
|
245
|
+
try {
|
|
246
|
+
const { data } = await client.GET('/sequences/{sequenceId}/contacts/{contactId}', {
|
|
247
|
+
params: {
|
|
248
|
+
path: { sequenceId: params.sequence_id, contactId: params.contact_id },
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
return jsonContent(data);
|
|
252
|
+
}
|
|
253
|
+
catch (e) {
|
|
254
|
+
if (e instanceof ApiError)
|
|
255
|
+
return jsonContent({ ok: false, status: e.status, error: e.body });
|
|
256
|
+
throw e;
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
server.registerTool('get_sequence_contact_events', {
|
|
260
|
+
description: "One person's journey ledger, oldest first: enrollment, sends, skips (with reasons), " +
|
|
261
|
+
'deferrals, channel outcomes (delivered/read/replied, answered/no answer/busy/failed), ' +
|
|
262
|
+
'parks and exits — each carrying the inbox session id of its send when one exists. ' +
|
|
263
|
+
'THE tool for "what happened to this person" and "why didn\'t step N fire": read it ' +
|
|
264
|
+
'before explaining an outcome or debugging a stuck journey, instead of inferring from ' +
|
|
265
|
+
'status alone (the list rows also carry a compact per-step `journey` summary — this is ' +
|
|
266
|
+
'the long form behind it).',
|
|
267
|
+
inputSchema: {
|
|
268
|
+
sequence_id: z.string().describe('The sequence id'),
|
|
269
|
+
contact_id: z
|
|
270
|
+
.string()
|
|
271
|
+
.describe("The person's contact id — from enroll results or list_sequence_contacts"),
|
|
272
|
+
},
|
|
273
|
+
}, async (params) => {
|
|
274
|
+
try {
|
|
275
|
+
const { data } = await client.GET('/sequences/{sequenceId}/contacts/{contactId}/events', {
|
|
276
|
+
params: {
|
|
277
|
+
path: { sequenceId: params.sequence_id, contactId: params.contact_id },
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
return jsonContent(data);
|
|
281
|
+
}
|
|
282
|
+
catch (e) {
|
|
283
|
+
if (e instanceof ApiError)
|
|
284
|
+
return jsonContent({ ok: false, status: e.status, error: e.body });
|
|
285
|
+
throw e;
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=campaign-qualification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"campaign-qualification.js","sourceRoot":"","sources":["../../src/tools/campaign-qualification.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 registerCampaignSpineTools(server: McpServer, client: OpenCXClient): void;
|
|
4
|
+
//# sourceMappingURL=campaign-spine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"campaign-spine.d.ts","sourceRoot":"","sources":["../../src/tools/campaign-spine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAgLrD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAukBjF"}
|