conduyt-mcp 4.68.0 → 4.69.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.
@@ -95,4 +95,18 @@ export function registerDripCampaignTools(server, client) {
95
95
  const result = await client.post("/api/v1/drip-enrollments/batch/stop", params);
96
96
  return formatResult(result);
97
97
  });
98
+ // (Smart Views slice A, Codex r70 m5) the whole enrollment's barrier at once, including a MARKER-ONLY barrier (the
99
+ // processor died between its marker and its log: no webhook log exists to cancel)
100
+ server.tool("conduyt_cancel_drip_enrollment_barrier", "Cancel a drip enrollment's whole send barrier (POST /api/v1/drip-enrollments/{id}/cancel-barrier; admin or owner, the drip-enrollments scope): every parked / queued / failed webhook log of the enrollment is cancelled, including the case where no webhook log exists at all (the processor died after writing its marker). Without a resolution the barrier STANDS (nothing is sent). resolution 'skip' assumes the current step was delivered: the processor advances without sending. resolution 'resend' makes the processor rebuild and send the step AGAIN (a possible duplicate SMS): refused unless acknowledgeDuplicateRisk is true. Answers 404 (no such enrollment), 409 drip_send_in_flight (a request is in flight: retry in a minute) or 409 step_already_sent (the step already carries sent evidence: a resend would only advance it, use 'skip'). The response carries resolution, resendScheduled, advanceScheduled, logsCancelled, markersResolved, handedBack and barrierStanding.", {
101
+ id: z.string().uuid().describe("Drip enrollment UUID"),
102
+ resolution: z.enum(["resend", "skip"]).optional().describe("Omit to cancel only (the barrier stands). 'skip' = assume delivered, advance. 'resend' = send the step again (duplicate risk: needs acknowledgeDuplicateRisk)"),
103
+ acknowledgeDuplicateRisk: z.boolean().optional().describe("Required true with resolution 'resend': you accept the step may be delivered twice"),
104
+ }, async ({ id, resolution, acknowledgeDuplicateRisk }) => {
105
+ if (resolution === "resend" && acknowledgeDuplicateRisk !== true) {
106
+ return formatResult({ error: "resolution 'resend' may deliver the step twice: pass acknowledgeDuplicateRisk: true, or use resolution 'skip' to advance without sending" });
107
+ }
108
+ // the body as ONE literal: the contract gate reads the request fields from it (resolution, confirm)
109
+ const result = await client.post(`/api/v1/drip-enrollments/${id}/cancel-barrier`, { ...(resolution ? { resolution } : {}), ...(resolution === "resend" ? { confirm: "RESEND_UNCONFIRMED_DRIP" } : {}) });
110
+ return formatResult(result);
111
+ });
98
112
  }
@@ -38,4 +38,17 @@ export function registerWebhookTools(server, client) {
38
38
  const result = await client.del(`/api/v1/webhooks/manage/${id}`);
39
39
  return formatResult(result);
40
40
  });
41
+ // (Smart Views slice A, Codex r70 m5) the drip send barrier's operator recovery, first-class for agents
42
+ server.tool("conduyt_cancel_webhook_log", "Cancel ONE parked / queued / failed webhook log of a drip send whose outcome was unconfirmed (POST /api/v1/webhook-logs/{id}/cancel; admin or owner, the webhooks scope). Without a resolution the log is cancelled and the barrier STANDS (nothing is sent, the enrollment stays parked). resolution 'skip' assumes the step was delivered: the processor advances without sending. resolution 'resend' makes the processor rebuild and send the step AGAIN (a possible duplicate SMS): it is refused unless acknowledgeDuplicateRisk is true. Answers 404 (no such log), 409 webhook_log_in_flight (a request is in flight right now: retry in a minute), 409 webhook_log_not_cancellable (already cancelled / succeeded) or 409 step_already_sent (the step already carries sent evidence: a resend would only advance it, use 'skip'). The response carries resolution, resendScheduled, advanceScheduled, handedBack, markersResolved and barrierStanding.", {
43
+ id: z.string().uuid().describe("Webhook log UUID (from the replay answer's replayBlockedIds / replayUnarmableIds, or the merge's 409 drip_send_unconfirmed)"),
44
+ resolution: z.enum(["resend", "skip"]).optional().describe("Omit to cancel only (the barrier stands). 'skip' = assume delivered, advance. 'resend' = send the step again (duplicate risk: needs acknowledgeDuplicateRisk)"),
45
+ acknowledgeDuplicateRisk: z.boolean().optional().describe("Required true with resolution 'resend': you accept the step may be delivered twice"),
46
+ }, async ({ id, resolution, acknowledgeDuplicateRisk }) => {
47
+ if (resolution === "resend" && acknowledgeDuplicateRisk !== true) {
48
+ return formatResult({ error: "resolution 'resend' may deliver the step twice: pass acknowledgeDuplicateRisk: true, or use resolution 'skip' to advance without sending" });
49
+ }
50
+ // the body as ONE literal: the contract gate reads the request fields from it (resolution, confirm)
51
+ const result = await client.post(`/api/v1/webhook-logs/${id}/cancel`, { ...(resolution ? { resolution } : {}), ...(resolution === "resend" ? { confirm: "RESEND_UNCONFIRMED_DRIP" } : {}) });
52
+ return formatResult(result);
53
+ });
41
54
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conduyt-mcp",
3
- "version": "4.68.0",
3
+ "version": "4.69.0",
4
4
  "description": "MCP server for Conduyt CRM — expose CRM operations as AI-accessible tools",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,11 +1,11 @@
1
1
  {
2
- "generatedAt": "2026-09-26T07:26:50.579Z",
3
- "toolCount": 288,
4
- "totalEndpoints": 1008,
2
+ "generatedAt": "2026-09-27T00:07:38.757Z",
3
+ "toolCount": 290,
4
+ "totalEndpoints": 1011,
5
5
  "counts": {
6
- "covered": 264,
6
+ "covered": 266,
7
7
  "excluded": 295,
8
- "planned": 449,
8
+ "planned": 450,
9
9
  "uncategorized": 0
10
10
  },
11
11
  "matrix": {
@@ -2499,6 +2499,12 @@
2499
2499
  "conduyt_list_drip_enrollments"
2500
2500
  ]
2501
2501
  },
2502
+ "POST /api/v1/drip-enrollments/:id/cancel-barrier": {
2503
+ "status": "covered",
2504
+ "tools": [
2505
+ "conduyt_cancel_drip_enrollment_barrier"
2506
+ ]
2507
+ },
2502
2508
  "GET /api/v1/drip-enrollments/:id/timeline": {
2503
2509
  "status": "planned",
2504
2510
  "reason": "drip enrollment timeline inspection"
@@ -4061,6 +4067,10 @@
4061
4067
  "conduyt_move_smart_view"
4062
4068
  ]
4063
4069
  },
4070
+ "GET /api/v1/smart-views/version": {
4071
+ "status": "planned",
4072
+ "reason": "smart view management beyond summaries"
4073
+ },
4064
4074
  "GET /api/v1/sms-providers": {
4065
4075
  "status": "planned",
4066
4076
  "reason": "SMS surfaces beyond send tools"
@@ -4394,6 +4404,12 @@
4394
4404
  "status": "planned",
4395
4405
  "reason": "outbound webhook delivery logs"
4396
4406
  },
4407
+ "POST /api/v1/webhook-logs/:id/cancel": {
4408
+ "status": "covered",
4409
+ "tools": [
4410
+ "conduyt_cancel_webhook_log"
4411
+ ]
4412
+ },
4397
4413
  "GET /api/v1/webhooks": {
4398
4414
  "status": "planned",
4399
4415
  "reason": "outbound webhook subscription management (distinct from the inbound /webhooks/ receivers)"