conduyt-mcp 4.50.0 → 4.51.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/README.md +2 -1
- package/dist/tools/messaging.js +10 -1
- package/package.json +1 -1
- package/scripts/coverage-matrix.json +15 -5
package/README.md
CHANGED
|
@@ -86,7 +86,8 @@ MCP server for [Conduyt CRM](https://conduyt.app) — expose your CRM as AI-acce
|
|
|
86
86
|
### Messaging
|
|
87
87
|
| Tool | Description |
|
|
88
88
|
|------|-------------|
|
|
89
|
-
| `conduyt_sms_transports` | What a workflow Send SMS step can speak through today: Twilio numbers, Project Blue lines held by active reps, the WhatsApp sender, webhook provider count, FromK.ai coming soon |
|
|
89
|
+
| `conduyt_sms_transports` | What a workflow Send SMS step can speak through today: Twilio numbers, Project Blue lines held by active reps, the WhatsApp sender, the Voicemail Drop recordings, webhook provider count, FromK.ai coming soon |
|
|
90
|
+
| `conduyt_voice_drop` | Place a voice drop to a contact: an outbound Twilio call with answering-machine detection that plays a Voicemail Drop recording to a machine (hangs up on a person unless onHuman is play); governed like a call (calls-tier consent, calling hours, one live call per lead) |
|
|
90
91
|
| `conduyt_whatsapp_templates` | The account's WhatsApp templates (Twilio Content) with Meta's approval verdict: sid, text with {{n}} placeholders, variables, approval |
|
|
91
92
|
| `conduyt_send_sms` | Send SMS to a contact (max 1600 chars); transport twilio, project_blue, or whatsapp (an approved template by Content SID, or free-form within the 24-hour window) |
|
|
92
93
|
| `conduyt_send_email` | Send a single email to a contact |
|
package/dist/tools/messaging.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { formatResult } from "../client.js";
|
|
3
3
|
export function registerMessagingTools(server, client) {
|
|
4
|
-
server.tool("conduyt_sms_transports", "What a workflow Send SMS step can speak through TODAY (GET /api/v1/sms/transports): twilio {connected, numbers[] = the account number + every active rep's assigned line, each a valid send_sms config.fromNumber}, projectBlue {connected, lines[] = Project Blue iPhone lines held by active reps, each lineId a valid config.projectBlueLineId for smsMode project_blue}, whatsapp {connected, sender = the account's WhatsApp sender for smsMode whatsapp; templates come from conduyt_whatsapp_templates}, webhook {providers = active webhook providers for smsMode webhook}, fromk {status: coming_soon}. Use it before building or editing a send_sms step so you never configure a transport that is not connected. Requires automations:view.", {}, async () => {
|
|
4
|
+
server.tool("conduyt_sms_transports", "What a workflow Send SMS step can speak through TODAY (GET /api/v1/sms/transports): twilio {connected, numbers[] = the account number + every active rep's assigned line, each a valid send_sms config.fromNumber}, projectBlue {connected, lines[] = Project Blue iPhone lines held by active reps, each lineId a valid config.projectBlueLineId for smsMode project_blue}, whatsapp {connected, sender = the account's WhatsApp sender for smsMode whatsapp; templates come from conduyt_whatsapp_templates}, voiceDrop {connected = Twilio is connected, recordings {hasDefault, templates[] = names valid as config.voiceDropRecording for smsMode voice_drop}}, webhook {providers = active webhook providers for smsMode webhook}, fromk {status: coming_soon}. Use it before building or editing a send_sms step so you never configure a transport that is not connected. Requires automations:view.", {}, async () => {
|
|
5
5
|
const result = await client.get("/api/v1/sms/transports");
|
|
6
6
|
return formatResult(result);
|
|
7
7
|
});
|
|
@@ -9,6 +9,15 @@ export function registerMessagingTools(server, client) {
|
|
|
9
9
|
const result = await client.get("/api/v1/sms/whatsapp/templates");
|
|
10
10
|
return formatResult(result);
|
|
11
11
|
});
|
|
12
|
+
server.tool("conduyt_voice_drop", "Place a voice drop to a contact (POST /api/v1/calls/voice-drop): an outbound Twilio call with answering-machine detection that plays one of the account's Voicemail Drop recordings (Settings → Twilio → Voicemail Drop; names from conduyt_sms_transports voiceDrop.recordings) when a machine answers, and hangs up quietly when a person answers unless onHuman is play. Governed like a call: calls-tier consent (a texting STOP does not block it, a DNC or litigator row does), the account's calling hours, one live call per lead. Placed from your own Twilio line (else the account number) unless fromNumber names a number the account owns. Returns 202 with the Call row; the outcome lands on it through the voice webhooks (disposition voicemail_drop = played to a machine, voice_drop_human = a person answered, voice_drop_live = played to a person, voice_drop_fax; status no-answer/busy when nobody picked up). Refusals carry a code (dnc, litigator, calling_window, active_call, missing_phone, voice_drop_recording_missing, voice_drop_not_configured); 429 and 502 are safe to retry. Requires dialer:create.", {
|
|
13
|
+
contactId: z.string().uuid().describe("Contact UUID — the drop calls the contact's primary number"),
|
|
14
|
+
recording: z.string().min(1).max(100).optional().describe("A Voicemail Drop template name (see conduyt_sms_transports voiceDrop.recordings.templates); omit for the default recording"),
|
|
15
|
+
fromNumber: z.string().regex(/^\+[1-9]\d{6,14}$/).optional().describe("Caller ID the account owns (the account number or an active rep's line, E.164); omit for your own line"),
|
|
16
|
+
onHuman: z.enum(["hang_up", "play"]).optional().describe("When a person answers: hang_up (default) ends the call quietly; play plays the recording anyway"),
|
|
17
|
+
}, async (params) => {
|
|
18
|
+
const result = await client.post("/api/v1/calls/voice-drop", params);
|
|
19
|
+
return formatResult(result);
|
|
20
|
+
});
|
|
12
21
|
server.tool("conduyt_send_sms", "Send an SMS message to a contact. Contact must have a phone number and not have opted out. Max 1600 characters.", {
|
|
13
22
|
contactId: z.string().describe("Contact UUID — must have a phone number on file"),
|
|
14
23
|
body: z.string().max(1600).optional().describe("Message text (max 1600 characters). Required unless a WhatsApp template is sent (transport whatsapp + whatsappContentSid): then the template Twilio renders is the text, and a media-only template has none."),
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-09-
|
|
3
|
-
"toolCount":
|
|
4
|
-
"totalEndpoints":
|
|
2
|
+
"generatedAt": "2026-09-11T22:38:09.066Z",
|
|
3
|
+
"toolCount": 256,
|
|
4
|
+
"totalEndpoints": 965,
|
|
5
5
|
"counts": {
|
|
6
|
-
"covered":
|
|
7
|
-
"excluded":
|
|
6
|
+
"covered": 239,
|
|
7
|
+
"excluded": 285,
|
|
8
8
|
"planned": 441,
|
|
9
9
|
"uncategorized": 0
|
|
10
10
|
},
|
|
@@ -1154,6 +1154,12 @@
|
|
|
1154
1154
|
"status": "planned",
|
|
1155
1155
|
"reason": "call subroutes beyond list/log"
|
|
1156
1156
|
},
|
|
1157
|
+
"POST /api/v1/calls/voice-drop": {
|
|
1158
|
+
"status": "covered",
|
|
1159
|
+
"tools": [
|
|
1160
|
+
"conduyt_voice_drop"
|
|
1161
|
+
]
|
|
1162
|
+
},
|
|
1157
1163
|
"GET /api/v1/chat/channels": {
|
|
1158
1164
|
"status": "planned",
|
|
1159
1165
|
"reason": "team chat read/post for agents"
|
|
@@ -4300,6 +4306,10 @@
|
|
|
4300
4306
|
"status": "excluded",
|
|
4301
4307
|
"reason": "inbound provider callback receivers (Twilio/Resend/etc.), not client-callable"
|
|
4302
4308
|
},
|
|
4309
|
+
"POST /api/v1/webhooks/voice/voice-drop": {
|
|
4310
|
+
"status": "excluded",
|
|
4311
|
+
"reason": "inbound provider callback receivers (Twilio/Resend/etc.), not client-callable"
|
|
4312
|
+
},
|
|
4303
4313
|
"POST /api/v1/webhooks/voice/voicemail": {
|
|
4304
4314
|
"status": "excluded",
|
|
4305
4315
|
"reason": "inbound provider callback receivers (Twilio/Resend/etc.), not client-callable"
|