intervals-icu-mcp-server 0.3.0 → 0.4.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/client.d.ts CHANGED
@@ -86,6 +86,19 @@ export declare const ActivitySchema: z.ZodObject<{
86
86
  source: z.ZodOptional<z.ZodNullable<z.ZodString>>;
87
87
  compliance: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
88
88
  icu_chat_id: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
89
+ coasting_time: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
90
+ ss_cp: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
91
+ ss_w_prime: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
92
+ ss_p_max: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
93
+ icu_pm_ftp: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
94
+ icu_w_prime: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
95
+ p_max: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
96
+ icu_max_wbal_depletion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
97
+ icu_joules_above_ftp: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
98
+ icu_weight: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
99
+ carbs_used: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
100
+ carbs_ingested: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
101
+ avg_lr_balance: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
89
102
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
90
103
  id: z.ZodString;
91
104
  name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -169,6 +182,19 @@ export declare const ActivitySchema: z.ZodObject<{
169
182
  source: z.ZodOptional<z.ZodNullable<z.ZodString>>;
170
183
  compliance: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
171
184
  icu_chat_id: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
185
+ coasting_time: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
186
+ ss_cp: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
187
+ ss_w_prime: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
188
+ ss_p_max: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
189
+ icu_pm_ftp: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
190
+ icu_w_prime: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
191
+ p_max: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
192
+ icu_max_wbal_depletion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
193
+ icu_joules_above_ftp: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
194
+ icu_weight: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
195
+ carbs_used: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
196
+ carbs_ingested: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
197
+ avg_lr_balance: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
172
198
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
173
199
  id: z.ZodString;
174
200
  name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -252,6 +278,19 @@ export declare const ActivitySchema: z.ZodObject<{
252
278
  source: z.ZodOptional<z.ZodNullable<z.ZodString>>;
253
279
  compliance: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
254
280
  icu_chat_id: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
281
+ coasting_time: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
282
+ ss_cp: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
283
+ ss_w_prime: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
284
+ ss_p_max: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
285
+ icu_pm_ftp: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
286
+ icu_w_prime: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
287
+ p_max: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
288
+ icu_max_wbal_depletion: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
289
+ icu_joules_above_ftp: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
290
+ icu_weight: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
291
+ carbs_used: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
292
+ carbs_ingested: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
293
+ avg_lr_balance: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
255
294
  }, z.ZodTypeAny, "passthrough">>;
256
295
  export type Activity = z.infer<typeof ActivitySchema>;
257
296
  export declare const WellnessSchema: z.ZodObject<{
package/dist/client.js CHANGED
@@ -84,6 +84,19 @@ export const ActivitySchema = z.object({
84
84
  source: z.string().nullable().optional(),
85
85
  compliance: z.number().nullable().optional(),
86
86
  icu_chat_id: z.number().nullable().optional(),
87
+ coasting_time: z.number().nullable().optional(),
88
+ ss_cp: z.number().nullable().optional(),
89
+ ss_w_prime: z.number().nullable().optional(),
90
+ ss_p_max: z.number().nullable().optional(),
91
+ icu_pm_ftp: z.number().nullable().optional(),
92
+ icu_w_prime: z.number().nullable().optional(),
93
+ p_max: z.number().nullable().optional(),
94
+ icu_max_wbal_depletion: z.number().nullable().optional(),
95
+ icu_joules_above_ftp: z.number().nullable().optional(),
96
+ icu_weight: z.number().nullable().optional(),
97
+ carbs_used: z.number().nullable().optional(),
98
+ carbs_ingested: z.number().nullable().optional(),
99
+ avg_lr_balance: z.number().nullable().optional(),
87
100
  }).passthrough();
88
101
  export const WellnessSchema = z.object({
89
102
  id: z.string().optional(),
package/dist/format.js CHANGED
@@ -23,7 +23,9 @@ export function formatActivity(a) {
23
23
  "Power:",
24
24
  ` Avg: ${n(a.icu_average_watts, " W")} | Weighted Avg: ${n(a.icu_weighted_avg_watts, " W")} | FTP: ${n(a.icu_ftp, " W")}`,
25
25
  ` Training Load: ${n(a.icu_training_load)} | Intensity: ${n(a.icu_intensity)} | VI: ${n(a.icu_variability_index)}`,
26
- ` Critical Power: ${n(a.icu_pm_cp, " W")} | Rolling FTP: ${n(a.icu_rolling_ftp, " W")} | Energy: ${a.icu_joules != null ? `${Math.round(a.icu_joules / 1000)} kJ` : "N/A"}`,
26
+ ` Critical Power: ${n(a.icu_pm_cp, " W")} | Rolling FTP: ${n(a.icu_rolling_ftp, " W")} | Activity eFTP: ${n(a.icu_pm_ftp, " W")}`,
27
+ ` Energy: ${a.icu_joules != null ? `${Math.round(a.icu_joules / 1000)} kJ` : "N/A"} | Above FTP: ${a.icu_joules_above_ftp != null ? `${Math.round(a.icu_joules_above_ftp / 1000)} kJ` : "N/A"}`,
28
+ ` W': ${n(a.icu_w_prime, " J")} | Pmax: ${n(a.p_max, " W")} | W'bal Drop: ${a.icu_max_wbal_depletion != null ? `${(a.icu_max_wbal_depletion / 1000).toFixed(1)} kJ` : "N/A"}`,
27
29
  "",
28
30
  "Heart Rate:",
29
31
  ` Avg: ${n(a.average_heartrate, " bpm")} | Max: ${n(a.max_heartrate, " bpm")}`,
@@ -41,7 +43,7 @@ export function formatActivity(a) {
41
43
  lines.push(` HR: ${a.icu_hr_zone_times.map((secs, i) => `Z${i + 1} ${fmtDuration(secs)}`).join(" | ")}`);
42
44
  }
43
45
  }
44
- lines.push("", "Other:", ` Cadence: ${n(a.average_cadence, " rpm")} | Calories: ${n(a.calories)} | Speed: ${n(a.average_speed, " m/s")} (max ${n(a.max_speed, " m/s")})`, ` Temp: ${n(a.average_temp, "°C")} | Trainer: ${a.trainer ? "Yes" : "No"}`, ` RPE: ${n(a.icu_rpe ?? a.perceived_exertion)}/10 | Feel: ${n(a.feel)}/5`, "", "Fitness:", ` CTL: ${n(a.icu_ctl)} | ATL: ${n(a.icu_atl)} | TRIMP: ${n(a.trimp)} | Polarization Index: ${n(a.polarization_index)}`, ` Power Load: ${n(a.power_load)} | HR Load: ${n(a.hr_load)} | Strain: ${n(a.strain_score)}`, "", "Equipment:", ` Gear: ${n(a.gear?.name)} | Device: ${n(a.device_name)} | Power Meter: ${n(a.power_meter)}`, ` Source: ${n(a.source)} | Compliance: ${a.compliance != null ? `${a.compliance}%` : "N/A"}`);
46
+ lines.push("", "Other:", ` Cadence: ${n(a.average_cadence, " rpm")} | Calories: ${n(a.calories)} | Speed: ${n(a.average_speed, " m/s")} (max ${n(a.max_speed, " m/s")})`, ` Temp: ${n(a.average_temp, "°C")} | Trainer: ${a.trainer ? "Yes" : "No"} | Coasting: ${fmtDuration(a.coasting_time)}`, ` RPE: ${n(a.icu_rpe ?? a.perceived_exertion)}/10 | Feel: ${n(a.feel)}/5 | S-RPE: ${n(a.session_rpe)}`, ` L/R Balance: ${a.avg_lr_balance != null ? `${(100 - a.avg_lr_balance).toFixed(0)}/${a.avg_lr_balance.toFixed(0)}` : "N/A"}`, "", "Fitness:", ` CTL: ${n(a.icu_ctl)} | ATL: ${n(a.icu_atl)} | TRIMP: ${n(a.trimp)} | Polarization Index: ${n(a.polarization_index)}`, ` Power Load: ${n(a.power_load)} | HR Load: ${n(a.hr_load)} | Strain: ${n(a.strain_score)}`, ` SS CP: ${n(a.ss_cp, " W")} | SS W': ${n(a.ss_w_prime)} | SS Pmax: ${n(a.ss_p_max)}`, ` Weight: ${n(a.icu_weight, " kg")} | CHO Used: ${n(a.carbs_used, " g")} | CHO In: ${n(a.carbs_ingested, " g")}`, "", "Equipment:", ` Gear: ${n(a.gear?.name)} | Device: ${n(a.device_name)} | Power Meter: ${n(a.power_meter)}`, ` Source: ${n(a.source)} | Compliance: ${a.compliance != null ? `${a.compliance}%` : "N/A"}`);
45
47
  if (a.description)
46
48
  lines.push("", `Description: ${a.description}`);
47
49
  return lines.join("\n");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "intervals-icu-mcp-server",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "MCP server for Intervals.icu — 26 tools for activities, wellness, calendar events, workouts and more",
5
5
  "type": "module",
6
6
  "bin": {