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 +292 -0
- package/LICENSE +21 -0
- package/dist/cli.mjs +2 -2
- package/dist/index.mjs +3 -3
- package/dist/{runtime-DaF-lJvN.mjs → runtime-6MOoVDc0.mjs} +15 -12
- package/dist/{src-BDNbf1do.mjs → src-B3ESIKKC.mjs} +33 -8
- package/package.json +61 -61
- package/server.json +2 -2
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-
|
|
12
|
-
import { o as createSafeErrorDiagnostic } from "./src-
|
|
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-
|
|
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-
|
|
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-
|
|
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] = "
|
|
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-
|
|
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.
|
|
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":
|
|
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:
|
|
776
|
-
bodyTimeoutMs:
|
|
776
|
+
idleTimeoutMs: 18e5,
|
|
777
|
+
bodyTimeoutMs: 3e4
|
|
777
778
|
};
|
|
778
779
|
const HTTP_ADMISSION_LIMITS = {
|
|
779
780
|
maxSessions: 1e4,
|
|
780
781
|
maxInitializing: 1e3,
|
|
781
|
-
idleTimeoutMs:
|
|
782
|
-
bodyTimeoutMs:
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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-
|
|
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,
|
|
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 /
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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 =
|
|
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-
|
|
5424
|
+
//# sourceMappingURL=src-B3ESIKKC.mjs.map
|
package/package.json
CHANGED
|
@@ -1,62 +1,62 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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.
|
|
10
|
+
"version": "6.1.8",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "hevy-mcp",
|
|
15
|
-
"version": "6.1.
|
|
15
|
+
"version": "6.1.8",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|