mlgym-deploy 2.3.1 → 2.3.3
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/index.js +144 -77
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -17,7 +17,7 @@ import crypto from 'crypto';
|
|
|
17
17
|
const execAsync = promisify(exec);
|
|
18
18
|
|
|
19
19
|
// Current version of this MCP server
|
|
20
|
-
const CURRENT_VERSION = '2.3.
|
|
20
|
+
const CURRENT_VERSION = '2.3.3';
|
|
21
21
|
const PACKAGE_NAME = 'mlgym-deploy';
|
|
22
22
|
|
|
23
23
|
// Version check state
|
|
@@ -25,6 +25,36 @@ let versionCheckResult = null;
|
|
|
25
25
|
let lastVersionCheck = 0;
|
|
26
26
|
const VERSION_CHECK_INTERVAL = 3600000; // Check once per hour
|
|
27
27
|
|
|
28
|
+
// Helper to wrap tool response with update message if needed
|
|
29
|
+
function wrapResponseWithUpdateMessage(response) {
|
|
30
|
+
if (versionCheckResult && versionCheckResult.updateAvailable) {
|
|
31
|
+
const updateMessage = `
|
|
32
|
+
╔════════════════════════════════════════════════════════════════════╗
|
|
33
|
+
║ 🔄 UPDATE AVAILABLE 🔄 ║
|
|
34
|
+
║ ║
|
|
35
|
+
║ A newer version of MLGym MCP Server is available! ║
|
|
36
|
+
║ ║
|
|
37
|
+
║ Current version: ${CURRENT_VERSION.padEnd(52)} ║
|
|
38
|
+
║ Latest version: ${versionCheckResult.latest.padEnd(52)} ║
|
|
39
|
+
║ ║
|
|
40
|
+
║ To update in Cursor: ║
|
|
41
|
+
║ 1. Open a new terminal tab (Cmd/Ctrl + Shift + \`) ║
|
|
42
|
+
║ 2. Run: npm install -g ${PACKAGE_NAME}@latest ║
|
|
43
|
+
║ 3. Restart Cursor to use the updated MCP server ║
|
|
44
|
+
║ ║
|
|
45
|
+
║ ⚠️ Using outdated version may cause unexpected issues! ║
|
|
46
|
+
╚════════════════════════════════════════════════════════════════════╝
|
|
47
|
+
`;
|
|
48
|
+
|
|
49
|
+
// Prepend update message to the response
|
|
50
|
+
if (response.content && response.content[0] && response.content[0].type === 'text') {
|
|
51
|
+
const originalText = response.content[0].text;
|
|
52
|
+
response.content[0].text = updateMessage + "\n" + originalText;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return response;
|
|
56
|
+
}
|
|
57
|
+
|
|
28
58
|
// Helper to check for updates
|
|
29
59
|
async function checkForUpdates() {
|
|
30
60
|
try {
|
|
@@ -1176,166 +1206,222 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
1176
1206
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
1177
1207
|
const { name, arguments: args } = request.params;
|
|
1178
1208
|
|
|
1209
|
+
let response;
|
|
1179
1210
|
switch (name) {
|
|
1180
1211
|
case 'mlgym_git_configure':
|
|
1181
|
-
|
|
1212
|
+
response = await configureGit(args);
|
|
1213
|
+
break;
|
|
1182
1214
|
|
|
1183
1215
|
case 'mlgym_debug_last_error':
|
|
1184
|
-
|
|
1216
|
+
response = await debugLastError(args);
|
|
1217
|
+
break;
|
|
1185
1218
|
|
|
1186
1219
|
case 'mlgym_debug_status':
|
|
1187
|
-
|
|
1220
|
+
response = await debugStatus(args);
|
|
1221
|
+
break;
|
|
1188
1222
|
|
|
1189
1223
|
case 'mlgym_debug_logs':
|
|
1190
|
-
|
|
1224
|
+
response = await debugLogs(args);
|
|
1225
|
+
break;
|
|
1191
1226
|
|
|
1192
1227
|
case 'mlgym_debug_deployment':
|
|
1193
|
-
|
|
1228
|
+
response = await debugDeployment(args);
|
|
1229
|
+
break;
|
|
1194
1230
|
|
|
1195
1231
|
case 'mlgym_version_check':
|
|
1196
|
-
|
|
1232
|
+
response = await versionCheck(args);
|
|
1233
|
+
break;
|
|
1197
1234
|
|
|
1198
1235
|
case 'mlgym_auth_check':
|
|
1199
|
-
|
|
1236
|
+
response = await checkUserExists(args);
|
|
1237
|
+
break;
|
|
1200
1238
|
|
|
1201
1239
|
case 'mlgym_user_create':
|
|
1202
|
-
|
|
1240
|
+
response = await createUser(args);
|
|
1241
|
+
break;
|
|
1203
1242
|
|
|
1204
1243
|
case 'mlgym_project_init':
|
|
1205
|
-
|
|
1244
|
+
response = await initProject(args);
|
|
1245
|
+
break;
|
|
1206
1246
|
|
|
1207
1247
|
case 'mlgym_user_recover':
|
|
1208
|
-
|
|
1248
|
+
response = await recoverUser(args);
|
|
1249
|
+
break;
|
|
1209
1250
|
|
|
1210
1251
|
case 'mlgym_auth_login':
|
|
1211
|
-
|
|
1252
|
+
response = await loginUser(args);
|
|
1253
|
+
break;
|
|
1212
1254
|
|
|
1213
1255
|
case 'mlgym_projects_list':
|
|
1214
|
-
|
|
1256
|
+
response = await listProjects(args);
|
|
1257
|
+
break;
|
|
1215
1258
|
|
|
1216
1259
|
case 'mlgym_deployments_trigger':
|
|
1217
|
-
|
|
1260
|
+
response = await triggerDeployment(args);
|
|
1261
|
+
break;
|
|
1218
1262
|
|
|
1219
1263
|
case 'mlgym_deployments_get_status':
|
|
1220
|
-
|
|
1264
|
+
response = await getDeploymentStatus(args);
|
|
1265
|
+
break;
|
|
1221
1266
|
|
|
1222
1267
|
case 'mlgym_auth_get_current_user':
|
|
1223
|
-
|
|
1268
|
+
response = await getCurrentUser(args);
|
|
1269
|
+
break;
|
|
1224
1270
|
|
|
1225
1271
|
case 'mlgym_projects_get':
|
|
1226
|
-
|
|
1272
|
+
response = await getProject(args);
|
|
1273
|
+
break;
|
|
1227
1274
|
|
|
1228
1275
|
case 'mlgym_projects_delete':
|
|
1229
|
-
|
|
1276
|
+
response = await deleteProject(args);
|
|
1277
|
+
break;
|
|
1230
1278
|
|
|
1231
1279
|
case 'mlgym_keys_list':
|
|
1232
|
-
|
|
1280
|
+
response = await listKeys(args);
|
|
1281
|
+
break;
|
|
1233
1282
|
|
|
1234
1283
|
case 'mlgym_projects_update':
|
|
1235
|
-
|
|
1284
|
+
response = await updateProject(args);
|
|
1285
|
+
break;
|
|
1236
1286
|
|
|
1237
1287
|
case 'mlgym_deployments_list':
|
|
1238
|
-
|
|
1288
|
+
response = await listDeployments(args);
|
|
1289
|
+
break;
|
|
1239
1290
|
|
|
1240
1291
|
case 'mlgym_deployments_get_logs':
|
|
1241
|
-
|
|
1292
|
+
response = await getDeploymentLogs(args);
|
|
1293
|
+
break;
|
|
1242
1294
|
|
|
1243
1295
|
case 'mlgym_keys_add':
|
|
1244
|
-
|
|
1296
|
+
response = await addKey(args);
|
|
1297
|
+
break;
|
|
1245
1298
|
|
|
1246
1299
|
case 'mlgym_keys_delete':
|
|
1247
|
-
|
|
1300
|
+
response = await deleteKey(args);
|
|
1301
|
+
break;
|
|
1248
1302
|
|
|
1249
1303
|
case 'mlgym_regions_list':
|
|
1250
|
-
|
|
1304
|
+
response = await listRegions(args);
|
|
1305
|
+
break;
|
|
1251
1306
|
|
|
1252
1307
|
case 'mlgym_regions_get_status':
|
|
1253
|
-
|
|
1308
|
+
response = await getRegionStatus(args);
|
|
1309
|
+
break;
|
|
1254
1310
|
|
|
1255
1311
|
case 'mlgym_pools_list':
|
|
1256
|
-
|
|
1312
|
+
response = await listPools(args);
|
|
1313
|
+
break;
|
|
1257
1314
|
|
|
1258
1315
|
case 'mlgym_pools_get_stats':
|
|
1259
|
-
|
|
1316
|
+
response = await getPoolStats(args);
|
|
1317
|
+
break;
|
|
1260
1318
|
|
|
1261
1319
|
case 'mlgym_pools_select_optimal':
|
|
1262
|
-
|
|
1320
|
+
response = await selectOptimalPool(args);
|
|
1321
|
+
break;
|
|
1263
1322
|
|
|
1264
1323
|
case 'mlgym_regions_select_isp':
|
|
1265
|
-
|
|
1324
|
+
response = await selectISP(args);
|
|
1325
|
+
break;
|
|
1266
1326
|
|
|
1267
1327
|
case 'mlgym_health_get_report':
|
|
1268
|
-
|
|
1328
|
+
response = await getHealthReport(args);
|
|
1329
|
+
break;
|
|
1269
1330
|
|
|
1270
1331
|
case 'mlgym_health_check_pool':
|
|
1271
|
-
|
|
1332
|
+
response = await checkPoolHealth(args);
|
|
1333
|
+
break;
|
|
1272
1334
|
|
|
1273
1335
|
case 'mlgym_health_check_node':
|
|
1274
|
-
|
|
1336
|
+
response = await checkNodeHealth(args);
|
|
1337
|
+
break;
|
|
1275
1338
|
|
|
1276
1339
|
case 'mlgym_metrics_get_deployment_metrics':
|
|
1277
|
-
|
|
1340
|
+
response = await getDeploymentMetrics(args);
|
|
1341
|
+
break;
|
|
1278
1342
|
|
|
1279
1343
|
case 'mlgym_metrics_get_pool_utilization':
|
|
1280
|
-
|
|
1344
|
+
response = await getPoolUtilization(args);
|
|
1345
|
+
break;
|
|
1281
1346
|
|
|
1282
1347
|
case 'mlgym_git_get_remote_url':
|
|
1283
|
-
|
|
1348
|
+
response = await getGitRemoteUrl(args);
|
|
1349
|
+
break;
|
|
1284
1350
|
|
|
1285
1351
|
case 'mlgym_git_setup_push':
|
|
1286
|
-
|
|
1352
|
+
response = await setupGitPush(args);
|
|
1353
|
+
break;
|
|
1287
1354
|
|
|
1288
1355
|
case 'mlgym_git_get_clone_command':
|
|
1289
|
-
|
|
1356
|
+
response = await getGitCloneCommand(args);
|
|
1357
|
+
break;
|
|
1290
1358
|
|
|
1291
1359
|
case 'mlgym_deployments_rollback':
|
|
1292
|
-
|
|
1360
|
+
response = await rollbackDeployment(args);
|
|
1361
|
+
break;
|
|
1293
1362
|
|
|
1294
1363
|
case 'mlgym_deployments_scale':
|
|
1295
|
-
|
|
1364
|
+
response = await scaleDeployment(args);
|
|
1365
|
+
break;
|
|
1296
1366
|
|
|
1297
1367
|
case 'mlgym_auth_logout':
|
|
1298
|
-
|
|
1368
|
+
response = await logoutUser(args);
|
|
1369
|
+
break;
|
|
1299
1370
|
|
|
1300
1371
|
case 'mlgym_auth_refresh_token':
|
|
1301
|
-
|
|
1372
|
+
response = await refreshToken(args);
|
|
1373
|
+
break;
|
|
1302
1374
|
|
|
1303
1375
|
case 'mlgym_auth_login_to_isp':
|
|
1304
|
-
|
|
1376
|
+
response = await loginToISP(args);
|
|
1377
|
+
break;
|
|
1305
1378
|
|
|
1306
1379
|
case 'mlgym_keys_generate_pair':
|
|
1307
|
-
|
|
1380
|
+
response = await generateKeyPair(args);
|
|
1381
|
+
break;
|
|
1308
1382
|
|
|
1309
1383
|
case 'mlgym_config_set_environment':
|
|
1310
|
-
|
|
1384
|
+
response = await setEnvironment(args);
|
|
1385
|
+
break;
|
|
1311
1386
|
|
|
1312
1387
|
case 'mlgym_config_get_endpoints':
|
|
1313
|
-
|
|
1388
|
+
response = await getEndpoints(args);
|
|
1389
|
+
break;
|
|
1314
1390
|
|
|
1315
1391
|
case 'mlgym_config_set_default_pool':
|
|
1316
|
-
|
|
1392
|
+
response = await setDefaultPool(args);
|
|
1393
|
+
break;
|
|
1317
1394
|
|
|
1318
1395
|
case 'mlgym_webhooks_setup':
|
|
1319
|
-
|
|
1396
|
+
response = await setupWebhook(args);
|
|
1397
|
+
break;
|
|
1320
1398
|
|
|
1321
1399
|
case 'mlgym_webhooks_test':
|
|
1322
|
-
|
|
1400
|
+
response = await testWebhook(args);
|
|
1401
|
+
break;
|
|
1323
1402
|
|
|
1324
1403
|
case 'mlgym_webhooks_get_logs':
|
|
1325
|
-
|
|
1404
|
+
response = await getWebhookLogs(args);
|
|
1405
|
+
break;
|
|
1326
1406
|
|
|
1327
1407
|
case 'mlgym_federation_get_status':
|
|
1328
|
-
|
|
1408
|
+
response = await getFederationStatus(args);
|
|
1409
|
+
break;
|
|
1329
1410
|
|
|
1330
1411
|
case 'mlgym_federation_list_peers':
|
|
1331
|
-
|
|
1412
|
+
response = await listFederationPeers(args);
|
|
1413
|
+
break;
|
|
1332
1414
|
|
|
1333
1415
|
case 'mlgym_federation_replicate_project':
|
|
1334
|
-
|
|
1416
|
+
response = await replicateProject(args);
|
|
1417
|
+
break;
|
|
1335
1418
|
|
|
1336
1419
|
default:
|
|
1337
1420
|
throw new Error(`Unknown tool: ${name}`);
|
|
1338
1421
|
}
|
|
1422
|
+
|
|
1423
|
+
// Wrap response with update message if an update is available
|
|
1424
|
+
return wrapResponseWithUpdateMessage(response);
|
|
1339
1425
|
});
|
|
1340
1426
|
|
|
1341
1427
|
// Helper to generate SSH key pair
|
|
@@ -6327,33 +6413,14 @@ async function replicateProject(args) {
|
|
|
6327
6413
|
|
|
6328
6414
|
// Start the server
|
|
6329
6415
|
async function main() {
|
|
6330
|
-
// Check for updates BEFORE starting the server
|
|
6331
|
-
const updateCheck = await checkForUpdates();
|
|
6332
|
-
|
|
6333
|
-
if (updateCheck.updateAvailable) {
|
|
6334
|
-
// Block execution and show update required message
|
|
6335
|
-
console.error(`\n╔════════════════════════════════════════════════════════════════════╗`);
|
|
6336
|
-
console.error(`║ 🚫 UPDATE REQUIRED 🚫 ║`);
|
|
6337
|
-
console.error(`║ ║`);
|
|
6338
|
-
console.error(`║ The MLGym MCP Server is out of date and cannot run. ║`);
|
|
6339
|
-
console.error(`║ ║`);
|
|
6340
|
-
console.error(`║ Current version: ${CURRENT_VERSION.padEnd(52)} ║`);
|
|
6341
|
-
console.error(`║ Required version: ${updateCheck.latest.padEnd(51)} ║`);
|
|
6342
|
-
console.error(`║ ║`);
|
|
6343
|
-
console.error(`║ Please update before continuing: ║`);
|
|
6344
|
-
console.error(`║ ║`);
|
|
6345
|
-
console.error(`║ npm install -g ${PACKAGE_NAME}@latest ║`);
|
|
6346
|
-
console.error(`║ ║`);
|
|
6347
|
-
console.error(`║ Then restart your IDE or MCP client. ║`);
|
|
6348
|
-
console.error(`╚════════════════════════════════════════════════════════════════════════╝\n`);
|
|
6349
|
-
|
|
6350
|
-
// Exit with error code to prevent MCP from starting
|
|
6351
|
-
process.exit(1);
|
|
6352
|
-
}
|
|
6353
|
-
|
|
6354
6416
|
const transport = new StdioServerTransport();
|
|
6355
6417
|
await server.connect(transport);
|
|
6356
6418
|
console.error(`GitLab Backend MCP Server v${CURRENT_VERSION} started`);
|
|
6419
|
+
|
|
6420
|
+
// Check for updates in the background
|
|
6421
|
+
setTimeout(async () => {
|
|
6422
|
+
await checkForUpdates();
|
|
6423
|
+
}, 1000);
|
|
6357
6424
|
}
|
|
6358
6425
|
|
|
6359
6426
|
main().catch((error) => {
|