hevy-mcp 6.1.22 → 6.2.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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # hevy-mcp
2
2
 
3
+ ## 6.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1246](https://github.com/chrisdoc/hevy-mcp/pull/1246) [`03b8678`](https://github.com/chrisdoc/hevy-mcp/commit/03b86780bbe5cd08f046dcfe29e4f0d614bc40d2) Thanks [@chrisdoc](https://github.com/chrisdoc)! - Advertise spec-recommended server metadata (title, description, website URL, and a scalable vector icon) during MCP discovery and initialization, and declare boolean `destructiveHint` on every read-only tool for platform compatibility checks.
8
+
3
9
  ## 6.1.22
4
10
 
5
11
  ### Patch Changes
package/dist/cli.mjs CHANGED
@@ -8,7 +8,7 @@
8
8
  n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "d637b259-c547-4286-9669-7b858825b504", e._sentryDebugIdIdentifier = "sentry-dbid-d637b259-c547-4286-9669-7b858825b504");
9
9
  } catch (e) {}
10
10
  })();
11
- import { i as handleFatalStartupError, r as getSafeStartupMessage, t as runServer } from "./runtime-BNYpQWRr.mjs";
11
+ import { i as handleFatalStartupError, r as getSafeStartupMessage, t as runServer } from "./runtime-WWo2HgNw.mjs";
12
12
  //#region src/cli.ts
13
13
  runServer().catch(async (error) => {
14
14
  await handleFatalStartupError(error);
@@ -5493,11 +5493,12 @@ function registerUnobservedToolDefinition(server, runtime, definition) {
5493
5493
  }
5494
5494
  //#endregion
5495
5495
  //#region ../core/src/utils/tool-annotations.ts
5496
- /** Read-only tools (get-*, search-*): no side effects. */
5496
+ /** Read-only tools (get-*, search-*): no side effects, never destructive. */
5497
5497
  function readOnlyAnnotations(title) {
5498
5498
  return {
5499
5499
  title,
5500
5500
  readOnlyHint: true,
5501
+ destructiveHint: false,
5501
5502
  openWorldHint: false
5502
5503
  };
5503
5504
  }
@@ -6932,9 +6933,24 @@ function readBuildGlobal(value) {
6932
6933
  }
6933
6934
  }
6934
6935
  const buildName = readBuildGlobal(() => "hevy-mcp");
6935
- const buildVersion = readBuildGlobal(() => "6.1.22");
6936
+ const buildVersion = readBuildGlobal(() => "6.2.0");
6936
6937
  const SERVER_NAME = readBuildString(buildName, "hevy-mcp");
6937
6938
  const SERVER_VERSION = readBuildString(buildVersion, "dev");
6939
+ /**
6940
+ * Server metadata advertised during discovery and initialization.
6941
+ *
6942
+ * `name`/`version` are injected at build time; the remaining fields are the
6943
+ * spec-recommended metadata clients and directories display (MCP schema
6944
+ * `Implementation`): human-readable title, description, public website, and a
6945
+ * scalable vector icon.
6946
+ */
6947
+ const SERVER_TITLE = "Hevy MCP";
6948
+ const SERVER_DESCRIPTION = "Connects AI assistants to the authenticated user's Hevy workout-tracking data — workouts, routines, exercise templates, routine folders, body measurements, and training summaries — for querying, logging, and editing.";
6949
+ const SERVER_WEBSITE_URL = "https://hevy-mcp.dev/";
6950
+ const SERVER_ICONS = [{
6951
+ src: "https://hevy-mcp.dev/favicon.svg",
6952
+ mimeType: "image/svg+xml"
6953
+ }];
6938
6954
  const SERVER_INSTRUCTIONS = [
6939
6955
  "Hevy MCP connects clients to the authenticated user's Hevy workout-tracking data, including workouts, routines, exercise templates, routine folders, body measurements, and profile information. HEVY_API_KEY must contain a valid Hevy API key for local stdio use.",
6940
6956
  "Safety: all get-* and search-* tools are read-only. create-* and update-* tools mutate Hevy data. Creates are additive and non-idempotent, so repeating one can create duplicates. Updates can overwrite existing data. Delete operations are not available.",
@@ -7419,6 +7435,10 @@ function createCountingServer(server) {
7419
7435
  const createHevyMcpServerEffect = Effect.fn("core.createHevyMcpServer")(function* (options) {
7420
7436
  const baseServer = new McpServer({
7421
7437
  name: SERVER_NAME,
7438
+ title: SERVER_TITLE,
7439
+ description: SERVER_DESCRIPTION,
7440
+ websiteUrl: SERVER_WEBSITE_URL,
7441
+ icons: SERVER_ICONS.map((icon) => ({ ...icon })),
7422
7442
  version: SERVER_VERSION
7423
7443
  }, {
7424
7444
  capabilities: { logging: {} },
@@ -7515,4 +7535,4 @@ function assertApiKey(apiKey) {
7515
7535
  //#endregion
7516
7536
  export { isHevyHttpError as _, SAFE_USER_HASH_PATTERN as a, mergeAbortSignals as c, createSafeErrorDiagnostic as d, bucketCount as f, metricEndpointIdentity as g, diagnosticEndpointIdentity as h, createHevyMcpServer as i, sanitizeDiagnosticText as l, SAFE_OBSERVATION_CODES as m, assertApiKey as n, USER_HASH_CONTEXT as o, createHevyClient as p, parseConfig as r, createExecutionProjection as s, MissingHevyApiKeyError as t, FEEDBACK_MAX_MESSAGE_LENGTH as u };
7517
7537
 
7518
- //# sourceMappingURL=config-D1ZvWKRJ.mjs.map
7538
+ //# sourceMappingURL=config-BtJyjCQL.mjs.map
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 { i as createHevyMcpServer, n as assertApiKey, p as createHevyClient } from "./config-D1ZvWKRJ.mjs";
4
+ import { i as createHevyMcpServer, n as assertApiKey, p as createHevyClient } from "./config-BtJyjCQL.mjs";
5
5
  //#region src/index.ts
6
6
  async function createNodeMcpServer({ apiKey, maxGetRetries, feedbackRecorder }, _transport = "stdio", lifecycleSignal) {
7
7
  assertApiKey(apiKey);
@@ -20,7 +20,7 @@ async function createNodeMcpServer({ apiKey, maxGetRetries, feedbackRecorder },
20
20
  * does not evaluate the runtime bootstrap; it is loaded only when invoked.
21
21
  */
22
22
  async function runStdioServer() {
23
- const { runStdioServer: run } = await import("./runtime-BNYpQWRr.mjs").then((n) => n.n);
23
+ const { runStdioServer: run } = await import("./runtime-WWo2HgNw.mjs").then((n) => n.n);
24
24
  return run();
25
25
  }
26
26
  /**
@@ -28,7 +28,7 @@ async function runStdioServer() {
28
28
  * does not evaluate the runtime bootstrap; it is loaded only when invoked.
29
29
  */
30
30
  async function runServer() {
31
- const { runServer: run } = await import("./runtime-BNYpQWRr.mjs").then((n) => n.n);
31
+ const { runServer: run } = await import("./runtime-WWo2HgNw.mjs").then((n) => n.n);
32
32
  return run();
33
33
  }
34
34
  //#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] = "5e5a5e87-68cd-4783-9030-b22022f32bf5", e._sentryDebugIdIdentifier = "sentry-dbid-5e5a5e87-68cd-4783-9030-b22022f32bf5");
8
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "32f18d43-0836-4048-b5d4-348ac7298254", e._sentryDebugIdIdentifier = "sentry-dbid-32f18d43-0836-4048-b5d4-348ac7298254");
9
9
  } catch (e) {}
10
10
  })();
11
- import { _ as isHevyHttpError, a as SAFE_USER_HASH_PATTERN, c as mergeAbortSignals, d as createSafeErrorDiagnostic, f as bucketCount, g as metricEndpointIdentity, h as diagnosticEndpointIdentity, i as createHevyMcpServer, l as sanitizeDiagnosticText$1, m as SAFE_OBSERVATION_CODES, n as assertApiKey, o as USER_HASH_CONTEXT, p as createHevyClient, r as parseConfig, s as createExecutionProjection, t as MissingHevyApiKeyError, u as FEEDBACK_MAX_MESSAGE_LENGTH } from "./config-D1ZvWKRJ.mjs";
11
+ import { _ as isHevyHttpError, a as SAFE_USER_HASH_PATTERN, c as mergeAbortSignals, d as createSafeErrorDiagnostic, f as bucketCount, g as metricEndpointIdentity, h as diagnosticEndpointIdentity, i as createHevyMcpServer, l as sanitizeDiagnosticText$1, m as SAFE_OBSERVATION_CODES, n as assertApiKey, o as USER_HASH_CONTEXT, p as createHevyClient, r as parseConfig, s as createExecutionProjection, t as MissingHevyApiKeyError, u as FEEDBACK_MAX_MESSAGE_LENGTH } from "./config-BtJyjCQL.mjs";
12
12
  import { ZodError, z } from "zod";
13
13
  import { Data, Duration, Effect, Exit, Fiber, Layer, Scope, Semaphore } from "effect";
14
14
  import { deserializeMessage } from "@modelcontextprotocol/server";
@@ -389,7 +389,7 @@ function parseBuildString(value, fallback) {
389
389
  return z.string().parse(value ?? fallback);
390
390
  }
391
391
  const name$1 = parseBuildString(readBuildGlobal(() => "hevy-mcp"), "hevy-mcp");
392
- const version$1 = parseBuildString(readBuildGlobal(() => "6.1.22"), "dev");
392
+ const version$1 = parseBuildString(readBuildGlobal(() => "6.2.0"), "dev");
393
393
  const collectorToken = z.string().safeParse(readBuildGlobal(() => "NH9vOela-HYreQxAbJa68cjEmORoEKM57EvneUDVcOo")).data ?? process.env.OTEL_COLLECTOR_TOKEN ?? "";
394
394
  const COLLECTOR_ENDPOINT = "https://otel.chrisdoc.dev/v1";
395
395
  const DEFAULT_SENTRY_DSN = "https://ce696d8333b507acbf5203eb877bce0f@o4508975499575296.ingest.de.sentry.io/4509049671647312";
@@ -3013,4 +3013,4 @@ async function runServer() {
3013
3013
  //#endregion
3014
3014
  export { handleFatalStartupError as i, runtime_exports as n, getSafeStartupMessage as r, runServer as t };
3015
3015
 
3016
- //# sourceMappingURL=runtime-BNYpQWRr.mjs.map
3016
+ //# sourceMappingURL=runtime-WWo2HgNw.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hevy-mcp",
3
- "version": "6.1.22",
3
+ "version": "6.2.0",
4
4
  "private": false,
5
5
  "description": "A Model Context Protocol (MCP) server implementation that interfaces with the Hevy fitness tracking app and its API.",
6
6
  "repository": {
@@ -44,7 +44,7 @@
44
44
  "zod": "^4.6.5"
45
45
  },
46
46
  "devDependencies": {
47
- "@hevy-mcp/core": "0.2.20",
47
+ "@hevy-mcp/core": "0.2.21",
48
48
  "@hevy-mcp/hevy-client": "0.2.14",
49
49
  "@sentry/core": "^11.4.0",
50
50
  "@types/node": "^26.6.4",
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.22",
10
+ "version": "6.2.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "hevy-mcp",
15
- "version": "6.1.22",
15
+ "version": "6.2.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },