hevy-mcp 5.1.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -38
- package/dist/cli.mjs +5 -3
- package/dist/index.d.mts +2 -1
- package/dist/index.mjs +2 -2
- package/dist/{src-DZjXdluF.mjs → src-faGQXQTl.mjs} +573 -495
- package/package.json +1 -2
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
[](#hosted-cloudflare-endpoint)
|
|
13
13
|
[](./LICENSE)
|
|
14
14
|
|
|
15
|
-
[Connect to the hosted MCP](#connect-to-the-hosted-endpoint) · [Watch the 18-second demo](https://raw.githubusercontent.com/chrisdoc/hevy-mcp/main/docs/assets/hevy-mcp-demo.mp4) · [Explore all
|
|
15
|
+
[Connect to the hosted MCP](#connect-to-the-hosted-endpoint) · [Watch the 18-second demo](https://raw.githubusercontent.com/chrisdoc/hevy-mcp/main/docs/assets/hevy-mcp-demo.mp4) · [Explore all 22 tools](#tools)
|
|
16
16
|
|
|
17
17
|
</div>
|
|
18
18
|
|
|
@@ -307,7 +307,7 @@ These server-provided MCP prompts coordinate common multi-step workflows:
|
|
|
307
307
|
|
|
308
308
|
## Tools
|
|
309
309
|
|
|
310
|
-
`hevy-mcp` registers
|
|
310
|
+
`hevy-mcp` registers 22 tools. Read-only tools are safe for exploration; create
|
|
311
311
|
and update tools are exposed with MCP mutation annotations so compatible clients
|
|
312
312
|
can request confirmation.
|
|
313
313
|
|
|
@@ -316,7 +316,6 @@ can request confirmation.
|
|
|
316
316
|
| Training analysis | `get-training-summary` | Summarize 1-12 weeks of workout activity and body-measurement trends in one call. |
|
|
317
317
|
| Workouts | `get-workouts` | List workouts from newest to oldest with exercise and timing details. |
|
|
318
318
|
| Workouts | `get-workout` | Get complete details for one workout by ID. |
|
|
319
|
-
| Workouts | `get-workout-count` | Return the account's total workout count. |
|
|
320
319
|
| Workouts | `get-workout-events` | List workout update and delete events since a timestamp. |
|
|
321
320
|
| Workouts | `create-workout` | Create a completed workout in Hevy. |
|
|
322
321
|
| Workouts | `update-workout` | Patch workout metadata by ID; omitted fields and all exercises remain unchanged. |
|
|
@@ -326,10 +325,8 @@ can request confirmation.
|
|
|
326
325
|
| Routines | `get-routine` | Get one routine and its exercise configuration by ID. |
|
|
327
326
|
| Routines | `create-routine` | Create a reusable workout routine. |
|
|
328
327
|
| Routines | `update-routine` | Replace an existing routine's content. |
|
|
329
|
-
| Routine folders | `get-routine-folders` | List default and custom routine folders. |
|
|
330
328
|
| Routine folders | `get-routine-folder` | Get one routine folder's metadata by ID. |
|
|
331
329
|
| Routine folders | `create-routine-folder` | Create a routine folder. |
|
|
332
|
-
| Exercise templates | `get-exercise-templates` | List exercise templates with equipment and muscle metadata. |
|
|
333
330
|
| Exercise templates | `get-exercise-template` | Get complete metadata for one exercise template by ID. |
|
|
334
331
|
| Exercise templates | `search-exercise-templates` | Search the full exercise catalog by title substring. |
|
|
335
332
|
| Exercise templates | `create-exercise-template` | Create a custom exercise template. |
|
|
@@ -338,7 +335,6 @@ can request confirmation.
|
|
|
338
335
|
| Body measurements | `get-body-measurement` | Get the body measurement entry for one date. |
|
|
339
336
|
| Body measurements | `create-body-measurement` | Create a dated body measurement. |
|
|
340
337
|
| Body measurements | `update-body-measurement` | Update the body measurement for an existing date. |
|
|
341
|
-
| Account | `get-user-info` | Return the user's ID, display name, and public profile URL. |
|
|
342
338
|
|
|
343
339
|
The Hevy API currently exposes no delete endpoints for workouts, routines,
|
|
344
340
|
routine folders, exercise templates, or body measurements, so there are no
|
|
@@ -362,7 +358,7 @@ https://hevy.chrisdoc.dev/mcp
|
|
|
362
358
|
```
|
|
363
359
|
|
|
364
360
|
It is the quickest way to use `hevy-mcp`: there is nothing to install or keep
|
|
365
|
-
running locally, and it exposes the same
|
|
361
|
+
running locally, and it exposes the same 22 tools as the npm package and Docker
|
|
366
362
|
image.
|
|
367
363
|
|
|
368
364
|
The Cloudflare Worker uses stateless **Streamable HTTP** at `POST /mcp`.
|
|
@@ -415,18 +411,19 @@ self-hosted Streamable HTTP.
|
|
|
415
411
|
|
|
416
412
|
## Advanced configuration
|
|
417
413
|
|
|
418
|
-
| Setting
|
|
419
|
-
|
|
|
420
|
-
| `HEVY_API_KEY`
|
|
421
|
-
| `HEVY_MCP_API_TIMEOUT`
|
|
422
|
-
| `HEVY_MCP_DEBUG`
|
|
423
|
-
| `HEVY_MCP_HTTP_BEARER_TOKEN`
|
|
424
|
-
| `HEVY_MCP_TELEMETRY`
|
|
425
|
-
| `
|
|
426
|
-
| `
|
|
427
|
-
| `
|
|
428
|
-
|
|
|
429
|
-
| `-
|
|
414
|
+
| Setting | Default | Scope | Notes |
|
|
415
|
+
| -------------------------------- | -------------------------------- | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
416
|
+
| `HEVY_API_KEY` | None; required | Local stdio or HTTP | Hevy API key from the Hevy app. Never pass it in a URL. |
|
|
417
|
+
| `HEVY_MCP_API_TIMEOUT` | `30000` ms | Local stdio | Positive Hevy API timeout in milliseconds. Invalid values fall back to 30 seconds. |
|
|
418
|
+
| `HEVY_MCP_DEBUG` | Disabled | Local Node | Set to exactly `1` for privacy-bounded diagnostics on stderr. Stdout remains reserved for MCP JSON-RPC. |
|
|
419
|
+
| `HEVY_MCP_HTTP_BEARER_TOKEN` | None | Non-loopback HTTP | Required when `--host` is not loopback; use a separate token, never the Hevy API key. |
|
|
420
|
+
| `HEVY_MCP_TELEMETRY` | Enabled | Local Node | Set to exactly `0` before startup/import to disable Sentry and OTLP telemetry. Takes precedence over packaged/runtime collector credentials. |
|
|
421
|
+
| `HEVY_MCP_TELEMETRY_DIAGNOSTICS` | Enabled | Local Node | Set to exactly `0` to keep structural telemetry while suppressing exception messages and stacks. |
|
|
422
|
+
| `XDG_CACHE_HOME` | `~/.cache` | Local stdio | Changes the root for the npm update-check cache at `hevy-mcp/update-check.json`. |
|
|
423
|
+
| `SENTRY_DSN` | Packaged Sentry SaaS project DSN | Optional local Node telemetry | Sentry project DSN override. An empty value disables Sentry export. The Worker does not import Node telemetry. |
|
|
424
|
+
| `SENTRY_RELEASE` | `hevy-mcp@<installed-version>` | Optional local Node telemetry | Overrides the release label attached to local Sentry error events. |
|
|
425
|
+
| `-h`, `--help` | N/A | Local stdio CLI | Print supported options and exit. |
|
|
426
|
+
| `-v`, `--version` | N/A | Local stdio CLI | Print the installed version and exit. |
|
|
430
427
|
|
|
431
428
|
The local executable uses stdio by default. To opt into Streamable HTTP, run:
|
|
432
429
|
|
|
@@ -458,7 +455,6 @@ server-scoped in-memory catalog cache:
|
|
|
458
455
|
- Entries live for five minutes, and the cache holds at most one catalog.
|
|
459
456
|
- Concurrent catalog requests share an in-flight fetch when possible.
|
|
460
457
|
- `search-exercise-templates` accepts `refresh: true` to invalidate the cache.
|
|
461
|
-
- Paginated `get-exercise-templates` calls always fetch their requested page.
|
|
462
458
|
- Each hosted Worker request gets a fresh cache, preventing cross-key sharing.
|
|
463
459
|
|
|
464
460
|
### Local Node telemetry and privacy
|
|
@@ -474,28 +470,29 @@ metric readers and makes no telemetry network requests. `SENTRY_DSN` remains a
|
|
|
474
470
|
Sentry-only setting; when telemetry is enabled, an empty value disables only
|
|
475
471
|
Sentry export.
|
|
476
472
|
|
|
477
|
-
When enabled, errors are sent to the
|
|
478
|
-
|
|
479
|
-
|
|
473
|
+
When enabled, actionable errors are sent to the Sentry project configured by
|
|
474
|
+
`SENTRY_DSN`; Sentry performance tracing is disabled. Exception messages and
|
|
475
|
+
stacks are bounded and scrubbed before export. Set
|
|
476
|
+
`HEVY_MCP_TELEMETRY_DIAGNOSTICS=0` to keep structural traces and metrics while
|
|
477
|
+
suppressing those details. Traces and metrics continue to be sent to the
|
|
478
|
+
collector at
|
|
480
479
|
<https://otel.chrisdoc.dev/v1/traces> and
|
|
481
480
|
<https://otel.chrisdoc.dev/v1/metrics>, which forward to Honeycomb. Metrics
|
|
482
481
|
export every 30 seconds.
|
|
483
482
|
|
|
484
|
-
The API key is never exported
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
descriptions/notes, measurement values, arbitrary client metadata, and
|
|
498
|
-
unnormalized endpoint paths.
|
|
483
|
+
The API key is never exported and is not used to derive a user identity. A
|
|
484
|
+
per-failure diagnostic ID and OTel trace ID may be attached to actionable
|
|
485
|
+
errors for support correlation. Structured telemetry contains only bounded
|
|
486
|
+
service, release, transport, tool, outcome, error, count, retry, duration,
|
|
487
|
+
session, cache, workflow, API method, normalized endpoint, and status fields.
|
|
488
|
+
|
|
489
|
+
Exception messages and stacks are treated as diagnostic details: they are
|
|
490
|
+
length-limited, scrubbed for credentials, URLs, and local home paths, and
|
|
491
|
+
removed entirely when `HEVY_MCP_TELEMETRY_DIAGNOSTICS=0`. Prompts, tool
|
|
492
|
+
arguments, tool results, request bodies, API keys, raw identifiers/queries,
|
|
493
|
+
exact dates, workout/routine/folder/template/body-measurement content,
|
|
494
|
+
names/titles/descriptions/notes, measurement values, arbitrary client
|
|
495
|
+
metadata, and unnormalized endpoint paths remain prohibited.
|
|
499
496
|
|
|
500
497
|
## Security and mutations
|
|
501
498
|
|
package/dist/cli.mjs
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
(function() {
|
|
5
5
|
try {
|
|
6
6
|
var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {};
|
|
7
|
-
e.SENTRY_RELEASE = { id: "hevy-mcp@
|
|
7
|
+
e.SENTRY_RELEASE = { id: "hevy-mcp@6.0.0" };
|
|
8
8
|
var n = new e.Error().stack;
|
|
9
|
-
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "
|
|
9
|
+
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "7b73b895-4e5f-413c-b175-545eb07b11b2", e._sentryDebugIdIdentifier = "sentry-dbid-7b73b895-4e5f-413c-b175-545eb07b11b2");
|
|
10
10
|
} catch (e) {}
|
|
11
11
|
})();
|
|
12
|
-
import { a as
|
|
12
|
+
import { a as flushTelemetry, i as MissingHevyApiKeyError, n as runServer, o as createSafeErrorDiagnostic } from "./src-faGQXQTl.mjs";
|
|
13
13
|
//#region src/cli.ts
|
|
14
14
|
runServer().catch(async (error) => {
|
|
15
15
|
if (error instanceof MissingHevyApiKeyError) console.error(error.message);
|
|
@@ -21,3 +21,5 @@ runServer().catch(async (error) => {
|
|
|
21
21
|
});
|
|
22
22
|
//#endregion
|
|
23
23
|
export {};
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=cli.mjs.map
|
package/dist/index.d.mts
CHANGED
|
@@ -9,4 +9,5 @@ declare function createNodeMcpServer({ apiKey }: {
|
|
|
9
9
|
declare function runStdioServer(): Promise<void>;
|
|
10
10
|
declare function runServer(): Promise<void>;
|
|
11
11
|
//#endregion
|
|
12
|
-
export { createNodeMcpServer, runServer, runStdioServer };
|
|
12
|
+
export { createNodeMcpServer, runServer, runStdioServer };
|
|
13
|
+
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.mjs
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
(function() {
|
|
5
5
|
try {
|
|
6
6
|
var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {};
|
|
7
|
-
e.SENTRY_RELEASE = { id: "hevy-mcp@
|
|
7
|
+
e.SENTRY_RELEASE = { id: "hevy-mcp@6.0.0" };
|
|
8
8
|
var n = new e.Error().stack;
|
|
9
9
|
n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "e9496b31-626b-4ad1-9416-47ba4ffd2995", e._sentryDebugIdIdentifier = "sentry-dbid-e9496b31-626b-4ad1-9416-47ba4ffd2995");
|
|
10
10
|
} catch (e) {}
|
|
11
11
|
})();
|
|
12
|
-
import { n as runServer, r as runStdioServer, t as createNodeMcpServer } from "./src-
|
|
12
|
+
import { n as runServer, r as runStdioServer, t as createNodeMcpServer } from "./src-faGQXQTl.mjs";
|
|
13
13
|
export { createNodeMcpServer, runServer, runStdioServer };
|