@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
package/README.md ADDED
@@ -0,0 +1,178 @@
1
+ # mloop-mcp
2
+
3
+ MCP (Model Context Protocol) server for [MLoop](https://github.com/iyulab/MLoop) CLI.
4
+
5
+ Enables AI clients (Claude, Cursor, ironhive-cli) to perform MLOps tasks using MLoop's AutoML capabilities.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install -g @iyulab/mloop-mcp
11
+ ```
12
+
13
+ Or run directly with npx:
14
+
15
+ ```bash
16
+ npx @iyulab/mloop-mcp
17
+ ```
18
+
19
+ ## Prerequisites
20
+
21
+ - Node.js 18+
22
+ - MLoop CLI installed and available in PATH
23
+ ```bash
24
+ dotnet tool install -g mloop
25
+ ```
26
+
27
+ ### Custom MLoop Path
28
+
29
+ If MLoop is not in PATH, set the `MLOOP_PATH` environment variable:
30
+
31
+ ```bash
32
+ # Windows
33
+ set MLOOP_PATH=D:\lib\mloop.exe
34
+
35
+ # Linux/macOS
36
+ export MLOOP_PATH=/usr/local/bin/mloop
37
+ ```
38
+
39
+ ## Configuration
40
+
41
+ ### For Claude Desktop
42
+
43
+ Add to your `claude_desktop_config.json`:
44
+
45
+ ```json
46
+ {
47
+ "mcpServers": {
48
+ "mloop": {
49
+ "command": "npx",
50
+ "args": ["@iyulab/mloop-mcp"]
51
+ }
52
+ }
53
+ }
54
+ ```
55
+
56
+ ### For ironhive-cli
57
+
58
+ Add to `.ironhive/plugins.yaml`:
59
+
60
+ ```yaml
61
+ plugins:
62
+ mloop:
63
+ transport: stdio
64
+ command: npx
65
+ args:
66
+ - "@iyulab/mloop-mcp"
67
+ ```
68
+
69
+ ## Available Tools
70
+
71
+ | Tool | Description |
72
+ |------|-------------|
73
+ | `mloop_train` | Train ML models using AutoML |
74
+ | `mloop_predict` | Run predictions with trained models |
75
+ | `mloop_list` | List experiments and their metrics |
76
+ | `mloop_promote` | Promote an experiment to production |
77
+ | `mloop_info` | Analyze and profile datasets |
78
+ | `mloop_status` | Show project status |
79
+ | `mloop_compare` | Compare multiple experiments |
80
+ | `mloop_evaluate` | Evaluate model performance |
81
+ | `mloop_serve` | Start REST API server |
82
+
83
+ ## Tool Examples
84
+
85
+ ### Train a model
86
+
87
+ ```json
88
+ {
89
+ "tool": "mloop_train",
90
+ "arguments": {
91
+ "projectPath": "/path/to/project",
92
+ "dataFile": "datasets/train.csv",
93
+ "label": "target",
94
+ "task": "binary-classification",
95
+ "time": 60
96
+ }
97
+ }
98
+ ```
99
+
100
+ ### Run predictions
101
+
102
+ ```json
103
+ {
104
+ "tool": "mloop_predict",
105
+ "arguments": {
106
+ "projectPath": "/path/to/project",
107
+ "dataFile": "datasets/test.csv",
108
+ "output": "predictions/output.csv"
109
+ }
110
+ }
111
+ ```
112
+
113
+ ### List experiments
114
+
115
+ ```json
116
+ {
117
+ "tool": "mloop_list",
118
+ "arguments": {
119
+ "projectPath": "/path/to/project",
120
+ "showAll": true
121
+ }
122
+ }
123
+ ```
124
+
125
+ ### Promote to production
126
+
127
+ ```json
128
+ {
129
+ "tool": "mloop_promote",
130
+ "arguments": {
131
+ "projectPath": "/path/to/project",
132
+ "experimentId": "exp-003",
133
+ "force": true
134
+ }
135
+ }
136
+ ```
137
+
138
+ ### Analyze dataset
139
+
140
+ ```json
141
+ {
142
+ "tool": "mloop_info",
143
+ "arguments": {
144
+ "dataFile": "datasets/train.csv",
145
+ "projectPath": "/path/to/project"
146
+ }
147
+ }
148
+ ```
149
+
150
+ ## Development
151
+
152
+ ```bash
153
+ # Install dependencies
154
+ npm install
155
+
156
+ # Build
157
+ npm run build
158
+
159
+ # Run locally
160
+ npm start
161
+
162
+ # Test with MCP Inspector
163
+ npx @modelcontextprotocol/inspector node build/index.js
164
+ ```
165
+
166
+ ## Architecture
167
+
168
+ ```
169
+ ironhive-cli ──[MCP/STDIO]──> mloop-mcp ──[subprocess]──> mloop CLI ──> ML.NET
170
+ ```
171
+
172
+ - **Pure Bridge Pattern**: 1:1 CLI mapping, no business logic, stateless
173
+ - **STDIO Transport**: Simple process communication
174
+ - **Subprocess Execution**: Each tool call spawns `mloop` CLI
175
+
176
+ ## License
177
+
178
+ MIT
@@ -0,0 +1,36 @@
1
+ /**
2
+ * CLI subprocess executor for mloop commands
3
+ */
4
+ export interface ExecuteOptions {
5
+ /** Working directory for command execution */
6
+ cwd?: string;
7
+ /** Timeout in milliseconds (default: 300000 = 5 minutes) */
8
+ timeout?: number;
9
+ /** Environment variables to pass */
10
+ env?: Record<string, string>;
11
+ }
12
+ export interface ExecuteResult {
13
+ stdout: string;
14
+ stderr: string;
15
+ exitCode: number;
16
+ }
17
+ /**
18
+ * Execute mloop CLI command
19
+ *
20
+ * @param args - Arguments to pass to mloop command
21
+ * @param options - Execution options
22
+ * @returns Promise resolving to execution result
23
+ * @throws CliExecutionError if command fails
24
+ * @throws TimeoutError if command times out
25
+ */
26
+ export declare function executeMloop(args: string[], options?: ExecuteOptions): Promise<ExecuteResult>;
27
+ /**
28
+ * Build CLI arguments from a parameter object
29
+ * Handles common patterns like --flag, --key=value
30
+ */
31
+ export declare function buildArgs(command: string, params: Record<string, unknown>): string[];
32
+ /**
33
+ * Build CLI arguments for positional + named parameters
34
+ */
35
+ export declare function buildArgsWithPositional(command: string, positional: string[], params: Record<string, unknown>): string[];
36
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAYD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA4DxB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,EAAE,CAmBV;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAAE,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,EAAE,CAkBV"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * CLI subprocess executor for mloop commands
3
+ */
4
+ import { spawn } from 'child_process';
5
+ import { CliExecutionError, TimeoutError } from './utils/errors.js';
6
+ const DEFAULT_TIMEOUT = 300_000; // 5 minutes
7
+ /**
8
+ * Get the mloop executable path.
9
+ * Uses MLOOP_PATH environment variable if set, otherwise defaults to 'mloop'.
10
+ */
11
+ function getMloopPath() {
12
+ return process.env['MLOOP_PATH'] || 'mloop';
13
+ }
14
+ /**
15
+ * Execute mloop CLI command
16
+ *
17
+ * @param args - Arguments to pass to mloop command
18
+ * @param options - Execution options
19
+ * @returns Promise resolving to execution result
20
+ * @throws CliExecutionError if command fails
21
+ * @throws TimeoutError if command times out
22
+ */
23
+ export async function executeMloop(args, options = {}) {
24
+ const { cwd, timeout = DEFAULT_TIMEOUT, env } = options;
25
+ const mloopPath = getMloopPath();
26
+ return new Promise((resolve, reject) => {
27
+ const proc = spawn(mloopPath, args, {
28
+ cwd,
29
+ env: { ...process.env, ...env },
30
+ shell: true, // Required for Windows
31
+ windowsHide: true,
32
+ });
33
+ let stdout = '';
34
+ let stderr = '';
35
+ let killed = false;
36
+ const timeoutId = setTimeout(() => {
37
+ killed = true;
38
+ proc.kill('SIGTERM');
39
+ reject(new TimeoutError(`Command timed out after ${timeout}ms`, timeout));
40
+ }, timeout);
41
+ proc.stdout?.on('data', (data) => {
42
+ stdout += data.toString();
43
+ });
44
+ proc.stderr?.on('data', (data) => {
45
+ stderr += data.toString();
46
+ });
47
+ proc.on('error', (error) => {
48
+ clearTimeout(timeoutId);
49
+ reject(new CliExecutionError(`Failed to execute mloop: ${error.message}`, -1, stdout, stderr));
50
+ });
51
+ proc.on('close', (code) => {
52
+ clearTimeout(timeoutId);
53
+ if (killed)
54
+ return; // Already handled by timeout
55
+ const exitCode = code ?? 0;
56
+ const result = { stdout, stderr, exitCode };
57
+ if (exitCode !== 0) {
58
+ reject(new CliExecutionError(`mloop exited with code ${exitCode}`, exitCode, stdout, stderr));
59
+ }
60
+ else {
61
+ resolve(result);
62
+ }
63
+ });
64
+ });
65
+ }
66
+ /**
67
+ * Build CLI arguments from a parameter object
68
+ * Handles common patterns like --flag, --key=value
69
+ */
70
+ export function buildArgs(command, params) {
71
+ const args = [command];
72
+ for (const [key, value] of Object.entries(params)) {
73
+ if (value === undefined || value === null || value === false) {
74
+ continue;
75
+ }
76
+ // Convert camelCase to kebab-case for CLI flags
77
+ const flag = `--${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`;
78
+ if (value === true) {
79
+ args.push(flag);
80
+ }
81
+ else {
82
+ args.push(flag, String(value));
83
+ }
84
+ }
85
+ return args;
86
+ }
87
+ /**
88
+ * Build CLI arguments for positional + named parameters
89
+ */
90
+ export function buildArgsWithPositional(command, positional, params) {
91
+ const args = [command, ...positional];
92
+ for (const [key, value] of Object.entries(params)) {
93
+ if (value === undefined || value === null || value === false) {
94
+ continue;
95
+ }
96
+ const flag = `--${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`;
97
+ if (value === true) {
98
+ args.push(flag);
99
+ }
100
+ else {
101
+ args.push(flag, String(value));
102
+ }
103
+ }
104
+ return args;
105
+ }
106
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mloop-mcp - MCP server for MLoop CLI
4
+ *
5
+ * Exposes MLoop ML.NET MLOps capabilities via Model Context Protocol
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
package/build/index.js ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mloop-mcp - MCP server for MLoop CLI
4
+ *
5
+ * Exposes MLoop ML.NET MLOps capabilities via Model Context Protocol
6
+ */
7
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
+ import { createServer } from './server.js';
9
+ async function main() {
10
+ const server = createServer();
11
+ const transport = new StdioServerTransport();
12
+ await server.connect(transport);
13
+ // Handle graceful shutdown
14
+ process.on('SIGINT', async () => {
15
+ await server.close();
16
+ process.exit(0);
17
+ });
18
+ process.on('SIGTERM', async () => {
19
+ await server.close();
20
+ process.exit(0);
21
+ });
22
+ }
23
+ main().catch((error) => {
24
+ console.error('Fatal error:', error);
25
+ process.exit(1);
26
+ });
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP Server for MLoop CLI
3
+ */
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ /**
6
+ * Create and configure the MCP server
7
+ */
8
+ export declare function createServer(): McpServer;
9
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+BpE;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CA+ExC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * MCP Server for MLoop CLI
3
+ */
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { trainTool, train, trainSchema, predictTool, predict, predictSchema, listTool, list, listSchema, promoteTool, promote, promoteSchema, infoTool, info, infoSchema, statusTool, status, statusSchema, compareTool, compare, compareSchema, evaluateTool, evaluate, evaluateSchema, serveTool, serve, serveSchema, } from './tools/index.js';
6
+ /**
7
+ * Create and configure the MCP server
8
+ */
9
+ export function createServer() {
10
+ const server = new McpServer({
11
+ name: 'mloop-mcp',
12
+ version: '0.1.0',
13
+ });
14
+ // Register mloop_train
15
+ server.tool(trainTool.name, trainTool.description, trainSchema.shape, async (params) => train(params));
16
+ // Register mloop_predict
17
+ server.tool(predictTool.name, predictTool.description, predictSchema.shape, async (params) => predict(params));
18
+ // Register mloop_list
19
+ server.tool(listTool.name, listTool.description, listSchema.shape, async (params) => list(params));
20
+ // Register mloop_promote
21
+ server.tool(promoteTool.name, promoteTool.description, promoteSchema.shape, async (params) => promote(params));
22
+ // Register mloop_info
23
+ server.tool(infoTool.name, infoTool.description, infoSchema.shape, async (params) => info(params));
24
+ // Register mloop_status
25
+ server.tool(statusTool.name, statusTool.description, statusSchema.shape, async (params) => status(params));
26
+ // Register mloop_compare
27
+ server.tool(compareTool.name, compareTool.description, compareSchema.shape, async (params) => compare(params));
28
+ // Register mloop_evaluate
29
+ server.tool(evaluateTool.name, evaluateTool.description, evaluateSchema.shape, async (params) => evaluate(params));
30
+ // Register mloop_serve
31
+ server.tool(serveTool.name, serveTool.description, serveSchema.shape, async (params) => serve(params));
32
+ return server;
33
+ }
34
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EACL,SAAS,EACT,KAAK,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,aAAa,EACb,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,WAAW,EACX,OAAO,EACP,aAAa,EACb,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,UAAU,EACV,MAAM,EACN,YAAY,EACZ,WAAW,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,SAAS,EACT,KAAK,EACL,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,CAAC,IAAI,CACT,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,KAAK,EACjB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,MAAqC,CAAC,CAC/D,CAAC;IAEF,yBAAyB;IACzB,MAAM,CAAC,IAAI,CACT,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,WAAW,EACvB,aAAa,CAAC,KAAK,EACnB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAuC,CAAC,CACnE,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,IAAI,CACT,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,WAAW,EACpB,UAAU,CAAC,KAAK,EAChB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAoC,CAAC,CAC7D,CAAC;IAEF,yBAAyB;IACzB,MAAM,CAAC,IAAI,CACT,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,WAAW,EACvB,aAAa,CAAC,KAAK,EACnB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAuC,CAAC,CACnE,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,IAAI,CACT,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,WAAW,EACpB,UAAU,CAAC,KAAK,EAChB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAoC,CAAC,CAC7D,CAAC;IAEF,wBAAwB;IACxB,MAAM,CAAC,IAAI,CACT,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,WAAW,EACtB,YAAY,CAAC,KAAK,EAClB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAsC,CAAC,CACjE,CAAC;IAEF,yBAAyB;IACzB,MAAM,CAAC,IAAI,CACT,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,WAAW,EACvB,aAAa,CAAC,KAAK,EACnB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAuC,CAAC,CACnE,CAAC;IAEF,0BAA0B;IAC1B,MAAM,CAAC,IAAI,CACT,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,WAAW,EACxB,cAAc,CAAC,KAAK,EACpB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAwC,CAAC,CACrE,CAAC;IAEF,uBAAuB;IACvB,MAAM,CAAC,IAAI,CACT,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,KAAK,EACjB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,MAAqC,CAAC,CAC/D,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * mloop_compare tool - Compare experiments
3
+ */
4
+ import { z } from 'zod';
5
+ export declare const compareSchema: z.ZodObject<{
6
+ projectPath: z.ZodString;
7
+ experiments: z.ZodArray<z.ZodString, "many">;
8
+ modelName: z.ZodOptional<z.ZodString>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ projectPath: string;
11
+ experiments: string[];
12
+ modelName?: string | undefined;
13
+ }, {
14
+ projectPath: string;
15
+ experiments: string[];
16
+ modelName?: string | undefined;
17
+ }>;
18
+ export type CompareParams = z.infer<typeof compareSchema>;
19
+ export declare function compare(params: CompareParams): Promise<{
20
+ content: Array<{
21
+ type: 'text';
22
+ text: string;
23
+ }>;
24
+ isError?: boolean;
25
+ }>;
26
+ export declare const compareTool: {
27
+ name: string;
28
+ description: string;
29
+ inputSchema: {
30
+ type: string;
31
+ properties: {
32
+ projectPath: {
33
+ type: string;
34
+ description: string;
35
+ };
36
+ experiments: {
37
+ type: string;
38
+ items: {
39
+ type: string;
40
+ };
41
+ minItems: number;
42
+ description: string;
43
+ };
44
+ modelName: {
45
+ type: string;
46
+ description: string;
47
+ };
48
+ };
49
+ required: string[];
50
+ };
51
+ handler: typeof compare;
52
+ };
53
+ //# sourceMappingURL=compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/tools/compare.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,aAAa;;;;;;;;;;;;EAIxB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,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,CA8BnI;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;CAwBvB,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * mloop_compare tool - Compare experiments
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 compareSchema = z.object({
9
+ projectPath: z.string().describe('Path to MLoop project directory'),
10
+ experiments: z.array(z.string()).min(2).describe('Experiment IDs to compare (at least 2)'),
11
+ modelName: z.string().optional().describe('Model name'),
12
+ });
13
+ export async function compare(params) {
14
+ try {
15
+ const { projectPath, experiments, modelName } = params;
16
+ const args = ['compare', ...experiments];
17
+ if (modelName) {
18
+ args.push('--name', modelName);
19
+ }
20
+ const result = await executeMloop(args, {
21
+ cwd: projectPath,
22
+ });
23
+ const output = parseCliOutput(result.stdout);
24
+ return {
25
+ content: [{
26
+ type: 'text',
27
+ text: output || 'No comparison data available.',
28
+ }],
29
+ };
30
+ }
31
+ catch (error) {
32
+ return {
33
+ content: [{
34
+ type: 'text',
35
+ text: formatError(error),
36
+ }],
37
+ isError: true,
38
+ };
39
+ }
40
+ }
41
+ export const compareTool = {
42
+ name: 'mloop_compare',
43
+ description: 'Compare metrics across multiple experiments to identify the best performing model.',
44
+ inputSchema: {
45
+ type: 'object',
46
+ properties: {
47
+ projectPath: {
48
+ type: 'string',
49
+ description: 'Path to MLoop project directory',
50
+ },
51
+ experiments: {
52
+ type: 'array',
53
+ items: { type: 'string' },
54
+ minItems: 2,
55
+ description: 'List of experiment IDs to compare (e.g., ["exp-001", "exp-002"])',
56
+ },
57
+ modelName: {
58
+ type: 'string',
59
+ description: 'Model name for namespacing',
60
+ },
61
+ },
62
+ required: ['projectPath', 'experiments'],
63
+ },
64
+ handler: compare,
65
+ };
66
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/tools/compare.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,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IAC1F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;CACxD,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAqB;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;QAEvD,MAAM,IAAI,GAAa,CAAC,SAAS,EAAE,GAAG,WAAW,CAAC,CAAC;QACnD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjC,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,+BAA+B;iBAChD,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,oFAAoF;IACjG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;aAC/C;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,QAAQ,EAAE,CAAC;gBACX,WAAW,EAAE,kEAAkE;aAChF;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4BAA4B;aAC1C;SACF;QACD,QAAQ,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;KACzC;IACD,OAAO,EAAE,OAAO;CACjB,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * mloop_evaluate tool - Evaluate model performance
3
+ */
4
+ import { z } from 'zod';
5
+ export declare const evaluateSchema: z.ZodObject<{
6
+ projectPath: z.ZodString;
7
+ dataFile: z.ZodOptional<z.ZodString>;
8
+ modelName: z.ZodOptional<z.ZodString>;
9
+ experimentId: z.ZodOptional<z.ZodString>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ projectPath: string;
12
+ dataFile?: string | undefined;
13
+ modelName?: string | undefined;
14
+ experimentId?: string | undefined;
15
+ }, {
16
+ projectPath: string;
17
+ dataFile?: string | undefined;
18
+ modelName?: string | undefined;
19
+ experimentId?: string | undefined;
20
+ }>;
21
+ export type EvaluateParams = z.infer<typeof evaluateSchema>;
22
+ export declare function evaluate(params: EvaluateParams): Promise<{
23
+ content: Array<{
24
+ type: 'text';
25
+ text: string;
26
+ }>;
27
+ isError?: boolean;
28
+ }>;
29
+ export declare const evaluateTool: {
30
+ name: string;
31
+ description: string;
32
+ inputSchema: {
33
+ type: string;
34
+ properties: {
35
+ projectPath: {
36
+ type: string;
37
+ description: string;
38
+ };
39
+ dataFile: {
40
+ type: string;
41
+ description: string;
42
+ };
43
+ modelName: {
44
+ type: string;
45
+ description: string;
46
+ };
47
+ experimentId: {
48
+ type: string;
49
+ description: string;
50
+ };
51
+ };
52
+ required: string[];
53
+ };
54
+ handler: typeof evaluate;
55
+ };
56
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;EAKzB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,wBAAsB,QAAQ,CAAC,MAAM,EAAE,cAAc,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,CAiDrI;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BxB,CAAC"}