conduyt-mcp 4.9.0 → 4.10.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/tools/bulk.js +20 -0
- package/dist/tools/contacts.js +7 -0
- package/dist/tools/messaging.js +18 -0
- package/package.json +1 -1
package/dist/tools/bulk.js
CHANGED
|
@@ -127,4 +127,24 @@ export function registerBulkTools(server, client) {
|
|
|
127
127
|
const result = await client.post("/api/v1/bulk/deals/update", params);
|
|
128
128
|
return formatResult(result);
|
|
129
129
|
});
|
|
130
|
+
server.tool("conduyt_import_preflight", "Pre-check a contact import BEFORE running it — returns criticalWarnings (phone-less list bound for SMS, heavy create-only duplicate skips, double-mapped columns), duplicate/existing-match estimates, invalid emails, DNC/litigator hits, SMS-provider readiness, and plan-limit impact. Same engine the import wizard uses; call this before conduyt_ai_import_contacts on any sizeable list.", {
|
|
131
|
+
objectType: z.enum(["contacts", "opportunities", "companies"]).default("contacts").describe("What the import creates"),
|
|
132
|
+
importMode: z.enum(["create_and_update", "create_only", "update_only"]).optional().describe("Duplicate handling mode the import will use"),
|
|
133
|
+
totalRows: z.number().describe("Total rows in the file/payload"),
|
|
134
|
+
emails: z.array(z.string()).optional().describe("All email values from the file (order-free)"),
|
|
135
|
+
phones: z.array(z.string()).optional().describe("All phone values from the file (order-free)"),
|
|
136
|
+
mappedFields: z.array(z.string()).optional().describe("The Conduyt field names your columns map to, e.g. ['firstName','phone']"),
|
|
137
|
+
removeDuplicates: z.boolean().optional().describe("Whether explicit dedupe is on"),
|
|
138
|
+
duplicateCheckFields: z.array(z.enum(["email", "phone"])).optional().describe("Identifiers explicit dedupe checks"),
|
|
139
|
+
rowIdentifiers: z.array(z.object({
|
|
140
|
+
email: z.string().nullable().optional(),
|
|
141
|
+
phone: z.string().nullable().optional(),
|
|
142
|
+
country: z.string().nullable().optional(),
|
|
143
|
+
firstName: z.string().nullable().optional(),
|
|
144
|
+
lastName: z.string().nullable().optional(),
|
|
145
|
+
})).optional().describe("Per-row {email, phone, country, firstName, lastName} for the exact name-aware skip estimate (recommended; falls back to a conservative estimate without it)"),
|
|
146
|
+
}, async (params) => {
|
|
147
|
+
const result = await client.post("/api/v1/imports/preflight", params);
|
|
148
|
+
return formatResult(result);
|
|
149
|
+
});
|
|
130
150
|
}
|
package/dist/tools/contacts.js
CHANGED
|
@@ -100,4 +100,11 @@ export function registerContactTools(server, client) {
|
|
|
100
100
|
const result = await client.post(`/api/v1/deals/${dealId}/contacts`, { contactId, role });
|
|
101
101
|
return formatResult(result);
|
|
102
102
|
});
|
|
103
|
+
server.tool("conduyt_verify_line_type", "Verify contacts' phone LINE TYPE (mobile/landline/VoIP) + carrier + validity via the tenant's own Twilio Lookup, stamping the results on each contact (Phone Verification custom fields). OPT-IN + TENANT-PAID (~$0.008/number on their Twilio): requires the account's lineTypeVerificationEnabled Twilio setting, configured Twilio credentials, and org-wide contact access (owner/admin/view_all). BATCHED + idempotent: each call verifies up to 50 not-yet-stamped contacts and returns { verified, remaining, done, byLineType } — CALL REPEATEDLY until done=true. Provide exactly ONE scope: smartListId or contactIds.", {
|
|
104
|
+
smartListId: z.string().uuid().optional().describe("Verify the unstamped members of this smart list"),
|
|
105
|
+
contactIds: z.array(z.string().uuid()).max(50000).optional().describe("Explicit contact UUIDs to verify (max 50,000)"),
|
|
106
|
+
}, async (params) => {
|
|
107
|
+
const result = await client.post("/api/v1/contacts/verify-line-type", params);
|
|
108
|
+
return formatResult(result);
|
|
109
|
+
});
|
|
103
110
|
}
|
package/dist/tools/messaging.js
CHANGED
|
@@ -66,4 +66,22 @@ export function registerMessagingTools(server, client) {
|
|
|
66
66
|
const result = await client.get(`/api/v1/messages?${params}`);
|
|
67
67
|
return formatResult(result);
|
|
68
68
|
});
|
|
69
|
+
server.tool("conduyt_sms_delivery_report", "SMS provider delivery-outcome report for external-workflow SMS drips: per-automation entered vs delivered / rejected (invalid, litigator, DNC) / provider-error / workflow dead-end, plus a send-attempt 'why rejected' reason breakdown (line_type = 'not mobile' often WRONGLY rejected; landline_skipped / no_phone_skipped = Conduyt's own recorded skips). Use to answer 'what did the SMS provider do with our drips?'", {
|
|
70
|
+
from: z.string().optional().describe("ISO start (omit both for the last 180 days; spans clamp to 180d)"),
|
|
71
|
+
to: z.string().optional().describe("ISO end"),
|
|
72
|
+
automationId: z.string().uuid().optional().describe("Scope to one automation"),
|
|
73
|
+
smartListId: z.string().uuid().optional().describe("Scope to contacts in this smart list"),
|
|
74
|
+
}, async ({ from, to, automationId, smartListId }) => {
|
|
75
|
+
const params = new URLSearchParams();
|
|
76
|
+
if (from)
|
|
77
|
+
params.set("from", from);
|
|
78
|
+
if (to)
|
|
79
|
+
params.set("to", to);
|
|
80
|
+
if (automationId)
|
|
81
|
+
params.set("automationId", automationId);
|
|
82
|
+
if (smartListId)
|
|
83
|
+
params.set("smartListId", smartListId);
|
|
84
|
+
const result = await client.get(`/api/v1/reports/sms-delivery?${params}`);
|
|
85
|
+
return formatResult(result);
|
|
86
|
+
});
|
|
69
87
|
}
|