conduyt-mcp 4.40.0 → 4.42.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/index.js CHANGED
@@ -42,6 +42,7 @@ import { registerReplyCaptureTools } from "./tools/reply-capture.js";
42
42
  import { registerCallFlowTools } from "./tools/call-flows.js";
43
43
  import { registerProjectBlueTools } from "./tools/project-blue.js";
44
44
  import { registerReportTools } from "./tools/reports.js";
45
+ import { registerReportDashboardTools } from "./tools/dashboards.js";
45
46
  const apiUrl = process.env.CONDUYT_API_URL;
46
47
  const apiKey = process.env.CONDUYT_API_KEY;
47
48
  if (!apiUrl || !apiKey) {
@@ -106,5 +107,6 @@ registerReplyCaptureTools(server, client);
106
107
  registerCallFlowTools(server, client);
107
108
  registerProjectBlueTools(server, client);
108
109
  registerReportTools(server, client);
110
+ registerReportDashboardTools(server, client);
109
111
  const transport = new StdioServerTransport();
110
112
  await server.connect(transport);
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ConduytClient } from "../client.js";
3
+ export declare function registerReportDashboardTools(server: McpServer, client: ConduytClient): void;
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ import { formatResult } from "../client.js";
3
+ const boardFiltersSchema = z.object({
4
+ dateRange: z.enum(["today", "this_week", "this_month", "this_quarter", "this_year", "last_7_days", "last_30_days", "last_90_days", "custom"]).optional(),
5
+ start: z.string().optional().describe("YYYY-MM-DD, with dateRange custom"),
6
+ end: z.string().optional().describe("YYYY-MM-DD, with dateRange custom"),
7
+ assignedTo: z.array(z.string().uuid()).max(50).optional().describe("Rep user ids"),
8
+ sources: z.array(z.string()).max(50).optional().describe("Lead sources"),
9
+ }).describe("Board filters, applied to EVERY tile at once (date window on the base date field, reps on assignedTo, sources on source)");
10
+ export function registerReportDashboardTools(server, client) {
11
+ server.tool("conduyt_list_dashboards", "The dashboards this key can open (shared boards and its own; admins see all): name, filters, tiles.", {}, async () => formatResult(await client.get("/api/v1/dashboards")));
12
+ server.tool("conduyt_create_dashboard", "Create a dashboard: a board of tiles, each a saved report shown as a KPI, chart, table or pivot, with one set of filters for the whole board.", {
13
+ name: z.string().min(1).max(120),
14
+ description: z.string().max(500).optional(),
15
+ filters: boardFiltersSchema.optional(),
16
+ isShared: z.boolean().optional().describe("Visible to the whole account (default false = only you and admins)"),
17
+ }, async ({ name, description, filters, isShared }) => formatResult(await client.post("/api/v1/dashboards", { name, description, filters, isShared })));
18
+ server.tool("conduyt_get_dashboard", "One dashboard with its tiles and their reports.", { id: z.string().uuid() }, async ({ id }) => formatResult(await client.get(`/api/v1/dashboards/${encodeURIComponent(id)}`)));
19
+ server.tool("conduyt_update_dashboard", "Rename, describe, share, replace the board filters, or reorder the tiles (tileOrder = every tile id once, in the new order). Only the fields you pass change.", {
20
+ id: z.string().uuid(),
21
+ name: z.string().min(1).max(120).optional(),
22
+ description: z.string().max(500).nullable().optional(),
23
+ filters: boardFiltersSchema.optional(),
24
+ isShared: z.boolean().optional(),
25
+ tileOrder: z.array(z.string().uuid()).optional(),
26
+ }, async ({ id, name, description, filters, isShared, tileOrder }) => formatResult(await client.patch(`/api/v1/dashboards/${encodeURIComponent(id)}`, { name, description, filters, isShared, tileOrder })));
27
+ server.tool("conduyt_delete_dashboard", "Delete a dashboard (its tiles go with it; the saved reports stay).", { id: z.string().uuid() }, async ({ id }) => formatResult(await client.del(`/api/v1/dashboards/${encodeURIComponent(id)}`)));
28
+ server.tool("conduyt_add_dashboard_tile", "Pin a saved report to a dashboard. kind kpi (style ledger | trend | goal; goal needs a target), chart (report needs a group by; style ranked | target | focus), table, or pivot (report needs a pivot). size s / m / l on a six-column grid.", {
29
+ id: z.string().uuid().describe("Dashboard id"),
30
+ savedReportId: z.string().uuid(),
31
+ kind: z.enum(["kpi", "chart", "table", "pivot"]),
32
+ style: z.enum(["ledger", "trend", "goal", "ranked", "target", "focus"]).optional(),
33
+ size: z.enum(["s", "m", "l"]).optional(),
34
+ title: z.string().max(120).optional().describe("Overrides the report name on the tile"),
35
+ target: z.number().nonnegative().optional().describe("For a goal KPI: the number the metric is measured against"),
36
+ }, async ({ id, savedReportId, kind, style, size, title, target }) => formatResult(await client.post(`/api/v1/dashboards/${encodeURIComponent(id)}/tiles`, { savedReportId, kind, style, size, title, target })));
37
+ server.tool("conduyt_update_dashboard_tile", "Change a tile's style, size, title or target (null clears the target).", {
38
+ id: z.string().uuid().describe("Dashboard id"),
39
+ tileId: z.string().uuid(),
40
+ style: z.enum(["ledger", "trend", "goal", "ranked", "target", "focus"]).nullable().optional(),
41
+ size: z.enum(["s", "m", "l"]).optional(),
42
+ title: z.string().max(120).nullable().optional(),
43
+ target: z.number().nonnegative().nullable().optional(),
44
+ }, async ({ id, tileId, style, size, title, target }) => formatResult(await client.patch(`/api/v1/dashboards/${encodeURIComponent(id)}/tiles/${encodeURIComponent(tileId)}`, { style, size, title, target })));
45
+ server.tool("conduyt_remove_dashboard_tile", "Remove a tile from a dashboard (the saved report stays).", { id: z.string().uuid().describe("Dashboard id"), tileId: z.string().uuid() }, async ({ id, tileId }) => formatResult(await client.del(`/api/v1/dashboards/${encodeURIComponent(id)}/tiles/${encodeURIComponent(tileId)}`)));
46
+ server.tool("conduyt_run_dashboard", "Run every tile of a dashboard with the board filters applied (pass filters to override them for this run only): KPI tiles carry the value, the previous window's value, the delta, and for trend a series, for goal the progress and pace; chart tiles the chart data; table tiles the first rows; pivot tiles the pivot grid. A tile whose report fails carries its error and the rest still return.", { id: z.string().uuid(), filters: boardFiltersSchema.optional() }, async ({ id, filters }) => formatResult(await client.post(`/api/v1/dashboards/${encodeURIComponent(id)}/run`, { filters })));
47
+ }
@@ -128,4 +128,20 @@ 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_funnel_report", "Stage funnel for ONE pipeline: every deal that entered each stage in the window (created in it, or moved into it) and what happened to that presence so far (advanced to a later stage, lost, moved back, handed off to another pipeline, still there; the five add up to the entries), with the median days a settled stay lasted, plus the pipeline cohort (deals created in the window by where they sit now: won / lost / open). Built from recorded stage moves, never from where deals sit now. Windows clamp to 90 days. GET /api/v1/reports/funnel", {
132
+ pipelineId: z.string().uuid().describe("The pipeline to report on"),
133
+ from: z.string().optional().describe("ISO start (omit both for the last 90 days; spans clamp to 90d)"),
134
+ to: z.string().optional().describe("ISO end"),
135
+ dateRange: z.string().optional().describe("A shared dashboard range key (today, week, month, quarter, year, last_30_days, ...) instead of from/to"),
136
+ }, async ({ pipelineId, from, to, dateRange }) => {
137
+ const params = new URLSearchParams({ pipelineId });
138
+ if (from)
139
+ params.set("from", from);
140
+ if (to)
141
+ params.set("to", to);
142
+ if (dateRange)
143
+ params.set("dateRange", dateRange);
144
+ const result = await client.get(`/api/v1/reports/funnel?${params}`);
145
+ return formatResult(result);
146
+ });
131
147
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conduyt-mcp",
3
- "version": "4.40.0",
3
+ "version": "4.42.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,11 +1,11 @@
1
1
  {
2
- "generatedAt": "2026-09-11T02:31:42.441Z",
3
- "toolCount": 234,
4
- "totalEndpoints": 940,
2
+ "generatedAt": "2026-09-11T07:55:35.252Z",
3
+ "toolCount": 244,
4
+ "totalEndpoints": 951,
5
5
  "counts": {
6
- "covered": 216,
6
+ "covered": 226,
7
7
  "excluded": 283,
8
- "planned": 441,
8
+ "planned": 442,
9
9
  "uncategorized": 0
10
10
  },
11
11
  "matrix": {
@@ -1895,6 +1895,60 @@
1895
1895
  "conduyt_dashboard"
1896
1896
  ]
1897
1897
  },
1898
+ "GET /api/v1/dashboards": {
1899
+ "status": "covered",
1900
+ "tools": [
1901
+ "conduyt_list_dashboards"
1902
+ ]
1903
+ },
1904
+ "POST /api/v1/dashboards": {
1905
+ "status": "covered",
1906
+ "tools": [
1907
+ "conduyt_create_dashboard"
1908
+ ]
1909
+ },
1910
+ "GET /api/v1/dashboards/:id": {
1911
+ "status": "covered",
1912
+ "tools": [
1913
+ "conduyt_get_dashboard"
1914
+ ]
1915
+ },
1916
+ "PATCH /api/v1/dashboards/:id": {
1917
+ "status": "covered",
1918
+ "tools": [
1919
+ "conduyt_update_dashboard"
1920
+ ]
1921
+ },
1922
+ "DELETE /api/v1/dashboards/:id": {
1923
+ "status": "covered",
1924
+ "tools": [
1925
+ "conduyt_delete_dashboard"
1926
+ ]
1927
+ },
1928
+ "POST /api/v1/dashboards/:id/run": {
1929
+ "status": "covered",
1930
+ "tools": [
1931
+ "conduyt_run_dashboard"
1932
+ ]
1933
+ },
1934
+ "POST /api/v1/dashboards/:id/tiles": {
1935
+ "status": "covered",
1936
+ "tools": [
1937
+ "conduyt_add_dashboard_tile"
1938
+ ]
1939
+ },
1940
+ "PATCH /api/v1/dashboards/:id/tiles/:tileId": {
1941
+ "status": "covered",
1942
+ "tools": [
1943
+ "conduyt_update_dashboard_tile"
1944
+ ]
1945
+ },
1946
+ "DELETE /api/v1/dashboards/:id/tiles/:tileId": {
1947
+ "status": "covered",
1948
+ "tools": [
1949
+ "conduyt_remove_dashboard_tile"
1950
+ ]
1951
+ },
1898
1952
  "GET /api/v1/data-model/quality": {
1899
1953
  "status": "planned",
1900
1954
  "reason": "data-model quality reporting"
@@ -2879,6 +2933,10 @@
2879
2933
  "status": "planned",
2880
2934
  "reason": "notification surfaces"
2881
2935
  },
2936
+ "GET /api/v1/ops/capacity": {
2937
+ "status": "planned",
2938
+ "reason": "operator capacity dashboard (#51, shipped 2026-09) — read-only queue/park telemetry; a typed conduyt_capacity_snapshot tool is agent-relevant for throughput questions"
2939
+ },
2882
2940
  "GET /api/v1/phone-numbers": {
2883
2941
  "status": "planned",
2884
2942
  "reason": "phone number inventory"
@@ -3253,6 +3311,12 @@
3253
3311
  "status": "planned",
3254
3312
  "reason": "additional report surfaces beyond ai/insights"
3255
3313
  },
3314
+ "GET /api/v1/reports/funnel": {
3315
+ "status": "covered",
3316
+ "tools": [
3317
+ "conduyt_funnel_report"
3318
+ ]
3319
+ },
3256
3320
  "GET /api/v1/reports/pipeline": {
3257
3321
  "status": "planned",
3258
3322
  "reason": "additional report surfaces beyond ai/insights"