@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.
- package/dist/bin/kaiord-mcp.js +37 -14
- package/dist/index.js +37 -14
- package/package.json +4 -4
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 {
|
|
@@ -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
|
|
715
|
+
var __dirname3 = dirname3(fileURLToPath2(import.meta.url));
|
|
699
716
|
var pkg = JSON.parse(
|
|
700
|
-
readFileSync3(join(
|
|
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
|
-
|
|
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
|
|
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 {
|
|
@@ -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
|
|
710
|
+
var __dirname3 = dirname3(fileURLToPath2(import.meta.url));
|
|
694
711
|
var pkg = JSON.parse(
|
|
695
|
-
readFileSync3(join(
|
|
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
|
-
|
|
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
|
+
"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/
|
|
27
|
-
"@kaiord/garmin": "^4.3.0",
|
|
26
|
+
"@kaiord/fit": "^4.3.0",
|
|
28
27
|
"@kaiord/zwo": "^4.3.0",
|
|
29
|
-
"@kaiord/
|
|
28
|
+
"@kaiord/tcx": "^4.3.0",
|
|
29
|
+
"@kaiord/garmin": "^4.3.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "^24.0.0",
|