conduyt-mcp 4.46.0 → 4.48.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
@@ -55,7 +55,7 @@ MCP server for [Conduyt CRM](https://conduyt.app) — expose your CRM as AI-acce
55
55
  ### AI
56
56
  | Tool | Description |
57
57
  |------|-------------|
58
- | `conduyt_ai_insights` | AI-powered CRM analytics (8 query types) |
58
+ | `conduyt_ai_insights` | AI-powered CRM analytics (11 query types, incl. report_catalog, saved_report and dashboard: run any saved report or board) |
59
59
 
60
60
  ### Automations
61
61
  | Tool | Description |
package/dist/tools/ai.js CHANGED
@@ -1,8 +1,11 @@
1
1
  import { z } from "zod";
2
2
  import { formatResult } from "../client.js";
3
3
  export function registerAiTools(server, client) {
4
- server.tool("conduyt_ai_insights", "Query AI-powered CRM insights. 8 query types available: pipeline_health (deals per stage, stale deals), sms_drip_status (SMS drip overview by provider/step), sms_responses_untouched (replied contacts with no follow-up), agent_followups (per-agent task performance), email_performance (open/click/reply rates), smart_view_summary (contact counts per saved view), team_activity (per-user activity counts), contact_import_history (recent import batches).", {
4
+ server.tool("conduyt_ai_insights", "Query AI-powered CRM insights. 11 query types: report_catalog (every saved report and dashboard this key can run), saved_report (run any saved report by name or id: rows, total, metric, chart data, pivot; optionally windowed with filters.period or filters.dateRange, reps and sources, paged with page / perPage), dashboard (run every tile of a dashboard by name or id, its saved filters or the filters passed for this run), pipeline_health (deals per stage, stale deals), sms_drip_status (SMS drip overview by provider/step), sms_responses_untouched (replied contacts with no follow-up), agent_followups (per-agent task performance), email_performance (open/click/reply rates), smart_view_summary (contact counts per saved view), team_activity (per-user activity counts), contact_import_history (recent import batches).", {
5
5
  query: z.enum([
6
+ "report_catalog",
7
+ "saved_report",
8
+ "dashboard",
6
9
  "pipeline_health",
7
10
  "sms_drip_status",
8
11
  "sms_responses_untouched",
@@ -12,6 +15,10 @@ export function registerAiTools(server, client) {
12
15
  "team_activity",
13
16
  "contact_import_history",
14
17
  ]).describe("Insight query type"),
18
+ report: z.object({ id: z.string().uuid().optional(), name: z.string().optional() }).optional().describe("saved_report: the saved report to run, by id or by exact name (case-insensitive); two of a name is a 409 naming both"),
19
+ dashboard: z.object({ id: z.string().uuid().optional(), name: z.string().optional() }).optional().describe("dashboard: the dashboard to run, by id or by exact name"),
20
+ page: z.number().int().min(1).optional().describe("saved_report: page number (default 1)"),
21
+ perPage: z.number().int().min(1).max(500).optional().describe("saved_report: rows per page (default 50, max 500)"),
15
22
  filters: z
16
23
  .object({
17
24
  dateRange: z
@@ -20,7 +27,10 @@ export function registerAiTools(server, client) {
20
27
  to: z.string().describe("ISO 8601 date"),
21
28
  })
22
29
  .optional()
23
- .describe("Date range to scope the query"),
30
+ .describe("Date range to scope the query (saved_report / dashboard: a custom window; never together with period)"),
31
+ period: z.enum(["today", "this_week", "this_month", "this_quarter", "this_year", "last_7_days", "last_30_days", "last_90_days"]).optional().describe("saved_report / dashboard: a board preset window"),
32
+ assignedTo: z.array(z.string().uuid()).max(50).optional().describe("saved_report / dashboard: rep user ids to keep"),
33
+ sources: z.array(z.string()).max(50).optional().describe("saved_report / dashboard: lead sources to keep"),
24
34
  provider: z.string().optional().describe("Filter by provider (e.g. for sms_drip_status)"),
25
35
  pipelineId: z.string().optional().describe("Pipeline UUID (for pipeline_health)"),
26
36
  userId: z.string().optional().describe("User UUID (for agent_followups)"),
@@ -128,6 +128,24 @@ export function registerMessagingTools(server, client) {
128
128
  const result = await client.get(`/api/v1/reports/speed-to-lead?${params}`);
129
129
  return formatResult(result);
130
130
  });
131
+ server.tool("conduyt_attribution_report", "Attribution: where the window's new contacts came from and what they turned into: the contacts created in the window grouped by their first or latest touch (UTM source, medium, campaign, content, term, the channel, the landing page or the referrer), each group followed to appointments booked, deals won and revenue so far. Touches are captured on forms, booking pages, inbound webhooks, imports and contact creation through the API (pass an `attribution` object with utm_source, utm_medium, utm_campaign, utm_content, utm_term, referrer, landingUrl, pageTitle, clickIds). Spans clamp to 366 days; the definition comes back as `definition`.", {
132
+ from: z.string().optional().describe("ISO start (omit both for the last 366 days)"),
133
+ to: z.string().optional().describe("ISO end"),
134
+ touch: z.enum(["first", "last"]).optional().describe("Group by the first (default) or the latest touch"),
135
+ group: z.enum(["source", "utm_source", "medium", "campaign", "content", "term", "channel", "landing", "referrer"]).optional().describe("The touch field to group by (default source = the UTM source when the touch carried one, else the recorded source; utm_source = strictly the UTM)"),
136
+ }, async ({ from, to, touch, group }) => {
137
+ const params = new URLSearchParams();
138
+ if (from)
139
+ params.set("from", from);
140
+ if (to)
141
+ params.set("to", to);
142
+ if (touch)
143
+ params.set("touch", touch);
144
+ if (group)
145
+ params.set("group", group);
146
+ const result = await client.get(`/api/v1/reports/attribution?${params}`);
147
+ return formatResult(result);
148
+ });
131
149
  server.tool("conduyt_agent_performance_report", "Agent performance: every active rep's numbers for the window next to their targets and next to each other: calls, conversations, appointments booked, deals won, revenue, activities, talk minutes, each with the target prorated to the window (daily once per day, weekly per 7 days, monthly per 30.4375 days) and the attainment; a score per rep and a team row. userIds (up to 10) is the compare set. Spans clamp to 366 days; the definition comes back as `definition`.", {
132
150
  from: z.string().optional().describe("ISO start (omit both for the last 366 days)"),
133
151
  to: z.string().optional().describe("ISO end"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conduyt-mcp",
3
- "version": "4.46.0",
3
+ "version": "4.48.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",
@@ -1,10 +1,10 @@
1
1
  {
2
- "generatedAt": "2026-09-11T11:05:33.223Z",
3
- "toolCount": 249,
4
- "totalEndpoints": 954,
2
+ "generatedAt": "2026-09-11T16:21:54.034Z",
3
+ "toolCount": 250,
4
+ "totalEndpoints": 956,
5
5
  "counts": {
6
- "covered": 231,
7
- "excluded": 283,
6
+ "covered": 232,
7
+ "excluded": 284,
8
8
  "planned": 440,
9
9
  "uncategorized": 0
10
10
  },
@@ -1545,6 +1545,10 @@
1545
1545
  "status": "excluded",
1546
1546
  "reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
1547
1547
  },
1548
+ "GET /api/v1/cron/hyros-source-sync": {
1549
+ "status": "excluded",
1550
+ "reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
1551
+ },
1548
1552
  "GET /api/v1/cron/job-run-monitor": {
1549
1553
  "status": "excluded",
1550
1554
  "reason": "CRON_SECRET-gated infrastructure jobs; never key-callable"
@@ -3223,6 +3227,12 @@
3223
3227
  "conduyt_appointment_report"
3224
3228
  ]
3225
3229
  },
3230
+ "GET /api/v1/reports/attribution": {
3231
+ "status": "covered",
3232
+ "tools": [
3233
+ "conduyt_attribution_report"
3234
+ ]
3235
+ },
3226
3236
  "GET /api/v1/reports/call-performance": {
3227
3237
  "status": "covered",
3228
3238
  "tools": [