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.
Files changed (2) hide show
  1. package/index.js +144 -77
  2. 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.1';
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
- return await configureGit(args);
1212
+ response = await configureGit(args);
1213
+ break;
1182
1214
 
1183
1215
  case 'mlgym_debug_last_error':
1184
- return await debugLastError(args);
1216
+ response = await debugLastError(args);
1217
+ break;
1185
1218
 
1186
1219
  case 'mlgym_debug_status':
1187
- return await debugStatus(args);
1220
+ response = await debugStatus(args);
1221
+ break;
1188
1222
 
1189
1223
  case 'mlgym_debug_logs':
1190
- return await debugLogs(args);
1224
+ response = await debugLogs(args);
1225
+ break;
1191
1226
 
1192
1227
  case 'mlgym_debug_deployment':
1193
- return await debugDeployment(args);
1228
+ response = await debugDeployment(args);
1229
+ break;
1194
1230
 
1195
1231
  case 'mlgym_version_check':
1196
- return await versionCheck(args);
1232
+ response = await versionCheck(args);
1233
+ break;
1197
1234
 
1198
1235
  case 'mlgym_auth_check':
1199
- return await checkUserExists(args);
1236
+ response = await checkUserExists(args);
1237
+ break;
1200
1238
 
1201
1239
  case 'mlgym_user_create':
1202
- return await createUser(args);
1240
+ response = await createUser(args);
1241
+ break;
1203
1242
 
1204
1243
  case 'mlgym_project_init':
1205
- return await initProject(args);
1244
+ response = await initProject(args);
1245
+ break;
1206
1246
 
1207
1247
  case 'mlgym_user_recover':
1208
- return await recoverUser(args);
1248
+ response = await recoverUser(args);
1249
+ break;
1209
1250
 
1210
1251
  case 'mlgym_auth_login':
1211
- return await loginUser(args);
1252
+ response = await loginUser(args);
1253
+ break;
1212
1254
 
1213
1255
  case 'mlgym_projects_list':
1214
- return await listProjects(args);
1256
+ response = await listProjects(args);
1257
+ break;
1215
1258
 
1216
1259
  case 'mlgym_deployments_trigger':
1217
- return await triggerDeployment(args);
1260
+ response = await triggerDeployment(args);
1261
+ break;
1218
1262
 
1219
1263
  case 'mlgym_deployments_get_status':
1220
- return await getDeploymentStatus(args);
1264
+ response = await getDeploymentStatus(args);
1265
+ break;
1221
1266
 
1222
1267
  case 'mlgym_auth_get_current_user':
1223
- return await getCurrentUser(args);
1268
+ response = await getCurrentUser(args);
1269
+ break;
1224
1270
 
1225
1271
  case 'mlgym_projects_get':
1226
- return await getProject(args);
1272
+ response = await getProject(args);
1273
+ break;
1227
1274
 
1228
1275
  case 'mlgym_projects_delete':
1229
- return await deleteProject(args);
1276
+ response = await deleteProject(args);
1277
+ break;
1230
1278
 
1231
1279
  case 'mlgym_keys_list':
1232
- return await listKeys(args);
1280
+ response = await listKeys(args);
1281
+ break;
1233
1282
 
1234
1283
  case 'mlgym_projects_update':
1235
- return await updateProject(args);
1284
+ response = await updateProject(args);
1285
+ break;
1236
1286
 
1237
1287
  case 'mlgym_deployments_list':
1238
- return await listDeployments(args);
1288
+ response = await listDeployments(args);
1289
+ break;
1239
1290
 
1240
1291
  case 'mlgym_deployments_get_logs':
1241
- return await getDeploymentLogs(args);
1292
+ response = await getDeploymentLogs(args);
1293
+ break;
1242
1294
 
1243
1295
  case 'mlgym_keys_add':
1244
- return await addKey(args);
1296
+ response = await addKey(args);
1297
+ break;
1245
1298
 
1246
1299
  case 'mlgym_keys_delete':
1247
- return await deleteKey(args);
1300
+ response = await deleteKey(args);
1301
+ break;
1248
1302
 
1249
1303
  case 'mlgym_regions_list':
1250
- return await listRegions(args);
1304
+ response = await listRegions(args);
1305
+ break;
1251
1306
 
1252
1307
  case 'mlgym_regions_get_status':
1253
- return await getRegionStatus(args);
1308
+ response = await getRegionStatus(args);
1309
+ break;
1254
1310
 
1255
1311
  case 'mlgym_pools_list':
1256
- return await listPools(args);
1312
+ response = await listPools(args);
1313
+ break;
1257
1314
 
1258
1315
  case 'mlgym_pools_get_stats':
1259
- return await getPoolStats(args);
1316
+ response = await getPoolStats(args);
1317
+ break;
1260
1318
 
1261
1319
  case 'mlgym_pools_select_optimal':
1262
- return await selectOptimalPool(args);
1320
+ response = await selectOptimalPool(args);
1321
+ break;
1263
1322
 
1264
1323
  case 'mlgym_regions_select_isp':
1265
- return await selectISP(args);
1324
+ response = await selectISP(args);
1325
+ break;
1266
1326
 
1267
1327
  case 'mlgym_health_get_report':
1268
- return await getHealthReport(args);
1328
+ response = await getHealthReport(args);
1329
+ break;
1269
1330
 
1270
1331
  case 'mlgym_health_check_pool':
1271
- return await checkPoolHealth(args);
1332
+ response = await checkPoolHealth(args);
1333
+ break;
1272
1334
 
1273
1335
  case 'mlgym_health_check_node':
1274
- return await checkNodeHealth(args);
1336
+ response = await checkNodeHealth(args);
1337
+ break;
1275
1338
 
1276
1339
  case 'mlgym_metrics_get_deployment_metrics':
1277
- return await getDeploymentMetrics(args);
1340
+ response = await getDeploymentMetrics(args);
1341
+ break;
1278
1342
 
1279
1343
  case 'mlgym_metrics_get_pool_utilization':
1280
- return await getPoolUtilization(args);
1344
+ response = await getPoolUtilization(args);
1345
+ break;
1281
1346
 
1282
1347
  case 'mlgym_git_get_remote_url':
1283
- return await getGitRemoteUrl(args);
1348
+ response = await getGitRemoteUrl(args);
1349
+ break;
1284
1350
 
1285
1351
  case 'mlgym_git_setup_push':
1286
- return await setupGitPush(args);
1352
+ response = await setupGitPush(args);
1353
+ break;
1287
1354
 
1288
1355
  case 'mlgym_git_get_clone_command':
1289
- return await getGitCloneCommand(args);
1356
+ response = await getGitCloneCommand(args);
1357
+ break;
1290
1358
 
1291
1359
  case 'mlgym_deployments_rollback':
1292
- return await rollbackDeployment(args);
1360
+ response = await rollbackDeployment(args);
1361
+ break;
1293
1362
 
1294
1363
  case 'mlgym_deployments_scale':
1295
- return await scaleDeployment(args);
1364
+ response = await scaleDeployment(args);
1365
+ break;
1296
1366
 
1297
1367
  case 'mlgym_auth_logout':
1298
- return await logoutUser(args);
1368
+ response = await logoutUser(args);
1369
+ break;
1299
1370
 
1300
1371
  case 'mlgym_auth_refresh_token':
1301
- return await refreshToken(args);
1372
+ response = await refreshToken(args);
1373
+ break;
1302
1374
 
1303
1375
  case 'mlgym_auth_login_to_isp':
1304
- return await loginToISP(args);
1376
+ response = await loginToISP(args);
1377
+ break;
1305
1378
 
1306
1379
  case 'mlgym_keys_generate_pair':
1307
- return await generateKeyPair(args);
1380
+ response = await generateKeyPair(args);
1381
+ break;
1308
1382
 
1309
1383
  case 'mlgym_config_set_environment':
1310
- return await setEnvironment(args);
1384
+ response = await setEnvironment(args);
1385
+ break;
1311
1386
 
1312
1387
  case 'mlgym_config_get_endpoints':
1313
- return await getEndpoints(args);
1388
+ response = await getEndpoints(args);
1389
+ break;
1314
1390
 
1315
1391
  case 'mlgym_config_set_default_pool':
1316
- return await setDefaultPool(args);
1392
+ response = await setDefaultPool(args);
1393
+ break;
1317
1394
 
1318
1395
  case 'mlgym_webhooks_setup':
1319
- return await setupWebhook(args);
1396
+ response = await setupWebhook(args);
1397
+ break;
1320
1398
 
1321
1399
  case 'mlgym_webhooks_test':
1322
- return await testWebhook(args);
1400
+ response = await testWebhook(args);
1401
+ break;
1323
1402
 
1324
1403
  case 'mlgym_webhooks_get_logs':
1325
- return await getWebhookLogs(args);
1404
+ response = await getWebhookLogs(args);
1405
+ break;
1326
1406
 
1327
1407
  case 'mlgym_federation_get_status':
1328
- return await getFederationStatus(args);
1408
+ response = await getFederationStatus(args);
1409
+ break;
1329
1410
 
1330
1411
  case 'mlgym_federation_list_peers':
1331
- return await listFederationPeers(args);
1412
+ response = await listFederationPeers(args);
1413
+ break;
1332
1414
 
1333
1415
  case 'mlgym_federation_replicate_project':
1334
- return await replicateProject(args);
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) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mlgym-deploy",
3
- "version": "2.3.1",
3
+ "version": "2.3.3",
4
4
  "description": "MCP server for GitLab Backend - User creation and project deployment",
5
5
  "main": "index.js",
6
6
  "type": "module",