@letpeoplework/lighthouse-mcp-core 1.1.0 → 1.2.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.cjs CHANGED
@@ -65,6 +65,19 @@ var throughputFilterViewProperty = {
65
65
  description: `Forecast-filter view (Lighthouse v26.5.24.10+). "filtered" applies the team's exclusion rule to throughput. Omit or "raw" returns unfiltered data.`
66
66
  }
67
67
  };
68
+ var cumulativeStateProperty = {
69
+ state: {
70
+ type: "string",
71
+ description: "Workflow state name to drill into (must match a bar's state from the cumulativeStateTime response)."
72
+ }
73
+ };
74
+ var itemIdsProperty = {
75
+ itemIds: {
76
+ type: "array",
77
+ items: { type: "integer" },
78
+ description: "Optional work-item IDs to narrow the computation to a selected subset; omit for all in-scope items."
79
+ }
80
+ };
68
81
  var forecastFilterOverrideProperty = {
69
82
  applyFilterOverride: {
70
83
  type: "boolean",
@@ -303,6 +316,90 @@ var toolDefinitions = [
303
316
  ],
304
317
  additionalProperties: false
305
318
  }
319
+ },
320
+ {
321
+ name: "lighthouse_team_metrics_cumulativeStateTime",
322
+ description: "Get cumulative time-per-state bar data for a team by ID: one entry per Doing-category workflow state with total/completed/ongoing contribution days and item counts. Optionally filter by date range and a subset of work-item IDs.",
323
+ inputSchema: {
324
+ type: "object",
325
+ properties: {
326
+ ...idInputSchema.properties,
327
+ ...dateRangeProperties,
328
+ ...itemIdsProperty
329
+ },
330
+ required: ["id"],
331
+ additionalProperties: false
332
+ }
333
+ },
334
+ {
335
+ name: "lighthouse_team_metrics_cumulativeStateTimeItems",
336
+ description: "Get the per-item drill-down for ONE state of a team's cumulative time-per-state chart: the work items that contributed to that state, with days contributed. Requires the state name.",
337
+ inputSchema: {
338
+ type: "object",
339
+ properties: {
340
+ ...idInputSchema.properties,
341
+ ...cumulativeStateProperty,
342
+ ...dateRangeProperties,
343
+ ...itemIdsProperty
344
+ },
345
+ required: ["id", "state"],
346
+ additionalProperties: false
347
+ }
348
+ },
349
+ {
350
+ name: "lighthouse_team_metrics_cumulativeStateTimeCandidates",
351
+ description: "List the work items selectable in a team's cumulative time-per-state item picker for the window (the in-scope candidate set). Search keys are referenceId and title.",
352
+ inputSchema: {
353
+ type: "object",
354
+ properties: {
355
+ ...idInputSchema.properties,
356
+ ...dateRangeProperties
357
+ },
358
+ required: ["id"],
359
+ additionalProperties: false
360
+ }
361
+ },
362
+ {
363
+ name: "lighthouse_portfolio_metrics_cumulativeStateTime",
364
+ description: "Get cumulative time-per-state bar data for a portfolio by ID: one entry per Doing-category workflow state with total/completed/ongoing contribution days and item counts. Optionally filter by date range and a subset of work-item IDs.",
365
+ inputSchema: {
366
+ type: "object",
367
+ properties: {
368
+ ...idInputSchema.properties,
369
+ ...dateRangeProperties,
370
+ ...itemIdsProperty
371
+ },
372
+ required: ["id"],
373
+ additionalProperties: false
374
+ }
375
+ },
376
+ {
377
+ name: "lighthouse_portfolio_metrics_cumulativeStateTimeItems",
378
+ description: "Get the per-item drill-down for ONE state of a portfolio's cumulative time-per-state chart: the work items that contributed to that state, with days contributed. Requires the state name.",
379
+ inputSchema: {
380
+ type: "object",
381
+ properties: {
382
+ ...idInputSchema.properties,
383
+ ...cumulativeStateProperty,
384
+ ...dateRangeProperties,
385
+ ...itemIdsProperty
386
+ },
387
+ required: ["id", "state"],
388
+ additionalProperties: false
389
+ }
390
+ },
391
+ {
392
+ name: "lighthouse_portfolio_metrics_cumulativeStateTimeCandidates",
393
+ description: "List the work items selectable in a portfolio's cumulative time-per-state item picker for the window (the in-scope candidate set). Search keys are referenceId and title.",
394
+ inputSchema: {
395
+ type: "object",
396
+ properties: {
397
+ ...idInputSchema.properties,
398
+ ...dateRangeProperties
399
+ },
400
+ required: ["id"],
401
+ additionalProperties: false
402
+ }
306
403
  }
307
404
  ];
308
405
  var encodePayload = (value) => {
@@ -354,6 +451,26 @@ var getDateRange = (argumentsPayload) => {
354
451
  }
355
452
  return void 0;
356
453
  };
454
+ var getStringArgument = (argumentsPayload, key) => {
455
+ if (!isObjectRecord(argumentsPayload)) {
456
+ return void 0;
457
+ }
458
+ const value = argumentsPayload[key];
459
+ return typeof value === "string" ? value : void 0;
460
+ };
461
+ var getItemIdsArgument = (argumentsPayload) => {
462
+ if (!isObjectRecord(argumentsPayload)) {
463
+ return void 0;
464
+ }
465
+ const value = argumentsPayload.itemIds;
466
+ if (!Array.isArray(value)) {
467
+ return void 0;
468
+ }
469
+ const ids = value.filter(
470
+ (entry) => typeof entry === "number" && Number.isInteger(entry)
471
+ );
472
+ return ids.length > 0 ? ids : void 0;
473
+ };
357
474
  var getThroughputFilterView = (argumentsPayload) => {
358
475
  if (!isObjectRecord(argumentsPayload)) {
359
476
  return void 0;
@@ -416,6 +533,42 @@ var toolInputSchemas = {
416
533
  startDate: isoDateStringSchema.optional(),
417
534
  endDate: isoDateStringSchema.optional()
418
535
  }),
536
+ lighthouse_team_metrics_cumulativeStateTime: import_zod.z.object({
537
+ id: import_zod.z.number().int(),
538
+ startDate: isoDateStringSchema.optional(),
539
+ endDate: isoDateStringSchema.optional(),
540
+ itemIds: import_zod.z.array(import_zod.z.number().int()).optional()
541
+ }),
542
+ lighthouse_team_metrics_cumulativeStateTimeItems: import_zod.z.object({
543
+ id: import_zod.z.number().int(),
544
+ state: import_zod.z.string(),
545
+ startDate: isoDateStringSchema.optional(),
546
+ endDate: isoDateStringSchema.optional(),
547
+ itemIds: import_zod.z.array(import_zod.z.number().int()).optional()
548
+ }),
549
+ lighthouse_team_metrics_cumulativeStateTimeCandidates: import_zod.z.object({
550
+ id: import_zod.z.number().int(),
551
+ startDate: isoDateStringSchema.optional(),
552
+ endDate: isoDateStringSchema.optional()
553
+ }),
554
+ lighthouse_portfolio_metrics_cumulativeStateTime: import_zod.z.object({
555
+ id: import_zod.z.number().int(),
556
+ startDate: isoDateStringSchema.optional(),
557
+ endDate: isoDateStringSchema.optional(),
558
+ itemIds: import_zod.z.array(import_zod.z.number().int()).optional()
559
+ }),
560
+ lighthouse_portfolio_metrics_cumulativeStateTimeItems: import_zod.z.object({
561
+ id: import_zod.z.number().int(),
562
+ state: import_zod.z.string(),
563
+ startDate: isoDateStringSchema.optional(),
564
+ endDate: isoDateStringSchema.optional(),
565
+ itemIds: import_zod.z.array(import_zod.z.number().int()).optional()
566
+ }),
567
+ lighthouse_portfolio_metrics_cumulativeStateTimeCandidates: import_zod.z.object({
568
+ id: import_zod.z.number().int(),
569
+ startDate: isoDateStringSchema.optional(),
570
+ endDate: isoDateStringSchema.optional()
571
+ }),
419
572
  lighthouse_feature_get: import_zod.z.object({
420
573
  ids: import_zod.z.array(import_zod.z.number().int()).optional(),
421
574
  refs: import_zod.z.array(import_zod.z.string()).optional()
@@ -594,6 +747,128 @@ var createMcpCoreRuntime = (dependencies) => ({
594
747
  `team metrics: ${result.error.category} (${result.error.reason})`
595
748
  );
596
749
  }
750
+ if (name === "lighthouse_team_metrics_cumulativeStateTime") {
751
+ const id = getNumericId(argumentsPayload);
752
+ if (id === null) {
753
+ return getErrorToolResult("team metrics: invalid id");
754
+ }
755
+ const result = await client.getTeamCumulativeStateTime(
756
+ id,
757
+ getDateRange(argumentsPayload),
758
+ getItemIdsArgument(argumentsPayload)
759
+ );
760
+ if (result.ok) {
761
+ return getSuccessToolResult(
762
+ `team cumulativeStateTime: ${encodePayload(result.value)}`
763
+ );
764
+ }
765
+ return getErrorToolResult(
766
+ `team metrics: ${result.error.category} (${result.error.reason})`
767
+ );
768
+ }
769
+ if (name === "lighthouse_team_metrics_cumulativeStateTimeItems") {
770
+ const id = getNumericId(argumentsPayload);
771
+ if (id === null) {
772
+ return getErrorToolResult("team metrics: invalid id");
773
+ }
774
+ const state = getStringArgument(argumentsPayload, "state");
775
+ if (state === void 0) {
776
+ return getErrorToolResult("team metrics: missing state");
777
+ }
778
+ const result = await client.getTeamCumulativeStateTimeItems(
779
+ id,
780
+ state,
781
+ getDateRange(argumentsPayload),
782
+ getItemIdsArgument(argumentsPayload)
783
+ );
784
+ if (result.ok) {
785
+ return getSuccessToolResult(
786
+ `team cumulativeStateTimeItems: ${encodePayload(result.value)}`
787
+ );
788
+ }
789
+ return getErrorToolResult(
790
+ `team metrics: ${result.error.category} (${result.error.reason})`
791
+ );
792
+ }
793
+ if (name === "lighthouse_team_metrics_cumulativeStateTimeCandidates") {
794
+ const id = getNumericId(argumentsPayload);
795
+ if (id === null) {
796
+ return getErrorToolResult("team metrics: invalid id");
797
+ }
798
+ const result = await client.getTeamCumulativeStateTimeCandidates(
799
+ id,
800
+ getDateRange(argumentsPayload)
801
+ );
802
+ if (result.ok) {
803
+ return getSuccessToolResult(
804
+ `team cumulativeStateTimeCandidates: ${encodePayload(result.value)}`
805
+ );
806
+ }
807
+ return getErrorToolResult(
808
+ `team metrics: ${result.error.category} (${result.error.reason})`
809
+ );
810
+ }
811
+ if (name === "lighthouse_portfolio_metrics_cumulativeStateTime") {
812
+ const id = getNumericId(argumentsPayload);
813
+ if (id === null) {
814
+ return getErrorToolResult("portfolio metrics: invalid id");
815
+ }
816
+ const result = await client.getPortfolioCumulativeStateTime(
817
+ id,
818
+ getDateRange(argumentsPayload),
819
+ getItemIdsArgument(argumentsPayload)
820
+ );
821
+ if (result.ok) {
822
+ return getSuccessToolResult(
823
+ `portfolio cumulativeStateTime: ${encodePayload(result.value)}`
824
+ );
825
+ }
826
+ return getErrorToolResult(
827
+ `portfolio metrics: ${result.error.category} (${result.error.reason})`
828
+ );
829
+ }
830
+ if (name === "lighthouse_portfolio_metrics_cumulativeStateTimeItems") {
831
+ const id = getNumericId(argumentsPayload);
832
+ if (id === null) {
833
+ return getErrorToolResult("portfolio metrics: invalid id");
834
+ }
835
+ const state = getStringArgument(argumentsPayload, "state");
836
+ if (state === void 0) {
837
+ return getErrorToolResult("portfolio metrics: missing state");
838
+ }
839
+ const result = await client.getPortfolioCumulativeStateTimeItems(
840
+ id,
841
+ state,
842
+ getDateRange(argumentsPayload),
843
+ getItemIdsArgument(argumentsPayload)
844
+ );
845
+ if (result.ok) {
846
+ return getSuccessToolResult(
847
+ `portfolio cumulativeStateTimeItems: ${encodePayload(result.value)}`
848
+ );
849
+ }
850
+ return getErrorToolResult(
851
+ `portfolio metrics: ${result.error.category} (${result.error.reason})`
852
+ );
853
+ }
854
+ if (name === "lighthouse_portfolio_metrics_cumulativeStateTimeCandidates") {
855
+ const id = getNumericId(argumentsPayload);
856
+ if (id === null) {
857
+ return getErrorToolResult("portfolio metrics: invalid id");
858
+ }
859
+ const result = await client.getPortfolioCumulativeStateTimeCandidates(
860
+ id,
861
+ getDateRange(argumentsPayload)
862
+ );
863
+ if (result.ok) {
864
+ return getSuccessToolResult(
865
+ `portfolio cumulativeStateTimeCandidates: ${encodePayload(result.value)}`
866
+ );
867
+ }
868
+ return getErrorToolResult(
869
+ `portfolio metrics: ${result.error.category} (${result.error.reason})`
870
+ );
871
+ }
597
872
  if (name === "lighthouse_portfolio_metrics_throughput") {
598
873
  const id = getNumericId(argumentsPayload);
599
874
  if (id === null) {
package/dist/index.d.cts CHANGED
@@ -15,7 +15,7 @@ type McpToolResult = {
15
15
  readonly content: readonly McpToolContent[];
16
16
  };
17
17
  type McpToolDefinition = {
18
- readonly name: "lighthouse_health_check" | "lighthouse_version_get" | "lighthouse_worktracking_list" | "lighthouse_worktracking_get" | "lighthouse_team_list" | "lighthouse_team_get" | "lighthouse_team_refresh" | "lighthouse_portfolio_list" | "lighthouse_portfolio_get" | "lighthouse_portfolio_refresh" | "lighthouse_team_metrics_throughput" | "lighthouse_team_metrics_cycleTimePercentiles" | "lighthouse_team_metrics_workItemAge" | "lighthouse_team_metrics_totalWorkItemAge" | "lighthouse_portfolio_metrics_throughput" | "lighthouse_portfolio_metrics_workItemAge" | "lighthouse_portfolio_metrics_totalWorkItemAge" | "lighthouse_feature_get" | "lighthouse_feature_workitems" | "lighthouse_delivery_list" | "lighthouse_forecast_manual" | "lighthouse_forecast_backtest";
18
+ readonly name: "lighthouse_health_check" | "lighthouse_version_get" | "lighthouse_worktracking_list" | "lighthouse_worktracking_get" | "lighthouse_team_list" | "lighthouse_team_get" | "lighthouse_team_refresh" | "lighthouse_portfolio_list" | "lighthouse_portfolio_get" | "lighthouse_portfolio_refresh" | "lighthouse_team_metrics_throughput" | "lighthouse_team_metrics_cycleTimePercentiles" | "lighthouse_team_metrics_workItemAge" | "lighthouse_team_metrics_totalWorkItemAge" | "lighthouse_portfolio_metrics_throughput" | "lighthouse_portfolio_metrics_workItemAge" | "lighthouse_portfolio_metrics_totalWorkItemAge" | "lighthouse_team_metrics_cumulativeStateTime" | "lighthouse_team_metrics_cumulativeStateTimeItems" | "lighthouse_team_metrics_cumulativeStateTimeCandidates" | "lighthouse_portfolio_metrics_cumulativeStateTime" | "lighthouse_portfolio_metrics_cumulativeStateTimeItems" | "lighthouse_portfolio_metrics_cumulativeStateTimeCandidates" | "lighthouse_feature_get" | "lighthouse_feature_workitems" | "lighthouse_delivery_list" | "lighthouse_forecast_manual" | "lighthouse_forecast_backtest";
19
19
  readonly description: string;
20
20
  readonly inputSchema: {
21
21
  readonly type: "object";
@@ -210,6 +210,84 @@ type McpRuntimeClient = {
210
210
  readonly reason: string;
211
211
  };
212
212
  }>;
213
+ readonly getTeamCumulativeStateTime: (id: number, range?: {
214
+ readonly startDate: string;
215
+ readonly endDate: string;
216
+ }, itemIds?: readonly number[]) => Promise<{
217
+ readonly ok: true;
218
+ readonly value: unknown;
219
+ } | {
220
+ readonly ok: false;
221
+ readonly error: {
222
+ readonly category: string;
223
+ readonly reason: string;
224
+ };
225
+ }>;
226
+ readonly getTeamCumulativeStateTimeItems: (id: number, state: string, range?: {
227
+ readonly startDate: string;
228
+ readonly endDate: string;
229
+ }, itemIds?: readonly number[]) => Promise<{
230
+ readonly ok: true;
231
+ readonly value: unknown;
232
+ } | {
233
+ readonly ok: false;
234
+ readonly error: {
235
+ readonly category: string;
236
+ readonly reason: string;
237
+ };
238
+ }>;
239
+ readonly getTeamCumulativeStateTimeCandidates: (id: number, range?: {
240
+ readonly startDate: string;
241
+ readonly endDate: string;
242
+ }) => Promise<{
243
+ readonly ok: true;
244
+ readonly value: unknown;
245
+ } | {
246
+ readonly ok: false;
247
+ readonly error: {
248
+ readonly category: string;
249
+ readonly reason: string;
250
+ };
251
+ }>;
252
+ readonly getPortfolioCumulativeStateTime: (id: number, range?: {
253
+ readonly startDate: string;
254
+ readonly endDate: string;
255
+ }, itemIds?: readonly number[]) => Promise<{
256
+ readonly ok: true;
257
+ readonly value: unknown;
258
+ } | {
259
+ readonly ok: false;
260
+ readonly error: {
261
+ readonly category: string;
262
+ readonly reason: string;
263
+ };
264
+ }>;
265
+ readonly getPortfolioCumulativeStateTimeItems: (id: number, state: string, range?: {
266
+ readonly startDate: string;
267
+ readonly endDate: string;
268
+ }, itemIds?: readonly number[]) => Promise<{
269
+ readonly ok: true;
270
+ readonly value: unknown;
271
+ } | {
272
+ readonly ok: false;
273
+ readonly error: {
274
+ readonly category: string;
275
+ readonly reason: string;
276
+ };
277
+ }>;
278
+ readonly getPortfolioCumulativeStateTimeCandidates: (id: number, range?: {
279
+ readonly startDate: string;
280
+ readonly endDate: string;
281
+ }) => Promise<{
282
+ readonly ok: true;
283
+ readonly value: unknown;
284
+ } | {
285
+ readonly ok: false;
286
+ readonly error: {
287
+ readonly category: string;
288
+ readonly reason: string;
289
+ };
290
+ }>;
213
291
  readonly getFeaturesByIds: (ids: readonly number[]) => Promise<{
214
292
  readonly ok: true;
215
293
  readonly value: readonly unknown[];
package/dist/index.d.ts CHANGED
@@ -15,7 +15,7 @@ type McpToolResult = {
15
15
  readonly content: readonly McpToolContent[];
16
16
  };
17
17
  type McpToolDefinition = {
18
- readonly name: "lighthouse_health_check" | "lighthouse_version_get" | "lighthouse_worktracking_list" | "lighthouse_worktracking_get" | "lighthouse_team_list" | "lighthouse_team_get" | "lighthouse_team_refresh" | "lighthouse_portfolio_list" | "lighthouse_portfolio_get" | "lighthouse_portfolio_refresh" | "lighthouse_team_metrics_throughput" | "lighthouse_team_metrics_cycleTimePercentiles" | "lighthouse_team_metrics_workItemAge" | "lighthouse_team_metrics_totalWorkItemAge" | "lighthouse_portfolio_metrics_throughput" | "lighthouse_portfolio_metrics_workItemAge" | "lighthouse_portfolio_metrics_totalWorkItemAge" | "lighthouse_feature_get" | "lighthouse_feature_workitems" | "lighthouse_delivery_list" | "lighthouse_forecast_manual" | "lighthouse_forecast_backtest";
18
+ readonly name: "lighthouse_health_check" | "lighthouse_version_get" | "lighthouse_worktracking_list" | "lighthouse_worktracking_get" | "lighthouse_team_list" | "lighthouse_team_get" | "lighthouse_team_refresh" | "lighthouse_portfolio_list" | "lighthouse_portfolio_get" | "lighthouse_portfolio_refresh" | "lighthouse_team_metrics_throughput" | "lighthouse_team_metrics_cycleTimePercentiles" | "lighthouse_team_metrics_workItemAge" | "lighthouse_team_metrics_totalWorkItemAge" | "lighthouse_portfolio_metrics_throughput" | "lighthouse_portfolio_metrics_workItemAge" | "lighthouse_portfolio_metrics_totalWorkItemAge" | "lighthouse_team_metrics_cumulativeStateTime" | "lighthouse_team_metrics_cumulativeStateTimeItems" | "lighthouse_team_metrics_cumulativeStateTimeCandidates" | "lighthouse_portfolio_metrics_cumulativeStateTime" | "lighthouse_portfolio_metrics_cumulativeStateTimeItems" | "lighthouse_portfolio_metrics_cumulativeStateTimeCandidates" | "lighthouse_feature_get" | "lighthouse_feature_workitems" | "lighthouse_delivery_list" | "lighthouse_forecast_manual" | "lighthouse_forecast_backtest";
19
19
  readonly description: string;
20
20
  readonly inputSchema: {
21
21
  readonly type: "object";
@@ -210,6 +210,84 @@ type McpRuntimeClient = {
210
210
  readonly reason: string;
211
211
  };
212
212
  }>;
213
+ readonly getTeamCumulativeStateTime: (id: number, range?: {
214
+ readonly startDate: string;
215
+ readonly endDate: string;
216
+ }, itemIds?: readonly number[]) => Promise<{
217
+ readonly ok: true;
218
+ readonly value: unknown;
219
+ } | {
220
+ readonly ok: false;
221
+ readonly error: {
222
+ readonly category: string;
223
+ readonly reason: string;
224
+ };
225
+ }>;
226
+ readonly getTeamCumulativeStateTimeItems: (id: number, state: string, range?: {
227
+ readonly startDate: string;
228
+ readonly endDate: string;
229
+ }, itemIds?: readonly number[]) => Promise<{
230
+ readonly ok: true;
231
+ readonly value: unknown;
232
+ } | {
233
+ readonly ok: false;
234
+ readonly error: {
235
+ readonly category: string;
236
+ readonly reason: string;
237
+ };
238
+ }>;
239
+ readonly getTeamCumulativeStateTimeCandidates: (id: number, range?: {
240
+ readonly startDate: string;
241
+ readonly endDate: string;
242
+ }) => Promise<{
243
+ readonly ok: true;
244
+ readonly value: unknown;
245
+ } | {
246
+ readonly ok: false;
247
+ readonly error: {
248
+ readonly category: string;
249
+ readonly reason: string;
250
+ };
251
+ }>;
252
+ readonly getPortfolioCumulativeStateTime: (id: number, range?: {
253
+ readonly startDate: string;
254
+ readonly endDate: string;
255
+ }, itemIds?: readonly number[]) => Promise<{
256
+ readonly ok: true;
257
+ readonly value: unknown;
258
+ } | {
259
+ readonly ok: false;
260
+ readonly error: {
261
+ readonly category: string;
262
+ readonly reason: string;
263
+ };
264
+ }>;
265
+ readonly getPortfolioCumulativeStateTimeItems: (id: number, state: string, range?: {
266
+ readonly startDate: string;
267
+ readonly endDate: string;
268
+ }, itemIds?: readonly number[]) => Promise<{
269
+ readonly ok: true;
270
+ readonly value: unknown;
271
+ } | {
272
+ readonly ok: false;
273
+ readonly error: {
274
+ readonly category: string;
275
+ readonly reason: string;
276
+ };
277
+ }>;
278
+ readonly getPortfolioCumulativeStateTimeCandidates: (id: number, range?: {
279
+ readonly startDate: string;
280
+ readonly endDate: string;
281
+ }) => Promise<{
282
+ readonly ok: true;
283
+ readonly value: unknown;
284
+ } | {
285
+ readonly ok: false;
286
+ readonly error: {
287
+ readonly category: string;
288
+ readonly reason: string;
289
+ };
290
+ }>;
213
291
  readonly getFeaturesByIds: (ids: readonly number[]) => Promise<{
214
292
  readonly ok: true;
215
293
  readonly value: readonly unknown[];
package/dist/index.js CHANGED
@@ -39,6 +39,19 @@ var throughputFilterViewProperty = {
39
39
  description: `Forecast-filter view (Lighthouse v26.5.24.10+). "filtered" applies the team's exclusion rule to throughput. Omit or "raw" returns unfiltered data.`
40
40
  }
41
41
  };
42
+ var cumulativeStateProperty = {
43
+ state: {
44
+ type: "string",
45
+ description: "Workflow state name to drill into (must match a bar's state from the cumulativeStateTime response)."
46
+ }
47
+ };
48
+ var itemIdsProperty = {
49
+ itemIds: {
50
+ type: "array",
51
+ items: { type: "integer" },
52
+ description: "Optional work-item IDs to narrow the computation to a selected subset; omit for all in-scope items."
53
+ }
54
+ };
42
55
  var forecastFilterOverrideProperty = {
43
56
  applyFilterOverride: {
44
57
  type: "boolean",
@@ -277,6 +290,90 @@ var toolDefinitions = [
277
290
  ],
278
291
  additionalProperties: false
279
292
  }
293
+ },
294
+ {
295
+ name: "lighthouse_team_metrics_cumulativeStateTime",
296
+ description: "Get cumulative time-per-state bar data for a team by ID: one entry per Doing-category workflow state with total/completed/ongoing contribution days and item counts. Optionally filter by date range and a subset of work-item IDs.",
297
+ inputSchema: {
298
+ type: "object",
299
+ properties: {
300
+ ...idInputSchema.properties,
301
+ ...dateRangeProperties,
302
+ ...itemIdsProperty
303
+ },
304
+ required: ["id"],
305
+ additionalProperties: false
306
+ }
307
+ },
308
+ {
309
+ name: "lighthouse_team_metrics_cumulativeStateTimeItems",
310
+ description: "Get the per-item drill-down for ONE state of a team's cumulative time-per-state chart: the work items that contributed to that state, with days contributed. Requires the state name.",
311
+ inputSchema: {
312
+ type: "object",
313
+ properties: {
314
+ ...idInputSchema.properties,
315
+ ...cumulativeStateProperty,
316
+ ...dateRangeProperties,
317
+ ...itemIdsProperty
318
+ },
319
+ required: ["id", "state"],
320
+ additionalProperties: false
321
+ }
322
+ },
323
+ {
324
+ name: "lighthouse_team_metrics_cumulativeStateTimeCandidates",
325
+ description: "List the work items selectable in a team's cumulative time-per-state item picker for the window (the in-scope candidate set). Search keys are referenceId and title.",
326
+ inputSchema: {
327
+ type: "object",
328
+ properties: {
329
+ ...idInputSchema.properties,
330
+ ...dateRangeProperties
331
+ },
332
+ required: ["id"],
333
+ additionalProperties: false
334
+ }
335
+ },
336
+ {
337
+ name: "lighthouse_portfolio_metrics_cumulativeStateTime",
338
+ description: "Get cumulative time-per-state bar data for a portfolio by ID: one entry per Doing-category workflow state with total/completed/ongoing contribution days and item counts. Optionally filter by date range and a subset of work-item IDs.",
339
+ inputSchema: {
340
+ type: "object",
341
+ properties: {
342
+ ...idInputSchema.properties,
343
+ ...dateRangeProperties,
344
+ ...itemIdsProperty
345
+ },
346
+ required: ["id"],
347
+ additionalProperties: false
348
+ }
349
+ },
350
+ {
351
+ name: "lighthouse_portfolio_metrics_cumulativeStateTimeItems",
352
+ description: "Get the per-item drill-down for ONE state of a portfolio's cumulative time-per-state chart: the work items that contributed to that state, with days contributed. Requires the state name.",
353
+ inputSchema: {
354
+ type: "object",
355
+ properties: {
356
+ ...idInputSchema.properties,
357
+ ...cumulativeStateProperty,
358
+ ...dateRangeProperties,
359
+ ...itemIdsProperty
360
+ },
361
+ required: ["id", "state"],
362
+ additionalProperties: false
363
+ }
364
+ },
365
+ {
366
+ name: "lighthouse_portfolio_metrics_cumulativeStateTimeCandidates",
367
+ description: "List the work items selectable in a portfolio's cumulative time-per-state item picker for the window (the in-scope candidate set). Search keys are referenceId and title.",
368
+ inputSchema: {
369
+ type: "object",
370
+ properties: {
371
+ ...idInputSchema.properties,
372
+ ...dateRangeProperties
373
+ },
374
+ required: ["id"],
375
+ additionalProperties: false
376
+ }
280
377
  }
281
378
  ];
282
379
  var encodePayload = (value) => {
@@ -328,6 +425,26 @@ var getDateRange = (argumentsPayload) => {
328
425
  }
329
426
  return void 0;
330
427
  };
428
+ var getStringArgument = (argumentsPayload, key) => {
429
+ if (!isObjectRecord(argumentsPayload)) {
430
+ return void 0;
431
+ }
432
+ const value = argumentsPayload[key];
433
+ return typeof value === "string" ? value : void 0;
434
+ };
435
+ var getItemIdsArgument = (argumentsPayload) => {
436
+ if (!isObjectRecord(argumentsPayload)) {
437
+ return void 0;
438
+ }
439
+ const value = argumentsPayload.itemIds;
440
+ if (!Array.isArray(value)) {
441
+ return void 0;
442
+ }
443
+ const ids = value.filter(
444
+ (entry) => typeof entry === "number" && Number.isInteger(entry)
445
+ );
446
+ return ids.length > 0 ? ids : void 0;
447
+ };
331
448
  var getThroughputFilterView = (argumentsPayload) => {
332
449
  if (!isObjectRecord(argumentsPayload)) {
333
450
  return void 0;
@@ -390,6 +507,42 @@ var toolInputSchemas = {
390
507
  startDate: isoDateStringSchema.optional(),
391
508
  endDate: isoDateStringSchema.optional()
392
509
  }),
510
+ lighthouse_team_metrics_cumulativeStateTime: z.object({
511
+ id: z.number().int(),
512
+ startDate: isoDateStringSchema.optional(),
513
+ endDate: isoDateStringSchema.optional(),
514
+ itemIds: z.array(z.number().int()).optional()
515
+ }),
516
+ lighthouse_team_metrics_cumulativeStateTimeItems: z.object({
517
+ id: z.number().int(),
518
+ state: z.string(),
519
+ startDate: isoDateStringSchema.optional(),
520
+ endDate: isoDateStringSchema.optional(),
521
+ itemIds: z.array(z.number().int()).optional()
522
+ }),
523
+ lighthouse_team_metrics_cumulativeStateTimeCandidates: z.object({
524
+ id: z.number().int(),
525
+ startDate: isoDateStringSchema.optional(),
526
+ endDate: isoDateStringSchema.optional()
527
+ }),
528
+ lighthouse_portfolio_metrics_cumulativeStateTime: z.object({
529
+ id: z.number().int(),
530
+ startDate: isoDateStringSchema.optional(),
531
+ endDate: isoDateStringSchema.optional(),
532
+ itemIds: z.array(z.number().int()).optional()
533
+ }),
534
+ lighthouse_portfolio_metrics_cumulativeStateTimeItems: z.object({
535
+ id: z.number().int(),
536
+ state: z.string(),
537
+ startDate: isoDateStringSchema.optional(),
538
+ endDate: isoDateStringSchema.optional(),
539
+ itemIds: z.array(z.number().int()).optional()
540
+ }),
541
+ lighthouse_portfolio_metrics_cumulativeStateTimeCandidates: z.object({
542
+ id: z.number().int(),
543
+ startDate: isoDateStringSchema.optional(),
544
+ endDate: isoDateStringSchema.optional()
545
+ }),
393
546
  lighthouse_feature_get: z.object({
394
547
  ids: z.array(z.number().int()).optional(),
395
548
  refs: z.array(z.string()).optional()
@@ -568,6 +721,128 @@ var createMcpCoreRuntime = (dependencies) => ({
568
721
  `team metrics: ${result.error.category} (${result.error.reason})`
569
722
  );
570
723
  }
724
+ if (name === "lighthouse_team_metrics_cumulativeStateTime") {
725
+ const id = getNumericId(argumentsPayload);
726
+ if (id === null) {
727
+ return getErrorToolResult("team metrics: invalid id");
728
+ }
729
+ const result = await client.getTeamCumulativeStateTime(
730
+ id,
731
+ getDateRange(argumentsPayload),
732
+ getItemIdsArgument(argumentsPayload)
733
+ );
734
+ if (result.ok) {
735
+ return getSuccessToolResult(
736
+ `team cumulativeStateTime: ${encodePayload(result.value)}`
737
+ );
738
+ }
739
+ return getErrorToolResult(
740
+ `team metrics: ${result.error.category} (${result.error.reason})`
741
+ );
742
+ }
743
+ if (name === "lighthouse_team_metrics_cumulativeStateTimeItems") {
744
+ const id = getNumericId(argumentsPayload);
745
+ if (id === null) {
746
+ return getErrorToolResult("team metrics: invalid id");
747
+ }
748
+ const state = getStringArgument(argumentsPayload, "state");
749
+ if (state === void 0) {
750
+ return getErrorToolResult("team metrics: missing state");
751
+ }
752
+ const result = await client.getTeamCumulativeStateTimeItems(
753
+ id,
754
+ state,
755
+ getDateRange(argumentsPayload),
756
+ getItemIdsArgument(argumentsPayload)
757
+ );
758
+ if (result.ok) {
759
+ return getSuccessToolResult(
760
+ `team cumulativeStateTimeItems: ${encodePayload(result.value)}`
761
+ );
762
+ }
763
+ return getErrorToolResult(
764
+ `team metrics: ${result.error.category} (${result.error.reason})`
765
+ );
766
+ }
767
+ if (name === "lighthouse_team_metrics_cumulativeStateTimeCandidates") {
768
+ const id = getNumericId(argumentsPayload);
769
+ if (id === null) {
770
+ return getErrorToolResult("team metrics: invalid id");
771
+ }
772
+ const result = await client.getTeamCumulativeStateTimeCandidates(
773
+ id,
774
+ getDateRange(argumentsPayload)
775
+ );
776
+ if (result.ok) {
777
+ return getSuccessToolResult(
778
+ `team cumulativeStateTimeCandidates: ${encodePayload(result.value)}`
779
+ );
780
+ }
781
+ return getErrorToolResult(
782
+ `team metrics: ${result.error.category} (${result.error.reason})`
783
+ );
784
+ }
785
+ if (name === "lighthouse_portfolio_metrics_cumulativeStateTime") {
786
+ const id = getNumericId(argumentsPayload);
787
+ if (id === null) {
788
+ return getErrorToolResult("portfolio metrics: invalid id");
789
+ }
790
+ const result = await client.getPortfolioCumulativeStateTime(
791
+ id,
792
+ getDateRange(argumentsPayload),
793
+ getItemIdsArgument(argumentsPayload)
794
+ );
795
+ if (result.ok) {
796
+ return getSuccessToolResult(
797
+ `portfolio cumulativeStateTime: ${encodePayload(result.value)}`
798
+ );
799
+ }
800
+ return getErrorToolResult(
801
+ `portfolio metrics: ${result.error.category} (${result.error.reason})`
802
+ );
803
+ }
804
+ if (name === "lighthouse_portfolio_metrics_cumulativeStateTimeItems") {
805
+ const id = getNumericId(argumentsPayload);
806
+ if (id === null) {
807
+ return getErrorToolResult("portfolio metrics: invalid id");
808
+ }
809
+ const state = getStringArgument(argumentsPayload, "state");
810
+ if (state === void 0) {
811
+ return getErrorToolResult("portfolio metrics: missing state");
812
+ }
813
+ const result = await client.getPortfolioCumulativeStateTimeItems(
814
+ id,
815
+ state,
816
+ getDateRange(argumentsPayload),
817
+ getItemIdsArgument(argumentsPayload)
818
+ );
819
+ if (result.ok) {
820
+ return getSuccessToolResult(
821
+ `portfolio cumulativeStateTimeItems: ${encodePayload(result.value)}`
822
+ );
823
+ }
824
+ return getErrorToolResult(
825
+ `portfolio metrics: ${result.error.category} (${result.error.reason})`
826
+ );
827
+ }
828
+ if (name === "lighthouse_portfolio_metrics_cumulativeStateTimeCandidates") {
829
+ const id = getNumericId(argumentsPayload);
830
+ if (id === null) {
831
+ return getErrorToolResult("portfolio metrics: invalid id");
832
+ }
833
+ const result = await client.getPortfolioCumulativeStateTimeCandidates(
834
+ id,
835
+ getDateRange(argumentsPayload)
836
+ );
837
+ if (result.ok) {
838
+ return getSuccessToolResult(
839
+ `portfolio cumulativeStateTimeCandidates: ${encodePayload(result.value)}`
840
+ );
841
+ }
842
+ return getErrorToolResult(
843
+ `portfolio metrics: ${result.error.category} (${result.error.reason})`
844
+ );
845
+ }
571
846
  if (name === "lighthouse_portfolio_metrics_throughput") {
572
847
  const id = getNumericId(argumentsPayload);
573
848
  if (id === null) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letpeoplework/lighthouse-mcp-core",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Shared MCP semantics for Lighthouse",
5
5
  "repository": "https://github.com/LetPeopleWork/lighthouse-clients",
6
6
  "type": "module",
@@ -26,7 +26,7 @@
26
26
  "@modelcontextprotocol/sdk": "^1.26.0",
27
27
  "@toon-format/toon": "^2.1.0",
28
28
  "zod": "^3.24.1",
29
- "@letpeoplework/lighthouse-client": "1.1.0"
29
+ "@letpeoplework/lighthouse-client": "1.2.0"
30
30
  },
31
31
  "scripts": {
32
32
  "build": "tsup src/index.ts --format esm,cjs --dts --clean",