@kaiord/mcp 4.3.2 → 4.4.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.
@@ -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 {
@@ -578,6 +584,17 @@ var registerExtractWorkoutTool = (server, logger) => {
578
584
  );
579
585
  };
580
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
+
581
598
  // src/tools/kaiord-inspect.ts
582
599
  import { z as z7 } from "zod";
583
600
 
@@ -695,16 +712,22 @@ var registerValidateTool = (server, logger) => {
695
712
 
696
713
  // src/server/create-server.ts
697
714
  var SERVER_NAME = "kaiord-mcp";
698
- var __dirname2 = dirname2(fileURLToPath(import.meta.url));
715
+ var __dirname3 = dirname3(fileURLToPath2(import.meta.url));
699
716
  var pkg = JSON.parse(
700
- readFileSync3(join(__dirname2, "../../package.json"), "utf-8")
717
+ readFileSync3(join(__dirname3, "../../package.json"), "utf-8")
701
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");
702
724
  var createServer = () => {
703
- const server = new McpServer({
704
- name: SERVER_NAME,
705
- version: pkg.version
706
- });
725
+ const server = new McpServer(
726
+ { name: SERVER_NAME, version: pkg.version },
727
+ { instructions: SERVER_INSTRUCTIONS }
728
+ );
707
729
  const logger = createStderrLogger();
730
+ registerGetFormatSpecTool(server);
708
731
  registerListFormatsTool(server);
709
732
  registerConvertTool(server, logger);
710
733
  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 {
@@ -573,6 +579,17 @@ var registerExtractWorkoutTool = (server, logger) => {
573
579
  );
574
580
  };
575
581
 
582
+ // src/tools/kaiord-get-format-spec.ts
583
+ var registerGetFormatSpecTool = (server) => {
584
+ const spec = findSpecFile();
585
+ server.tool(
586
+ "kaiord_get_format_spec",
587
+ "Get the KRD format specification. Call this before creating or editing KRD documents.",
588
+ {},
589
+ async () => formatSuccess(spec)
590
+ );
591
+ };
592
+
576
593
  // src/tools/kaiord-inspect.ts
577
594
  import { z as z7 } from "zod";
578
595
 
@@ -690,16 +707,22 @@ var registerValidateTool = (server, logger) => {
690
707
 
691
708
  // src/server/create-server.ts
692
709
  var SERVER_NAME = "kaiord-mcp";
693
- var __dirname2 = dirname2(fileURLToPath(import.meta.url));
710
+ var __dirname3 = dirname3(fileURLToPath2(import.meta.url));
694
711
  var pkg = JSON.parse(
695
- readFileSync3(join(__dirname2, "../../package.json"), "utf-8")
712
+ readFileSync3(join(__dirname3, "../../package.json"), "utf-8")
696
713
  );
714
+ var SERVER_INSTRUCTIONS = [
715
+ "Kaiord is a fitness data framework. KRD is the canonical JSON format \u2014 all conversions go through KRD.",
716
+ "BEFORE creating or editing KRD documents, call the kaiord_get_format_spec tool to get the full specification.",
717
+ "Use kaiord_list_formats to discover all supported formats (FIT, TCX, ZWO, GCN, KRD)."
718
+ ].join("\n");
697
719
  var createServer = () => {
698
- const server = new McpServer({
699
- name: SERVER_NAME,
700
- version: pkg.version
701
- });
720
+ const server = new McpServer(
721
+ { name: SERVER_NAME, version: pkg.version },
722
+ { instructions: SERVER_INSTRUCTIONS }
723
+ );
702
724
  const logger = createStderrLogger();
725
+ registerGetFormatSpecTool(server);
703
726
  registerListFormatsTool(server);
704
727
  registerConvertTool(server, logger);
705
728
  registerValidateTool(server, logger);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaiord/mcp",
3
- "version": "4.3.2",
3
+ "version": "4.4.0",
4
4
  "description": "MCP server for Kaiord fitness data conversion (FIT, TCX, ZWO, GCN, KRD)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -23,10 +23,10 @@
23
23
  "@modelcontextprotocol/sdk": "^1.26.0",
24
24
  "zod": "^4.0.0",
25
25
  "@kaiord/core": "^4.3.0",
26
- "@kaiord/tcx": "^4.3.0",
27
- "@kaiord/garmin": "^4.3.0",
26
+ "@kaiord/fit": "^4.3.0",
28
27
  "@kaiord/zwo": "^4.3.0",
29
- "@kaiord/fit": "^4.3.0"
28
+ "@kaiord/tcx": "^4.3.0",
29
+ "@kaiord/garmin": "^4.3.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "^24.0.0",