conduyt-mcp 4.23.0 → 4.24.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/client.d.ts CHANGED
@@ -55,6 +55,7 @@ export declare class ConduytClient {
55
55
  post(path: string, body: unknown, opts?: RequestOptions): Promise<unknown>;
56
56
  postText(path: string, body: unknown, opts?: RequestOptions): Promise<string>;
57
57
  patch(path: string, body: unknown, opts?: RequestOptions): Promise<unknown>;
58
+ put(path: string, body: unknown, opts?: RequestOptions): Promise<unknown>;
58
59
  del(path: string, opts?: RequestOptions): Promise<unknown>;
59
60
  }
60
61
  export declare function formatResult(data: unknown): {
package/dist/client.js CHANGED
@@ -270,6 +270,9 @@ export class ConduytClient {
270
270
  patch(path, body, opts) {
271
271
  return this.request("PATCH", path, body, opts);
272
272
  }
273
+ put(path, body, opts) {
274
+ return this.request("PUT", path, body, opts);
275
+ }
273
276
  del(path, opts) {
274
277
  return this.request("DELETE", path, undefined, opts);
275
278
  }
package/dist/index.js CHANGED
@@ -39,6 +39,7 @@ import { registerAccountExportTools } from "./tools/account-exports.js";
39
39
  import { registerLifecycleTools } from "./tools/lifecycle.js";
40
40
  import { registerReplyCaptureTools } from "./tools/reply-capture.js";
41
41
  import { registerCallFlowTools } from "./tools/call-flows.js";
42
+ import { registerProjectBlueTools } from "./tools/project-blue.js";
42
43
  const apiUrl = process.env.CONDUYT_API_URL;
43
44
  const apiKey = process.env.CONDUYT_API_KEY;
44
45
  if (!apiUrl || !apiKey) {
@@ -100,5 +101,6 @@ registerAccountExportTools(server, client);
100
101
  registerLifecycleTools(server, client);
101
102
  registerReplyCaptureTools(server, client);
102
103
  registerCallFlowTools(server, client);
104
+ registerProjectBlueTools(server, client);
103
105
  const transport = new StdioServerTransport();
104
106
  await server.connect(transport);
@@ -0,0 +1,10 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ConduytClient } from "../client.js";
3
+ /**
4
+ * Project Blue (#49): the tenant's third telephony/SMS provider — dedicated
5
+ * iPhone lines (iMessage/SMS + FaceTime Audio), ONE line per agent. The API
6
+ * key itself is connected by a human in Settings → Project Blue; these tools
7
+ * cover what an AI operator needs: is it connected, which lines exist and who
8
+ * holds them, and moving lines between agents.
9
+ */
10
+ export declare function registerProjectBlueTools(server: McpServer, client: ConduytClient): void;
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ import { formatResult } from "../client.js";
3
+ /**
4
+ * Project Blue (#49): the tenant's third telephony/SMS provider — dedicated
5
+ * iPhone lines (iMessage/SMS + FaceTime Audio), ONE line per agent. The API
6
+ * key itself is connected by a human in Settings → Project Blue; these tools
7
+ * cover what an AI operator needs: is it connected, which lines exist and who
8
+ * holds them, and moving lines between agents.
9
+ */
10
+ export function registerProjectBlueTools(server, client) {
11
+ server.tool("conduyt_project_blue_status", "Project Blue connection status for this account (connected / not_configured, the API key masked) plus the current line assignments (which agent holds which iPhone line). Requires settings:view.", {}, async () => {
12
+ const result = await client.get("/api/v1/settings/project-blue");
13
+ return formatResult(result);
14
+ });
15
+ server.tool("conduyt_project_blue_lines", "The LIVE Project Blue line inventory read from the vendor with this account's key: every line (lineId, E.164 phoneNumber, name) with its assigned agent (assignedTo) or null, plus `orphaned` — assignments whose line the vendor no longer lists. 409 when Project Blue is not connected, 422 when the stored key was revoked, 502 when the vendor is unreachable. Requires settings:view.", {}, async () => {
16
+ const result = await client.get("/api/v1/settings/project-blue/lines");
17
+ return formatResult(result);
18
+ });
19
+ server.tool("conduyt_project_blue_assign_line", "Assign a Project Blue line to an agent, or release it (userId null). One line per agent and one agent per line: assigning a line another agent holds, or to an agent who already has a line, MOVES it — the response's `released` lists what was displaced. The line must exist on the vendor account right now (404 line_not_found otherwise); the agent must be an active member (404 user_not_found). Requires settings:edit.", {
20
+ lineId: z.string().uuid().describe("Project Blue line id (from conduyt_project_blue_lines)"),
21
+ userId: z.string().uuid().nullable().describe("Agent user id to hold the line, or null to release it"),
22
+ }, async ({ lineId, userId }) => {
23
+ const result = await client.put(`/api/v1/settings/project-blue/lines/${encodeURIComponent(lineId)}`, { userId });
24
+ return formatResult(result);
25
+ });
26
+ }
@@ -14,7 +14,7 @@ import { formatResult } from "../client.js";
14
14
  // limits (10 groups × 20 rules) so oversized payloads fail here instead of
15
15
  // round-tripping to a 400.
16
16
  const ruleSchema = z.object({
17
- field: z.string().describe("Filter field, e.g. assignedTo, source, tags, pipelineStage, dealStatus, createdAt"),
17
+ field: z.string().describe("Filter field, e.g. assignedTo, source, tags, pipeline (the whole pipeline), pipelineStage, dealStatus, createdAt"),
18
18
  operator: z.string().describe("Operator valid for the field, e.g. equals, is_any_of, contains, is_empty"),
19
19
  value: z.union([z.string(), z.array(z.string())]).optional(),
20
20
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conduyt-mcp",
3
- "version": "4.23.0",
3
+ "version": "4.24.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-04T21:17:21.600Z",
3
- "toolCount": 201,
4
- "totalEndpoints": 893,
2
+ "generatedAt": "2026-09-05T14:07:22.993Z",
3
+ "toolCount": 204,
4
+ "totalEndpoints": 908,
5
5
  "counts": {
6
- "covered": 186,
7
- "excluded": 263,
8
- "planned": 444,
6
+ "covered": 189,
7
+ "excluded": 273,
8
+ "planned": 446,
9
9
  "uncategorized": 0
10
10
  },
11
11
  "matrix": {
@@ -1521,6 +1521,10 @@
1521
1521
  "status": "excluded",
1522
1522
  "reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
1523
1523
  },
1524
+ "GET /api/v1/cron/mailbox-delta-recovery": {
1525
+ "status": "excluded",
1526
+ "reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
1527
+ },
1524
1528
  "GET /api/v1/cron/mailbox-webhook-renewal": {
1525
1529
  "status": "excluded",
1526
1530
  "reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
@@ -1605,6 +1609,14 @@
1605
1609
  "status": "excluded",
1606
1610
  "reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
1607
1611
  },
1612
+ "GET /api/v1/cron/process-inbound-sms-intake": {
1613
+ "status": "excluded",
1614
+ "reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
1615
+ },
1616
+ "GET /api/v1/cron/process-mailbox-intake": {
1617
+ "status": "excluded",
1618
+ "reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
1619
+ },
1608
1620
  "GET /api/v1/cron/process-outbox": {
1609
1621
  "status": "excluded",
1610
1622
  "reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
@@ -1979,6 +1991,22 @@
1979
1991
  "status": "excluded",
1980
1992
  "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
1981
1993
  },
1994
+ "GET /api/v1/dialer/call/:id/participants": {
1995
+ "status": "excluded",
1996
+ "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
1997
+ },
1998
+ "POST /api/v1/dialer/call/:id/participants": {
1999
+ "status": "excluded",
2000
+ "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2001
+ },
2002
+ "PATCH /api/v1/dialer/call/:id/participants/:participantSid": {
2003
+ "status": "excluded",
2004
+ "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2005
+ },
2006
+ "DELETE /api/v1/dialer/call/:id/participants/:participantSid": {
2007
+ "status": "excluded",
2008
+ "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2009
+ },
1982
2010
  "POST /api/v1/dialer/call/:id/record": {
1983
2011
  "status": "excluded",
1984
2012
  "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
@@ -2051,6 +2079,10 @@
2051
2079
  "status": "excluded",
2052
2080
  "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2053
2081
  },
2082
+ "GET /api/v1/dialer/local-presence/resolve": {
2083
+ "status": "excluded",
2084
+ "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2085
+ },
2054
2086
  "POST /api/v1/dialer/local-presence/sync": {
2055
2087
  "status": "covered",
2056
2088
  "tools": [
@@ -2061,6 +2093,10 @@
2061
2093
  "status": "excluded",
2062
2094
  "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2063
2095
  },
2096
+ "POST /api/v1/dialer/participants/events": {
2097
+ "status": "excluded",
2098
+ "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2099
+ },
2064
2100
  "GET /api/v1/dialer/queue": {
2065
2101
  "status": "excluded",
2066
2102
  "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
@@ -2073,6 +2109,10 @@
2073
2109
  "status": "excluded",
2074
2110
  "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2075
2111
  },
2112
+ "POST /api/v1/dialer/queue/worked": {
2113
+ "status": "excluded",
2114
+ "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
2115
+ },
2076
2116
  "GET /api/v1/dialer/recordings": {
2077
2117
  "status": "excluded",
2078
2118
  "reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
@@ -3359,6 +3399,32 @@
3359
3399
  "status": "planned",
3360
3400
  "reason": "account settings read/update surfaces"
3361
3401
  },
3402
+ "GET /api/v1/settings/project-blue": {
3403
+ "status": "covered",
3404
+ "tools": [
3405
+ "conduyt_project_blue_status"
3406
+ ]
3407
+ },
3408
+ "PUT /api/v1/settings/project-blue": {
3409
+ "status": "planned",
3410
+ "reason": "account settings read/update surfaces"
3411
+ },
3412
+ "DELETE /api/v1/settings/project-blue": {
3413
+ "status": "planned",
3414
+ "reason": "account settings read/update surfaces"
3415
+ },
3416
+ "GET /api/v1/settings/project-blue/lines": {
3417
+ "status": "covered",
3418
+ "tools": [
3419
+ "conduyt_project_blue_lines"
3420
+ ]
3421
+ },
3422
+ "PUT /api/v1/settings/project-blue/lines/:lineId": {
3423
+ "status": "covered",
3424
+ "tools": [
3425
+ "conduyt_project_blue_assign_line"
3426
+ ]
3427
+ },
3362
3428
  "GET /api/v1/settings/scheduled-export": {
3363
3429
  "status": "covered",
3364
3430
  "tools": [