@letpeoplework/lighthouse-mcp-core 1.8.1 → 1.9.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
@@ -561,6 +561,7 @@ const recurringBlackoutRuleProperties = {
561
561
  description: "Human-readable description of the rule."
562
562
  }
563
563
  };
564
+ const BEYOND_HORIZON_NOTE = "A forecast percentile with beyondHorizon true lies beyond Lighthouse's simulation horizon of horizonYears years: its expectedDate is only a stand-in, not a forecast, so say \"More than <horizonYears> years\" and never that date. Both fields are absent on an older Lighthouse, whose dates stand as sent.";
564
565
  const toolDefinitions = [
565
566
  {
566
567
  name: "lighthouse_health_check",
@@ -690,7 +691,7 @@ const toolDefinitions = [
690
691
  },
691
692
  {
692
693
  name: "lighthouse_portfolio_metrics_blockedCountHistory",
693
- description: "Get the blocked-items-over-time trend for a portfolio by ID: how many work items were blocked on each captured day, optionally filtered by start and end dates. No tool reads what is blocked right now for a portfolio: name the command `lh metrics portfolio --metrics wip --id <id>`, whose items each carry isBlocked and, when blocked, a blockedSince timestamp. A second text block, `summary: …`, states the answer as the dashboard does, in the instance's terminology: the heading and its sentence; the first block is the facts, unchanged.",
694
+ description: "Get the blocked-items-over-time trend for a portfolio by ID: how many work items were blocked on each captured day, optionally filtered by start and end dates. No tool reads what is blocked right now for a portfolio: name the command `lh metrics portfolio --metrics wip --id <id>`, whose items each carry isBlocked and, when blocked, a blockedSince timestamp, and whether Lighthouse marks it stale (isStale) and why (staleReasons), both absent on an older Lighthouse. A second text block, `summary: …`, states the answer as the dashboard does, in the instance's terminology: the heading and its sentence; the first block is the facts, unchanged.",
694
695
  inputSchema: {
695
696
  type: "object",
696
697
  properties: {
@@ -824,7 +825,7 @@ const toolDefinitions = [
824
825
  },
825
826
  {
826
827
  name: "lighthouse_feature_get",
827
- description: "Get feature details by numeric IDs or external reference IDs. A second text block, `summary`, counts them in the instance's terminology; the first block is the facts, unchanged.",
828
+ description: "Get feature details by numeric IDs or external reference IDs. A second text block, `summary`, counts them in the instance's terminology; the first block is the facts, unchanged. " + BEYOND_HORIZON_NOTE,
828
829
  inputSchema: {
829
830
  type: "object",
830
831
  properties: {
@@ -849,12 +850,12 @@ const toolDefinitions = [
849
850
  },
850
851
  {
851
852
  name: "lighthouse_delivery_list",
852
- description: "List deliveries for a portfolio by portfolio ID. The answer holds the running deliveries under `active` and the archived ones under `archived`; a `summary` field counts the running ones in the instance's terminology.",
853
+ description: "List deliveries for a portfolio by portfolio ID. The answer holds the running deliveries under `active` and the archived ones under `archived`; a `summary` field counts the running ones in the instance's terminology. " + BEYOND_HORIZON_NOTE,
853
854
  inputSchema: idInputSchema
854
855
  },
855
856
  {
856
857
  name: "lighthouse_delivery_metrics",
857
- description: "Get a delivery's recorded trend by delivery ID: one row per day with total, done and remaining work, the epic count and the likelihood. Set detail to \"epics\" for the per-epic breakdown and the forecast distribution, which are far larger. Forward-only, so it starts at the first recorded snapshot. `summary` states the delivery and its date as lh heads them, in the instance's terminology: a second text block beside the rows, a field of the detailed payload. Requires Lighthouse newer than v26.5.29.5.",
858
+ description: "Get a delivery's recorded trend by delivery ID: one row per day with total, done and remaining work, the epic count and the likelihood. Set detail to \"epics\" for the per-epic breakdown and the forecast distribution, which are far larger. Forward-only, so it starts at the first recorded snapshot. `summary` states the delivery and its date as lh heads them, in the instance's terminology: a second text block beside the rows, a field of the detailed payload. Requires Lighthouse newer than v26.5.29.5. " + BEYOND_HORIZON_NOTE,
858
859
  inputSchema: {
859
860
  type: "object",
860
861
  properties: {
@@ -918,7 +919,7 @@ const toolDefinitions = [
918
919
  },
919
920
  {
920
921
  name: "lighthouse_forecast_manual",
921
- description: "Run a manual forecast for a team by ID with optional remaining items and target date. Pass applyFilterOverride=true to apply the team's forecast filter, false to skip it, or omit to respect the team setting (Lighthouse v26.5.24.10+). The response includes filterApplied (boolean) and excludedSummary (string) when a filter was applied. `summary` states the answer as the web does, in the instance's terminology: the heading, then the likelihood sentence when both remaining items and a target date were given.",
922
+ description: "Run a manual forecast for a team by ID with optional remaining items and target date. Pass applyFilterOverride=true to apply the team's forecast filter, false to skip it, or omit to respect the team setting (Lighthouse v26.5.24.10+). The response includes filterApplied (boolean) and excludedSummary (string) when a filter was applied. `summary` states the answer as the web does, in the instance's terminology: the heading, then the likelihood sentence when both remaining items and a target date were given. " + BEYOND_HORIZON_NOTE,
922
923
  inputSchema: {
923
924
  type: "object",
924
925
  properties: {
@@ -1058,7 +1059,7 @@ const toolDefinitions = [
1058
1059
  },
1059
1060
  {
1060
1061
  name: "lighthouse_team_metrics_wip",
1061
- description: "Get what a team has in progress right now by ID: each work item in progress today with its age (workItemAge), state, whether it is blocked (isBlocked) and since when (blockedSince), and its link (url). Use it for what is blocked or aging today; for how many were blocked on past days use lighthouse_team_metrics_blockedCountHistory. A second text block, `summary: …`, states the answer as lh does, in the instance's terminology: the heading, how many are in progress against the System WIP Limit, and how many are blocked; the first block is the facts, unchanged.",
1062
+ description: "Get what a team has in progress right now by ID: each work item in progress today with its age (workItemAge), state, whether it is blocked (isBlocked) and since when (blockedSince), whether Lighthouse marks it stale (isStale) and why (staleReasons: each a kind, TimeInState, BlockedDuration or TimeInStateWhileBlocked, with its days, and the state's stateName on the two time-in-state kinds), and its link (url). isStale and staleReasons are absent on an older Lighthouse, which does not say which work items are stale; never work staleness out yourself. Use it for what is blocked, stale or aging today; for how many were blocked on past days use lighthouse_team_metrics_blockedCountHistory. A second text block, `summary: …`, states the answer as lh does, in the instance's terminology: the heading, how many are in progress against the System WIP Limit, how many are blocked and how many are stale; the first block is the facts, unchanged.",
1062
1063
  inputSchema: idInputSchema
1063
1064
  },
1064
1065
  {
@@ -1197,7 +1198,8 @@ const summariseCurrentWip = (today) => (facts, known) => {
1197
1198
  if (now === null) return null;
1198
1199
  const { terms } = known.wording;
1199
1200
  const blocked = (0, _letpeoplework_lighthouse_client.describeBlockedNow)(now, "team", terms);
1200
- return linesOf((0, _letpeoplework_lighthouse_client.describeAsOfHeading)({ endDate: today }, known.wording), sentenceOf((0, _letpeoplework_lighthouse_client.describeInProgressNow)(now, "team", terms, known.systemWipLimit ?? void 0)), blocked === null ? null : sentenceOf(blocked), ...(0, _letpeoplework_lighthouse_client.describeWhatWipLeavesUnsaid)(now, "team", terms, known.systemWipLimit));
1201
+ const stale = (0, _letpeoplework_lighthouse_client.describeStaleNow)(now, "team", terms);
1202
+ return linesOf((0, _letpeoplework_lighthouse_client.describeAsOfHeading)({ endDate: today }, known.wording), sentenceOf((0, _letpeoplework_lighthouse_client.describeInProgressNow)(now, "team", terms, known.systemWipLimit ?? void 0)), blocked === null ? null : sentenceOf(blocked), stale === null ? null : sentenceOf(stale), ...(0, _letpeoplework_lighthouse_client.describeWhatWipLeavesUnsaid)(now, "team", terms, known.systemWipLimit));
1201
1203
  };
1202
1204
  const readTeamForSummary = async (client, teamId) => {
1203
1205
  const team = client.getTeam(teamId);
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { LIGHTHOUSE_IS_REACHABLE, REFINEMENT_ANSWERS, describeAsOfHeading, describeBacktestActual, describeBacktestPeriod, describeBacktestSummary, describeBlackoutRuleCount, describeBlackoutRuleWriteConfirmation, describeBlockedDays, describeBlockedNow, describeConnectionSummary, describeCycleTimeDays, describeDeliveryCount, describeDeliveryMetricsHeading, describeFeatureListCount, describeFeatureWorkItemsHeading, describeInProgressNow, describeManualForecastLikelihood, describeManualForecastSummary, describeMetricSummary, describeMetricsHeading, describeMissingCondition, describeNothingToTakeBack, describeOwnerCount, describePercentilesOverTimeDays, describePortfolioSummary, describeProcessBehaviorChart, describeProcessBehaviorOverTimeDays, describeRecordedComment, describeRecordedVote, describeRefinementSummary, describeRefreshConfirmation, describeSleRiskNow, describeTakenBack, describeTeamSummary, describeThroughputDays, describeTimeInStateContributorDays, describeTimeInStateDays, describeTotalWorkItemAgeDays, describeVersion, describeWhatWipLeavesUnsaid, describeWorkItemAgeDays, describeWorkItemAgePercentiles, describeWorkTrackingSystemCount, getDefaultMetricsDateRange, isMissingItsCondition, isRefinementAnswer, keepVoterKey, myVoteOn, readAnswerWording, readBacktest, readBlackoutRules, readBlocked, readCycleTimeDefinitionName, readCycleTimePercentiles, readDeliveryMetricsHistory, readFeatureList, readFeatureWording, readFeatureWorkItems, readInProgressItems, readManualForecast, readNameOfMyVote, readOwnerList, readPercentilesOverTime, readPortfolio, readPortfolioDeliveries, readProcessBehaviorChart, readProcessBehaviorOverTime, readRefinementWording, readRunChart, readServiceLevelExpectation, readSleRisk, readSystemWipLimit, readTeam, readTerms, readTimeInStateBar, readTimeInStateContributors, readTotalWorkItemAge, readVoteRefusal, readWorkItemAge, readWorkItemAgePercentiles, readWorkTrackingConnections, readWrittenBlackoutRule, refinementDayVerdictOf, sizingMomentOf, summariseDeliveryMetricsHistory } from "@letpeoplework/lighthouse-client";
1
+ import { LIGHTHOUSE_IS_REACHABLE, REFINEMENT_ANSWERS, describeAsOfHeading, describeBacktestActual, describeBacktestPeriod, describeBacktestSummary, describeBlackoutRuleCount, describeBlackoutRuleWriteConfirmation, describeBlockedDays, describeBlockedNow, describeConnectionSummary, describeCycleTimeDays, describeDeliveryCount, describeDeliveryMetricsHeading, describeFeatureListCount, describeFeatureWorkItemsHeading, describeInProgressNow, describeManualForecastLikelihood, describeManualForecastSummary, describeMetricSummary, describeMetricsHeading, describeMissingCondition, describeNothingToTakeBack, describeOwnerCount, describePercentilesOverTimeDays, describePortfolioSummary, describeProcessBehaviorChart, describeProcessBehaviorOverTimeDays, describeRecordedComment, describeRecordedVote, describeRefinementSummary, describeRefreshConfirmation, describeSleRiskNow, describeStaleNow, describeTakenBack, describeTeamSummary, describeThroughputDays, describeTimeInStateContributorDays, describeTimeInStateDays, describeTotalWorkItemAgeDays, describeVersion, describeWhatWipLeavesUnsaid, describeWorkItemAgeDays, describeWorkItemAgePercentiles, describeWorkTrackingSystemCount, getDefaultMetricsDateRange, isMissingItsCondition, isRefinementAnswer, keepVoterKey, myVoteOn, readAnswerWording, readBacktest, readBlackoutRules, readBlocked, readCycleTimeDefinitionName, readCycleTimePercentiles, readDeliveryMetricsHistory, readFeatureList, readFeatureWording, readFeatureWorkItems, readInProgressItems, readManualForecast, readNameOfMyVote, readOwnerList, readPercentilesOverTime, readPortfolio, readPortfolioDeliveries, readProcessBehaviorChart, readProcessBehaviorOverTime, readRefinementWording, readRunChart, readServiceLevelExpectation, readSleRisk, readSystemWipLimit, readTeam, readTerms, readTimeInStateBar, readTimeInStateContributors, readTotalWorkItemAge, readVoteRefusal, readWorkItemAge, readWorkItemAgePercentiles, readWorkTrackingConnections, readWrittenBlackoutRule, refinementDayVerdictOf, sizingMomentOf, summariseDeliveryMetricsHistory } from "@letpeoplework/lighthouse-client";
2
2
  import { ElicitResultSchema } from "@modelcontextprotocol/sdk/types.js";
3
3
  import { z } from "zod";
4
4
  import { encode } from "@toon-format/toon";
@@ -560,6 +560,7 @@ const recurringBlackoutRuleProperties = {
560
560
  description: "Human-readable description of the rule."
561
561
  }
562
562
  };
563
+ const BEYOND_HORIZON_NOTE = "A forecast percentile with beyondHorizon true lies beyond Lighthouse's simulation horizon of horizonYears years: its expectedDate is only a stand-in, not a forecast, so say \"More than <horizonYears> years\" and never that date. Both fields are absent on an older Lighthouse, whose dates stand as sent.";
563
564
  const toolDefinitions = [
564
565
  {
565
566
  name: "lighthouse_health_check",
@@ -689,7 +690,7 @@ const toolDefinitions = [
689
690
  },
690
691
  {
691
692
  name: "lighthouse_portfolio_metrics_blockedCountHistory",
692
- description: "Get the blocked-items-over-time trend for a portfolio by ID: how many work items were blocked on each captured day, optionally filtered by start and end dates. No tool reads what is blocked right now for a portfolio: name the command `lh metrics portfolio --metrics wip --id <id>`, whose items each carry isBlocked and, when blocked, a blockedSince timestamp. A second text block, `summary: …`, states the answer as the dashboard does, in the instance's terminology: the heading and its sentence; the first block is the facts, unchanged.",
693
+ description: "Get the blocked-items-over-time trend for a portfolio by ID: how many work items were blocked on each captured day, optionally filtered by start and end dates. No tool reads what is blocked right now for a portfolio: name the command `lh metrics portfolio --metrics wip --id <id>`, whose items each carry isBlocked and, when blocked, a blockedSince timestamp, and whether Lighthouse marks it stale (isStale) and why (staleReasons), both absent on an older Lighthouse. A second text block, `summary: …`, states the answer as the dashboard does, in the instance's terminology: the heading and its sentence; the first block is the facts, unchanged.",
693
694
  inputSchema: {
694
695
  type: "object",
695
696
  properties: {
@@ -823,7 +824,7 @@ const toolDefinitions = [
823
824
  },
824
825
  {
825
826
  name: "lighthouse_feature_get",
826
- description: "Get feature details by numeric IDs or external reference IDs. A second text block, `summary`, counts them in the instance's terminology; the first block is the facts, unchanged.",
827
+ description: "Get feature details by numeric IDs or external reference IDs. A second text block, `summary`, counts them in the instance's terminology; the first block is the facts, unchanged. " + BEYOND_HORIZON_NOTE,
827
828
  inputSchema: {
828
829
  type: "object",
829
830
  properties: {
@@ -848,12 +849,12 @@ const toolDefinitions = [
848
849
  },
849
850
  {
850
851
  name: "lighthouse_delivery_list",
851
- description: "List deliveries for a portfolio by portfolio ID. The answer holds the running deliveries under `active` and the archived ones under `archived`; a `summary` field counts the running ones in the instance's terminology.",
852
+ description: "List deliveries for a portfolio by portfolio ID. The answer holds the running deliveries under `active` and the archived ones under `archived`; a `summary` field counts the running ones in the instance's terminology. " + BEYOND_HORIZON_NOTE,
852
853
  inputSchema: idInputSchema
853
854
  },
854
855
  {
855
856
  name: "lighthouse_delivery_metrics",
856
- description: "Get a delivery's recorded trend by delivery ID: one row per day with total, done and remaining work, the epic count and the likelihood. Set detail to \"epics\" for the per-epic breakdown and the forecast distribution, which are far larger. Forward-only, so it starts at the first recorded snapshot. `summary` states the delivery and its date as lh heads them, in the instance's terminology: a second text block beside the rows, a field of the detailed payload. Requires Lighthouse newer than v26.5.29.5.",
857
+ description: "Get a delivery's recorded trend by delivery ID: one row per day with total, done and remaining work, the epic count and the likelihood. Set detail to \"epics\" for the per-epic breakdown and the forecast distribution, which are far larger. Forward-only, so it starts at the first recorded snapshot. `summary` states the delivery and its date as lh heads them, in the instance's terminology: a second text block beside the rows, a field of the detailed payload. Requires Lighthouse newer than v26.5.29.5. " + BEYOND_HORIZON_NOTE,
857
858
  inputSchema: {
858
859
  type: "object",
859
860
  properties: {
@@ -917,7 +918,7 @@ const toolDefinitions = [
917
918
  },
918
919
  {
919
920
  name: "lighthouse_forecast_manual",
920
- description: "Run a manual forecast for a team by ID with optional remaining items and target date. Pass applyFilterOverride=true to apply the team's forecast filter, false to skip it, or omit to respect the team setting (Lighthouse v26.5.24.10+). The response includes filterApplied (boolean) and excludedSummary (string) when a filter was applied. `summary` states the answer as the web does, in the instance's terminology: the heading, then the likelihood sentence when both remaining items and a target date were given.",
921
+ description: "Run a manual forecast for a team by ID with optional remaining items and target date. Pass applyFilterOverride=true to apply the team's forecast filter, false to skip it, or omit to respect the team setting (Lighthouse v26.5.24.10+). The response includes filterApplied (boolean) and excludedSummary (string) when a filter was applied. `summary` states the answer as the web does, in the instance's terminology: the heading, then the likelihood sentence when both remaining items and a target date were given. " + BEYOND_HORIZON_NOTE,
921
922
  inputSchema: {
922
923
  type: "object",
923
924
  properties: {
@@ -1057,7 +1058,7 @@ const toolDefinitions = [
1057
1058
  },
1058
1059
  {
1059
1060
  name: "lighthouse_team_metrics_wip",
1060
- description: "Get what a team has in progress right now by ID: each work item in progress today with its age (workItemAge), state, whether it is blocked (isBlocked) and since when (blockedSince), and its link (url). Use it for what is blocked or aging today; for how many were blocked on past days use lighthouse_team_metrics_blockedCountHistory. A second text block, `summary: …`, states the answer as lh does, in the instance's terminology: the heading, how many are in progress against the System WIP Limit, and how many are blocked; the first block is the facts, unchanged.",
1061
+ description: "Get what a team has in progress right now by ID: each work item in progress today with its age (workItemAge), state, whether it is blocked (isBlocked) and since when (blockedSince), whether Lighthouse marks it stale (isStale) and why (staleReasons: each a kind, TimeInState, BlockedDuration or TimeInStateWhileBlocked, with its days, and the state's stateName on the two time-in-state kinds), and its link (url). isStale and staleReasons are absent on an older Lighthouse, which does not say which work items are stale; never work staleness out yourself. Use it for what is blocked, stale or aging today; for how many were blocked on past days use lighthouse_team_metrics_blockedCountHistory. A second text block, `summary: …`, states the answer as lh does, in the instance's terminology: the heading, how many are in progress against the System WIP Limit, how many are blocked and how many are stale; the first block is the facts, unchanged.",
1061
1062
  inputSchema: idInputSchema
1062
1063
  },
1063
1064
  {
@@ -1196,7 +1197,8 @@ const summariseCurrentWip = (today) => (facts, known) => {
1196
1197
  if (now === null) return null;
1197
1198
  const { terms } = known.wording;
1198
1199
  const blocked = describeBlockedNow(now, "team", terms);
1199
- return linesOf(describeAsOfHeading({ endDate: today }, known.wording), sentenceOf(describeInProgressNow(now, "team", terms, known.systemWipLimit ?? void 0)), blocked === null ? null : sentenceOf(blocked), ...describeWhatWipLeavesUnsaid(now, "team", terms, known.systemWipLimit));
1200
+ const stale = describeStaleNow(now, "team", terms);
1201
+ return linesOf(describeAsOfHeading({ endDate: today }, known.wording), sentenceOf(describeInProgressNow(now, "team", terms, known.systemWipLimit ?? void 0)), blocked === null ? null : sentenceOf(blocked), stale === null ? null : sentenceOf(stale), ...describeWhatWipLeavesUnsaid(now, "team", terms, known.systemWipLimit));
1200
1202
  };
1201
1203
  const readTeamForSummary = async (client, teamId) => {
1202
1204
  const team = client.getTeam(teamId);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letpeoplework/lighthouse-mcp-core",
3
- "version": "1.8.1",
3
+ "version": "1.9.0",
4
4
  "description": "Shared MCP semantics for Lighthouse",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,7 +26,7 @@
26
26
  "registry": "https://registry.npmjs.org/"
27
27
  },
28
28
  "dependencies": {
29
- "@letpeoplework/lighthouse-client": "1.10.0",
29
+ "@letpeoplework/lighthouse-client": "1.11.0",
30
30
  "@modelcontextprotocol/sdk": "^1.26.0",
31
31
  "@toon-format/toon": "^4.0.0",
32
32
  "zod": "^4.0.0"