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-
|
|
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.
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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] = "
|
|
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-
|
|
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.
|
|
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-
|
|
3016
|
+
//# sourceMappingURL=runtime-WWo2HgNw.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hevy-mcp",
|
|
3
|
-
"version": "6.
|
|
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.
|
|
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.
|
|
10
|
+
"version": "6.2.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "hevy-mcp",
|
|
15
|
-
"version": "6.
|
|
15
|
+
"version": "6.2.0",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|