hevy-mcp 6.1.7 → 6.1.8

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/CHANGELOG.md ADDED
@@ -0,0 +1,292 @@
1
+ # hevy-mcp
2
+
3
+ ## 6.1.8
4
+
5
+ ### Patch Changes
6
+
7
+ - [#1078](https://github.com/chrisdoc/hevy-mcp/pull/1078) [`9e86cb2`](https://github.com/chrisdoc/hevy-mcp/commit/9e86cb269e5d1ceedf9eb0f0208559d288bb297f) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Guard `mergeAbortSignals` with an `AbortSignal.any` capability check and a manual composition fallback so self-hosted Node runtimes older than 20.3 no longer fail every tool dispatch with `TypeError: AbortSignal.any is not a function`.
8
+
9
+ - [#1083](https://github.com/chrisdoc/hevy-mcp/pull/1083) [`a9cca6b`](https://github.com/chrisdoc/hevy-mcp/commit/a9cca6bc167c7a296532d10d1a272851b43487a4) Thanks [@chrisdoc](https://github.com/chrisdoc)! - chore: switch the repository package manager from npm to pnpm 12. Internal workspace dependencies use the `workspace:*` protocol, scripts/workflows/docs were migrated, and the lockfile is now `pnpm-lock.yaml`. No runtime behavior change.
10
+
11
+ - [#1081](https://github.com/chrisdoc/hevy-mcp/pull/1081) [`37ded34`](https://github.com/chrisdoc/hevy-mcp/commit/37ded345d7ea1b8639bd0ebe373a76c38f22a94d) Thanks [@chrisdoc](https://github.com/chrisdoc)! - chore(deps): update `@sentry/node` to 10.72.0, `@types/node` to 26.4.0, and `zod` to 4.5.2 within existing semver ranges.
12
+
13
+ - [#1080](https://github.com/chrisdoc/hevy-mcp/pull/1080) [`919ad8e`](https://github.com/chrisdoc/hevy-mcp/commit/919ad8e5da1bcd45c817727bedb5d1daedb25988) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Test-only: strengthen tool output-schema assertions and replace Git-based changeset fixtures with pure filesystem fixtures.
14
+
15
+ ## 6.1.7
16
+
17
+ ### Patch Changes
18
+
19
+ - [#1074](https://github.com/chrisdoc/hevy-mcp/pull/1074) [`65970a1`](https://github.com/chrisdoc/hevy-mcp/commit/65970a1fc95f80b82e52e67cf45fd3481fdbcc45) Thanks [@manelpb](https://github.com/manelpb)! - Apply oxfmt 0.63.0 formatting to core mapped-type declarations in `execution.ts`, `tools/input-schemas.ts`, and `tools/tool-runtime.ts`. Formatting only — no functional change. `hevy-mcp` and `@chrisdoc/hevy-cli` get a patch bump solely because the release cascade re-releases core's consumers.
20
+
21
+ ## 6.1.6
22
+
23
+ ### Patch Changes
24
+
25
+ - [#1056](https://github.com/chrisdoc/hevy-mcp/pull/1056) [`3a29218`](https://github.com/chrisdoc/hevy-mcp/commit/3a29218d6b1d837eeecb5cb849396eee9f62e3e0) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Narrow the operations interface to the names consumers actually use; remove four dead exported predicates and stop re-exporting internal operation plumbing.
26
+
27
+ - [#1053](https://github.com/chrisdoc/hevy-mcp/pull/1053) [`4556c13`](https://github.com/chrisdoc/hevy-mcp/commit/4556c13e18fb7281788e86505b09985e1f061e62) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Export the safe-error diagnostic vocabulary (codes, methods, categories, stack sources) from core as its interface; the Worker adapter validates against the shared vocabulary instead of private copies. Folds the safe-error-diagnostic re-export into error-policy.
28
+
29
+ - [#1054](https://github.com/chrisdoc/hevy-mcp/pull/1054) [`1b83866`](https://github.com/chrisdoc/hevy-mcp/commit/1b83866030f004bc19ccb8ebc860828fc853957d) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Own the telemetry contract constants (user hash context, hash shape, argument-key allowlist) in core so the Node and Worker adapters cannot drift apart.
30
+
31
+ - [#1057](https://github.com/chrisdoc/hevy-mcp/pull/1057) [`139ae78`](https://github.com/chrisdoc/hevy-mcp/commit/139ae78a3293ebe401a13ea88f3946f29848577e) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Export the generated workout and routine set schemas from the curated schemas entry point and pin the MCP input enum vocabularies (RPE, set type) to them with a contract test, so upstream enum changes surface at test time instead of drifting.
32
+
33
+ - [#1051](https://github.com/chrisdoc/hevy-mcp/pull/1051) [`2cd03b0`](https://github.com/chrisdoc/hevy-mcp/commit/2cd03b09d8d59d19118a4af81ae568f34914441a) Thanks [@charliecreates](https://github.com/apps/charliecreates)! - Scan all reported training-summary pages so later workouts and body measurements are not hidden by older records on earlier pages, and apply the same fix to the `hevy` CLI summary export.
34
+
35
+ - [#1052](https://github.com/chrisdoc/hevy-mcp/pull/1052) [`5c9a57a`](https://github.com/chrisdoc/hevy-mcp/commit/5c9a57aead4e7b64d4dbfae7785742be26eaf196) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Split response-contracts into output-schemas and formatters modules with no behavior change; response contract wiring stays in response-contracts.
36
+
37
+ - [#1055](https://github.com/chrisdoc/hevy-mcp/pull/1055) [`4f2b707`](https://github.com/chrisdoc/hevy-mcp/commit/4f2b7074505948b3dfb6021f9e0e20fd971a66d6) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Give the workout is_private quirk one home in hevy-quirks; the runtime rule, user-facing error, and tool-description clauses all derive from the same constants so they cannot drift.
38
+
39
+ ## 6.1.5
40
+
41
+ ### Patch Changes
42
+
43
+ - [#1049](https://github.com/chrisdoc/hevy-mcp/pull/1049) [`e7934bb`](https://github.com/chrisdoc/hevy-mcp/commit/e7934bb0d01ef1bbb9915bbd1252998fa25c440a) Thanks [@jacksonpradolima](https://github.com/jacksonpradolima)! - Fix update-workout failing with Hevy API HTTP 500 when is_private is omitted.
44
+
45
+ The upstream Hevy API requires `is_private` in PUT requests, but the GET endpoint does not return it. The tool description stated that omitted fields remain unchanged, but this was not true for `is_private` due to API contract mismatch.
46
+
47
+ Changes:
48
+
49
+ - Add validation in `update-workout` to require explicit `is_private` value, preventing the opaque transient-error from the API
50
+ - Add `is_private` requirement to `replace-workout-exercises` schema and tool handler
51
+ - Improve error message handling to preserve safe user-facing error messages while blocking sensitive information
52
+ - Add regression test for metadata-only workout updates
53
+
54
+ - [#1046](https://github.com/chrisdoc/hevy-mcp/pull/1046) [`3e53c0b`](https://github.com/chrisdoc/hevy-mcp/commit/3e53c0bcd6ba6b5403e437fa738f7d3c7e3b8d7c) Thanks [@charliecreates](https://github.com/apps/charliecreates)! - Document the Node package's updated 60-second default Hevy API timeout.
55
+
56
+ ## 6.1.4
57
+
58
+ ### Patch Changes
59
+
60
+ - [#1036](https://github.com/chrisdoc/hevy-mcp/pull/1036) [`a9a7594`](https://github.com/chrisdoc/hevy-mcp/commit/a9a75943e32656299fc0f523d0eed5848d8d64bc) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Clarify canonical MCP tool names and require tool parameters to be sent in the arguments object.
61
+
62
+ - [#1033](https://github.com/chrisdoc/hevy-mcp/pull/1033) [`331a3bc`](https://github.com/chrisdoc/hevy-mcp/commit/331a3bc77d462161fc2922a5ece22d39a6d0c839) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Increase the default Hevy API operation deadline to accommodate slow, large collection responses.
63
+
64
+ - [#1033](https://github.com/chrisdoc/hevy-mcp/pull/1033) [`331a3bc`](https://github.com/chrisdoc/hevy-mcp/commit/331a3bc77d462161fc2922a5ece22d39a6d0c839) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Return a structured, confirmed acknowledgement from `create-routine`, including the authoritative routine when Hevy provides one.
65
+
66
+ - [#1035](https://github.com/chrisdoc/hevy-mcp/pull/1035) [`b17ab5b`](https://github.com/chrisdoc/hevy-mcp/commit/b17ab5b74a592a37f905d954a334fbfd5e58ae5a) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Guard MCP telemetry session ID generation when `node:crypto.randomUUID` is unavailable.
67
+
68
+ - [#1032](https://github.com/chrisdoc/hevy-mcp/pull/1032) [`ad391b1`](https://github.com/chrisdoc/hevy-mcp/commit/ad391b17ac96761f9c05d7d107009d73fde096e7) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Treat Hevy's HTTP 400 workout validation responses as actionable input errors instead of generic API failures.
69
+
70
+ - [#1031](https://github.com/chrisdoc/hevy-mcp/pull/1031) [`ae58ddd`](https://github.com/chrisdoc/hevy-mcp/commit/ae58ddd420289d7fb53a84f02e5e01d021c61ab6) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Use endpoint-agnostic guidance for HTTP 409 conflicts so routine conflicts are not described as body measurement conflicts.
71
+
72
+ - [#1036](https://github.com/chrisdoc/hevy-mcp/pull/1036) [`a9a7594`](https://github.com/chrisdoc/hevy-mcp/commit/a9a75943e32656299fc0f523d0eed5848d8d64bc) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Improve the error guidance when updating a routine that no longer exists in Hevy.
73
+
74
+ - [#1034](https://github.com/chrisdoc/hevy-mcp/pull/1034) [`1a6b016`](https://github.com/chrisdoc/hevy-mcp/commit/1a6b016de37d0772e8fc8ee71f664dc8114b0ac4) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Improve the startup guidance when non-loopback HTTP mode is missing its bearer token.
75
+
76
+ - [#1030](https://github.com/chrisdoc/hevy-mcp/pull/1030) [`1bae2ba`](https://github.com/chrisdoc/hevy-mcp/commit/1bae2ba660f7fb702d4d70ae34b8d6701df4591e) Thanks [@chrisdoc](https://github.com/chrisdoc)! - docs: clarify Hevy API authentication failures
77
+
78
+ - [#1045](https://github.com/chrisdoc/hevy-mcp/pull/1045) [`cd46318`](https://github.com/chrisdoc/hevy-mcp/commit/cd4631886e98119d548e16017bb12071c0bbc5dd) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Reduce per-request CPU in the Worker: memoize tool schema registration once per isolate, and preload the actual compact-JSON-Schema conversions at module scope so the first request only reads already-converted schemas. This eliminates the repeated conversion that caused intermittent `Worker exceeded CPU time limit` (503) responses.
79
+
80
+ - [#1042](https://github.com/chrisdoc/hevy-mcp/pull/1042) [`31bf76a`](https://github.com/chrisdoc/hevy-mcp/commit/31bf76a8d6f6a5305de5637e359eae086677f9f7) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Adapt telemetry and Worker tracing fallbacks to the upgraded Cloudflare Workers types and Node type definitions.
81
+
82
+ ## 6.1.3
83
+
84
+ ### Patch Changes
85
+
86
+ - [#1015](https://github.com/chrisdoc/hevy-mcp/pull/1015) [`0e4d8a3`](https://github.com/chrisdoc/hevy-mcp/commit/0e4d8a33a54f07670aeb8a53d575981010a0f7e7) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Add the anti-slop Oxlint plugin and migrate omission-preserving response projection helpers to a shared typed helper.
87
+
88
+ - [#1028](https://github.com/chrisdoc/hevy-mcp/pull/1028) [`f1ac721`](https://github.com/chrisdoc/hevy-mcp/commit/f1ac721f3a99c5b3be0e2c2af417441db4793262) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Advertise required routine exercise arrays consistently and document the wrapped snake_case `create-routine` payload.
89
+
90
+ ## 6.1.2
91
+
92
+ ### Patch Changes
93
+
94
+ - [#989](https://github.com/chrisdoc/hevy-mcp/pull/989) [`f34db48`](https://github.com/chrisdoc/hevy-mcp/commit/f34db48e503263c52de1e1f8261e0587a43cec9b) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Propagate the bounded HMAC `user.hash` pseudonym onto Node tool, discovery, and prompt activity spans without exporting raw Hevy API keys.
95
+
96
+ ## 6.1.1
97
+
98
+ ### Patch Changes
99
+
100
+ - [#980](https://github.com/chrisdoc/hevy-mcp/pull/980) [`ac18809`](https://github.com/chrisdoc/hevy-mcp/commit/ac18809a23ef04a6f9d75bb3138611385cc5ab7f) Thanks [@charliecreates](https://github.com/apps/charliecreates)! - Update the published Node package documentation to use the current hosted MCP endpoint.
101
+
102
+ - [#968](https://github.com/chrisdoc/hevy-mcp/pull/968) [`23afac3`](https://github.com/chrisdoc/hevy-mcp/commit/23afac3c4ab0d66b60cb193d9efc86b598b1d6da) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Treat unknown MCP tool calls as expected caller validation failures instead of reporting them as Sentry errors.
103
+
104
+ - [#968](https://github.com/chrisdoc/hevy-mcp/pull/968) [`23afac3`](https://github.com/chrisdoc/hevy-mcp/commit/23afac3c4ab0d66b60cb193d9efc86b598b1d6da) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Use Oxfmt for generated client formatting and remove the repository's Prettier dependency.
105
+
106
+ - [#968](https://github.com/chrisdoc/hevy-mcp/pull/968) [`23afac3`](https://github.com/chrisdoc/hevy-mcp/commit/23afac3c4ab0d66b60cb193d9efc86b598b1d6da) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Capture bounded, allowlisted, redacted upstream error details in API diagnostics without adding response text to metrics.
107
+
108
+ ## 6.1.0
109
+
110
+ ### Minor Changes
111
+
112
+ - [#944](https://github.com/chrisdoc/hevy-mcp/pull/944) [`1ae0e10`](https://github.com/chrisdoc/hevy-mcp/commit/1ae0e1017646a1fe843a35c984537995e2521f7e) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Centralize typed Hevy endpoint identity and transient error policy across client, operations, Core, and Node observability.
113
+
114
+ ### Patch Changes
115
+
116
+ - [#957](https://github.com/chrisdoc/hevy-mcp/pull/957) [`66aca90`](https://github.com/chrisdoc/hevy-mcp/commit/66aca90eba1ced4ceab76fc7d0babd87850b483e) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Ban `Record<string, unknown>` in Oxlint and replace existing uses with named object types or narrower `object` types.
117
+
118
+ - [#948](https://github.com/chrisdoc/hevy-mcp/pull/948) [`1333a59`](https://github.com/chrisdoc/hevy-mcp/commit/1333a59f54a6ab5dbae0b3498b0d31ac9aacfc86) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Share the private Node process lifecycle owner across stdio and HTTP startup paths.
119
+
120
+ - [#952](https://github.com/chrisdoc/hevy-mcp/pull/952) [`6d9d4a5`](https://github.com/chrisdoc/hevy-mcp/commit/6d9d4a5078d44a36bd4b5d991fe58b1bb756d3b4) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Add a production-owned read capability descriptor and bounded Core, Node HTTP, and Worker contract-matrix coverage.
121
+
122
+ - [#960](https://github.com/chrisdoc/hevy-mcp/pull/960) [`8d63b10`](https://github.com/chrisdoc/hevy-mcp/commit/8d63b10897815913c59e8054fc1410bd95f3081c) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Normalize ISO timestamp variants returned by Hevy before workout updates and keep expected MCP caller validation failures out of Sentry issues.
123
+
124
+ - [#946](https://github.com/chrisdoc/hevy-mcp/pull/946) [`1e5aed4`](https://github.com/chrisdoc/hevy-mcp/commit/1e5aed4a84ff7515d05ec46f06b0555c6814a4b4) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Keep the typed workout tool test fixture aligned with operation descriptors.
125
+
126
+ - [#947](https://github.com/chrisdoc/hevy-mcp/pull/947) [`5c07cd8`](https://github.com/chrisdoc/hevy-mcp/commit/5c07cd8daf9ceb9e2dbc5c38cca74c79ee4ed2a2) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Make the package-root Node API safe for embedding by separating it from executable telemetry and lifecycle startup.
127
+
128
+ - [#951](https://github.com/chrisdoc/hevy-mcp/pull/951) [`007127b`](https://github.com/chrisdoc/hevy-mcp/commit/007127b0644333342382cf17a8eb3884729a9c4d) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Bound Node Streamable HTTP session admission, request body deadlines, and idle session cleanup.
129
+
130
+ - [#946](https://github.com/chrisdoc/hevy-mcp/pull/946) [`1e5aed4`](https://github.com/chrisdoc/hevy-mcp/commit/1e5aed4a84ff7515d05ec46f06b0555c6814a4b4) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Add a typed routines get operation and use it from Core while preserving the CLI get path.
131
+
132
+ - [#946](https://github.com/chrisdoc/hevy-mcp/pull/946) [`1e5aed4`](https://github.com/chrisdoc/hevy-mcp/commit/1e5aed4a84ff7515d05ec46f06b0555c6814a4b4) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Add a typed routines list operation and use it from Core and the CLI.
133
+
134
+ - [#946](https://github.com/chrisdoc/hevy-mcp/pull/946) [`1e5aed4`](https://github.com/chrisdoc/hevy-mcp/commit/1e5aed4a84ff7515d05ec46f06b0555c6814a4b4) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Enforce type-aware async function usage with Oxlint.
135
+
136
+ - [#946](https://github.com/chrisdoc/hevy-mcp/pull/946) [`1e5aed4`](https://github.com/chrisdoc/hevy-mcp/commit/1e5aed4a84ff7515d05ec46f06b0555c6814a4b4) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Add a typed workouts get operation and use it from Core while preserving the CLI get path.
137
+
138
+ ## 6.0.0
139
+
140
+ ### Major Changes
141
+
142
+ - [#933](https://github.com/chrisdoc/hevy-mcp/pull/933) [`5fca900`](https://github.com/chrisdoc/hevy-mcp/commit/5fca9009b2c125dcba6694cb506f986dba026206) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Remove MCP tools that duplicate the `hevy://user`, `hevy://workout-count`, `hevy://exercise-templates`, and `hevy://routine-folders` resources. Clients should use those resources for complete datasets and retain `search-exercise-templates` for filtered catalog searches.
143
+
144
+ ### Patch Changes
145
+
146
+ - [#936](https://github.com/chrisdoc/hevy-mcp/pull/936) [`a142826`](https://github.com/chrisdoc/hevy-mcp/commit/a142826339f473a0ebdca58a9e624046cb15ab0a) Thanks [@charliecreates](https://github.com/apps/charliecreates)! - Correct stale MCP tool counts in the published documentation.
147
+
148
+ - [#907](https://github.com/chrisdoc/hevy-mcp/pull/907) [`4dec481`](https://github.com/chrisdoc/hevy-mcp/commit/4dec481875cb97041ab558177f94c859fe48ee3f) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Update Kubb and related development dependencies, and refresh the generated Hevy API client.
149
+
150
+ - [#931](https://github.com/chrisdoc/hevy-mcp/pull/931) [`47f399f`](https://github.com/chrisdoc/hevy-mcp/commit/47f399f4b63c15fd2fafe9667fd578eae80fd6c6) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Improve Node error reporting with Sentry release diagnostics and centralized
151
+ sanitized exception telemetry while keeping OpenTelemetry traces independent.
152
+
153
+ ## 5.1.0
154
+
155
+ ### Minor Changes
156
+
157
+ - [#887](https://github.com/chrisdoc/hevy-mcp/pull/887) [`976f570`](https://github.com/chrisdoc/hevy-mcp/commit/976f570fe1a0258ee5442002c830385dc888ad72) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Add invocation-scoped cancellation, absolute deadlines, commit-state outcomes, and safe retry diagnostics across the Hevy client, MCP adapters, Worker, Node server, and CLI.
158
+
159
+ ### Patch Changes
160
+
161
+ - [#904](https://github.com/chrisdoc/hevy-mcp/pull/904) [`8ecf3f5`](https://github.com/chrisdoc/hevy-mcp/commit/8ecf3f5ceee778cca0df942fda702d1c2195c03d) Thanks [@charliecreates](https://github.com/apps/charliecreates)! - Document the 30-second OpenTelemetry metric export interval.
162
+
163
+ - [#890](https://github.com/chrisdoc/hevy-mcp/pull/890) [`5f78f33`](https://github.com/chrisdoc/hevy-mcp/commit/5f78f334c01016580fcff8af895d50997ef9ae87) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Keep generated client output complete and reproducible while centralizing
164
+ repository topology, artifact provenance, and validation lanes.
165
+
166
+ - [#905](https://github.com/chrisdoc/hevy-mcp/pull/905) [`3050d11`](https://github.com/chrisdoc/hevy-mcp/commit/3050d113bc808025d567b71c3004c7604aba8a3f) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Keep the packaged GlitchTip DSN while suppressing Sentry client reports for dropped spans.
167
+
168
+ - [#902](https://github.com/chrisdoc/hevy-mcp/pull/902) [`cafe0c6`](https://github.com/chrisdoc/hevy-mcp/commit/cafe0c624de9804c11a93b20f2364c4e742c6cc3) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Share the typed workouts.list operation between the MCP server and CLI.
169
+
170
+ - [#896](https://github.com/chrisdoc/hevy-mcp/pull/896) [`dea8542`](https://github.com/chrisdoc/hevy-mcp/commit/dea8542d7fdf06971519607a13713b970b560f86) Thanks [@charliecreates](https://github.com/apps/charliecreates)! - Clarify that `SENTRY_RELEASE` labels local Sentry error events.
171
+
172
+ ## 5.0.6
173
+
174
+ ### Patch Changes
175
+
176
+ - [#867](https://github.com/chrisdoc/hevy-mcp/pull/867) [`01bc861`](https://github.com/chrisdoc/hevy-mcp/commit/01bc8617d9a5130d55fdd3e661ec8af0290d5ca7) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Send the Node package's default error telemetry to the self-hosted GlitchTip
177
+ project while retaining trace and metric export through the existing OTel
178
+ collector.
179
+
180
+ - [#895](https://github.com/chrisdoc/hevy-mcp/pull/895) [`d51bf30`](https://github.com/chrisdoc/hevy-mcp/commit/d51bf30a1c81ddf3780e4626b4ee65f2abd79eae) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Reduce Node telemetry volume by exporting metrics every 30 seconds, removing
181
+ result-shape dimensions from tool-duration metrics, and normalizing dynamic API
182
+ endpoint labels while retaining the detailed trace attributes.
183
+
184
+ ## 5.0.5
185
+
186
+ ### Patch Changes
187
+
188
+ - [#850](https://github.com/chrisdoc/hevy-mcp/pull/850) [`fe6ef1d`](https://github.com/chrisdoc/hevy-mcp/commit/fe6ef1d0351af7e8128cb5a33a8eb01b32084540) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Enrich SDK protocol spans and export privacy-safe failure events.
189
+
190
+ ## 5.0.4
191
+
192
+ ### Patch Changes
193
+
194
+ - [#848](https://github.com/chrisdoc/hevy-mcp/pull/848) [`11d55d2`](https://github.com/chrisdoc/hevy-mcp/commit/11d55d238cfc4e874d470d798206c349fda4d9d0) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Make OTLP metrics process-safe and add portable ClickStack operational views.
195
+
196
+ - [#848](https://github.com/chrisdoc/hevy-mcp/pull/848) [`11d55d2`](https://github.com/chrisdoc/hevy-mcp/commit/11d55d238cfc4e874d470d798206c349fda4d9d0) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Add privacy-safe MCP session correlation and richer request lifecycle telemetry.
197
+
198
+ - [#848](https://github.com/chrisdoc/hevy-mcp/pull/848) [`11d55d2`](https://github.com/chrisdoc/hevy-mcp/commit/11d55d238cfc4e874d470d798206c349fda4d9d0) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Add bounded, privacy-safe failure events and expected outcome classification.
199
+
200
+ ## 5.0.3
201
+
202
+ ### Patch Changes
203
+
204
+ - [#839](https://github.com/chrisdoc/hevy-mcp/pull/839) [`aa57348`](https://github.com/chrisdoc/hevy-mcp/commit/aa57348cf0cd7a41d5109c676319ef4377a83994) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Record tool thrown-error and returned-error exceptions as OpenTelemetry span exception events; add process-level uncaughtExceptionMonitor and unhandledRejection telemetry tracking.
205
+
206
+ - [#842](https://github.com/chrisdoc/hevy-mcp/pull/842) [`de9aad0`](https://github.com/chrisdoc/hevy-mcp/commit/de9aad0268495ac3583e4198cb9d1f29991865b4) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Unify privacy-safe MCP tool failure events across runtimes.
207
+
208
+ ## 5.0.2
209
+
210
+ ### Patch Changes
211
+
212
+ - [#835](https://github.com/chrisdoc/hevy-mcp/pull/835) [`64800ce`](https://github.com/chrisdoc/hevy-mcp/commit/64800cec91613ed9c95550581b9c8872545f746a) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Preserve the corrected routine OpenAPI contract across future spec refreshes.
213
+
214
+ ## 5.0.1
215
+
216
+ ### Patch Changes
217
+
218
+ - [#796](https://github.com/chrisdoc/hevy-mcp/pull/796) [`8ca3b7c`](https://github.com/chrisdoc/hevy-mcp/commit/8ca3b7c1b980ebcf0d7e2868d57d91b9a9baf7fc) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Ignore malformed MCP stdin lines after recording bounded diagnostics so valid subsequent messages continue processing.
219
+
220
+ ## 5.0.0
221
+
222
+ ### Major Changes
223
+
224
+ - [#775](https://github.com/chrisdoc/hevy-mcp/pull/775) [`9518fcc`](https://github.com/chrisdoc/hevy-mcp/commit/9518fccc98f3843303d51436469db57a1898beb6) Thanks [@charliecreates](https://github.com/apps/charliecreates)! - Compact the MCP tool catalog and structured responses while preserving direct tool workflows.
225
+
226
+ - [#778](https://github.com/chrisdoc/hevy-mcp/pull/778) [`dcfc058`](https://github.com/chrisdoc/hevy-mcp/commit/dcfc058723327e7ca02f2e0d84ace5247ecfd6ac) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Change `update-workout` to patch workout metadata without replacing exercises, and add `replace-workout-exercises` for explicit exercise replacement.
227
+
228
+ ## 4.1.4
229
+
230
+ ### Patch Changes
231
+
232
+ - [#780](https://github.com/chrisdoc/hevy-mcp/pull/780) [`14b4b01`](https://github.com/chrisdoc/hevy-mcp/commit/14b4b01d8cfcafe6489de5dbbee5f15474d9d82e) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Reduce OAuth refresh frequency to keep Cloudflare KV writes below the free-plan quota while preserving refresh-token support.
233
+
234
+ ## 4.1.3
235
+
236
+ ### Patch Changes
237
+
238
+ - [#774](https://github.com/chrisdoc/hevy-mcp/pull/774) [`12ca7d5`](https://github.com/chrisdoc/hevy-mcp/commit/12ca7d5362024f06d8c2b0a42e84a92e2087a077) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Migrate the server runtimes and tests to MCP TypeScript SDK v2.
239
+
240
+ ## 4.1.2
241
+
242
+ ### Patch Changes
243
+
244
+ - [#764](https://github.com/chrisdoc/hevy-mcp/pull/764) [`c2b7352`](https://github.com/chrisdoc/hevy-mcp/commit/c2b73527966454ccc8cd9fd475f132225fbf2af1) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Update runtime dependency versions
245
+
246
+ ## 4.1.1
247
+
248
+ ### Patch Changes
249
+
250
+ - [#762](https://github.com/chrisdoc/hevy-mcp/pull/762) [`187b93f`](https://github.com/chrisdoc/hevy-mcp/commit/187b93fb40c57e0827c89326ca9d01e660c608e9) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Add `HEVY_MCP_TELEMETRY=0` to disable all Node project telemetry while preserving telemetry by default.
251
+
252
+ ## 4.1.0
253
+
254
+ ### Minor Changes
255
+
256
+ - [#758](https://github.com/chrisdoc/hevy-mcp/pull/758) [`f2b9bff`](https://github.com/chrisdoc/hevy-mcp/commit/f2b9bffbfe1c2fcc2a2f4fcf2a7b087849d49f67) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Add opt-in Streamable HTTP transport to the Node package while preserving stdio as the default.
257
+
258
+ ## 4.0.1
259
+
260
+ ### Patch Changes
261
+
262
+ - [#756](https://github.com/chrisdoc/hevy-mcp/pull/756) [`90756f6`](https://github.com/chrisdoc/hevy-mcp/commit/90756f69d850619baa0ef391e8e4f9fca579dca9) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Include repository metadata in published package manifests for npm provenance validation.
263
+
264
+ ## 4.0.0
265
+
266
+ ### Major Changes
267
+
268
+ - [#715](https://github.com/chrisdoc/hevy-mcp/pull/715) [`36bfe38`](https://github.com/chrisdoc/hevy-mcp/commit/36bfe38ad89d1a52296b25cecc15c2d8310247db) Thanks [@chrisdoc](https://github.com/chrisdoc)! - The Node package now publishes a runtime-neutral MCP server behind
269
+ `createNodeMcpServer({ apiKey })` and `runStdioServer()`. The default export,
270
+ `createServer`, `runServer`, and `configSchema` are removed. Consumers that
271
+ used the old programmatic API should pass the API key explicitly and choose
272
+ whether their application owns a transport or uses the built-in stdio runner.
273
+
274
+ ### Patch Changes
275
+
276
+ - [#732](https://github.com/chrisdoc/hevy-mcp/pull/732) [`6ea2a7a`](https://github.com/chrisdoc/hevy-mcp/commit/6ea2a7a6449300b34ba94964f3db932c95587c30) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Allow same-origin OAuth form submissions on the Worker.
277
+
278
+ - [#734](https://github.com/chrisdoc/hevy-mcp/pull/734) [`c7c0abc`](https://github.com/chrisdoc/hevy-mcp/commit/c7c0abce71328d8e9f7760285bb3fb078106d939) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Prefer Client ID Metadata Documents for Worker OAuth while retaining Dynamic Client Registration as a compatibility fallback.
279
+
280
+ - [#730](https://github.com/chrisdoc/hevy-mcp/pull/730) [`b52ad29`](https://github.com/chrisdoc/hevy-mcp/commit/b52ad29fd5515265951c16d836c3103cec664423) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Observe workout prompt failures safely and support prompt previews when routine arguments are omitted.
281
+
282
+ - [#732](https://github.com/chrisdoc/hevy-mcp/pull/732) [`6ea2a7a`](https://github.com/chrisdoc/hevy-mcp/commit/6ea2a7a6449300b34ba94964f3db932c95587c30) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Allow the legacy ChatGPT web origin to complete OAuth browser flows.
283
+
284
+ - [#727](https://github.com/chrisdoc/hevy-mcp/pull/727) [`1c95fe1`](https://github.com/chrisdoc/hevy-mcp/commit/1c95fe1ae0596737854a3cdd62d2a7347878a1a1) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Allow supported browser-based MCP clients to connect to the hosted Worker with exact-origin validation.
285
+
286
+ - [#736](https://github.com/chrisdoc/hevy-mcp/pull/736) [`01fc87b`](https://github.com/chrisdoc/hevy-mcp/commit/01fc87b6395c886c4b362b2858b26e948578d68e) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Allow sandboxed OAuth consent forms with an opaque browser origin to submit authorization safely.
287
+
288
+ - [#714](https://github.com/chrisdoc/hevy-mcp/pull/714) [`6c2e48c`](https://github.com/chrisdoc/hevy-mcp/commit/6c2e48ce3a0bc95fcc08b70c7d52cbfc71c96208) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Handle expected Hevy not-found responses consistently, preserve pagination metadata, and reduce telemetry noise from expected API and malformed-stdio failures.
289
+
290
+ - [#731](https://github.com/chrisdoc/hevy-mcp/pull/731) [`91cb2e5`](https://github.com/chrisdoc/hevy-mcp/commit/91cb2e59e59c983bde6fef8b8393bebbceb2fc7a) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Group MCP tool failure telemetry by sanitized error category and HTTP status while preserving per-event context tags.
291
+
292
+ - [#741](https://github.com/chrisdoc/hevy-mcp/pull/741) [`5afe15f`](https://github.com/chrisdoc/hevy-mcp/commit/5afe15fa008d914730f17ffd5a8bbec72a2ca65f) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Add the `mcp.hevy-mcp.dev` custom domain to the Cloudflare Worker deployment.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Christoph Kieslich
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/cli.mjs CHANGED
@@ -8,8 +8,8 @@
8
8
  n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "d3aac8bf-d688-4457-b96a-ad51dafd540c", e._sentryDebugIdIdentifier = "sentry-dbid-d3aac8bf-d688-4457-b96a-ad51dafd540c");
9
9
  } catch (e) {}
10
10
  })();
11
- import { i as flushTelemetry, r as MissingHevyApiKeyError, t as runServer } from "./runtime-DaF-lJvN.mjs";
12
- import { o as createSafeErrorDiagnostic } from "./src-BDNbf1do.mjs";
11
+ import { i as flushTelemetry, r as MissingHevyApiKeyError, t as runServer } from "./runtime-6MOoVDc0.mjs";
12
+ import { o as createSafeErrorDiagnostic } from "./src-B3ESIKKC.mjs";
13
13
  //#region src/cli.ts
14
14
  runServer().catch(async (error) => {
15
15
  if (error instanceof MissingHevyApiKeyError) console.error(error.message);
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // Generated with tsdown
3
3
  // https://tsdown.dev
4
- import { s as createHevyClient, t as createHevyMcpServer } from "./src-BDNbf1do.mjs";
4
+ import { s as createHevyClient, t as createHevyMcpServer } from "./src-B3ESIKKC.mjs";
5
5
  import { z } from "zod";
6
6
  //#region src/index.ts
7
7
  const serverConfigSchema = z.object({ apiKey: z.string().min(1, "Hevy API key is required").describe("Your Hevy API key (available in the Hevy app settings).") });
@@ -32,7 +32,7 @@ function createNodeMcpServer({ apiKey }, _transport = "stdio", lifecycleSignal)
32
32
  * does not evaluate the runtime bootstrap; it is loaded only when invoked.
33
33
  */
34
34
  async function runStdioServer() {
35
- const { runStdioServer: run } = await import("./runtime-DaF-lJvN.mjs").then((n) => n.n);
35
+ const { runStdioServer: run } = await import("./runtime-6MOoVDc0.mjs").then((n) => n.n);
36
36
  return run();
37
37
  }
38
38
  /**
@@ -40,7 +40,7 @@ async function runStdioServer() {
40
40
  * does not evaluate the runtime bootstrap; it is loaded only when invoked.
41
41
  */
42
42
  async function runServer() {
43
- const { runServer: run } = await import("./runtime-DaF-lJvN.mjs").then((n) => n.n);
43
+ const { runServer: run } = await import("./runtime-6MOoVDc0.mjs").then((n) => n.n);
44
44
  return run();
45
45
  }
46
46
  //#endregion
@@ -5,10 +5,10 @@
5
5
  try {
6
6
  var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {};
7
7
  var n = new e.Error().stack;
8
- n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "93c68f03-327a-4ba4-9583-1606d5041602", e._sentryDebugIdIdentifier = "sentry-dbid-93c68f03-327a-4ba4-9583-1606d5041602");
8
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "e86c31e4-4804-4119-8ae6-571bedecba08", e._sentryDebugIdIdentifier = "sentry-dbid-e86c31e4-4804-4119-8ae6-571bedecba08");
9
9
  } catch (e) {}
10
10
  })();
11
- import { a as mergeAbortSignals, c as SAFE_OBSERVATION_CODES, d as isHevyHttpError, f as bucketCount, i as createExecutionProjection, l as diagnosticEndpointIdentity, n as SAFE_USER_HASH_PATTERN, o as createSafeErrorDiagnostic, r as USER_HASH_CONTEXT, s as createHevyClient, t as createHevyMcpServer, u as metricEndpointIdentity } from "./src-BDNbf1do.mjs";
11
+ import { a as mergeAbortSignals, c as SAFE_OBSERVATION_CODES, d as isHevyHttpError, f as bucketCount, i as createExecutionProjection, l as diagnosticEndpointIdentity, n as SAFE_USER_HASH_PATTERN, o as createSafeErrorDiagnostic, r as USER_HASH_CONTEXT, s as createHevyClient, t as createHevyMcpServer, u as metricEndpointIdentity } from "./src-B3ESIKKC.mjs";
12
12
  import { ZodError, z } from "zod";
13
13
  import { deserializeMessage } from "@modelcontextprotocol/server";
14
14
  import * as crypto from "node:crypto";
@@ -394,7 +394,7 @@ function parseBuildString(value, fallback) {
394
394
  return z.string().parse(value ?? fallback);
395
395
  }
396
396
  const name$1 = parseBuildString(readBuildGlobal(() => "hevy-mcp"), "hevy-mcp");
397
- const version$1 = parseBuildString(readBuildGlobal(() => "6.1.7"), "dev");
397
+ const version$1 = parseBuildString(readBuildGlobal(() => "6.1.8"), "dev");
398
398
  const telemetryEnabled = process.env.HEVY_MCP_TELEMETRY !== "0";
399
399
  const collectorToken = z.string().safeParse(readBuildGlobal(() => "NH9vOela-HYreQxAbJa68cjEmORoEKM57EvneUDVcOo")).data ?? process.env.OTEL_COLLECTOR_TOKEN ?? "";
400
400
  const COLLECTOR_ENDPOINT = "https://otel.chrisdoc.dev/v1";
@@ -413,10 +413,11 @@ function createServiceInstanceId(generate = randomUUID) {
413
413
  } catch {}
414
414
  return toHex$1(randomBytes(16));
415
415
  }
416
+ const serviceInstanceId = createServiceInstanceId();
416
417
  const resource = resourceFromAttributes({
417
418
  "service.name": name$1,
418
419
  "service.version": version$1,
419
- "service.instance.id": createServiceInstanceId(),
420
+ "service.instance.id": serviceInstanceId,
420
421
  "process.runtime.name": process.release.name,
421
422
  "process.runtime.version": process.version
422
423
  });
@@ -772,14 +773,14 @@ const HTTP_BEARER_TOKEN = "HEVY_MCP_HTTP_BEARER_TOKEN";
772
773
  const HTTP_ADMISSION_DEFAULTS = {
773
774
  maxSessions: 100,
774
775
  maxInitializing: 10,
775
- idleTimeoutMs: 1800 * 1e3,
776
- bodyTimeoutMs: 30 * 1e3
776
+ idleTimeoutMs: 18e5,
777
+ bodyTimeoutMs: 3e4
777
778
  };
778
779
  const HTTP_ADMISSION_LIMITS = {
779
780
  maxSessions: 1e4,
780
781
  maxInitializing: 1e3,
781
- idleTimeoutMs: 1440 * 60 * 1e3,
782
- bodyTimeoutMs: 300 * 1e3
782
+ idleTimeoutMs: 864e5,
783
+ bodyTimeoutMs: 3e5
783
784
  };
784
785
  function parsePositiveLimit(value, fallback, maximum) {
785
786
  const parsed = isNumber$1(value) ? value : Number(value);
@@ -849,7 +850,8 @@ function writeJson(res, status, message) {
849
850
  }
850
851
  function writeExecutionJson(res, status, message, error) {
851
852
  if (res.headersSent || res.destroyed) return;
852
- const execution = createExecutionProjection(createSafeErrorDiagnostic(error));
853
+ const diagnostic = createSafeErrorDiagnostic(error);
854
+ const execution = createExecutionProjection(diagnostic);
853
855
  res.statusCode = status;
854
856
  res.setHeader("Content-Type", "application/json");
855
857
  res.end(JSON.stringify({ error: {
@@ -2201,7 +2203,7 @@ function installGracefulShutdown({ target, process: processLike = process, logEr
2201
2203
  }
2202
2204
  //#endregion
2203
2205
  //#region src/utils/version-check.ts
2204
- const CACHE_TTL_MS = 1440 * 60 * 1e3;
2206
+ const CACHE_TTL_MS = 864e5;
2205
2207
  const REQUEST_TIMEOUT_MS = 3e3;
2206
2208
  const REGISTRY_URL = "https://registry.npmjs.org";
2207
2209
  const cacheEntrySchema = z.object({
@@ -2227,7 +2229,8 @@ const defaultSchedulerDependencies = {
2227
2229
  checkForUpdate
2228
2230
  };
2229
2231
  function getCachePath(dependencies) {
2230
- return join(dependencies.env.XDG_CACHE_HOME || join(dependencies.homedir(), ".cache"), "hevy-mcp", "update-check.json");
2232
+ const cacheRoot = dependencies.env.XDG_CACHE_HOME || join(dependencies.homedir(), ".cache");
2233
+ return join(cacheRoot, "hevy-mcp", "update-check.json");
2231
2234
  }
2232
2235
  function parseCacheEntry(value, now) {
2233
2236
  try {
@@ -2696,4 +2699,4 @@ async function runServer() {
2696
2699
  //#endregion
2697
2700
  export { flushTelemetry as i, runtime_exports as n, MissingHevyApiKeyError as r, runServer as t };
2698
2701
 
2699
- //# sourceMappingURL=runtime-DaF-lJvN.mjs.map
2702
+ //# sourceMappingURL=runtime-6MOoVDc0.mjs.map
@@ -660,7 +660,7 @@ function removeControlCharacters(value) {
660
660
  return output;
661
661
  }
662
662
  function truncate(value) {
663
- return value.length > MAX_RESPONSE_ERROR_LENGTH ? `${value.slice(0, MAX_RESPONSE_ERROR_LENGTH - 1)}…` : value;
663
+ return value.length > MAX_RESPONSE_ERROR_LENGTH ? `${value.slice(0, 255)}…` : value;
664
664
  }
665
665
  function sanitizeResponseErrorText(value) {
666
666
  return truncate(removeControlCharacters(value.slice(0, MAX_RESPONSE_ERROR_INPUT_LENGTH)).replace(COOKIE_ASSIGNMENT, "$1[REDACTED]").replace(SECRET_ASSIGNMENT, "$1[REDACTED]").replace(BEARER_TOKEN, "Bearer [REDACTED]").replace(JSON_WEB_TOKEN, "[JWT_REDACTED]").replace(SECRET_QUERY_PARAMETER, "$1[REDACTED]").replace(HTTP_URL, "[URL_REDACTED]").replace(EMAIL, "[EMAIL_REDACTED]").replace(UUID, "[ID_REDACTED]").replace(/\s+/g, " ").trim());
@@ -2678,7 +2678,7 @@ function calculateDuration(startTime, endTime) {
2678
2678
  if (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime())) return "Unknown duration";
2679
2679
  const durationMs = end.getTime() - start.getTime();
2680
2680
  if (durationMs < 0) return "Invalid duration (end time before start time)";
2681
- return `${Math.floor(durationMs / (1e3 * 60 * 60))}h ${Math.floor(durationMs % (1e3 * 60 * 60) / (1e3 * 60))}m ${Math.floor(durationMs % (1e3 * 60) / 1e3)}s`;
2681
+ return `${Math.floor(durationMs / 36e5)}h ${Math.floor(durationMs % 36e5 / 6e4)}m ${Math.floor(durationMs % 6e4 / 1e3)}s`;
2682
2682
  } catch (error) {
2683
2683
  console.error("Error calculating duration", createSafeErrorDiagnostic(error));
2684
2684
  return "Unknown duration";
@@ -4121,7 +4121,7 @@ const routineDiscoveryToolDefinitions = [{
4121
4121
  //#endregion
4122
4122
  //#region ../core/src/tools/workflows.ts
4123
4123
  const trainingSummarySchema = { weeks: z.coerce.number().int().min(1).max(12).default(4) };
4124
- const MILLISECONDS_PER_DAY = 1440 * 60 * 1e3;
4124
+ const MILLISECONDS_PER_DAY = 864e5;
4125
4125
  function parseUtcDate(value) {
4126
4126
  const normalized = value.length === 10 ? `${value}T00:00:00.000Z` : value;
4127
4127
  const timestamp = Date.parse(normalized);
@@ -4458,7 +4458,31 @@ function mergeAbortSignals(...signals) {
4458
4458
  const active = signals.filter((signal) => signal !== void 0);
4459
4459
  if (active.length === 0) return void 0;
4460
4460
  if (active.length === 1) return active[0];
4461
- return AbortSignal.any(active);
4461
+ try {
4462
+ return AbortSignal.any(active);
4463
+ } catch (error) {
4464
+ if (!(error instanceof TypeError)) throw error;
4465
+ }
4466
+ const composed = new AbortController();
4467
+ const listeners = [];
4468
+ const abort = (signal) => {
4469
+ for (const listener of listeners) listener.signal.removeEventListener("abort", listener.onAbort);
4470
+ listeners.length = 0;
4471
+ composed.abort(signal.reason);
4472
+ };
4473
+ for (const signal of active) {
4474
+ if (signal.aborted) {
4475
+ abort(signal);
4476
+ break;
4477
+ }
4478
+ const onAbort = () => abort(signal);
4479
+ listeners.push({
4480
+ signal,
4481
+ onAbort
4482
+ });
4483
+ signal.addEventListener("abort", onAbort, { once: true });
4484
+ }
4485
+ return composed.signal;
4462
4486
  }
4463
4487
  /**
4464
4488
  * The curated client's options slot is deliberately explicit. Inferring it
@@ -4502,10 +4526,11 @@ function bindClientExecution(client, control) {
4502
4526
  const optionIndex = property in HEVY_CLIENT_OPTION_INDEXES ? HEVY_CLIENT_OPTION_INDEXES[property] : void 0;
4503
4527
  if (optionIndex === void 0) return value.bind(target);
4504
4528
  return (...args) => {
4505
- args[optionIndex] = {
4529
+ const merged = {
4506
4530
  ...args[optionIndex],
4507
4531
  ...control
4508
4532
  };
4533
+ args[optionIndex] = merged;
4509
4534
  return Reflect.apply(value, target, args);
4510
4535
  };
4511
4536
  } });
@@ -4801,7 +4826,7 @@ function readBuildGlobal(value) {
4801
4826
  }
4802
4827
  }
4803
4828
  const buildName = readBuildGlobal(() => "hevy-mcp");
4804
- const buildVersion = readBuildGlobal(() => "6.1.7");
4829
+ const buildVersion = readBuildGlobal(() => "6.1.8");
4805
4830
  const SERVER_NAME = readBuildString(buildName, "hevy-mcp");
4806
4831
  const SERVER_VERSION = readBuildString(buildVersion, "dev");
4807
4832
  const SERVER_INSTRUCTIONS = [
@@ -5279,7 +5304,7 @@ var AsyncTtlCache = class {
5279
5304
  //#endregion
5280
5305
  //#region ../core/src/utils/exercise-template-catalog.ts
5281
5306
  const EXERCISE_TEMPLATE_CATALOG_CACHE_KEY = "exercise-template-catalog";
5282
- const EXERCISE_TEMPLATE_CATALOG_CACHE_TTL_MS = 300 * 1e3;
5307
+ const EXERCISE_TEMPLATE_CATALOG_CACHE_TTL_MS = 3e5;
5283
5308
  const EXERCISE_TEMPLATE_CATALOG_CACHE_MAX_SIZE = 1;
5284
5309
  function createExerciseTemplateCatalog(hevyClient, cacheObserver) {
5285
5310
  const cache = new AsyncTtlCache({
@@ -5396,4 +5421,4 @@ function createHevyMcpServer(options) {
5396
5421
  //#endregion
5397
5422
  export { mergeAbortSignals as a, SAFE_OBSERVATION_CODES as c, isHevyHttpError as d, bucketCount as f, createExecutionProjection as i, diagnosticEndpointIdentity as l, SAFE_USER_HASH_PATTERN as n, createSafeErrorDiagnostic as o, USER_HASH_CONTEXT as r, createHevyClient as s, createHevyMcpServer as t, metricEndpointIdentity as u };
5398
5423
 
5399
- //# sourceMappingURL=src-BDNbf1do.mjs.map
5424
+ //# sourceMappingURL=src-B3ESIKKC.mjs.map
package/package.json CHANGED
@@ -1,62 +1,62 @@
1
1
  {
2
- "name": "hevy-mcp",
3
- "version": "6.1.7",
4
- "private": false,
5
- "description": "A Model Context Protocol (MCP) server implementation that interfaces with the Hevy fitness tracking app and its API.",
6
- "repository": {
7
- "type": "git",
8
- "url": "https://github.com/chrisdoc/hevy-mcp"
9
- },
10
- "bin": {
11
- "hevy-mcp": "dist/cli.mjs"
12
- },
13
- "files": [
14
- "dist",
15
- "README.md",
16
- "server.json"
17
- ],
18
- "type": "module",
19
- "main": "dist/index.mjs",
20
- "types": "dist/index.d.mts",
21
- "exports": {
22
- ".": {
23
- "types": "./dist/index.d.mts",
24
- "import": "./dist/index.mjs"
25
- }
26
- },
27
- "publishConfig": {
28
- "access": "public"
29
- },
30
- "scripts": {
31
- "build": "tsdown -c tsdown.config.ts",
32
- "prepack": "node ../../scripts/server-manifest.mjs check && npm run build",
33
- "check:types": "tsc --noEmit -p tsconfig.json",
34
- "build:standalone": "cross-env HEVY_MCP_BUILD_MODE=standalone tsdown -c tsdown.config.ts"
35
- },
36
- "dependencies": {
37
- "@modelcontextprotocol/node": "^2.0.0",
38
- "@modelcontextprotocol/server": "^2.0.0",
39
- "@opentelemetry/api": "^1.9.1",
40
- "@opentelemetry/exporter-metrics-otlp-http": "^0.221.0",
41
- "@opentelemetry/exporter-trace-otlp-http": "^0.221.0",
42
- "@opentelemetry/resources": "^2.10.0",
43
- "@opentelemetry/sdk-metrics": "^2.10.0",
44
- "@opentelemetry/sdk-trace-base": "^2.10.0",
45
- "@opentelemetry/sdk-trace-node": "^2.10.0",
46
- "@sentry/node": "^10.70.0",
47
- "semver": "^7.8.5",
48
- "zod": "^4.4.3"
49
- },
50
- "devDependencies": {
51
- "@hevy-mcp/core": "*",
52
- "@hevy-mcp/hevy-client": "*",
53
- "@types/node": "^26.2.0",
54
- "cross-env": "^10.1.0",
55
- "tsdown": "^0.22.14",
56
- "typescript": "^7.0.2"
57
- },
58
- "engines": {
59
- "node": ">=20.0.0"
60
- },
61
- "mcpName": "io.github.chrisdoc/hevy-mcp"
62
- }
2
+ "name": "hevy-mcp",
3
+ "version": "6.1.8",
4
+ "private": false,
5
+ "description": "A Model Context Protocol (MCP) server implementation that interfaces with the Hevy fitness tracking app and its API.",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/chrisdoc/hevy-mcp"
9
+ },
10
+ "bin": {
11
+ "hevy-mcp": "dist/cli.mjs"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "README.md",
16
+ "server.json"
17
+ ],
18
+ "type": "module",
19
+ "main": "dist/index.mjs",
20
+ "types": "dist/index.d.mts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.mts",
24
+ "import": "./dist/index.mjs"
25
+ }
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "dependencies": {
31
+ "@modelcontextprotocol/node": "^2.0.0",
32
+ "@modelcontextprotocol/server": "^2.0.0",
33
+ "@opentelemetry/api": "^1.9.1",
34
+ "@opentelemetry/exporter-metrics-otlp-http": "^0.221.0",
35
+ "@opentelemetry/exporter-trace-otlp-http": "^0.221.0",
36
+ "@opentelemetry/resources": "^2.10.0",
37
+ "@opentelemetry/sdk-metrics": "^2.10.0",
38
+ "@opentelemetry/sdk-trace-base": "^2.10.0",
39
+ "@opentelemetry/sdk-trace-node": "^2.10.0",
40
+ "@sentry/node": "^10.70.0",
41
+ "semver": "^7.8.5",
42
+ "zod": "^4.4.3"
43
+ },
44
+ "devDependencies": {
45
+ "@hevy-mcp/core": "0.2.7",
46
+ "@hevy-mcp/hevy-client": "0.2.4",
47
+ "@sentry/core": "^10.71.0",
48
+ "@types/node": "^26.2.0",
49
+ "cross-env": "^10.1.0",
50
+ "tsdown": "^0.22.14",
51
+ "typescript": "^7.0.2"
52
+ },
53
+ "engines": {
54
+ "node": ">=20.0.0"
55
+ },
56
+ "mcpName": "io.github.chrisdoc/hevy-mcp",
57
+ "scripts": {
58
+ "build": "tsdown -c tsdown.config.ts",
59
+ "check:types": "tsc --noEmit -p tsconfig.json",
60
+ "build:standalone": "cross-env HEVY_MCP_BUILD_MODE=standalone tsdown -c tsdown.config.ts"
61
+ }
62
+ }
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/chrisdoc/hevy-mcp",
8
8
  "source": "github"
9
9
  },
10
- "version": "6.1.7",
10
+ "version": "6.1.8",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "hevy-mcp",
15
- "version": "6.1.7",
15
+ "version": "6.1.8",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },