conduyt-mcp 4.23.1 → 4.25.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 +1 -0
- package/dist/client.js +3 -0
- package/dist/index.js +2 -0
- package/dist/tools/messaging.js +2 -0
- package/dist/tools/project-blue.d.ts +10 -0
- package/dist/tools/project-blue.js +26 -0
- package/package.json +1 -1
- package/scripts/coverage-matrix.json +76 -6
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);
|
package/dist/tools/messaging.js
CHANGED
|
@@ -5,6 +5,8 @@ export function registerMessagingTools(server, client) {
|
|
|
5
5
|
contactId: z.string().describe("Contact UUID — must have a phone number on file"),
|
|
6
6
|
body: z.string().describe("SMS message body (max 1600 characters)"),
|
|
7
7
|
fromNumber: z.string().optional().describe("Sender phone number (defaults to account's primary number)"),
|
|
8
|
+
transport: z.enum(["twilio", "project_blue"]).optional().describe("'project_blue' sends from the acting user's own Project Blue iPhone line (iMessage when the lead is on Apple, SMS otherwise; the user must have a line assigned in Settings → Project Blue). Default: Twilio."),
|
|
9
|
+
idempotencyKey: z.string().min(8).max(200).optional().describe("Operation key for at-most-once sends: reuse the SAME key when retrying a send whose outcome you did not see; a settled key answers with the original message and never sends twice."),
|
|
8
10
|
}, async (params) => {
|
|
9
11
|
const result = await client.post("/api/v1/messages/sms/send", params);
|
|
10
12
|
return formatResult(result);
|
|
@@ -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
|
+
}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-09-
|
|
3
|
-
"toolCount":
|
|
4
|
-
"totalEndpoints":
|
|
2
|
+
"generatedAt": "2026-09-05T15:24:32.841Z",
|
|
3
|
+
"toolCount": 204,
|
|
4
|
+
"totalEndpoints": 909,
|
|
5
5
|
"counts": {
|
|
6
|
-
"covered":
|
|
7
|
-
"excluded":
|
|
8
|
-
"planned":
|
|
6
|
+
"covered": 189,
|
|
7
|
+
"excluded": 274,
|
|
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"
|
|
@@ -1637,6 +1649,10 @@
|
|
|
1637
1649
|
"status": "excluded",
|
|
1638
1650
|
"reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
|
|
1639
1651
|
},
|
|
1652
|
+
"GET /api/v1/cron/project-blue-inbound-reconcile": {
|
|
1653
|
+
"status": "excluded",
|
|
1654
|
+
"reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
|
|
1655
|
+
},
|
|
1640
1656
|
"GET /api/v1/cron/prune-screen-share-sessions": {
|
|
1641
1657
|
"status": "excluded",
|
|
1642
1658
|
"reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
|
|
@@ -1979,6 +1995,22 @@
|
|
|
1979
1995
|
"status": "excluded",
|
|
1980
1996
|
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
1981
1997
|
},
|
|
1998
|
+
"GET /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
|
+
"POST /api/v1/dialer/call/:id/participants": {
|
|
2003
|
+
"status": "excluded",
|
|
2004
|
+
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
2005
|
+
},
|
|
2006
|
+
"PATCH /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
|
+
},
|
|
2010
|
+
"DELETE /api/v1/dialer/call/:id/participants/:participantSid": {
|
|
2011
|
+
"status": "excluded",
|
|
2012
|
+
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
2013
|
+
},
|
|
1982
2014
|
"POST /api/v1/dialer/call/:id/record": {
|
|
1983
2015
|
"status": "excluded",
|
|
1984
2016
|
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
@@ -2051,6 +2083,10 @@
|
|
|
2051
2083
|
"status": "excluded",
|
|
2052
2084
|
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
2053
2085
|
},
|
|
2086
|
+
"GET /api/v1/dialer/local-presence/resolve": {
|
|
2087
|
+
"status": "excluded",
|
|
2088
|
+
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
2089
|
+
},
|
|
2054
2090
|
"POST /api/v1/dialer/local-presence/sync": {
|
|
2055
2091
|
"status": "covered",
|
|
2056
2092
|
"tools": [
|
|
@@ -2061,6 +2097,10 @@
|
|
|
2061
2097
|
"status": "excluded",
|
|
2062
2098
|
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
2063
2099
|
},
|
|
2100
|
+
"POST /api/v1/dialer/participants/events": {
|
|
2101
|
+
"status": "excluded",
|
|
2102
|
+
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
2103
|
+
},
|
|
2064
2104
|
"GET /api/v1/dialer/queue": {
|
|
2065
2105
|
"status": "excluded",
|
|
2066
2106
|
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
@@ -2073,6 +2113,10 @@
|
|
|
2073
2113
|
"status": "excluded",
|
|
2074
2114
|
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
2075
2115
|
},
|
|
2116
|
+
"POST /api/v1/dialer/queue/worked": {
|
|
2117
|
+
"status": "excluded",
|
|
2118
|
+
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
2119
|
+
},
|
|
2076
2120
|
"GET /api/v1/dialer/recordings": {
|
|
2077
2121
|
"status": "excluded",
|
|
2078
2122
|
"reason": "realtime browser dialer (WebRTC tokens, live call control) — needs a live audio session"
|
|
@@ -3359,6 +3403,32 @@
|
|
|
3359
3403
|
"status": "planned",
|
|
3360
3404
|
"reason": "account settings read/update surfaces"
|
|
3361
3405
|
},
|
|
3406
|
+
"GET /api/v1/settings/project-blue": {
|
|
3407
|
+
"status": "covered",
|
|
3408
|
+
"tools": [
|
|
3409
|
+
"conduyt_project_blue_status"
|
|
3410
|
+
]
|
|
3411
|
+
},
|
|
3412
|
+
"PUT /api/v1/settings/project-blue": {
|
|
3413
|
+
"status": "planned",
|
|
3414
|
+
"reason": "account settings read/update surfaces"
|
|
3415
|
+
},
|
|
3416
|
+
"DELETE /api/v1/settings/project-blue": {
|
|
3417
|
+
"status": "planned",
|
|
3418
|
+
"reason": "account settings read/update surfaces"
|
|
3419
|
+
},
|
|
3420
|
+
"GET /api/v1/settings/project-blue/lines": {
|
|
3421
|
+
"status": "covered",
|
|
3422
|
+
"tools": [
|
|
3423
|
+
"conduyt_project_blue_lines"
|
|
3424
|
+
]
|
|
3425
|
+
},
|
|
3426
|
+
"PUT /api/v1/settings/project-blue/lines/:lineId": {
|
|
3427
|
+
"status": "covered",
|
|
3428
|
+
"tools": [
|
|
3429
|
+
"conduyt_project_blue_assign_line"
|
|
3430
|
+
]
|
|
3431
|
+
},
|
|
3362
3432
|
"GET /api/v1/settings/scheduled-export": {
|
|
3363
3433
|
"status": "covered",
|
|
3364
3434
|
"tools": [
|