conduyt-mcp 4.59.0 → 4.61.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.
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ import { registerAutomationTools } from "./tools/automations.js";
14
14
  import { registerSequenceTools } from "./tools/sequences.js";
15
15
  import { registerMessagingTools } from "./tools/messaging.js";
16
16
  import { registerCallTools } from "./tools/calls.js";
17
+ import { registerDialerSettingsTools } from "./tools/dialer-settings.js";
17
18
  import { registerCompanyTools } from "./tools/companies.js";
18
19
  import { registerTagTools } from "./tools/tags.js";
19
20
  import { registerCalendarTools } from "./tools/calendar.js";
@@ -84,6 +85,7 @@ registerAutomationTools(server, client);
84
85
  registerSequenceTools(server, client);
85
86
  registerMessagingTools(server, client);
86
87
  registerCallTools(server, client);
88
+ registerDialerSettingsTools(server, client);
87
89
  registerCompanyTools(server, client);
88
90
  registerTagTools(server, client);
89
91
  registerCalendarTools(server, client);
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ConduytClient } from "../client.js";
3
+ /**
4
+ * Smart Dialing policy (GET/PATCH /api/v1/dialer/settings): the account-wide rules every rep's Smart Dialing run
5
+ * follows. Read needs the dialer scope; update needs the settings scope (admin). (#95/#96, 2026-09-16)
6
+ */
7
+ export declare function registerDialerSettingsTools(server: McpServer, client: ConduytClient): void;
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ import { formatResult } from "../client.js";
3
+ /**
4
+ * Smart Dialing policy (GET/PATCH /api/v1/dialer/settings): the account-wide rules every rep's Smart Dialing run
5
+ * follows. Read needs the dialer scope; update needs the settings scope (admin). (#95/#96, 2026-09-16)
6
+ */
7
+ export function registerDialerSettingsTools(server, client) {
8
+ server.tool("conduyt_get_dialer_settings", "Read the account's Smart Dialing policy: autoAdvanceEnabled + pauseSeconds + advanceOn ('disposition' = the next dial waits for a saved disposition, 'timer' = the pause starts when the call ends), openLeadOnDial (the lead's record opens as each Smart Dialing call goes out), smartDialCallerId ('local_presence' = an area-code match from the number pool, the rep's own line when no pool exists; 'did' = always the rep's own line), and localPresenceConfigured (whether a number pool exists).", {}, async () => formatResult(await client.get("/api/v1/dialer/settings")));
9
+ server.tool("conduyt_update_dialer_settings", "Change the account's Smart Dialing policy (admin: settings scope). Send only the fields to change: autoAdvanceEnabled, pauseSeconds (1-60), advanceOn ('disposition' | 'timer'), openLeadOnDial (true = the lead's record opens as each Smart Dialing call goes out), smartDialCallerId ('local_presence' | 'did'). Returns the policy as saved.", {
10
+ autoAdvanceEnabled: z.boolean().optional().describe("Start the next dial automatically after a call"),
11
+ pauseSeconds: z.number().int().min(1).max(60).optional().describe("Seconds between calls when auto-advance is on"),
12
+ advanceOn: z.enum(["disposition", "timer"]).optional().describe("'disposition': wait for a saved disposition; 'timer': the pause starts when the call ends"),
13
+ openLeadOnDial: z.boolean().optional().describe("Open the lead's record as each Smart Dialing call goes out (default true)"),
14
+ smartDialCallerId: z.enum(["local_presence", "did"]).optional().describe("Line Smart Dialing calls go out on: Local Presence (default) or the rep's own DID"),
15
+ }, async ({ autoAdvanceEnabled, pauseSeconds, advanceOn, openLeadOnDial, smartDialCallerId }) => {
16
+ if ([autoAdvanceEnabled, pauseSeconds, advanceOn, openLeadOnDial, smartDialCallerId].every((v) => v === undefined)) {
17
+ return { content: [{ type: "text", text: "Nothing to change: pass at least one of autoAdvanceEnabled, pauseSeconds, advanceOn, openLeadOnDial, smartDialCallerId." }], isError: true };
18
+ }
19
+ // undefined fields drop out of the JSON body, so only the named changes reach the route
20
+ const result = await client.patch("/api/v1/dialer/settings", { autoAdvanceEnabled, pauseSeconds, advanceOn, openLeadOnDial, smartDialCallerId });
21
+ return formatResult(result);
22
+ });
23
+ }
@@ -19,7 +19,7 @@ export function registerSmartViewTools(server, client) {
19
19
  const result = await client.get("/api/v1/smart-views");
20
20
  return formatResult(result);
21
21
  });
22
- server.tool("conduyt_update_smart_view_dialing", "Change one Smart View's Smart Dialing settings (admin key): make it a priority or not, the lifetime attempt cap, the per-day cap (null = no daily cap, counted in the account timezone), the cooldown between calls to the same lead, and the retry schedule. Only the fields you pass change. Use conduyt_reorder_smart_views to change WHICH priority it is.", {
22
+ server.tool("conduyt_update_smart_view_dialing", "Change one Smart View's Smart Dialing settings (admin key): make it a priority or not, the lifetime attempt cap, the per-day cap (null = no daily cap, counted in the account timezone), the cooldown between calls to the same lead, the shared pool and when a pool lead is assigned, and the retry schedule. Only the fields you pass change. Use conduyt_reorder_smart_views to change WHICH priority it is.", {
23
23
  id: z.string().uuid().describe("Smart View UUID (from conduyt_list_smart_views)"),
24
24
  dialEnabled: z.boolean().optional().describe("true = this view is a Smart Dialing priority; false = agents no longer dial it"),
25
25
  maxDialAttempts: z.number().int().min(1).max(20).optional().describe("Stop after N calls to a lead, ever (1–20)"),
@@ -35,14 +35,18 @@ export function registerSmartViewTools(server, client) {
35
35
  dialIncludeUnassigned: z
36
36
  .boolean()
37
37
  .optional()
38
- .describe("true = this priority also hands out leads nobody owns yet (a shared pool; the lead is assigned to the rep at hand-out); false = the rep's own leads only"),
38
+ .describe("true = this priority also hands out leads nobody owns yet (a shared pool); false = the rep's own leads only"),
39
+ dialPoolAssignOn: z
40
+ .enum(["handout", "disposition"])
41
+ .optional()
42
+ .describe("Shared pool only: when an unowned lead becomes the rep's. handout (default) = the moment the dialer offers it; disposition = only when the rep saves a disposition (an unanswered lead goes back to the pool)"),
39
43
  dialSchedule: z
40
44
  .array(scheduleStepSchema)
41
45
  .min(1)
42
46
  .max(20)
43
47
  .optional()
44
48
  .describe('Retry schedule, e.g. [{"attemptNumber":1,"delayMinutes":0},{"attemptNumber":2,"delayMinutes":60},{"attemptNumber":3,"delayMinutes":1440}]'),
45
- }, async ({ id, dialEnabled, maxDialAttempts, maxDialAttemptsPerDay, dialCooldownMinutes, dialIncludeUnassigned, dialSchedule }) => {
49
+ }, async ({ id, dialEnabled, maxDialAttempts, maxDialAttemptsPerDay, dialCooldownMinutes, dialIncludeUnassigned, dialPoolAssignOn, dialSchedule }) => {
46
50
  // Inline body (undefined fields drop out in JSON) — keeps the shape
47
51
  // readable by the contract verifier's static parser.
48
52
  const result = await client.patch(`/api/v1/smart-views/${encodeURIComponent(id)}`, {
@@ -51,6 +55,7 @@ export function registerSmartViewTools(server, client) {
51
55
  maxDialAttemptsPerDay,
52
56
  dialCooldownMinutes,
53
57
  dialIncludeUnassigned,
58
+ dialPoolAssignOn,
54
59
  dialSchedule,
55
60
  });
56
61
  return formatResult(result);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conduyt-mcp",
3
- "version": "4.59.0",
3
+ "version": "4.61.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-16T04:52:03.211Z",
3
- "toolCount": 275,
4
- "totalEndpoints": 983,
2
+ "generatedAt": "2026-09-16T16:47:18.079Z",
3
+ "toolCount": 277,
4
+ "totalEndpoints": 984,
5
5
  "counts": {
6
- "covered": 257,
7
- "excluded": 291,
8
- "planned": 435,
6
+ "covered": 259,
7
+ "excluded": 289,
8
+ "planned": 436,
9
9
  "uncategorized": 0
10
10
  },
11
11
  "matrix": {
@@ -2296,12 +2296,16 @@
2296
2296
  "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2297
2297
  },
2298
2298
  "GET /api/v1/dialer/settings": {
2299
- "status": "excluded",
2300
- "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2299
+ "status": "covered",
2300
+ "tools": [
2301
+ "conduyt_get_dialer_settings"
2302
+ ]
2301
2303
  },
2302
2304
  "PATCH /api/v1/dialer/settings": {
2303
- "status": "excluded",
2304
- "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2305
+ "status": "covered",
2306
+ "tools": [
2307
+ "conduyt_update_dialer_settings"
2308
+ ]
2305
2309
  },
2306
2310
  "GET /api/v1/dialer/setup": {
2307
2311
  "status": "excluded",
@@ -3920,6 +3924,10 @@
3920
3924
  "status": "planned",
3921
3925
  "reason": "smart view management beyond summaries"
3922
3926
  },
3927
+ "GET /api/v1/smart-views/:id": {
3928
+ "status": "planned",
3929
+ "reason": "smart view management beyond summaries"
3930
+ },
3923
3931
  "PATCH /api/v1/smart-views/:id": {
3924
3932
  "status": "covered",
3925
3933
  "tools": [