@iyulab/mloop-mcp 0.1.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.
Files changed (62) hide show
  1. package/README.md +178 -0
  2. package/build/executor.d.ts +36 -0
  3. package/build/executor.d.ts.map +1 -0
  4. package/build/executor.js +106 -0
  5. package/build/executor.js.map +1 -0
  6. package/build/index.d.ts +8 -0
  7. package/build/index.d.ts.map +1 -0
  8. package/build/index.js +27 -0
  9. package/build/index.js.map +1 -0
  10. package/build/server.d.ts +9 -0
  11. package/build/server.d.ts.map +1 -0
  12. package/build/server.js +34 -0
  13. package/build/server.js.map +1 -0
  14. package/build/tools/compare.d.ts +53 -0
  15. package/build/tools/compare.d.ts.map +1 -0
  16. package/build/tools/compare.js +66 -0
  17. package/build/tools/compare.js.map +1 -0
  18. package/build/tools/evaluate.d.ts +56 -0
  19. package/build/tools/evaluate.d.ts.map +1 -0
  20. package/build/tools/evaluate.js +85 -0
  21. package/build/tools/evaluate.js.map +1 -0
  22. package/build/tools/index.d.ts +44 -0
  23. package/build/tools/index.d.ts.map +1 -0
  24. package/build/tools/index.js +27 -0
  25. package/build/tools/index.js.map +1 -0
  26. package/build/tools/info.d.ts +42 -0
  27. package/build/tools/info.d.ts.map +1 -0
  28. package/build/tools/info.js +56 -0
  29. package/build/tools/info.js.map +1 -0
  30. package/build/tools/list.d.ts +49 -0
  31. package/build/tools/list.d.ts.map +1 -0
  32. package/build/tools/list.js +66 -0
  33. package/build/tools/list.js.map +1 -0
  34. package/build/tools/predict.d.ts +63 -0
  35. package/build/tools/predict.d.ts.map +1 -0
  36. package/build/tools/predict.js +82 -0
  37. package/build/tools/predict.js.map +1 -0
  38. package/build/tools/promote.d.ts +56 -0
  39. package/build/tools/promote.d.ts.map +1 -0
  40. package/build/tools/promote.js +72 -0
  41. package/build/tools/promote.js.map +1 -0
  42. package/build/tools/serve.d.ts +49 -0
  43. package/build/tools/serve.d.ts.map +1 -0
  44. package/build/tools/serve.js +79 -0
  45. package/build/tools/serve.js.map +1 -0
  46. package/build/tools/status.d.ts +35 -0
  47. package/build/tools/status.d.ts.map +1 -0
  48. package/build/tools/status.js +51 -0
  49. package/build/tools/status.js.map +1 -0
  50. package/build/tools/train.d.ts +78 -0
  51. package/build/tools/train.d.ts.map +1 -0
  52. package/build/tools/train.js +101 -0
  53. package/build/tools/train.js.map +1 -0
  54. package/build/utils/errors.d.ts +28 -0
  55. package/build/utils/errors.d.ts.map +1 -0
  56. package/build/utils/errors.js +59 -0
  57. package/build/utils/errors.js.map +1 -0
  58. package/build/utils/parser.d.ts +23 -0
  59. package/build/utils/parser.d.ts.map +1 -0
  60. package/build/utils/parser.js +98 -0
  61. package/build/utils/parser.js.map +1 -0
  62. package/package.json +49 -0
@@ -0,0 +1,72 @@
1
+ /**
2
+ * mloop_promote tool - Promote experiment to production
3
+ */
4
+ import { z } from 'zod';
5
+ import { executeMloop } from '../executor.js';
6
+ import { parseCliOutput } from '../utils/parser.js';
7
+ import { formatError } from '../utils/errors.js';
8
+ export const promoteSchema = z.object({
9
+ projectPath: z.string().describe('Path to MLoop project directory'),
10
+ experimentId: z.string().describe('Experiment ID to promote (e.g., exp-003)'),
11
+ modelName: z.string().optional().describe('Model name'),
12
+ force: z.boolean().optional().describe('Skip confirmation'),
13
+ });
14
+ export async function promote(params) {
15
+ try {
16
+ const { projectPath, experimentId, modelName, force } = params;
17
+ const args = ['promote', experimentId];
18
+ if (modelName) {
19
+ args.push('--name', modelName);
20
+ }
21
+ if (force) {
22
+ args.push('--force');
23
+ }
24
+ const result = await executeMloop(args, {
25
+ cwd: projectPath,
26
+ });
27
+ const output = parseCliOutput(result.stdout);
28
+ return {
29
+ content: [{
30
+ type: 'text',
31
+ text: output || `Experiment ${experimentId} promoted to production successfully.`,
32
+ }],
33
+ };
34
+ }
35
+ catch (error) {
36
+ return {
37
+ content: [{
38
+ type: 'text',
39
+ text: formatError(error),
40
+ }],
41
+ isError: true,
42
+ };
43
+ }
44
+ }
45
+ export const promoteTool = {
46
+ name: 'mloop_promote',
47
+ description: 'Promote an experiment to production. The experiment\'s model will be used for predictions.',
48
+ inputSchema: {
49
+ type: 'object',
50
+ properties: {
51
+ projectPath: {
52
+ type: 'string',
53
+ description: 'Path to MLoop project directory',
54
+ },
55
+ experimentId: {
56
+ type: 'string',
57
+ description: 'Experiment ID to promote (e.g., exp-003)',
58
+ },
59
+ modelName: {
60
+ type: 'string',
61
+ description: 'Model name for namespacing',
62
+ },
63
+ force: {
64
+ type: 'boolean',
65
+ description: 'Skip confirmation prompt',
66
+ },
67
+ },
68
+ required: ['projectPath', 'experimentId'],
69
+ },
70
+ handler: promote,
71
+ };
72
+ //# sourceMappingURL=promote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/tools/promote.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACnE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IAC7E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACvD,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CAC5D,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAqB;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QAE/D,MAAM,IAAI,GAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACjD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE;YACtC,GAAG,EAAE,WAAW;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE7C,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM,IAAI,cAAc,YAAY,uCAAuC;iBAClF,CAAC;SACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC;iBACzB,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,4FAA4F;IACzG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;aAC/C;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0CAA0C;aACxD;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4BAA4B;aAC1C;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,0BAA0B;aACxC;SACF;QACD,QAAQ,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC;KAC1C;IACD,OAAO,EAAE,OAAO;CACjB,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * mloop_serve tool - Start REST API server
3
+ */
4
+ import { z } from 'zod';
5
+ export declare const serveSchema: z.ZodObject<{
6
+ projectPath: z.ZodString;
7
+ port: z.ZodOptional<z.ZodNumber>;
8
+ host: z.ZodOptional<z.ZodString>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ projectPath: string;
11
+ port?: number | undefined;
12
+ host?: string | undefined;
13
+ }, {
14
+ projectPath: string;
15
+ port?: number | undefined;
16
+ host?: string | undefined;
17
+ }>;
18
+ export type ServeParams = z.infer<typeof serveSchema>;
19
+ export declare function serve(params: ServeParams): Promise<{
20
+ content: Array<{
21
+ type: 'text';
22
+ text: string;
23
+ }>;
24
+ isError?: boolean;
25
+ }>;
26
+ export declare const serveTool: {
27
+ name: string;
28
+ description: string;
29
+ inputSchema: {
30
+ type: string;
31
+ properties: {
32
+ projectPath: {
33
+ type: string;
34
+ description: string;
35
+ };
36
+ port: {
37
+ type: string;
38
+ description: string;
39
+ };
40
+ host: {
41
+ type: string;
42
+ description: string;
43
+ };
44
+ };
45
+ required: string[];
46
+ };
47
+ handler: typeof serve;
48
+ };
49
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/tools/serve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,WAAW;;;;;;;;;;;;EAItB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,wBAAsB,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CA8C/H;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;CAsBrB,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * mloop_serve tool - Start REST API server
3
+ */
4
+ import { z } from 'zod';
5
+ import { executeMloop } from '../executor.js';
6
+ import { parseCliOutput } from '../utils/parser.js';
7
+ import { formatError } from '../utils/errors.js';
8
+ export const serveSchema = z.object({
9
+ projectPath: z.string().describe('Path to MLoop project directory'),
10
+ port: z.number().optional().describe('Port number (default: 5000)'),
11
+ host: z.string().optional().describe('Host to bind to'),
12
+ });
13
+ export async function serve(params) {
14
+ try {
15
+ const { projectPath, port, host } = params;
16
+ const args = ['serve'];
17
+ if (port) {
18
+ args.push('--port', String(port));
19
+ }
20
+ if (host) {
21
+ args.push('--host', host);
22
+ }
23
+ // Note: serve is a long-running command, so we use a short timeout
24
+ // and expect it to "fail" when it starts successfully
25
+ const result = await executeMloop(args, {
26
+ cwd: projectPath,
27
+ timeout: 5000, // 5 seconds - just enough to start
28
+ });
29
+ const output = parseCliOutput(result.stdout);
30
+ return {
31
+ content: [{
32
+ type: 'text',
33
+ text: output || `API server starting on port ${port ?? 5000}...`,
34
+ }],
35
+ };
36
+ }
37
+ catch (error) {
38
+ // If it's a timeout, the server likely started successfully
39
+ if (error instanceof Error && error.name === 'TimeoutError') {
40
+ return {
41
+ content: [{
42
+ type: 'text',
43
+ text: `API server started on port ${params.port ?? 5000}. The server is running in the background.`,
44
+ }],
45
+ };
46
+ }
47
+ return {
48
+ content: [{
49
+ type: 'text',
50
+ text: formatError(error),
51
+ }],
52
+ isError: true,
53
+ };
54
+ }
55
+ }
56
+ export const serveTool = {
57
+ name: 'mloop_serve',
58
+ description: 'Start the MLoop REST API server for serving predictions via HTTP.',
59
+ inputSchema: {
60
+ type: 'object',
61
+ properties: {
62
+ projectPath: {
63
+ type: 'string',
64
+ description: 'Path to MLoop project directory',
65
+ },
66
+ port: {
67
+ type: 'number',
68
+ description: 'Port number to listen on (default: 5000)',
69
+ },
70
+ host: {
71
+ type: 'string',
72
+ description: 'Host address to bind to',
73
+ },
74
+ },
75
+ required: ['projectPath'],
76
+ },
77
+ handler: serve,
78
+ };
79
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/tools/serve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACnE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACnE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CACxD,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,MAAmB;IAC7C,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAE3C,MAAM,IAAI,GAAa,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,mEAAmE;QACnE,sDAAsD;QACtD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE;YACtC,GAAG,EAAE,WAAW;YAChB,OAAO,EAAE,IAAI,EAAE,mCAAmC;SACnD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE7C,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM,IAAI,+BAA+B,IAAI,IAAI,IAAI,KAAK;iBACjE,CAAC;SACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4DAA4D;QAC5D,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5D,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,8BAA8B,MAAM,CAAC,IAAI,IAAI,IAAI,4CAA4C;qBACpG,CAAC;aACH,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC;iBACzB,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,mEAAmE;IAChF,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;aAC/C;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0CAA0C;aACxD;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yBAAyB;aACvC;SACF;QACD,QAAQ,EAAE,CAAC,aAAa,CAAC;KAC1B;IACD,OAAO,EAAE,KAAK;CACf,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * mloop_status tool - Project status overview
3
+ */
4
+ import { z } from 'zod';
5
+ export declare const statusSchema: z.ZodObject<{
6
+ projectPath: z.ZodString;
7
+ }, "strip", z.ZodTypeAny, {
8
+ projectPath: string;
9
+ }, {
10
+ projectPath: string;
11
+ }>;
12
+ export type StatusParams = z.infer<typeof statusSchema>;
13
+ export declare function status(params: StatusParams): Promise<{
14
+ content: Array<{
15
+ type: 'text';
16
+ text: string;
17
+ }>;
18
+ isError?: boolean;
19
+ }>;
20
+ export declare const statusTool: {
21
+ name: string;
22
+ description: string;
23
+ inputSchema: {
24
+ type: string;
25
+ properties: {
26
+ projectPath: {
27
+ type: string;
28
+ description: string;
29
+ };
30
+ };
31
+ required: string[];
32
+ };
33
+ handler: typeof status;
34
+ };
35
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,YAAY;;;;;;EAEvB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,wBAAsB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CA2BjI;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;CActB,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * mloop_status tool - Project status overview
3
+ */
4
+ import { z } from 'zod';
5
+ import { executeMloop } from '../executor.js';
6
+ import { parseCliOutput } from '../utils/parser.js';
7
+ import { formatError } from '../utils/errors.js';
8
+ export const statusSchema = z.object({
9
+ projectPath: z.string().describe('Path to MLoop project directory'),
10
+ });
11
+ export async function status(params) {
12
+ try {
13
+ const { projectPath } = params;
14
+ const args = ['status'];
15
+ const result = await executeMloop(args, {
16
+ cwd: projectPath,
17
+ });
18
+ const output = parseCliOutput(result.stdout);
19
+ return {
20
+ content: [{
21
+ type: 'text',
22
+ text: output || 'No status information available.',
23
+ }],
24
+ };
25
+ }
26
+ catch (error) {
27
+ return {
28
+ content: [{
29
+ type: 'text',
30
+ text: formatError(error),
31
+ }],
32
+ isError: true,
33
+ };
34
+ }
35
+ }
36
+ export const statusTool = {
37
+ name: 'mloop_status',
38
+ description: 'Show MLoop project status including models, experiments, and production deployments.',
39
+ inputSchema: {
40
+ type: 'object',
41
+ properties: {
42
+ projectPath: {
43
+ type: 'string',
44
+ description: 'Path to MLoop project directory',
45
+ },
46
+ },
47
+ required: ['projectPath'],
48
+ },
49
+ handler: status,
50
+ };
51
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CACpE,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,MAAoB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAE/B,MAAM,IAAI,GAAa,CAAC,QAAQ,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE;YACtC,GAAG,EAAE,WAAW;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE7C,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM,IAAI,kCAAkC;iBACnD,CAAC;SACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC;iBACzB,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,sFAAsF;IACnG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;aAC/C;SACF;QACD,QAAQ,EAAE,CAAC,aAAa,CAAC;KAC1B;IACD,OAAO,EAAE,MAAM;CAChB,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * mloop_train tool - Train ML models with AutoML
3
+ */
4
+ import { z } from 'zod';
5
+ export declare const trainSchema: z.ZodObject<{
6
+ projectPath: z.ZodString;
7
+ dataFile: z.ZodOptional<z.ZodString>;
8
+ label: z.ZodOptional<z.ZodString>;
9
+ task: z.ZodOptional<z.ZodEnum<["binary-classification", "multiclass-classification", "regression"]>>;
10
+ time: z.ZodOptional<z.ZodNumber>;
11
+ metric: z.ZodOptional<z.ZodString>;
12
+ modelName: z.ZodOptional<z.ZodString>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ projectPath: string;
15
+ dataFile?: string | undefined;
16
+ label?: string | undefined;
17
+ task?: "binary-classification" | "multiclass-classification" | "regression" | undefined;
18
+ time?: number | undefined;
19
+ metric?: string | undefined;
20
+ modelName?: string | undefined;
21
+ }, {
22
+ projectPath: string;
23
+ dataFile?: string | undefined;
24
+ label?: string | undefined;
25
+ task?: "binary-classification" | "multiclass-classification" | "regression" | undefined;
26
+ time?: number | undefined;
27
+ metric?: string | undefined;
28
+ modelName?: string | undefined;
29
+ }>;
30
+ export type TrainParams = z.infer<typeof trainSchema>;
31
+ export declare function train(params: TrainParams): Promise<{
32
+ content: Array<{
33
+ type: 'text';
34
+ text: string;
35
+ }>;
36
+ isError?: boolean;
37
+ }>;
38
+ export declare const trainTool: {
39
+ name: string;
40
+ description: string;
41
+ inputSchema: {
42
+ type: string;
43
+ properties: {
44
+ projectPath: {
45
+ type: string;
46
+ description: string;
47
+ };
48
+ dataFile: {
49
+ type: string;
50
+ description: string;
51
+ };
52
+ label: {
53
+ type: string;
54
+ description: string;
55
+ };
56
+ task: {
57
+ type: string;
58
+ enum: string[];
59
+ description: string;
60
+ };
61
+ time: {
62
+ type: string;
63
+ description: string;
64
+ };
65
+ metric: {
66
+ type: string;
67
+ description: string;
68
+ };
69
+ modelName: {
70
+ type: string;
71
+ description: string;
72
+ };
73
+ };
74
+ required: string[];
75
+ };
76
+ handler: typeof train;
77
+ };
78
+ //# sourceMappingURL=train.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"train.d.ts","sourceRoot":"","sources":["../../src/tools/train.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;EAUtB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,wBAAsB,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAwC/H;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCrB,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * mloop_train tool - Train ML models with AutoML
3
+ */
4
+ import { z } from 'zod';
5
+ import { executeMloop, buildArgsWithPositional } from '../executor.js';
6
+ import { parseCliOutput } from '../utils/parser.js';
7
+ import { formatError } from '../utils/errors.js';
8
+ export const trainSchema = z.object({
9
+ projectPath: z.string().describe('Path to MLoop project directory'),
10
+ dataFile: z.string().optional().describe('Training data file (default: datasets/train.csv)'),
11
+ label: z.string().optional().describe('Label column name'),
12
+ task: z.enum(['binary-classification', 'multiclass-classification', 'regression'])
13
+ .optional()
14
+ .describe('ML task type'),
15
+ time: z.number().positive().optional().describe('Training time in seconds'),
16
+ metric: z.string().optional().describe('Optimization metric'),
17
+ modelName: z.string().optional().describe('Model name (default: "default")'),
18
+ });
19
+ export async function train(params) {
20
+ try {
21
+ const { projectPath, dataFile, label, ...options } = params;
22
+ // Build positional arguments
23
+ const positional = [];
24
+ if (dataFile)
25
+ positional.push(dataFile);
26
+ if (label)
27
+ positional.push(label);
28
+ // Map parameters to CLI flags
29
+ const cliParams = {};
30
+ if (options.task)
31
+ cliParams['task'] = options.task;
32
+ if (options.time)
33
+ cliParams['time'] = options.time;
34
+ if (options.metric)
35
+ cliParams['metric'] = options.metric;
36
+ if (options.modelName)
37
+ cliParams['name'] = options.modelName;
38
+ const args = buildArgsWithPositional('train', positional, cliParams);
39
+ const result = await executeMloop(args, {
40
+ cwd: projectPath,
41
+ timeout: 600_000, // 10 minutes for training
42
+ });
43
+ const output = parseCliOutput(result.stdout);
44
+ return {
45
+ content: [{
46
+ type: 'text',
47
+ text: output || 'Training completed successfully.',
48
+ }],
49
+ };
50
+ }
51
+ catch (error) {
52
+ return {
53
+ content: [{
54
+ type: 'text',
55
+ text: formatError(error),
56
+ }],
57
+ isError: true,
58
+ };
59
+ }
60
+ }
61
+ export const trainTool = {
62
+ name: 'mloop_train',
63
+ description: 'Train an ML model using AutoML. Runs mloop train command with specified parameters.',
64
+ inputSchema: {
65
+ type: 'object',
66
+ properties: {
67
+ projectPath: {
68
+ type: 'string',
69
+ description: 'Path to MLoop project directory',
70
+ },
71
+ dataFile: {
72
+ type: 'string',
73
+ description: 'Training data file path (default: datasets/train.csv)',
74
+ },
75
+ label: {
76
+ type: 'string',
77
+ description: 'Label column name for training',
78
+ },
79
+ task: {
80
+ type: 'string',
81
+ enum: ['binary-classification', 'multiclass-classification', 'regression'],
82
+ description: 'ML task type',
83
+ },
84
+ time: {
85
+ type: 'number',
86
+ description: 'Training time limit in seconds',
87
+ },
88
+ metric: {
89
+ type: 'string',
90
+ description: 'Optimization metric (e.g., Accuracy, F1Score, RSquared)',
91
+ },
92
+ modelName: {
93
+ type: 'string',
94
+ description: 'Model name for namespacing (default: "default")',
95
+ },
96
+ },
97
+ required: ['projectPath'],
98
+ },
99
+ handler: train,
100
+ };
101
+ //# sourceMappingURL=train.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"train.js","sourceRoot":"","sources":["../../src/tools/train.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Error handling utilities for mloop-mcp
3
+ */
4
+ /**
5
+ * Remove ANSI escape codes from string
6
+ */
7
+ export declare function stripAnsi(text: string): string;
8
+ /**
9
+ * Custom error for CLI execution failures
10
+ */
11
+ export declare class CliExecutionError extends Error {
12
+ readonly exitCode: number;
13
+ readonly stdout: string;
14
+ readonly stderr: string;
15
+ constructor(message: string, exitCode: number, stdout: string, stderr: string);
16
+ }
17
+ /**
18
+ * Custom error for timeout
19
+ */
20
+ export declare class TimeoutError extends Error {
21
+ readonly timeoutMs: number;
22
+ constructor(message: string, timeoutMs: number);
23
+ }
24
+ /**
25
+ * Format error for MCP response
26
+ */
27
+ export declare function formatError(error: unknown): string;
28
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,MAAM;aACd,MAAM,EAAE,MAAM;gBAH9B,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM;CAKjC;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;aAGnB,SAAS,EAAE,MAAM;gBADjC,OAAO,EAAE,MAAM,EACC,SAAS,EAAE,MAAM;CAKpC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAuBlD"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Error handling utilities for mloop-mcp
3
+ */
4
+ /**
5
+ * Remove ANSI escape codes from string
6
+ */
7
+ export function stripAnsi(text) {
8
+ // eslint-disable-next-line no-control-regex
9
+ return text.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, '');
10
+ }
11
+ /**
12
+ * Custom error for CLI execution failures
13
+ */
14
+ export class CliExecutionError extends Error {
15
+ exitCode;
16
+ stdout;
17
+ stderr;
18
+ constructor(message, exitCode, stdout, stderr) {
19
+ super(message);
20
+ this.exitCode = exitCode;
21
+ this.stdout = stdout;
22
+ this.stderr = stderr;
23
+ this.name = 'CliExecutionError';
24
+ }
25
+ }
26
+ /**
27
+ * Custom error for timeout
28
+ */
29
+ export class TimeoutError extends Error {
30
+ timeoutMs;
31
+ constructor(message, timeoutMs) {
32
+ super(message);
33
+ this.timeoutMs = timeoutMs;
34
+ this.name = 'TimeoutError';
35
+ }
36
+ }
37
+ /**
38
+ * Format error for MCP response
39
+ */
40
+ export function formatError(error) {
41
+ if (error instanceof CliExecutionError) {
42
+ const parts = [`CLI Error (exit code ${error.exitCode})`];
43
+ if (error.stderr) {
44
+ parts.push(`\nStderr: ${stripAnsi(error.stderr)}`);
45
+ }
46
+ if (error.stdout) {
47
+ parts.push(`\nStdout: ${stripAnsi(error.stdout)}`);
48
+ }
49
+ return parts.join('');
50
+ }
51
+ if (error instanceof TimeoutError) {
52
+ return `Timeout: Command did not complete within ${error.timeoutMs}ms`;
53
+ }
54
+ if (error instanceof Error) {
55
+ return error.message;
56
+ }
57
+ return String(error);
58
+ }
59
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,4CAA4C;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAGxB;IACA;IACA;IAJlB,YACE,OAAe,EACC,QAAgB,EAChB,MAAc,EACd,MAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;QAG9B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IAGnB;IAFlB,YACE,OAAe,EACC,SAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,cAAS,GAAT,SAAS,CAAQ;QAGjC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,CAAC,wBAAwB,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QAE1D,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,OAAO,4CAA4C,KAAK,CAAC,SAAS,IAAI,CAAC;IACzE,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * CLI output parsing utilities
3
+ */
4
+ /**
5
+ * Parse CLI output and clean it for MCP response
6
+ */
7
+ export declare function parseCliOutput(output: string): string;
8
+ /**
9
+ * Try to parse JSON from CLI output
10
+ * Returns null if parsing fails
11
+ */
12
+ export declare function tryParseJson<T>(output: string): T | null;
13
+ /**
14
+ * Extract table data from CLI output
15
+ * Parses simple table format with headers
16
+ */
17
+ export declare function parseTable(output: string): Array<Record<string, string>>;
18
+ /**
19
+ * Extract key-value pairs from CLI output
20
+ * Handles formats like "Key: Value" or "Key = Value"
21
+ */
22
+ export declare function parseKeyValues(output: string): Record<string, string>;
23
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAOxD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgCxE;AA+BD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAerE"}