@apex-inc/mcp-server 0.32.0 → 0.34.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.
Files changed (74) hide show
  1. package/README.md +19 -18
  2. package/dist/api-client.d.ts +5 -0
  3. package/dist/api-client.d.ts.map +1 -1
  4. package/dist/api-client.js +40 -24
  5. package/dist/api-client.js.map +1 -1
  6. package/dist/conflict-advisory.d.ts +29 -0
  7. package/dist/conflict-advisory.d.ts.map +1 -0
  8. package/dist/conflict-advisory.js +48 -0
  9. package/dist/conflict-advisory.js.map +1 -0
  10. package/dist/index.js +8 -5
  11. package/dist/index.js.map +1 -1
  12. package/dist/live-test-guard.d.ts +1 -0
  13. package/dist/live-test-guard.d.ts.map +1 -1
  14. package/dist/live-test-guard.js +4 -3
  15. package/dist/live-test-guard.js.map +1 -1
  16. package/dist/prompts.d.ts.map +1 -1
  17. package/dist/prompts.js +5 -7
  18. package/dist/prompts.js.map +1 -1
  19. package/dist/setup-catchup-tools.d.ts.map +1 -1
  20. package/dist/setup-catchup-tools.js +15 -3
  21. package/dist/setup-catchup-tools.js.map +1 -1
  22. package/dist/smoke-tools.d.ts +56 -0
  23. package/dist/smoke-tools.d.ts.map +1 -0
  24. package/dist/smoke-tools.js +261 -0
  25. package/dist/smoke-tools.js.map +1 -0
  26. package/dist/tool-catalog.d.ts +10 -0
  27. package/dist/tool-catalog.d.ts.map +1 -0
  28. package/dist/tool-catalog.js +36 -0
  29. package/dist/tool-catalog.js.map +1 -0
  30. package/dist/tool-groups.d.ts +5 -0
  31. package/dist/tool-groups.d.ts.map +1 -0
  32. package/dist/tool-groups.js +206 -0
  33. package/dist/tool-groups.js.map +1 -0
  34. package/dist/tool-shared.d.ts +300 -0
  35. package/dist/tool-shared.d.ts.map +1 -0
  36. package/dist/tool-shared.js +319 -0
  37. package/dist/tool-shared.js.map +1 -0
  38. package/dist/tools/accounts.d.ts +124 -0
  39. package/dist/tools/accounts.d.ts.map +1 -0
  40. package/dist/tools/accounts.js +99 -0
  41. package/dist/tools/accounts.js.map +1 -0
  42. package/dist/tools/adoption.d.ts +499 -0
  43. package/dist/tools/adoption.d.ts.map +1 -0
  44. package/dist/tools/adoption.js +447 -0
  45. package/dist/tools/adoption.js.map +1 -0
  46. package/dist/tools/context.d.ts +216 -0
  47. package/dist/tools/context.d.ts.map +1 -0
  48. package/dist/tools/context.js +328 -0
  49. package/dist/tools/context.js.map +1 -0
  50. package/dist/tools/experiments.d.ts +1066 -0
  51. package/dist/tools/experiments.d.ts.map +1 -0
  52. package/dist/tools/experiments.js +2090 -0
  53. package/dist/tools/experiments.js.map +1 -0
  54. package/dist/tools/letters.d.ts +1107 -0
  55. package/dist/tools/letters.d.ts.map +1 -0
  56. package/dist/tools/letters.js +1324 -0
  57. package/dist/tools/letters.js.map +1 -0
  58. package/dist/tools/measurement.d.ts +886 -0
  59. package/dist/tools/measurement.d.ts.map +1 -0
  60. package/dist/tools/measurement.js +1353 -0
  61. package/dist/tools/measurement.js.map +1 -0
  62. package/dist/tools/partners.d.ts +364 -0
  63. package/dist/tools/partners.d.ts.map +1 -0
  64. package/dist/tools/partners.js +199 -0
  65. package/dist/tools/partners.js.map +1 -0
  66. package/dist/tools.d.ts +3161 -2826
  67. package/dist/tools.d.ts.map +1 -1
  68. package/dist/tools.js +26 -6133
  69. package/dist/tools.js.map +1 -1
  70. package/package.json +3 -2
  71. package/skills/apex-communications/SKILL.md +5 -5
  72. package/skills/apex-experimentation/SKILL.md +11 -14
  73. package/skills/apex-growth-intelligence/SKILL.md +1 -1
  74. package/skills/apex-integration-cookbook/SKILL.md +1 -1
@@ -0,0 +1,447 @@
1
+ import { z } from "zod";
2
+ import { apiGet, apiPost, apiPatch, apiDelete, } from "../api-client.js";
3
+ import { milestoneWriteBody, preflightAdoptionMilestone, } from "../adoption-compose.js";
4
+ import { refuseLiveApexObject } from "../live-test-guard.js";
5
+ import { APEX } from "../tool-shared.js";
6
+ export const adoptionTools = {
7
+ list_adoption_milestones: {
8
+ description: `${APEX} — List the workspace's adoption milestones (per-feature "has this user adopted X?" definitions). A milestone is NOT a goal. Each row now includes enrollMode (all vs future) and gapPolicy.hours when the wait is sub-day.`,
9
+ schema: z.object({}),
10
+ handler: async () => {
11
+ const data = await apiGet("/api/adoption/milestones");
12
+ return {
13
+ content: [
14
+ { type: "text", text: JSON.stringify(data?.data?.milestones ?? [], null, 2) },
15
+ ],
16
+ };
17
+ },
18
+ },
19
+ get_adoption_milestone: {
20
+ description: `${APEX} — Fetch one adoption milestone by id.`,
21
+ schema: z.object({ milestoneId: z.string().describe("The milestone id") }),
22
+ handler: async ({ milestoneId }) => {
23
+ const data = await apiGet(`/api/adoption/milestones/${encodeURIComponent(milestoneId)}`);
24
+ return {
25
+ content: [{ type: "text", text: JSON.stringify(data?.data?.milestone ?? null, null, 2) }],
26
+ };
27
+ },
28
+ },
29
+ create_adoption_milestone: {
30
+ description: `${APEX} — Create an adoption milestone. "Adopted" is one event or one trait. Omit adopted_when_kind to create the milestone before its finishing moment is chosen, then set it later with update_adoption_milestone; a milestone with no moment counts nobody, mails nobody, and cannot be turned on. Default enroll_mode is "future" (only people who sign up after this is created). Use enroll_mode="all" to include everyone already here. gap_hours wins over gap_days. Starts OFF unless active=true.`,
31
+ schema: z.object({
32
+ name: z.string().describe("Human label, e.g. 'Ran first report'"),
33
+ featureKey: z.string().describe("Stable feature key, e.g. 'reporting'"),
34
+ actionLabel: z.string().optional().describe("Sentence verb: hasn't {action_label}. Never the raw event key."),
35
+ adoptedWhenKind: z.enum(["event", "trait"]).optional().describe("How adoption is detected. Omit to decide the finishing moment later; the milestone stays inert until it is set."),
36
+ eventName: z.string().optional().describe("event kind: the event whose firing means adopted"),
37
+ traitPath: z.string().optional().describe("trait kind: dotted trait path, e.g. 'plan'"),
38
+ traitValue: z.string().optional().describe("trait kind: value to match (equals)"),
39
+ traitOp: z.enum(["equals", "not_equals", "exists"]).optional().describe("trait kind: comparison. Default equals."),
40
+ priority: z.number().optional().describe("Lower is nudged first. Default 100."),
41
+ order: z.number().optional().describe("0-based sequence order (which milestone accounts reach first). Ordering the full set unlocks the account-view Path funnel."),
42
+ gapDays: z.number().optional().describe("Nudge this many days after the anchor if not adopted. Ignored when gap_hours is set. Default 3."),
43
+ gapHours: z.number().optional().describe("Nudge this many hours after the anchor. Use for same-day QA. 0 = right away."),
44
+ gapKind: z.enum(["days_since_signup", "event_not_fired"]).optional().describe("Anchor. Default days_since_signup. event_not_fired needs since_event_name."),
45
+ sinceEventName: z.string().optional().describe("event_not_fired: the event the wait starts from."),
46
+ enrollMode: z.enum(["all", "future"]).optional().describe("future (default) = only people who sign up from now on. all = historical roster too."),
47
+ finishWhen: z.enum(["this_person", "anyone_here"]).optional().describe("this_person (default) = only that person finishes. anyone_here = first person on the same Account finishes it for the company. Event finishes only."),
48
+ active: z.boolean().optional().describe("Turn the milestone on. Default false."),
49
+ }),
50
+ handler: async (args) => {
51
+ const warnings = await preflightAdoptionMilestone(args);
52
+ if (!args.adoptedWhenKind) {
53
+ warnings.push("No finishing moment set. This milestone counts nobody and cannot be turned on until update_adoption_milestone sets adopted_when_kind.");
54
+ }
55
+ const body = milestoneWriteBody({
56
+ ...args,
57
+ enrollMode: args.enrollMode ?? "future",
58
+ active: args.active ?? false,
59
+ priority: args.priority ?? 100,
60
+ });
61
+ const data = await apiPost("/api/adoption/milestones", body);
62
+ return {
63
+ content: [{
64
+ type: "text",
65
+ text: JSON.stringify({ milestone: data?.data?.milestone ?? data, warnings }, null, 2),
66
+ }],
67
+ };
68
+ },
69
+ },
70
+ update_adoption_milestone: {
71
+ description: `${APEX} — Update an adoption milestone (finishing moment, name, priority, active, gap days/hours, enroll mode, who finishing counts, nudge journey). Pass adopted_when_kind plus event_name or trait_path to set the finishing moment on a milestone created without one. active=true is REFUSED while there is no moment, because nobody could ever finish it and everyone would stay late forever. Changing the moment resets the lift window. If the Milestone is ON, changing what "finished" means stops and asks — do not pass confirmLiveMilestone unless they picked an out. A Milestone keeps BOTH letters on its one Adaptive Journey: the Celebration is a Send on the finish arm, not a second journey. finish_when=anyone_here on a live event Milestone backfills leftover Nudges for Accounts that already have a doer.`,
72
+ schema: z.object({
73
+ milestoneId: z.string(),
74
+ name: z.string().optional(),
75
+ actionLabel: z.string().optional().describe("Sentence verb: hasn't {action_label}."),
76
+ adoptedWhenKind: z.enum(["event", "trait"]).optional().describe("Set the finishing moment. Changing it resets the lift window."),
77
+ eventName: z.string().optional().describe("event kind: the event whose firing means adopted"),
78
+ traitPath: z.string().optional().describe("trait kind: dotted trait path, e.g. 'plan'"),
79
+ traitValue: z.string().optional().describe("trait kind: value to match (equals)"),
80
+ traitOp: z.enum(["equals", "not_equals", "exists"]).optional().describe("trait kind: comparison. Default equals."),
81
+ priority: z.number().optional(),
82
+ order: z.number().optional().describe("0-based sequence order. Prefer reorder_adoption_milestones to sequence the whole set."),
83
+ active: z.boolean().optional(),
84
+ gapDays: z.number().optional(),
85
+ gapHours: z.number().optional().describe("Sub-day wait. Wins over gap_days."),
86
+ gapKind: z.enum(["days_since_signup", "event_not_fired"]).optional(),
87
+ sinceEventName: z.string().optional(),
88
+ enrollMode: z.enum(["all", "future"]).optional(),
89
+ finishWhen: z.enum(["this_person", "anyone_here"]).optional().describe("this_person = only that person. anyone_here = first person on the Account. Event finishes only."),
90
+ nudgeJourneyId: z.string().optional(),
91
+ confirmLiveMilestone: z
92
+ .boolean()
93
+ .optional()
94
+ .describe("Change an ON Milestone anyway. Only pass true after they picked an out."),
95
+ }),
96
+ handler: async (args) => {
97
+ const changesWhatCounts = args.adoptedWhenKind !== undefined ||
98
+ args.eventName !== undefined ||
99
+ args.traitPath !== undefined ||
100
+ args.gapDays !== undefined ||
101
+ args.gapHours !== undefined ||
102
+ args.gapKind !== undefined ||
103
+ args.active !== undefined ||
104
+ args.enrollMode !== undefined ||
105
+ args.finishWhen !== undefined ||
106
+ args.nudgeJourneyId !== undefined;
107
+ if (changesWhatCounts) {
108
+ const guard = await refuseLiveApexObject({
109
+ milestoneIds: [args.milestoneId],
110
+ confirmed: args.confirmLiveMilestone === true,
111
+ purpose: "milestone",
112
+ });
113
+ if (guard.stop) {
114
+ return { content: [{ type: "text", text: guard.text }] };
115
+ }
116
+ }
117
+ const updates = milestoneWriteBody(args);
118
+ if (args.gapDays === undefined && args.gapHours === undefined && args.gapKind === undefined && args.sinceEventName === undefined) {
119
+ delete updates.gapPolicy;
120
+ }
121
+ const data = await apiPatch(`/api/adoption/milestones/${encodeURIComponent(args.milestoneId)}`, updates);
122
+ return {
123
+ content: [{ type: "text", text: JSON.stringify(data?.data?.milestone ?? data, null, 2) }],
124
+ };
125
+ },
126
+ },
127
+ delete_adoption_milestone: {
128
+ description: `${APEX} — Delete an adoption milestone. If it is on, stop and ask. Do not pass confirmLiveMilestone unless they picked an out.`,
129
+ schema: z.object({
130
+ milestoneId: z.string(),
131
+ confirmLiveMilestone: z
132
+ .boolean()
133
+ .optional()
134
+ .describe("Delete an ON Milestone anyway. Only pass true after they picked an out."),
135
+ }),
136
+ handler: async ({ milestoneId, confirmLiveMilestone, }) => {
137
+ const guard = await refuseLiveApexObject({
138
+ milestoneIds: [milestoneId],
139
+ confirmed: confirmLiveMilestone === true,
140
+ purpose: "milestone",
141
+ });
142
+ if (guard.stop) {
143
+ return { content: [{ type: "text", text: guard.text }] };
144
+ }
145
+ await apiDelete(`/api/adoption/milestones/${encodeURIComponent(milestoneId)}`);
146
+ return { content: [{ type: "text", text: `Deleted milestone ${milestoneId}.` }] };
147
+ },
148
+ },
149
+ compose_adoption_milestone: {
150
+ description: `${APEX} — Create a Milestone and stamp ONE Adaptive Journey (Trigger → Wait until they finish → Celebration and/or Nudge). scaffold="both" (default) includes both letters; "nudge" / "celebration" one letter; "none" is just-track. Unique Communication per Send — never reuse the shared catalog letters. New milestones default to enroll_mode="future". Journeys are drafts — preview, then publish_journey. A Milestone is NOT a Target.`,
151
+ schema: z.object({
152
+ name: z.string().describe("Human label, e.g. 'Started first experiment'"),
153
+ featureKey: z.string().describe("Stable feature key, e.g. 'experiments'"),
154
+ actionLabel: z.string().optional().describe("Sentence verb: hasn't {action_label}."),
155
+ adoptedWhenKind: z.enum(["event", "trait"]).describe("How adoption is detected"),
156
+ eventName: z.string().optional().describe("event kind: the event whose firing means adopted"),
157
+ traitPath: z.string().optional().describe("trait kind: dotted trait path, e.g. 'plan'"),
158
+ traitValue: z.string().optional().describe("trait kind: value to match (equals)"),
159
+ traitOp: z.enum(["equals", "not_equals", "exists"]).optional(),
160
+ priority: z.number().optional().describe("Lower is nudged first. Default 100."),
161
+ order: z.number().optional().describe("0-based sequence order."),
162
+ gapDays: z.number().optional().describe("First Nudge window in days. Ignored when gap_hours or nudge_clocks is set. Default 3."),
163
+ gapHours: z.number().optional().describe("First Nudge window in hours. 0 = right away."),
164
+ nudgeClocks: z
165
+ .array(z.object({
166
+ hours: z.number().optional(),
167
+ days: z.number().optional(),
168
+ }))
169
+ .optional()
170
+ .describe("Each clock is N hours or N days. First is the Wait deadline; later are extra Nudges."),
171
+ gapKind: z.enum(["days_since_signup", "event_not_fired"]).optional(),
172
+ sinceEventName: z.string().optional(),
173
+ enrollMode: z.enum(["all", "future"]).optional().describe("future (default) = only people who sign up from now on."),
174
+ finishWhen: z.enum(["this_person", "anyone_here"]).optional().describe("this_person (default) = only that person finishes. anyone_here = first person on the same Account. Event finishes only."),
175
+ active: z.boolean().optional().describe("Turn the milestone on. Default false."),
176
+ scaffold: z.enum(["both", "celebration", "nudge", "none"]).optional().describe("Which letters to include. Default both."),
177
+ journeyName: z.string().optional().describe("Name for the Adaptive Journey. Default is the Milestone name."),
178
+ saveNotYetSegment: z.boolean().optional().describe("Save the live not-yet rule as a Segment."),
179
+ saveDoneSegment: z.boolean().optional().describe("Save the live done rule as a Segment."),
180
+ }),
181
+ handler: async (args) => {
182
+ const warnings = await preflightAdoptionMilestone(args);
183
+ const firstClock = args.nudgeClocks?.[0];
184
+ const created = await apiPost("/api/adoption/milestones", milestoneWriteBody({
185
+ ...args,
186
+ ...(firstClock?.hours !== undefined ? { gapHours: firstClock.hours } : {}),
187
+ ...(firstClock?.days !== undefined && firstClock.hours === undefined
188
+ ? { gapDays: firstClock.days }
189
+ : {}),
190
+ enrollMode: args.enrollMode ?? "future",
191
+ active: args.active ?? false,
192
+ priority: args.priority ?? 100,
193
+ }));
194
+ const milestoneId = created?.data?.milestone?.id;
195
+ if (!milestoneId) {
196
+ return { content: [{ type: "text", text: JSON.stringify(created, null, 2) }] };
197
+ }
198
+ const persistSegments = async () => {
199
+ if (!args.saveNotYetSegment && !args.saveDoneSegment) {
200
+ return created.data?.milestone;
201
+ }
202
+ const patched = await apiPatch(`/api/adoption/milestones/${encodeURIComponent(milestoneId)}`, {
203
+ saveNotYetSegment: args.saveNotYetSegment === true,
204
+ saveDoneSegment: args.saveDoneSegment === true,
205
+ });
206
+ return patched.data?.milestone ?? created.data?.milestone;
207
+ };
208
+ const scaffold = args.scaffold ?? "both";
209
+ if (scaffold === "none") {
210
+ const milestone = await persistSegments();
211
+ return {
212
+ content: [{ type: "text", text: JSON.stringify({
213
+ milestone,
214
+ journey_id: null,
215
+ nudge_journey_id: null,
216
+ celebration_journey_id: null,
217
+ sends: [],
218
+ warnings,
219
+ }, null, 2) }],
220
+ };
221
+ }
222
+ const journey = await apiPost("/api/journeys/from-template", {
223
+ templateId: "adoption-nudge",
224
+ milestoneId,
225
+ scaffold,
226
+ name: args.journeyName ?? args.name,
227
+ ...(args.nudgeClocks ? { nudgeClocks: args.nudgeClocks } : {}),
228
+ });
229
+ const journeyId = journey?.id ?? null;
230
+ const sends = (journey?.sends ?? []).map((s) => ({
231
+ role: s.role,
232
+ step_id: s.stepId,
233
+ comm_id: s.commId,
234
+ }));
235
+ const milestone = await persistSegments();
236
+ return {
237
+ content: [
238
+ {
239
+ type: "text",
240
+ text: JSON.stringify({
241
+ milestone,
242
+ journey_id: journeyId,
243
+ nudge_journey_id: journeyId,
244
+ celebration_journey_id: null,
245
+ sends,
246
+ warnings,
247
+ }, null, 2),
248
+ },
249
+ ],
250
+ };
251
+ },
252
+ },
253
+ attach_adoption_milestone_still: {
254
+ description: `${APEX} — Attach a still of the empty screen (not_yet) or the finished screen (done) to a Milestone. Same two pictures the shop uploads. Pass imageBase64 or a public url. For a signed-in product page, capture on their machine with \`npx @apex-inc/mcp-server screenshot --milestone … --state not_yet|done --url … --storage-state <login file>\` — do not use hosted recapture. A Milestone is NOT a Target.`,
255
+ schema: z.object({
256
+ milestoneId: z.string().describe("The Milestone to attach the still to"),
257
+ state: z.enum(["not_yet", "done"]).describe("not_yet = empty screen; done = finished screen"),
258
+ imageBase64: z.string().optional().describe("Base64-encoded PNG/JPEG."),
259
+ url: z.string().url().optional().describe("Already-hosted public image URL."),
260
+ viewport: z.enum(["desktop", "tablet", "mobile"]).optional(),
261
+ format: z.enum(["png", "jpeg"]).optional(),
262
+ label: z.string().optional(),
263
+ }),
264
+ handler: async (args) => {
265
+ if (!args.imageBase64 && !args.url) {
266
+ return {
267
+ content: [{
268
+ type: "text",
269
+ text: "Provide either imageBase64 or url.",
270
+ }],
271
+ isError: true,
272
+ };
273
+ }
274
+ const res = await apiPost(`/api/adoption/milestones/${encodeURIComponent(args.milestoneId)}/assets`, {
275
+ state: args.state,
276
+ source: args.imageBase64 ? "agent" : "upload",
277
+ viewport: args.viewport ?? "desktop",
278
+ imageBase64: args.imageBase64,
279
+ url: args.url,
280
+ format: args.format ?? "png",
281
+ label: args.label,
282
+ });
283
+ const asset = res.data;
284
+ return {
285
+ content: [{
286
+ type: "text",
287
+ text: JSON.stringify({
288
+ id: asset.id,
289
+ state: asset.state,
290
+ url: asset.url,
291
+ milestone_id: args.milestoneId,
292
+ }, null, 2),
293
+ }],
294
+ };
295
+ },
296
+ },
297
+ recapture_adoption_milestone_stills: {
298
+ description: `${APEX} — Capture the Not yet and Done stills from public pages on a named workspace host. Not localhost. A login wall fails honestly and writes nothing. For a signed-in product page, sit it on their machine: \`npx @apex-inc/mcp-server screenshot --milestone … --storage-state <login file>\`. Same two pictures the shop uploads.`,
299
+ schema: z.object({
300
+ milestoneId: z.string().describe("The Milestone to capture stills for"),
301
+ notYetUrl: z.string().url().optional().describe("Public https URL of the empty screen."),
302
+ doneUrl: z.string().url().optional().describe("Public https URL of the finished screen."),
303
+ }),
304
+ handler: async (args) => {
305
+ if (!args.notYetUrl && !args.doneUrl) {
306
+ return {
307
+ content: [{ type: "text", text: "Name a public page for Not yet or Done." }],
308
+ isError: true,
309
+ };
310
+ }
311
+ try {
312
+ const res = await apiPost(`/api/adoption/milestones/${encodeURIComponent(args.milestoneId)}/recapture`, {
313
+ notYetUrl: args.notYetUrl,
314
+ doneUrl: args.doneUrl,
315
+ });
316
+ if (res.error) {
317
+ return {
318
+ content: [{
319
+ type: "text",
320
+ text: res.error,
321
+ }],
322
+ isError: true,
323
+ };
324
+ }
325
+ return {
326
+ content: [{
327
+ type: "text",
328
+ text: JSON.stringify({
329
+ captured: res.data?.captured ?? [],
330
+ failed: res.data?.failed ?? [],
331
+ milestone_id: args.milestoneId,
332
+ }, null, 2),
333
+ }],
334
+ };
335
+ }
336
+ catch {
337
+ return {
338
+ content: [{
339
+ type: "text",
340
+ text: "We couldn’t open that page from Apex. It may need a sign-in. Attach a still yourself.",
341
+ }],
342
+ isError: true,
343
+ };
344
+ }
345
+ },
346
+ },
347
+ list_adoption_milestone_stills: {
348
+ description: `${APEX} — List the Not yet and Done stills attached to a Milestone. Empty means they have not attached one yet.`,
349
+ schema: z.object({
350
+ milestoneId: z.string().describe("The Milestone to list stills for"),
351
+ }),
352
+ handler: async ({ milestoneId }) => {
353
+ const res = await apiGet(`/api/adoption/milestones/${encodeURIComponent(milestoneId)}/assets`);
354
+ return {
355
+ content: [{
356
+ type: "text",
357
+ text: JSON.stringify(res.data ?? [], null, 2),
358
+ }],
359
+ };
360
+ },
361
+ },
362
+ reorder_adoption_milestones: {
363
+ description: `${APEX} — Set the sequence order of adoption milestones in one call. Pass the milestone ids in the desired order; each gets order = its index. Ordering the full set unlocks the "Path" funnel in the account view (a step-by-step drop-off chart that is only honest over an explicitly-ordered set).`,
364
+ schema: z.object({
365
+ orderedIds: z.array(z.string()).describe("Milestone ids in the desired order (index becomes the order)."),
366
+ }),
367
+ handler: async ({ orderedIds }) => {
368
+ const data = await apiPost("/api/adoption/milestones/reorder", { orderedIds });
369
+ return {
370
+ content: [{ type: "text", text: JSON.stringify(data?.data ?? data, null, 2) }],
371
+ };
372
+ },
373
+ },
374
+ get_adoption_metrics: {
375
+ description: `${APEX} — Aggregated adoption metrics: per-milestone funnel + lift-vs-holdout, plus workspace health. Counts only (no user PII).`,
376
+ schema: z.object({}),
377
+ handler: async () => {
378
+ const data = await apiGet("/api/adoption/metrics");
379
+ return {
380
+ content: [{ type: "text", text: JSON.stringify(data?.data ?? {}, null, 2) }],
381
+ };
382
+ },
383
+ },
384
+ get_adoption_account_progress: {
385
+ description: `${APEX} — One Account's Path: which Milestones this company has finished, who did them, and how many people are Not yet / Started / Done. account_id is the company id from identify({ account: { id } }). Never includes holdout.`,
386
+ schema: z.object({
387
+ account_id: z
388
+ .string()
389
+ .describe("The Account id (identify account.id or the Apex acct_ id)"),
390
+ }),
391
+ handler: async ({ account_id }) => {
392
+ const data = await apiGet(`/api/adoption/progress?account_id=${encodeURIComponent(account_id)}`);
393
+ return {
394
+ content: [
395
+ {
396
+ type: "text",
397
+ text: JSON.stringify(data?.data ?? {}, null, 2),
398
+ },
399
+ ],
400
+ };
401
+ },
402
+ },
403
+ get_adoption_user_progress: {
404
+ description: `${APEX} — One person's Path (Not yet / Started / Done) across every active Milestone. Includes finish_when and inherited when Anyone here finished for their company. Never email, name, or holdout. end_user_id must be a valid user id, not an email.`,
405
+ schema: z.object({
406
+ end_user_id: z
407
+ .string()
408
+ .describe("The end-user id to look up (not an email address)"),
409
+ }),
410
+ handler: async ({ end_user_id }) => {
411
+ const data = await apiGet(`/api/adoption/progress?end_user_id=${encodeURIComponent(end_user_id)}`);
412
+ return {
413
+ content: [
414
+ {
415
+ type: "text",
416
+ text: JSON.stringify(data?.data?.progress ?? [], null, 2),
417
+ },
418
+ ],
419
+ };
420
+ },
421
+ },
422
+ list_adoption_features: {
423
+ description: `${APEX} — List the workspace's tenant-owned feature groupings (how adoption milestones group your own events).`,
424
+ schema: z.object({}),
425
+ handler: async () => {
426
+ const data = await apiGet("/api/adoption/features");
427
+ return {
428
+ content: [{ type: "text", text: JSON.stringify(data?.data?.features ?? [], null, 2) }],
429
+ };
430
+ },
431
+ },
432
+ create_adoption_feature: {
433
+ description: `${APEX} — Create or upsert (by key) a tenant-owned feature grouping. Group your own events under a named feature the milestone builder can target.`,
434
+ schema: z.object({
435
+ label: z.string().describe("Human label, e.g. 'Subscriptions'"),
436
+ key: z.string().optional().describe("Stable key; slugged from label if omitted"),
437
+ eventNames: z.array(z.string()).optional().describe("Event names tagged into this feature"),
438
+ }),
439
+ handler: async (args) => {
440
+ const data = await apiPost("/api/adoption/features", { label: args.label, key: args.key, eventNames: args.eventNames ?? [] });
441
+ return {
442
+ content: [{ type: "text", text: JSON.stringify(data?.data?.feature ?? data, null, 2) }],
443
+ };
444
+ },
445
+ },
446
+ };
447
+ //# sourceMappingURL=adoption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adoption.js","sourceRoot":"","sources":["../../src/tools/adoption.ts"],"names":[],"mappings":"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"}