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 CHANGED
@@ -12,7 +12,7 @@
12
12
  [![Hosted on Cloudflare](https://img.shields.io/badge/Hosted_on-Cloudflare-F38020?logo=cloudflare&logoColor=white)](#hosted-cloudflare-endpoint)
13
13
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./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 26 tools](#tools)
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 26 tools. Read-only tools are safe for exploration; create
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 26 tools as the npm package and Docker
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 | Default | Scope | Notes |
419
- | ---------------------------- | ------------------------------ | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
420
- | `HEVY_API_KEY` | None; required | Local stdio or HTTP | Hevy API key from the Hevy app. Never pass it in a URL. |
421
- | `HEVY_MCP_API_TIMEOUT` | `30000` ms | Local stdio | Positive Hevy API timeout in milliseconds. Invalid values fall back to 30 seconds. |
422
- | `HEVY_MCP_DEBUG` | Disabled | Local Node | Set to exactly `1` for privacy-bounded diagnostics on stderr. Stdout remains reserved for MCP JSON-RPC. |
423
- | `HEVY_MCP_HTTP_BEARER_TOKEN` | None | Non-loopback HTTP | Required when `--host` is not loopback; use a separate token, never the Hevy API key. |
424
- | `HEVY_MCP_TELEMETRY` | Enabled | Local Node | Set to exactly `0` before startup/import to disable Sentry errors/traces and OTLP traces/metrics. Takes precedence over `SENTRY_DSN` and packaged/runtime collector credentials. |
425
- | `XDG_CACHE_HOME` | `~/.cache` | Local stdio | Changes the root for the npm update-check cache at `hevy-mcp/update-check.json`. |
426
- | `SENTRY_DSN` | Packaged GlitchTip project DSN | Optional local Node telemetry | Sentry-compatible override for the destination. An empty value disables Sentry export. The Worker does not import Node telemetry. |
427
- | `SENTRY_RELEASE` | `hevy-mcp@<installed-version>` | Optional local Node telemetry | Overrides the release label attached to local Sentry error events. |
428
- | `-h`, `--help` | N/A | Local stdio CLI | Print supported options and exit. |
429
- | `-v`, `--version` | N/A | Local stdio CLI | Print the installed version and exit. |
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 self-hosted GlitchTip project at
478
- <https://glitchtip.chrisdoc.dev>; Sentry performance tracing is disabled.
479
- Traces and metrics continue to be sent to the collector at
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. Enabled telemetry derives a deterministic
485
- ten-character HMAC-SHA-256 pseudonym from it solely for cross-span
486
- correlation. The pseudonym is attached to spans only, never used as a metric
487
- dimension, and is not intended for per-user behavior histories.
488
-
489
- The privacy allowlist contains service/version/transport; fixed tool feature,
490
- read/write kind, operation, and short-lived tool name; bounded
491
- outcome/error/count/retry/duration/session/cache/workflow values; normalized API
492
- method/endpoint/status; shape-only key names, presence, count, and boolean
493
- fields; sanitized client/protocol tokens; and the span-only pseudonym. It
494
- explicitly prohibits raw prompts, tool argument values, tool result content,
495
- request bodies, API keys, raw identifiers/queries/exact dates,
496
- workout/routine/folder/template/body-measurement content, names/titles/
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@5.1.0" };
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] = "625c4c9c-e20d-40b3-96b1-4e799ef130f3", e._sentryDebugIdIdentifier = "sentry-dbid-625c4c9c-e20d-40b3-96b1-4e799ef130f3");
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 createSafeErrorDiagnostic, i as MissingHevyApiKeyError, n as runServer, o as flushTelemetry } from "./src-DZjXdluF.mjs";
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@5.1.0" };
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-DZjXdluF.mjs";
12
+ import { n as runServer, r as runStdioServer, t as createNodeMcpServer } from "./src-faGQXQTl.mjs";
13
13
  export { createNodeMcpServer, runServer, runStdioServer };