conduyt-mcp 4.72.1 → 4.73.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 +3 -3
- package/dist/tools/deals.js +2 -1
- package/package.json +1 -1
- package/scripts/coverage-matrix.json +32 -4
package/README.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# Conduyt MCP Server
|
|
2
2
|
|
|
3
|
-
MCP server for [Conduyt CRM](https://conduyt.app) — expose your CRM as AI-accessible tools. Covers the core CRM surface (contacts, deals, pipelines, custom fields, automations, messaging, and more); use `conduyt_api_catalog` to discover the full set of
|
|
3
|
+
MCP server for [Conduyt CRM](https://conduyt.app) — expose your CRM as AI-accessible tools. Covers the core CRM surface (contacts, deals, pipelines, custom fields, automations, messaging, and more); use `conduyt_api_catalog` to discover the full set of 600+ REST endpoints.
|
|
4
4
|
|
|
5
5
|
## 299 Tools
|
|
6
6
|
|
|
7
7
|
### Discovery
|
|
8
8
|
| Tool | Description |
|
|
9
9
|
|------|-------------|
|
|
10
|
-
| `conduyt_api_catalog` | Discover all
|
|
10
|
+
| `conduyt_api_catalog` | Discover all 600+ API endpoints |
|
|
11
11
|
| `conduyt_check_permissions` | Introspect current API key permissions |
|
|
12
12
|
| `conduyt_search` | Global search across contacts, deals, companies, tasks |
|
|
13
13
|
|
|
@@ -26,7 +26,7 @@ MCP server for [Conduyt CRM](https://conduyt.app) — expose your CRM as AI-acce
|
|
|
26
26
|
| `conduyt_list_deals` | List deals by pipeline, stage, or assignee |
|
|
27
27
|
| `conduyt_get_deal` | Get deal details with history, including custom-field values |
|
|
28
28
|
| `conduyt_create_deal` | Create a deal with full attributes — currency (e.g. GBP), probability, priority, expected close date, contact/company, and structured custom-field values |
|
|
29
|
-
| `conduyt_update_deal` | Move stage, change value/currency, set probability or close date, reassign, mark won/lost, or write custom-field values |
|
|
29
|
+
| `conduyt_update_deal` | Move stage, change value/currency, set probability or close date, reassign, mark won/lost, or write custom-field values; optional `expectedUpdatedAt` pins the `updatedAt` you read, and a stale pin returns 409 `deal_changed` with the current `updatedAt` and writes nothing |
|
|
30
30
|
| `conduyt_import_deals` | Bulk-import deals (pipeline/stage by name, contact by email) via the canonical import engine — dedupes, side-effect-free, owner/admin only |
|
|
31
31
|
|
|
32
32
|
### Tasks
|
package/dist/tools/deals.js
CHANGED
|
@@ -105,7 +105,8 @@ export function registerDealTools(server, client) {
|
|
|
105
105
|
assignedTo: z.string().optional().describe("Reassign to user (owner) UUID"),
|
|
106
106
|
source: z.string().trim().min(1).max(500).optional().describe("Attribution source for THIS deal (the trigger that produced it) — distinct from the contact's first-touch source. Every deal keeps a source (#129): it can be changed, never cleared (null/blank are rejected). 1-500 chars."),
|
|
107
107
|
lostReason: z.string().optional().describe("Reason for a lost/disqualified deal. Some stages REQUIRE this on entry (the move fails with code STAGE_REQUIREMENTS listing lostReasonOptions when the stage has a configured dropdown — resend with one of those exact values)."),
|
|
108
|
-
customFields: z.record(z.any()).optional().describe("Structured custom-field values to merge, keyed by field key"),
|
|
108
|
+
customFields: z.record(z.any()).optional().describe("Structured custom-field values to merge, keyed by field key (send null for a key to clear it; keys you omit keep their current values)"),
|
|
109
|
+
expectedUpdatedAt: z.string().datetime({ message: "expectedUpdatedAt must be the deal's updatedAt exactly as the API returned it (UTC, trailing Z, e.g. 2026-10-06T23:19:00.000Z)" }).optional().describe("Optional: the deal's updatedAt from your last read, ISO 8601 exactly as returned (e.g. 2026-10-06T23:19:00.000Z). If the deal changed since, the update is refused (409, code deal_changed, with the current updatedAt) and nothing is written — read the deal again and retry. Omit for last-write-wins per field."),
|
|
109
110
|
}, async ({ id, ...updates }) => {
|
|
110
111
|
const result = await client.patch(`/api/v1/deals/${id}`, updates);
|
|
111
112
|
return formatResult(result);
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-10-
|
|
2
|
+
"generatedAt": "2026-10-04T13:54:51.239Z",
|
|
3
3
|
"toolCount": 299,
|
|
4
|
-
"totalEndpoints":
|
|
4
|
+
"totalEndpoints": 1043,
|
|
5
5
|
"counts": {
|
|
6
6
|
"covered": 273,
|
|
7
|
-
"excluded":
|
|
8
|
-
"planned":
|
|
7
|
+
"excluded": 317,
|
|
8
|
+
"planned": 453,
|
|
9
9
|
"uncategorized": 0
|
|
10
10
|
},
|
|
11
11
|
"matrix": {
|
|
@@ -189,6 +189,14 @@
|
|
|
189
189
|
"status": "planned",
|
|
190
190
|
"reason": "invoicing"
|
|
191
191
|
},
|
|
192
|
+
"POST /api/v1/invoices/:id/overpayments/:overpaymentId/manual-refund": {
|
|
193
|
+
"status": "planned",
|
|
194
|
+
"reason": "invoicing"
|
|
195
|
+
},
|
|
196
|
+
"POST /api/v1/invoices/:id/overpayments/:overpaymentId/refund": {
|
|
197
|
+
"status": "planned",
|
|
198
|
+
"reason": "invoicing"
|
|
199
|
+
},
|
|
192
200
|
"POST /api/v1/invoices/:id/payment-link": {
|
|
193
201
|
"status": "planned",
|
|
194
202
|
"reason": "invoicing"
|
|
@@ -235,6 +243,14 @@
|
|
|
235
243
|
"status": "excluded",
|
|
236
244
|
"reason": "public unauthenticated surfaces (forms, booking, unsubscribe) — no key semantics"
|
|
237
245
|
},
|
|
246
|
+
"GET /api/public/unsubscribe/confirm/:token": {
|
|
247
|
+
"status": "excluded",
|
|
248
|
+
"reason": "public unauthenticated surfaces (forms, booking, unsubscribe) — no key semantics"
|
|
249
|
+
},
|
|
250
|
+
"POST /api/public/unsubscribe/confirm/:token": {
|
|
251
|
+
"status": "excluded",
|
|
252
|
+
"reason": "public unauthenticated surfaces (forms, booking, unsubscribe) — no key semantics"
|
|
253
|
+
},
|
|
238
254
|
"GET /api/track/click/:messageId": {
|
|
239
255
|
"status": "excluded",
|
|
240
256
|
"reason": "email open/click tracking pixels and redirects — recipient-facing"
|
|
@@ -1865,6 +1881,14 @@
|
|
|
1865
1881
|
"status": "excluded",
|
|
1866
1882
|
"reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
|
|
1867
1883
|
},
|
|
1884
|
+
"GET /api/v1/cron/reconcile-overpayment-refunds": {
|
|
1885
|
+
"status": "excluded",
|
|
1886
|
+
"reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
|
|
1887
|
+
},
|
|
1888
|
+
"POST /api/v1/cron/reconcile-overpayment-refunds": {
|
|
1889
|
+
"status": "excluded",
|
|
1890
|
+
"reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
|
|
1891
|
+
},
|
|
1868
1892
|
"GET /api/v1/cron/reconcile-reply-capture": {
|
|
1869
1893
|
"status": "excluded",
|
|
1870
1894
|
"reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
|
|
@@ -2623,6 +2647,10 @@
|
|
|
2623
2647
|
"status": "planned",
|
|
2624
2648
|
"reason": "sending-domain management (reply-capture subpaths ARE covered — see the reply_capture_* tools)"
|
|
2625
2649
|
},
|
|
2650
|
+
"POST /api/v1/email/opt-out-list/resubscribe": {
|
|
2651
|
+
"status": "planned",
|
|
2652
|
+
"reason": "bulk email send surfaces"
|
|
2653
|
+
},
|
|
2626
2654
|
"POST /api/v1/email/send": {
|
|
2627
2655
|
"status": "covered",
|
|
2628
2656
|
"tools": [
|