@telora/mcp-products 0.21.1

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.
Files changed (63) hide show
  1. package/README.md +276 -0
  2. package/dist/cli/init.d.ts +2 -0
  3. package/dist/cli/init.js +94 -0
  4. package/dist/cli/init.js.map +1 -0
  5. package/dist/handlers/agentHandlers.d.ts +3 -0
  6. package/dist/handlers/agentHandlers.js +97 -0
  7. package/dist/handlers/agentHandlers.js.map +1 -0
  8. package/dist/handlers/connectorHandlers.d.ts +3 -0
  9. package/dist/handlers/connectorHandlers.js +401 -0
  10. package/dist/handlers/connectorHandlers.js.map +1 -0
  11. package/dist/handlers/contextHandlers.d.ts +8 -0
  12. package/dist/handlers/contextHandlers.js +169 -0
  13. package/dist/handlers/contextHandlers.js.map +1 -0
  14. package/dist/handlers/deliveryHandlers.d.ts +3 -0
  15. package/dist/handlers/deliveryHandlers.js +122 -0
  16. package/dist/handlers/deliveryHandlers.js.map +1 -0
  17. package/dist/handlers/deploymentProfileHandlers.d.ts +3 -0
  18. package/dist/handlers/deploymentProfileHandlers.js +104 -0
  19. package/dist/handlers/deploymentProfileHandlers.js.map +1 -0
  20. package/dist/handlers/discoverHandler.d.ts +23 -0
  21. package/dist/handlers/discoverHandler.js +83 -0
  22. package/dist/handlers/discoverHandler.js.map +1 -0
  23. package/dist/handlers/factoryHandlers.d.ts +3 -0
  24. package/dist/handlers/factoryHandlers.js +484 -0
  25. package/dist/handlers/factoryHandlers.js.map +1 -0
  26. package/dist/handlers/ideaHandlers.d.ts +3 -0
  27. package/dist/handlers/ideaHandlers.js +245 -0
  28. package/dist/handlers/ideaHandlers.js.map +1 -0
  29. package/dist/handlers/index.d.ts +15 -0
  30. package/dist/handlers/index.js +19 -0
  31. package/dist/handlers/index.js.map +1 -0
  32. package/dist/handlers/infrastructureHandlers.d.ts +3 -0
  33. package/dist/handlers/infrastructureHandlers.js +335 -0
  34. package/dist/handlers/infrastructureHandlers.js.map +1 -0
  35. package/dist/handlers/issueHandlers.d.ts +3 -0
  36. package/dist/handlers/issueHandlers.js +94 -0
  37. package/dist/handlers/issueHandlers.js.map +1 -0
  38. package/dist/handlers/okrHandlers.d.ts +3 -0
  39. package/dist/handlers/okrHandlers.js +194 -0
  40. package/dist/handlers/okrHandlers.js.map +1 -0
  41. package/dist/handlers/playbookHandlers.d.ts +3 -0
  42. package/dist/handlers/playbookHandlers.js +93 -0
  43. package/dist/handlers/playbookHandlers.js.map +1 -0
  44. package/dist/handlers/productHandlers.d.ts +3 -0
  45. package/dist/handlers/productHandlers.js +129 -0
  46. package/dist/handlers/productHandlers.js.map +1 -0
  47. package/dist/handlers/reportHandlers.d.ts +3 -0
  48. package/dist/handlers/reportHandlers.js +59 -0
  49. package/dist/handlers/reportHandlers.js.map +1 -0
  50. package/dist/handlers/strategyHandlers.d.ts +3 -0
  51. package/dist/handlers/strategyHandlers.js +116 -0
  52. package/dist/handlers/strategyHandlers.js.map +1 -0
  53. package/dist/handlers/workflowHandlers.d.ts +3 -0
  54. package/dist/handlers/workflowHandlers.js +93 -0
  55. package/dist/handlers/workflowHandlers.js.map +1 -0
  56. package/dist/index.d.ts +2 -0
  57. package/dist/index.js +284 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/shared.d.ts +77 -0
  60. package/dist/shared.js +147 -0
  61. package/dist/shared.js.map +1 -0
  62. package/package.json +47 -0
  63. package/scripts/postinstall.js +96 -0
@@ -0,0 +1,194 @@
1
+ // ---------------------------------------------------------------------------
2
+ // OKR tool handlers (consolidated): telora_objective, telora_key_result,
3
+ // telora_strategy_key_result
4
+ // ---------------------------------------------------------------------------
5
+ import { z } from "zod";
6
+ import { callProductApi, successResult, validationError, buildFields, wrapHandler, compactEntity, } from "../shared.js";
7
+ export function registerOkrTools(server, getCreds) {
8
+ // -- telora_objective ---------------------------------------------------------
9
+ server.tool("telora_objective", "Goal setting (OKR): manage strategic objectives. Objectives define what you want to achieve and can cascade " +
10
+ "(parent-child alignment). Actions: create an objective (title required), get details, list (filter by status), " +
11
+ "update fields (description, dates, final grade, owner).", {
12
+ action: z.enum(["create", "get", "list", "update"]).describe("Action to perform"),
13
+ objectiveId: z.string().uuid().optional().describe("Objective UUID (required for get, update)"),
14
+ title: z.string().max(500).optional().describe("Objective title (required for create)"),
15
+ description: z.string().max(2000).optional().describe("Objective description"),
16
+ status: z.enum(["draft", "active", "completed", "cancelled"]).optional().describe("Objective status (list: filter; create: defaults to draft)"),
17
+ startDate: z.string().nullable().optional().describe("Start date (ISO 8601, e.g. 2025-01-01) or null to clear"),
18
+ targetDate: z.string().nullable().optional().describe("Target date (ISO 8601, e.g. 2025-03-31) or null to clear"),
19
+ finalGrade: z.number().min(0).max(1).nullable().optional().describe("Final grade on 0.0-1.0 scale (Google OKR standard) or null to clear (update only)"),
20
+ ownerId: z.string().uuid().nullable().optional().describe("Owner profile UUID or null to clear"),
21
+ parentObjectiveId: z.string().uuid().optional().describe("Parent objective UUID for cascading alignment (create only)"),
22
+ productId: z.string().uuid().nullable().optional().describe("Product UUID to associate or null to clear"),
23
+ limit: z.number().int().min(1).max(500).optional().describe("Max results (1-500, default 50; list only)"),
24
+ offset: z.number().int().min(0).optional().describe("Number of results to skip (default 0; list only)"),
25
+ detail: z.enum(["titles", "summary", "full"]).optional().describe("Response detail level: titles (id+name), summary (default, compact), full (all fields). List only."),
26
+ returnFull: z.boolean().optional().describe("Return full entity (default: compact; create/update only)"),
27
+ }, wrapHandler(async (params) => {
28
+ switch (params.action) {
29
+ case "list": {
30
+ const fields = buildFields({ status: params.status });
31
+ const body = {
32
+ action: "objective_list",
33
+ fields: Object.keys(fields).length > 0 ? fields : undefined,
34
+ };
35
+ if (params.limit !== undefined)
36
+ body.limit = params.limit;
37
+ if (params.offset !== undefined)
38
+ body.offset = params.offset;
39
+ if (params.detail !== undefined)
40
+ body.detail = params.detail;
41
+ const result = await callProductApi(getCreds(), body);
42
+ return successResult({ items: result.objectives, totalCount: result.totalCount });
43
+ }
44
+ case "create": {
45
+ if (!params.title)
46
+ return validationError("title required for create");
47
+ const { title, description, status, startDate, targetDate, ownerId, parentObjectiveId, productId } = params;
48
+ const createParams = { title, description, status, startDate, targetDate, ownerId, parentObjectiveId, productId };
49
+ const fields = buildFields(createParams, ['title', 'description', 'status', 'startDate', 'targetDate', 'ownerId', 'parentObjectiveId', 'productId']);
50
+ const result = await callProductApi(getCreds(), {
51
+ action: "objective_create",
52
+ fields,
53
+ });
54
+ return successResult(compactEntity(result.objective, Object.keys(fields), params.returnFull));
55
+ }
56
+ case "get": {
57
+ if (!params.objectiveId)
58
+ return validationError("objectiveId required for get");
59
+ const result = await callProductApi(getCreds(), {
60
+ action: "objective_get",
61
+ objectiveId: params.objectiveId,
62
+ });
63
+ return successResult(result.objective);
64
+ }
65
+ case "update": {
66
+ if (!params.objectiveId)
67
+ return validationError("objectiveId required for update");
68
+ const { title, description, status, startDate, targetDate, finalGrade, ownerId, productId } = params;
69
+ const updateParams = { title, description, status, startDate, targetDate, finalGrade, ownerId, productId };
70
+ const fields = buildFields(updateParams, ['title', 'description', 'status', 'startDate', 'targetDate', 'finalGrade', 'ownerId', 'productId']);
71
+ if (Object.keys(fields).length === 0) {
72
+ return validationError("Provide at least one field to update");
73
+ }
74
+ const result = await callProductApi(getCreds(), {
75
+ action: "objective_update",
76
+ objectiveId: params.objectiveId,
77
+ fields,
78
+ });
79
+ return successResult(compactEntity(result.objective, Object.keys(fields), params.returnFull));
80
+ }
81
+ }
82
+ }));
83
+ // -- telora_key_result --------------------------------------------------------
84
+ server.tool("telora_key_result", "Measurable targets (OKR): manage key results under objectives. Key results define how you measure progress " +
85
+ "with metric types (percentage, count, currency), target values, and confidence levels. " +
86
+ "Actions: create a key result (objectiveId + title), list for an objective, update progress/confidence, " +
87
+ "delete (also removes strategy links).", {
88
+ action: z.enum(["create", "list", "update", "delete"]).describe("Action to perform"),
89
+ objectiveId: z.string().uuid().optional().describe("Objective UUID (required for create, list)"),
90
+ keyResultId: z.string().uuid().optional().describe("Key result UUID (required for update, delete)"),
91
+ title: z.string().max(500).optional().describe("Key result title (required for create)"),
92
+ description: z.string().max(2000).optional().describe("Key result description"),
93
+ metricType: z.enum(["percentage", "count", "currency", "custom"]).optional().describe("Metric type (defaults to percentage)"),
94
+ targetValue: z.number().optional().describe("Target value to achieve (defaults to 100)"),
95
+ currentValue: z.number().optional().describe("Current progress value (defaults to 0)"),
96
+ unit: z.string().max(50).nullable().optional().describe("Unit of measurement (e.g. '%', 'days', '$') or null to clear"),
97
+ confidenceLevel: z.enum(["low", "medium", "high"]).optional().describe("Confidence in achieving target (defaults to medium)"),
98
+ limit: z.number().int().min(1).max(500).optional().describe("Max results (1-500, default 50; list only)"),
99
+ offset: z.number().int().min(0).optional().describe("Number of results to skip (default 0; list only)"),
100
+ detail: z.enum(["titles", "summary", "full"]).optional().describe("Response detail level: titles (id+name), summary (default, compact), full (all fields). List only."),
101
+ returnFull: z.boolean().optional().describe("Return full entity (default: compact; create/update only)"),
102
+ }, wrapHandler(async (params) => {
103
+ switch (params.action) {
104
+ case "list": {
105
+ if (!params.objectiveId)
106
+ return validationError("objectiveId required for list");
107
+ const body = {
108
+ action: "key_result_list",
109
+ objectiveId: params.objectiveId,
110
+ };
111
+ if (params.limit !== undefined)
112
+ body.limit = params.limit;
113
+ if (params.offset !== undefined)
114
+ body.offset = params.offset;
115
+ if (params.detail !== undefined)
116
+ body.detail = params.detail;
117
+ const result = await callProductApi(getCreds(), body);
118
+ return successResult({ items: result.keyResults, totalCount: result.totalCount });
119
+ }
120
+ case "create": {
121
+ if (!params.objectiveId)
122
+ return validationError("objectiveId required for create");
123
+ if (!params.title)
124
+ return validationError("title required for create");
125
+ const { title, description, metricType, targetValue, currentValue, unit, confidenceLevel } = params;
126
+ const createParams = { title, description, metricType, targetValue, currentValue, unit, confidenceLevel };
127
+ const fields = buildFields(createParams, ['title', 'description', 'metricType', 'targetValue', 'currentValue', 'unit', 'confidenceLevel']);
128
+ const result = await callProductApi(getCreds(), {
129
+ action: "key_result_create",
130
+ objectiveId: params.objectiveId,
131
+ fields,
132
+ });
133
+ return successResult(compactEntity(result.keyResult, Object.keys(fields), params.returnFull));
134
+ }
135
+ case "update": {
136
+ if (!params.keyResultId)
137
+ return validationError("keyResultId required for update");
138
+ const { title, description, metricType, targetValue, currentValue, unit, confidenceLevel } = params;
139
+ const updateParams = { title, description, metricType, targetValue, currentValue, unit, confidenceLevel };
140
+ const fields = buildFields(updateParams, ['title', 'description', 'metricType', 'targetValue', 'currentValue', 'unit', 'confidenceLevel']);
141
+ if (Object.keys(fields).length === 0) {
142
+ return validationError("Provide at least one field to update");
143
+ }
144
+ const result = await callProductApi(getCreds(), {
145
+ action: "key_result_update",
146
+ keyResultId: params.keyResultId,
147
+ fields,
148
+ });
149
+ return successResult(compactEntity(result.keyResult, Object.keys(fields), params.returnFull));
150
+ }
151
+ case "delete": {
152
+ if (!params.keyResultId)
153
+ return validationError("keyResultId required for delete");
154
+ await callProductApi(getCreds(), {
155
+ action: "key_result_delete",
156
+ keyResultId: params.keyResultId,
157
+ });
158
+ return successResult({ deleted: true });
159
+ }
160
+ }
161
+ }));
162
+ // -- telora_strategy_key_result -----------------------------------------------
163
+ server.tool("telora_strategy_key_result", "OKR-strategy alignment: connect strategies to key results for traceability. " +
164
+ "Links show which strategies contribute to which measurable outcomes. " +
165
+ "Actions: link a strategy to a key result, unlink.", {
166
+ action: z.enum(["link", "unlink"]).describe("Action to perform"),
167
+ strategyId: z.string().uuid().optional().describe("Strategy UUID (required)"),
168
+ keyResultId: z.string().uuid().optional().describe("Key result UUID (required)"),
169
+ }, wrapHandler(async (params) => {
170
+ if (!params.strategyId)
171
+ return validationError("strategyId required");
172
+ if (!params.keyResultId)
173
+ return validationError("keyResultId required");
174
+ switch (params.action) {
175
+ case "link": {
176
+ const result = await callProductApi(getCreds(), {
177
+ action: "strategy_key_result_link",
178
+ strategyId: params.strategyId,
179
+ keyResultId: params.keyResultId,
180
+ });
181
+ return successResult(result.link);
182
+ }
183
+ case "unlink": {
184
+ await callProductApi(getCreds(), {
185
+ action: "strategy_key_result_unlink",
186
+ strategyId: params.strategyId,
187
+ keyResultId: params.keyResultId,
188
+ });
189
+ return successResult({ unlinked: true });
190
+ }
191
+ }
192
+ }));
193
+ }
194
+ //# sourceMappingURL=okrHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"okrHandlers.js","sourceRoot":"","sources":["../../src/handlers/okrHandlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type GetCreds } from "../shared.js";
3
+ export declare function registerPlaybookTools(server: McpServer, getCreds: GetCreds): void;
@@ -0,0 +1,93 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Playbook tool handler (consolidated):
3
+ // telora_playbook (list | get | create | instantiate)
4
+ // ---------------------------------------------------------------------------
5
+ import { z } from "zod";
6
+ import { callProductApi, successResult, validationError, buildFields, wrapHandler, compactEntity, } from "../shared.js";
7
+ export function registerPlaybookTools(server, getCreds) {
8
+ server.tool("telora_playbook", "Repeatable patterns: template strategies with pre-configured deliveries and issues. " +
9
+ "Playbooks capture proven execution patterns (audits, feature rollouts) that can be instantiated on any product. " +
10
+ "Actions: list playbooks (filter by category: audit/execution), get details, create (name required), " +
11
+ "instantiate on a product (creates strategy + deliveries + issues).", {
12
+ action: z.enum(["list", "get", "create", "instantiate"]).describe("Action to perform"),
13
+ playbookId: z.string().uuid().optional().describe("Playbook UUID (required for get, instantiate)"),
14
+ productId: z.string().uuid().optional().describe("Target product UUID (required for instantiate)"),
15
+ name: z.string().max(200).optional().describe("Playbook name (required for create)"),
16
+ description: z.string().max(2000).optional().describe("Playbook description (create only)"),
17
+ parameterSchema: z.string().optional().describe("JSON string of the parameter schema (create only)"),
18
+ parameters: z.string().optional().describe("JSON string of parameter values (instantiate only)"),
19
+ category: z.enum(["audit", "execution"]).optional().describe("Filter by category (list only)"),
20
+ limit: z.number().int().min(1).max(500).optional().describe("Max results (1-500, default 50)"),
21
+ offset: z.number().int().min(0).optional().describe("Number of results to skip (default 0)"),
22
+ detail: z.enum(["titles", "summary", "full"]).optional().describe("Response detail level"),
23
+ returnFull: z.boolean().optional().describe("Return full entity (default: compact)"),
24
+ }, wrapHandler(async (params) => {
25
+ switch (params.action) {
26
+ case "list": {
27
+ const body = { action: "playbook_list" };
28
+ if (params.limit !== undefined)
29
+ body.limit = params.limit;
30
+ if (params.offset !== undefined)
31
+ body.offset = params.offset;
32
+ if (params.detail !== undefined)
33
+ body.detail = params.detail;
34
+ if (params.category !== undefined)
35
+ body.category = params.category;
36
+ const result = await callProductApi(getCreds(), body);
37
+ return successResult({ items: result.playbooks, totalCount: result.totalCount });
38
+ }
39
+ case "get": {
40
+ if (!params.playbookId)
41
+ return validationError("playbookId required for get");
42
+ const result = await callProductApi(getCreds(), {
43
+ action: "playbook_get",
44
+ playbookId: params.playbookId,
45
+ });
46
+ return successResult(result.playbook);
47
+ }
48
+ case "create": {
49
+ if (!params.name)
50
+ return validationError("name required for create");
51
+ const fields = buildFields({ name: params.name, description: params.description });
52
+ if (params.parameterSchema !== undefined) {
53
+ try {
54
+ fields.parameterSchema = JSON.parse(params.parameterSchema);
55
+ }
56
+ catch {
57
+ return validationError("Invalid JSON for parameterSchema");
58
+ }
59
+ }
60
+ const result = await callProductApi(getCreds(), {
61
+ action: "playbook_create",
62
+ fields,
63
+ });
64
+ return successResult(compactEntity(result.playbook, Object.keys(fields), params.returnFull));
65
+ }
66
+ case "instantiate": {
67
+ if (!params.playbookId)
68
+ return validationError("playbookId required for instantiate");
69
+ if (!params.productId)
70
+ return validationError("productId required for instantiate");
71
+ let paramObj = {};
72
+ if (params.parameters !== undefined) {
73
+ try {
74
+ paramObj = JSON.parse(params.parameters);
75
+ }
76
+ catch {
77
+ return validationError("Invalid JSON for parameters");
78
+ }
79
+ }
80
+ const result = await callProductApi(getCreds(), {
81
+ action: "playbook_instantiate",
82
+ playbookId: params.playbookId,
83
+ productId: params.productId,
84
+ fields: { parameters: paramObj },
85
+ });
86
+ return successResult(result);
87
+ }
88
+ default:
89
+ return validationError(`Unknown action: ${params.action}`);
90
+ }
91
+ }));
92
+ }
93
+ //# sourceMappingURL=playbookHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbookHandlers.js","sourceRoot":"","sources":["../../src/handlers/playbookHandlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type GetCreds, type ToolProfile } from "../shared.js";
3
+ export declare function registerProductTools(server: McpServer, getCreds: GetCreds, profile?: ToolProfile): void;
@@ -0,0 +1,129 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Product tool handler (consolidated):
3
+ // telora_product (list | create | get | update | overview)
4
+ // ---------------------------------------------------------------------------
5
+ import { z } from "zod";
6
+ import { callProductApi, successResult, validationError, buildFields, wrapHandler, compactEntity, } from "../shared.js";
7
+ export function registerProductTools(server, getCreds, profile = 'full') {
8
+ server.tool("telora_product", "Product registry: manage the portfolio of software products. Each product scopes strategies, deliveries, issues, and context documents. " +
9
+ "Actions: list products, create a new product (name required), get product details (by name or id), " +
10
+ "update product settings (vision, audience, QA services), overview (full product summary with strategies and deliveries).", {
11
+ action: z.enum(["list", "create", "get", "update", "overview"]).describe("Action to perform"),
12
+ id: z.string().uuid().optional().describe("Product UUID (required for update; optional for get)"),
13
+ productId: z.string().uuid().optional().describe("Product UUID (required for overview)"),
14
+ name: z.string().max(100).optional().describe("Product name (required for create; optional for get as case-insensitive match)"),
15
+ description: z.string().optional().describe("Product description (supports Markdown)"),
16
+ vision: z.string().max(2000).optional().describe("Product vision statement"),
17
+ targetAudience: z.string().max(500).optional().describe("Target audience"),
18
+ unitId: z.string().uuid().nullable().optional().describe("Organizational unit UUID (null to unassign)"),
19
+ status: z.enum(["draft", "active", "archived"]).optional().describe("Product status (list: filter; create/update: set)"),
20
+ qaServices: z.array(z.object({
21
+ label: z.string().describe("Display label (e.g. 'Supabase Studio')"),
22
+ port: z.number().int().describe("Port number on the QA host"),
23
+ })).nullable().optional().describe("QA environment service URLs (null to clear)"),
24
+ limit: z.number().int().min(1).max(500).optional().describe("Max results (1-500, default 50)"),
25
+ offset: z.number().int().min(0).optional().describe("Number of results to skip (default 0)"),
26
+ detail: z.enum(["titles", "summary", "full"]).optional().describe("Response detail level"),
27
+ returnFull: z.boolean().optional().describe("Return full entity (default: compact)"),
28
+ }, wrapHandler(async (params) => {
29
+ switch (params.action) {
30
+ case "list": {
31
+ if (profile === 'factory')
32
+ return validationError("product list not available in factory profile");
33
+ const fields = buildFields({ status: params.status, unitId: params.unitId });
34
+ const body = {
35
+ action: "list",
36
+ fields: Object.keys(fields).length > 0 ? fields : undefined,
37
+ };
38
+ if (params.limit !== undefined)
39
+ body.limit = params.limit;
40
+ if (params.offset !== undefined)
41
+ body.offset = params.offset;
42
+ if (params.detail !== undefined)
43
+ body.detail = params.detail;
44
+ const result = await callProductApi(getCreds(), body);
45
+ const listResponse = { items: result.products, totalCount: result.totalCount };
46
+ if (profile === 'human') {
47
+ listResponse.context_hint = "Product context documents with design principles may be available. " +
48
+ "For architectural work, use telora_product_context list with includeMode='always' to load them, " +
49
+ "or telora_context_assemble for layered context at product/strategy/delivery scope.";
50
+ }
51
+ return successResult(listResponse);
52
+ }
53
+ case "create": {
54
+ if (profile !== 'full' && profile !== 'human')
55
+ return validationError("product create not available in this profile");
56
+ if (!params.name)
57
+ return validationError("name required for create");
58
+ const fields = buildFields(params, ['name', 'description', 'vision', 'targetAudience', 'unitId', 'status']);
59
+ const result = await callProductApi(getCreds(), {
60
+ action: "create",
61
+ fields,
62
+ });
63
+ return successResult(compactEntity(result.product, Object.keys(fields), params.returnFull));
64
+ }
65
+ case "get": {
66
+ if (!params.name && !params.id) {
67
+ return validationError("Provide either name or id for get");
68
+ }
69
+ const body = { action: "get" };
70
+ if (params.id)
71
+ body.productId = params.id;
72
+ if (params.name)
73
+ body.productName = params.name;
74
+ const result = await callProductApi(getCreds(), body);
75
+ return successResult(result.product);
76
+ }
77
+ case "update": {
78
+ if (profile !== 'full' && profile !== 'human')
79
+ return validationError("product update not available in this profile");
80
+ if (!params.id)
81
+ return validationError("id required for update");
82
+ const fields = buildFields(params, ['vision', 'description', 'targetAudience', 'unitId', 'status', 'qaServices']);
83
+ if (Object.keys(fields).length === 0) {
84
+ return validationError("Provide at least one field to update");
85
+ }
86
+ const result = await callProductApi(getCreds(), {
87
+ action: "update",
88
+ productId: params.id,
89
+ fields,
90
+ });
91
+ return successResult(compactEntity(result.product, Object.keys(fields), params.returnFull));
92
+ }
93
+ case "overview": {
94
+ if (profile === 'factory')
95
+ return validationError("product overview not available in factory profile");
96
+ const pid = params.productId || params.id;
97
+ if (!pid)
98
+ return validationError("productId required for overview");
99
+ const result = await callProductApi(getCreds(), {
100
+ action: "product_overview",
101
+ productId: pid,
102
+ });
103
+ if (profile === 'human') {
104
+ try {
105
+ const ctxResult = await callProductApi(getCreds(), {
106
+ action: "context_list",
107
+ productId: pid,
108
+ fields: { includeMode: "always" },
109
+ limit: 1,
110
+ });
111
+ if (ctxResult.totalCount > 0) {
112
+ result.context_hint =
113
+ `${ctxResult.totalCount} always-included context document(s) available. ` +
114
+ "Use telora_product_context list with includeMode='always' to load design principles, " +
115
+ "or telora_context_assemble for layered context.";
116
+ }
117
+ }
118
+ catch {
119
+ // Non-fatal: context hint is best-effort
120
+ }
121
+ }
122
+ return successResult(result);
123
+ }
124
+ default:
125
+ return validationError(`Unknown action: ${params.action}`);
126
+ }
127
+ }));
128
+ }
129
+ //# sourceMappingURL=productHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"productHandlers.js","sourceRoot":"","sources":["../../src/handlers/productHandlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type GetCreds } from "../shared.js";
3
+ export declare function registerReportTools(server: McpServer, getCreds: GetCreds): void;
@@ -0,0 +1,59 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Report tool handler (consolidated):
3
+ // telora_product_report (list | generate | update)
4
+ // ---------------------------------------------------------------------------
5
+ import { z } from "zod";
6
+ import { callProductApi, successResult, validationError, wrapHandler, } from "../shared.js";
7
+ export function registerReportTools(server, getCreds) {
8
+ server.tool("telora_product_report", "Stakeholder reports: AI-generated weekly digests summarizing strategy progress, deliveries, issues, escalations, and factory activity. " +
9
+ "Actions: list reports for a product, generate a new AI-powered weekly digest (creates draft), " +
10
+ "update draft report content.", {
11
+ action: z.enum(["list", "generate", "update"]).describe("Action to perform"),
12
+ productId: z.string().uuid().optional().describe("Product UUID (required for list, generate)"),
13
+ reportId: z.string().uuid().optional().describe("Report UUID (required for update)"),
14
+ content: z.string().optional().describe("Updated markdown content (required for update)"),
15
+ limit: z.number().int().min(1).max(100).optional().describe("Max results (1-100, default 50)"),
16
+ offset: z.number().int().min(0).optional().describe("Number of results to skip (default 0)"),
17
+ }, wrapHandler(async (params) => {
18
+ switch (params.action) {
19
+ case "list": {
20
+ if (!params.productId)
21
+ return validationError("productId required for list");
22
+ const body = {
23
+ action: "list_reports",
24
+ productId: params.productId,
25
+ };
26
+ if (params.limit !== undefined)
27
+ body.limit = params.limit;
28
+ if (params.offset !== undefined)
29
+ body.offset = params.offset;
30
+ const result = await callProductApi(getCreds(), body);
31
+ return successResult({ items: result.reports, totalCount: result.totalCount });
32
+ }
33
+ case "generate": {
34
+ if (!params.productId)
35
+ return validationError("productId required for generate");
36
+ const result = await callProductApi(getCreds(), {
37
+ action: "generate_report",
38
+ productId: params.productId,
39
+ });
40
+ return successResult(result.report);
41
+ }
42
+ case "update": {
43
+ if (!params.reportId)
44
+ return validationError("reportId required for update");
45
+ if (params.content === undefined)
46
+ return validationError("content required for update");
47
+ const result = await callProductApi(getCreds(), {
48
+ action: "update_report",
49
+ reportId: params.reportId,
50
+ fields: { content: params.content },
51
+ });
52
+ return successResult(result.report);
53
+ }
54
+ default:
55
+ return validationError(`Unknown action: ${params.action}`);
56
+ }
57
+ }));
58
+ }
59
+ //# sourceMappingURL=reportHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportHandlers.js","sourceRoot":"","sources":["../../src/handlers/reportHandlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type GetCreds, type ToolProfile } from "../shared.js";
3
+ export declare function registerStrategyTools(server: McpServer, getCreds: GetCreds, profile?: ToolProfile): void;