@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.
- package/dist/bin/kaiord-mcp.js +42 -14
- package/dist/index.js +42 -14
- package/package.json +3 -3
package/dist/bin/kaiord-mcp.js
CHANGED
|
@@ -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
|
|
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/
|
|
93
|
+
// src/utils/find-spec-file.ts
|
|
94
94
|
import { existsSync, readFileSync } from "fs";
|
|
95
|
-
import { resolve } from "path";
|
|
96
|
-
|
|
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(
|
|
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
|
|
720
|
+
var __dirname3 = dirname3(fileURLToPath2(import.meta.url));
|
|
699
721
|
var pkg = JSON.parse(
|
|
700
|
-
readFileSync3(join(
|
|
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
|
-
|
|
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
|
|
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/
|
|
88
|
+
// src/utils/find-spec-file.ts
|
|
89
89
|
import { existsSync, readFileSync } from "fs";
|
|
90
|
-
import { resolve } from "path";
|
|
91
|
-
|
|
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(
|
|
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
|
|
715
|
+
var __dirname3 = dirname3(fileURLToPath2(import.meta.url));
|
|
694
716
|
var pkg = JSON.parse(
|
|
695
|
-
readFileSync3(join(
|
|
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
|
-
|
|
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
|
+
"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.
|
|
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.
|
|
29
|
+
"@kaiord/garmin": "^4.5.1"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "^24.0.0",
|