conduyt-mcp 4.10.0 → 4.11.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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
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 500+ REST endpoints.
4
4
 
5
- ## 136 Tools
5
+ ## 161 Tools
6
6
 
7
7
  ### Discovery
8
8
  | Tool | Description |
@@ -252,6 +252,12 @@ MCP server for [Conduyt CRM](https://conduyt.app) — expose your CRM as AI-acce
252
252
  | `conduyt_ai_task_segment_and_act` | AI task (preview only): segment by filter, then tag/assign/update — execution is human-session-only |
253
253
  | `conduyt_ai_task_pipeline_cleanup` | AI task (preview only): find stale deals and tag/move/notify/report — execution is human-session-only |
254
254
 
255
+ ### Privacy (GDPR)
256
+ | Tool | Description |
257
+ |------|-------------|
258
+ | `conduyt_export_contact_data` | GDPR data-portability export — full portable JSON of everything held about a contact (owner/admin) |
259
+ | `conduyt_forget_contact` | IRREVERSIBLE GDPR right-to-be-forgotten erasure — requires `confirm='FORGET'` (owner only) |
260
+
255
261
  ## Setup
256
262
 
257
263
  ```bash
package/dist/index.js CHANGED
@@ -34,6 +34,7 @@ import { registerTemplateTools } from "./tools/templates.js";
34
34
  import { registerDashboardTools } from "./tools/dashboard.js";
35
35
  import { registerAiExtendedTools } from "./tools/ai-extended.js";
36
36
  import { registerWorkflowSandboxTools } from "./tools/workflow-sandbox.js";
37
+ import { registerPrivacyTools } from "./tools/privacy.js";
37
38
  const apiUrl = process.env.CONDUYT_API_URL;
38
39
  const apiKey = process.env.CONDUYT_API_KEY;
39
40
  if (!apiUrl || !apiKey) {
@@ -85,5 +86,6 @@ registerTemplateTools(server, client);
85
86
  registerDashboardTools(server, client);
86
87
  registerAiExtendedTools(server, client);
87
88
  registerWorkflowSandboxTools(server, client);
89
+ registerPrivacyTools(server, client);
88
90
  const transport = new StdioServerTransport();
89
91
  await server.connect(transport);
@@ -0,0 +1,11 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ConduytClient } from "../client.js";
3
+ /**
4
+ * GDPR privacy tools — tri-surface parity for the /gdpr-export and /gdpr-forget
5
+ * endpoints (audit F7). The API enforces role independently (export =
6
+ * owner/admin, forget = owner-only); these tools work with whatever role the
7
+ * API key carries. The forget is IRREVERSIBLE, so the tool requires an explicit
8
+ * confirm="FORGET" literal (mirroring the API contract) — a model cannot erase a
9
+ * contact without deliberately supplying it.
10
+ */
11
+ export declare function registerPrivacyTools(server: McpServer, client: ConduytClient): void;
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ import { formatResult } from "../client.js";
3
+ /**
4
+ * GDPR privacy tools — tri-surface parity for the /gdpr-export and /gdpr-forget
5
+ * endpoints (audit F7). The API enforces role independently (export =
6
+ * owner/admin, forget = owner-only); these tools work with whatever role the
7
+ * API key carries. The forget is IRREVERSIBLE, so the tool requires an explicit
8
+ * confirm="FORGET" literal (mirroring the API contract) — a model cannot erase a
9
+ * contact without deliberately supplying it.
10
+ */
11
+ export function registerPrivacyTools(server, client) {
12
+ server.tool("conduyt_export_contact_data", "GDPR data-portability export: returns the full portable JSON of everything held about a contact — profile, custom fields, tags, messages, notes, deals, activities, calls, appointments, files, and consent/suppression records. Read-only. Requires an owner or admin API key (the API enforces this).", {
13
+ // Strict UUID + encode: a raw id with slashes could otherwise traverse
14
+ // into a different subroute. Keep this export-only regardless of key role.
15
+ id: z.string().uuid().describe("Contact UUID to export"),
16
+ }, async ({ id }) => {
17
+ const result = await client.get(`/api/v1/contacts/${encodeURIComponent(id)}/gdpr-export`);
18
+ return formatResult(result);
19
+ });
20
+ server.tool("conduyt_forget_contact", "IRREVERSIBLE GDPR right-to-be-forgotten erasure: permanently anonymizes the contact and erases their personal data EVERYWHERE it appears — messages, notes, deals, files, automations, and exports — across the whole account. Suppression/consent tombstones are kept so they are not re-contacted. THERE IS NO UNDO. Requires an owner API key (the API enforces this) and an explicit confirm='FORGET'. On a large tenant this can legitimately take tens of seconds. A 409 is retryable (a concurrent merge or in-flight automation) — retry once.", {
21
+ // Strict UUID + encode — this must stay a forget of exactly this contact,
22
+ // never a traversal into another destructive endpoint.
23
+ id: z.string().uuid().describe("Contact UUID to erase"),
24
+ confirm: z
25
+ .literal("FORGET")
26
+ .describe("Must be exactly the string 'FORGET'. This is a hard safety gate for an irreversible erasure — do not supply it unless the erasure is intended."),
27
+ }, async ({ id, confirm }) => {
28
+ const result = await client.post(`/api/v1/contacts/${encodeURIComponent(id)}/gdpr-forget`, { confirm });
29
+ return formatResult(result);
30
+ });
31
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conduyt-mcp",
3
- "version": "4.10.0",
3
+ "version": "4.11.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",