conduyt-mcp 4.40.0 → 4.41.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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conduyt-mcp",
3
- "version": "4.40.0",
3
+ "version": "4.41.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-11T04:54:57.020Z",
3
+ "toolCount": 243,
4
+ "totalEndpoints": 950,
5
5
  "counts": {
6
- "covered": 216,
6
+ "covered": 225,
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"