@kaiord/mcp 4.3.3 → 4.5.1

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.
@@ -5,8 +5,8 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
5
5
 
6
6
  // src/server/create-server.ts
7
7
  import { readFileSync as readFileSync3 } from "fs";
8
- import { dirname as dirname2, join } from "path";
9
- import { fileURLToPath } from "url";
8
+ import { dirname as dirname3, join } from "path";
9
+ import { fileURLToPath as fileURLToPath2 } from "url";
10
10
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
11
 
12
12
  // src/adapters/stderr-logger.ts
@@ -90,15 +90,18 @@ var registerConvertFilePrompt = (server) => {
90
90
  );
91
91
  };
92
92
 
93
- // src/resources/krd-format-spec.ts
93
+ // src/utils/find-spec-file.ts
94
94
  import { existsSync, readFileSync } from "fs";
95
- import { resolve } from "path";
96
- var SPEC_URI = "kaiord://docs/krd-format";
95
+ import { dirname, resolve } from "path";
96
+ import { fileURLToPath } from "url";
97
97
  var DOCS_URL = "https://github.com/pablo-albaladejo/kaiord/blob/main/docs/krd-format.md";
98
+ var __dirname2 = dirname(fileURLToPath(import.meta.url));
98
99
  var findSpecFile = () => {
99
100
  const candidates = [
100
101
  resolve(process.cwd(), "docs/krd-format.md"),
101
- resolve(process.cwd(), "packages/mcp/docs/krd-format.md")
102
+ resolve(process.cwd(), "packages/mcp/docs/krd-format.md"),
103
+ resolve(__dirname2, "../../../docs/krd-format.md"),
104
+ resolve(__dirname2, "../../../../docs/krd-format.md")
102
105
  ];
103
106
  for (const path of candidates) {
104
107
  if (existsSync(path)) {
@@ -107,6 +110,9 @@ var findSpecFile = () => {
107
110
  }
108
111
  return `KRD format specification not found locally. See: ${DOCS_URL}`;
109
112
  };
113
+
114
+ // src/resources/krd-format-spec.ts
115
+ var SPEC_URI = "kaiord://docs/krd-format";
110
116
  var registerKrdFormatSpecResource = (server) => {
111
117
  const spec = findSpecFile();
112
118
  server.resource(
@@ -264,7 +270,7 @@ import {
264
270
  readFile as fsReadFile,
265
271
  writeFile as fsWriteFile
266
272
  } from "fs/promises";
267
- import { dirname } from "path";
273
+ import { dirname as dirname2 } from "path";
268
274
  var DANGEROUS_CHARS = /[\0|;&`$(){}!\n\r]/;
269
275
  var PATH_TRAVERSAL = /(?:^|[/\\])\.\.(?:[/\\]|$)/;
270
276
  var validatePathSecurity = (inputPath) => {
@@ -298,7 +304,7 @@ var readFileAsText = async (path) => {
298
304
  };
299
305
  var writeOutputFile = async (path, data) => {
300
306
  validatePathSecurity(path);
301
- await mkdir(dirname(path), { recursive: true });
307
+ await mkdir(dirname2(path), { recursive: true });
302
308
  if (data instanceof Uint8Array) {
303
309
  await fsWriteFile(path, data);
304
310
  } else {
@@ -328,6 +334,11 @@ var resolveTextInput = async (inputFile, inputContent) => {
328
334
  if (inputFile) {
329
335
  return readFileAsText(inputFile);
330
336
  }
337
+ if (inputContent === void 0) {
338
+ throw new Error(
339
+ "input_content is required when input_file is not provided"
340
+ );
341
+ }
331
342
  return inputContent;
332
343
  };
333
344
 
@@ -578,6 +589,17 @@ var registerExtractWorkoutTool = (server, logger) => {
578
589
  );
579
590
  };
580
591
 
592
+ // src/tools/kaiord-get-format-spec.ts
593
+ var registerGetFormatSpecTool = (server) => {
594
+ const spec = findSpecFile();
595
+ server.tool(
596
+ "kaiord_get_format_spec",
597
+ "Get the KRD format specification. Call this before creating or editing KRD documents.",
598
+ {},
599
+ async () => formatSuccess(spec)
600
+ );
601
+ };
602
+
581
603
  // src/tools/kaiord-inspect.ts
582
604
  import { z as z7 } from "zod";
583
605
 
@@ -695,16 +717,22 @@ var registerValidateTool = (server, logger) => {
695
717
 
696
718
  // src/server/create-server.ts
697
719
  var SERVER_NAME = "kaiord-mcp";
698
- var __dirname2 = dirname2(fileURLToPath(import.meta.url));
720
+ var __dirname3 = dirname3(fileURLToPath2(import.meta.url));
699
721
  var pkg = JSON.parse(
700
- readFileSync3(join(__dirname2, "../../package.json"), "utf-8")
722
+ readFileSync3(join(__dirname3, "../../package.json"), "utf-8")
701
723
  );
724
+ var SERVER_INSTRUCTIONS = [
725
+ "Kaiord is a fitness data framework. KRD is the canonical JSON format \u2014 all conversions go through KRD.",
726
+ "BEFORE creating or editing KRD documents, call the kaiord_get_format_spec tool to get the full specification.",
727
+ "Use kaiord_list_formats to discover all supported formats (FIT, TCX, ZWO, GCN, KRD)."
728
+ ].join("\n");
702
729
  var createServer = () => {
703
- const server = new McpServer({
704
- name: SERVER_NAME,
705
- version: pkg.version
706
- });
730
+ const server = new McpServer(
731
+ { name: SERVER_NAME, version: pkg.version },
732
+ { instructions: SERVER_INSTRUCTIONS }
733
+ );
707
734
  const logger = createStderrLogger();
735
+ registerGetFormatSpecTool(server);
708
736
  registerListFormatsTool(server);
709
737
  registerConvertTool(server, logger);
710
738
  registerValidateTool(server, logger);
package/dist/index.js CHANGED
@@ -8,8 +8,8 @@ var createStderrLogger = () => ({
8
8
 
9
9
  // src/server/create-server.ts
10
10
  import { readFileSync as readFileSync3 } from "fs";
11
- import { dirname as dirname2, join } from "path";
12
- import { fileURLToPath } from "url";
11
+ import { dirname as dirname3, join } from "path";
12
+ import { fileURLToPath as fileURLToPath2 } from "url";
13
13
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
14
 
15
15
  // src/prompts/analyze-workout.ts
@@ -85,15 +85,18 @@ var registerConvertFilePrompt = (server) => {
85
85
  );
86
86
  };
87
87
 
88
- // src/resources/krd-format-spec.ts
88
+ // src/utils/find-spec-file.ts
89
89
  import { existsSync, readFileSync } from "fs";
90
- import { resolve } from "path";
91
- var SPEC_URI = "kaiord://docs/krd-format";
90
+ import { dirname, resolve } from "path";
91
+ import { fileURLToPath } from "url";
92
92
  var DOCS_URL = "https://github.com/pablo-albaladejo/kaiord/blob/main/docs/krd-format.md";
93
+ var __dirname2 = dirname(fileURLToPath(import.meta.url));
93
94
  var findSpecFile = () => {
94
95
  const candidates = [
95
96
  resolve(process.cwd(), "docs/krd-format.md"),
96
- resolve(process.cwd(), "packages/mcp/docs/krd-format.md")
97
+ resolve(process.cwd(), "packages/mcp/docs/krd-format.md"),
98
+ resolve(__dirname2, "../../../docs/krd-format.md"),
99
+ resolve(__dirname2, "../../../../docs/krd-format.md")
97
100
  ];
98
101
  for (const path of candidates) {
99
102
  if (existsSync(path)) {
@@ -102,6 +105,9 @@ var findSpecFile = () => {
102
105
  }
103
106
  return `KRD format specification not found locally. See: ${DOCS_URL}`;
104
107
  };
108
+
109
+ // src/resources/krd-format-spec.ts
110
+ var SPEC_URI = "kaiord://docs/krd-format";
105
111
  var registerKrdFormatSpecResource = (server) => {
106
112
  const spec = findSpecFile();
107
113
  server.resource(
@@ -259,7 +265,7 @@ import {
259
265
  readFile as fsReadFile,
260
266
  writeFile as fsWriteFile
261
267
  } from "fs/promises";
262
- import { dirname } from "path";
268
+ import { dirname as dirname2 } from "path";
263
269
  var DANGEROUS_CHARS = /[\0|;&`$(){}!\n\r]/;
264
270
  var PATH_TRAVERSAL = /(?:^|[/\\])\.\.(?:[/\\]|$)/;
265
271
  var validatePathSecurity = (inputPath) => {
@@ -293,7 +299,7 @@ var readFileAsText = async (path) => {
293
299
  };
294
300
  var writeOutputFile = async (path, data) => {
295
301
  validatePathSecurity(path);
296
- await mkdir(dirname(path), { recursive: true });
302
+ await mkdir(dirname2(path), { recursive: true });
297
303
  if (data instanceof Uint8Array) {
298
304
  await fsWriteFile(path, data);
299
305
  } else {
@@ -323,6 +329,11 @@ var resolveTextInput = async (inputFile, inputContent) => {
323
329
  if (inputFile) {
324
330
  return readFileAsText(inputFile);
325
331
  }
332
+ if (inputContent === void 0) {
333
+ throw new Error(
334
+ "input_content is required when input_file is not provided"
335
+ );
336
+ }
326
337
  return inputContent;
327
338
  };
328
339
 
@@ -573,6 +584,17 @@ var registerExtractWorkoutTool = (server, logger) => {
573
584
  );
574
585
  };
575
586
 
587
+ // src/tools/kaiord-get-format-spec.ts
588
+ var registerGetFormatSpecTool = (server) => {
589
+ const spec = findSpecFile();
590
+ server.tool(
591
+ "kaiord_get_format_spec",
592
+ "Get the KRD format specification. Call this before creating or editing KRD documents.",
593
+ {},
594
+ async () => formatSuccess(spec)
595
+ );
596
+ };
597
+
576
598
  // src/tools/kaiord-inspect.ts
577
599
  import { z as z7 } from "zod";
578
600
 
@@ -690,16 +712,22 @@ var registerValidateTool = (server, logger) => {
690
712
 
691
713
  // src/server/create-server.ts
692
714
  var SERVER_NAME = "kaiord-mcp";
693
- var __dirname2 = dirname2(fileURLToPath(import.meta.url));
715
+ var __dirname3 = dirname3(fileURLToPath2(import.meta.url));
694
716
  var pkg = JSON.parse(
695
- readFileSync3(join(__dirname2, "../../package.json"), "utf-8")
717
+ readFileSync3(join(__dirname3, "../../package.json"), "utf-8")
696
718
  );
719
+ var SERVER_INSTRUCTIONS = [
720
+ "Kaiord is a fitness data framework. KRD is the canonical JSON format \u2014 all conversions go through KRD.",
721
+ "BEFORE creating or editing KRD documents, call the kaiord_get_format_spec tool to get the full specification.",
722
+ "Use kaiord_list_formats to discover all supported formats (FIT, TCX, ZWO, GCN, KRD)."
723
+ ].join("\n");
697
724
  var createServer = () => {
698
- const server = new McpServer({
699
- name: SERVER_NAME,
700
- version: pkg.version
701
- });
725
+ const server = new McpServer(
726
+ { name: SERVER_NAME, version: pkg.version },
727
+ { instructions: SERVER_INSTRUCTIONS }
728
+ );
702
729
  const logger = createStderrLogger();
730
+ registerGetFormatSpecTool(server);
703
731
  registerListFormatsTool(server);
704
732
  registerConvertTool(server, logger);
705
733
  registerValidateTool(server, logger);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaiord/mcp",
3
- "version": "4.3.3",
3
+ "version": "4.5.1",
4
4
  "description": "MCP server for Kaiord fitness data conversion (FIT, TCX, ZWO, GCN, KRD)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,11 +22,11 @@
22
22
  "dependencies": {
23
23
  "@modelcontextprotocol/sdk": "^1.26.0",
24
24
  "zod": "^4.0.0",
25
- "@kaiord/core": "^4.3.0",
25
+ "@kaiord/core": "^4.5.0",
26
26
  "@kaiord/fit": "^4.3.0",
27
27
  "@kaiord/tcx": "^4.3.0",
28
28
  "@kaiord/zwo": "^4.3.0",
29
- "@kaiord/garmin": "^4.3.0"
29
+ "@kaiord/garmin": "^4.5.1"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "^24.0.0",