@justanothermldude/mcp-exec 1.3.1 → 1.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/dist/bridge/port-cleanup.d.ts +2 -2
- package/dist/bridge/port-cleanup.d.ts.map +1 -1
- package/dist/bridge/port-cleanup.js +6 -5
- package/dist/bridge/port-cleanup.js.map +1 -1
- package/dist/index.js +59 -7
- package/dist/index.js.map +1 -1
- package/dist/server.js +3 -3
- package/dist/server.js.map +1 -1
- package/dist/tools/execute-with-wrappers.d.ts +5 -2
- package/dist/tools/execute-with-wrappers.d.ts.map +1 -1
- package/dist/tools/execute-with-wrappers.js +67 -4
- package/dist/tools/execute-with-wrappers.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Attempt to clean up stale mcp-exec processes on a specific port
|
|
3
|
-
*
|
|
2
|
+
* Attempt to clean up stale mcp-exec processes on a specific port.
|
|
3
|
+
* Kills processes that match mcp-exec/meta-mcp in their command line OR are orphaned (PPID=1).
|
|
4
4
|
*
|
|
5
5
|
* @param port - Port number to check for stale processes
|
|
6
6
|
* @returns true if any processes were killed, false otherwise
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port-cleanup.d.ts","sourceRoot":"","sources":["../../src/bridge/port-cleanup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"port-cleanup.d.ts","sourceRoot":"","sources":["../../src/bridge/port-cleanup.ts"],"names":[],"mappings":"AAoCA;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBxE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Port cleanup utilities for handling stale mcp-exec processes
|
|
2
|
+
* Port cleanup utilities for handling stale mcp-exec processes on the bridge port.
|
|
3
|
+
* Orphan process cleanup (PPID=1) is handled by cleanupOrphanedProcesses in core.
|
|
3
4
|
*/
|
|
4
5
|
import { execSync } from 'child_process';
|
|
6
|
+
import { isOrphanedProcess } from '@justanothermldude/meta-mcp-core';
|
|
5
7
|
/**
|
|
6
8
|
* Check if a process is an mcp-exec process by examining its command line
|
|
7
9
|
*/
|
|
@@ -33,8 +35,8 @@ function getProcessesOnPort(port) {
|
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
/**
|
|
36
|
-
* Attempt to clean up stale mcp-exec processes on a specific port
|
|
37
|
-
*
|
|
38
|
+
* Attempt to clean up stale mcp-exec processes on a specific port.
|
|
39
|
+
* Kills processes that match mcp-exec/meta-mcp in their command line OR are orphaned (PPID=1).
|
|
38
40
|
*
|
|
39
41
|
* @param port - Port number to check for stale processes
|
|
40
42
|
* @returns true if any processes were killed, false otherwise
|
|
@@ -45,7 +47,7 @@ export async function cleanupStaleProcess(port) {
|
|
|
45
47
|
return false;
|
|
46
48
|
let killedAny = false;
|
|
47
49
|
for (const pid of pids) {
|
|
48
|
-
if (isMcpExecProcess(pid)) {
|
|
50
|
+
if (isMcpExecProcess(pid) || isOrphanedProcess(pid)) {
|
|
49
51
|
try {
|
|
50
52
|
process.kill(pid, 'SIGTERM');
|
|
51
53
|
killedAny = true;
|
|
@@ -56,7 +58,6 @@ export async function cleanupStaleProcess(port) {
|
|
|
56
58
|
}
|
|
57
59
|
}
|
|
58
60
|
if (killedAny) {
|
|
59
|
-
// Give processes time to terminate
|
|
60
61
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
61
62
|
}
|
|
62
63
|
return killedAny;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port-cleanup.js","sourceRoot":"","sources":["../../src/bridge/port-cleanup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"port-cleanup.js","sourceRoot":"","sources":["../../src/bridge/port-cleanup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,GAAG,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClF,OAAO,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1E,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM;aACV,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;aAC/B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC7B,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,kCAAkC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -870,6 +870,7 @@ import { getServerConfig, listServers as listServers2 } from "@justanothermldude
|
|
|
870
870
|
|
|
871
871
|
// dist/bridge/port-cleanup.js
|
|
872
872
|
import { execSync } from "child_process";
|
|
873
|
+
import { isOrphanedProcess } from "@justanothermldude/meta-mcp-core";
|
|
873
874
|
function isMcpExecProcess(pid) {
|
|
874
875
|
try {
|
|
875
876
|
const cmdline = execSync(`ps -p ${pid} -o command=`, { encoding: "utf8" }).trim();
|
|
@@ -896,7 +897,7 @@ async function cleanupStaleProcess(port) {
|
|
|
896
897
|
return false;
|
|
897
898
|
let killedAny = false;
|
|
898
899
|
for (const pid of pids) {
|
|
899
|
-
if (isMcpExecProcess(pid)) {
|
|
900
|
+
if (isMcpExecProcess(pid) || isOrphanedProcess(pid)) {
|
|
900
901
|
try {
|
|
901
902
|
process.kill(pid, "SIGTERM");
|
|
902
903
|
killedAny = true;
|
|
@@ -1269,6 +1270,34 @@ function isExecuteWithWrappersInput(args2) {
|
|
|
1269
1270
|
return typeof args2 === "object" && args2 !== null && "code" in args2 && typeof args2.code === "string" && "wrappers" in args2 && Array.isArray(args2.wrappers) && args2.wrappers.every((w) => typeof w === "string");
|
|
1270
1271
|
}
|
|
1271
1272
|
__name(isExecuteWithWrappersInput, "isExecuteWithWrappersInput");
|
|
1273
|
+
function wrapUserCodeForReturnCapture(code) {
|
|
1274
|
+
const trimmed = code.trimEnd();
|
|
1275
|
+
if (!trimmed)
|
|
1276
|
+
return code;
|
|
1277
|
+
const lines = trimmed.split("\n");
|
|
1278
|
+
let lastIdx = lines.length - 1;
|
|
1279
|
+
while (lastIdx >= 0) {
|
|
1280
|
+
const t = lines[lastIdx].trim();
|
|
1281
|
+
if (t && !t.startsWith("//") && !t.startsWith("*") && !t.startsWith("/*"))
|
|
1282
|
+
break;
|
|
1283
|
+
lastIdx--;
|
|
1284
|
+
}
|
|
1285
|
+
if (lastIdx < 0)
|
|
1286
|
+
return code;
|
|
1287
|
+
const lastTrimmed = lines[lastIdx].trim();
|
|
1288
|
+
const isStatement = /^(const|let|var|function\s|class\s|import\s|export\s|return\b|throw\b|if\s*\(|else\b|for\s*[\({]|while\s*\(|do\s*\{|switch\s*\(|try\s*\{|catch\s*\(|finally\s*\{|break\b|continue\b|;)/.test(lastTrimmed);
|
|
1289
|
+
if (isStatement)
|
|
1290
|
+
return code;
|
|
1291
|
+
const expr = lastTrimmed.replace(/;$/, "");
|
|
1292
|
+
const indent = lines[lastIdx].match(/^(\s*)/)?.[1] ?? "";
|
|
1293
|
+
lines[lastIdx] = `${indent}const __execResult = await Promise.resolve(${expr});
|
|
1294
|
+
${indent}if (__execResult !== undefined) {
|
|
1295
|
+
${indent} const __out = typeof __execResult === 'string' ? __execResult : JSON.stringify(__execResult, null, 2);
|
|
1296
|
+
${indent} process.stdout.write(__out + '\\n');
|
|
1297
|
+
${indent}}`;
|
|
1298
|
+
return lines.join("\n");
|
|
1299
|
+
}
|
|
1300
|
+
__name(wrapUserCodeForReturnCapture, "wrapUserCodeForReturnCapture");
|
|
1272
1301
|
function getMcpPreamble(bridgePort) {
|
|
1273
1302
|
return `
|
|
1274
1303
|
// MCP helper for calling tools via HTTP bridge
|
|
@@ -1298,7 +1327,18 @@ globalThis.mcp = {
|
|
|
1298
1327
|
__name(getMcpPreamble, "getMcpPreamble");
|
|
1299
1328
|
function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
1300
1329
|
const preferredPort = config.bridgeConfig?.port ?? 3e3;
|
|
1301
|
-
|
|
1330
|
+
let activeBridge = null;
|
|
1331
|
+
async function stopActiveBridge() {
|
|
1332
|
+
if (activeBridge?.isRunning()) {
|
|
1333
|
+
try {
|
|
1334
|
+
await activeBridge.stop();
|
|
1335
|
+
} catch {
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
activeBridge = null;
|
|
1339
|
+
}
|
|
1340
|
+
__name(stopActiveBridge, "stopActiveBridge");
|
|
1341
|
+
async function executeWithWrappersHandler(args2) {
|
|
1302
1342
|
const { code, wrappers, timeout_ms = DEFAULT_TIMEOUT_MS } = args2;
|
|
1303
1343
|
if (!code || typeof code !== "string") {
|
|
1304
1344
|
return {
|
|
@@ -1329,6 +1369,7 @@ function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
1329
1369
|
...config.bridgeConfig,
|
|
1330
1370
|
port: preferredPort
|
|
1331
1371
|
});
|
|
1372
|
+
activeBridge = bridge;
|
|
1332
1373
|
try {
|
|
1333
1374
|
await bridge.start();
|
|
1334
1375
|
const actualPort = bridge.getPort();
|
|
@@ -1352,12 +1393,13 @@ function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
1352
1393
|
const generatedWrappers = wrapperModules.join("\n\n");
|
|
1353
1394
|
const mcpDictionary = generateMcpDictionary(wrappers);
|
|
1354
1395
|
const mcpPreamble = getMcpPreamble(actualPort);
|
|
1396
|
+
const instrumentedCode = wrapUserCodeForReturnCapture(code);
|
|
1355
1397
|
const fullCode = `${generatedWrappers}
|
|
1356
1398
|
|
|
1357
1399
|
${mcpDictionary}
|
|
1358
1400
|
|
|
1359
1401
|
${mcpPreamble}
|
|
1360
|
-
${
|
|
1402
|
+
${instrumentedCode}`;
|
|
1361
1403
|
const sandboxConfig = {
|
|
1362
1404
|
...config.sandboxConfig,
|
|
1363
1405
|
mcpBridgePort: actualPort
|
|
@@ -1365,6 +1407,7 @@ ${code}`;
|
|
|
1365
1407
|
const executor = new SandboxExecutor(sandboxConfig);
|
|
1366
1408
|
result = await executor.execute(fullCode, timeout_ms);
|
|
1367
1409
|
await bridge.stop();
|
|
1410
|
+
activeBridge = null;
|
|
1368
1411
|
return formatResult(result);
|
|
1369
1412
|
} catch (error) {
|
|
1370
1413
|
try {
|
|
@@ -1373,10 +1416,13 @@ ${code}`;
|
|
|
1373
1416
|
}
|
|
1374
1417
|
} catch {
|
|
1375
1418
|
}
|
|
1419
|
+
activeBridge = null;
|
|
1376
1420
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1377
1421
|
return formatErrorResult(errorMessage, result);
|
|
1378
1422
|
}
|
|
1379
|
-
}
|
|
1423
|
+
}
|
|
1424
|
+
__name(executeWithWrappersHandler, "executeWithWrappersHandler");
|
|
1425
|
+
return { handler: executeWithWrappersHandler, stopActiveBridge };
|
|
1380
1426
|
}
|
|
1381
1427
|
__name(createExecuteWithWrappersHandler, "createExecuteWithWrappersHandler");
|
|
1382
1428
|
function formatResult(result) {
|
|
@@ -1426,7 +1472,7 @@ function createMcpExecServer(pool, config = {}) {
|
|
|
1426
1472
|
});
|
|
1427
1473
|
const listServersHandler = createListServersHandler();
|
|
1428
1474
|
const getToolSchemaHandler = createGetToolSchemaHandler(pool);
|
|
1429
|
-
const executeWithWrappersHandler = createExecuteWithWrappersHandler(pool, config.handlerConfig);
|
|
1475
|
+
const { handler: executeWithWrappersHandler, stopActiveBridge } = createExecuteWithWrappersHandler(pool, config.handlerConfig);
|
|
1430
1476
|
const tools = [
|
|
1431
1477
|
listAvailableMcpServersTool,
|
|
1432
1478
|
getMcpToolSchemaTool,
|
|
@@ -1487,6 +1533,7 @@ function createMcpExecServer(pool, config = {}) {
|
|
|
1487
1533
|
return callToolRequestHandler(request.params);
|
|
1488
1534
|
});
|
|
1489
1535
|
const shutdown = /* @__PURE__ */ __name(async () => {
|
|
1536
|
+
await stopActiveBridge();
|
|
1490
1537
|
}, "shutdown");
|
|
1491
1538
|
return {
|
|
1492
1539
|
server,
|
|
@@ -1498,9 +1545,9 @@ function createMcpExecServer(pool, config = {}) {
|
|
|
1498
1545
|
__name(createMcpExecServer, "createMcpExecServer");
|
|
1499
1546
|
|
|
1500
1547
|
// dist/index.js
|
|
1501
|
-
import { ServerPool, createConnection, getServerConfig as getServerConfig2, loadServerManifest as loadServerManifest2 } from "@justanothermldude/meta-mcp-core";
|
|
1548
|
+
import { ServerPool, createConnection, getServerConfig as getServerConfig2, loadServerManifest as loadServerManifest2, cleanupOrphanedProcesses } from "@justanothermldude/meta-mcp-core";
|
|
1502
1549
|
var APP_NAME = "mcp-exec";
|
|
1503
|
-
var VERSION2 = "1.3.
|
|
1550
|
+
var VERSION2 = "1.3.3";
|
|
1504
1551
|
var defaultExecutor = null;
|
|
1505
1552
|
function getDefaultExecutor() {
|
|
1506
1553
|
if (!defaultExecutor) {
|
|
@@ -1542,6 +1589,11 @@ Environment:
|
|
|
1542
1589
|
process.exit(0);
|
|
1543
1590
|
}
|
|
1544
1591
|
async function main() {
|
|
1592
|
+
const killed = await cleanupOrphanedProcesses("mcp-exec");
|
|
1593
|
+
if (killed > 0) {
|
|
1594
|
+
process.stderr.write(`Cleaned up ${killed} orphaned mcp-exec process(es)
|
|
1595
|
+
`);
|
|
1596
|
+
}
|
|
1545
1597
|
const configPath = process.env.SERVERS_CONFIG;
|
|
1546
1598
|
if (configPath) {
|
|
1547
1599
|
process.stderr.write(`Loading config from: ${configPath}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE/I,eAAe;AACf,cAAc,kBAAkB,CAAC;AAEjC,wBAAwB;AACxB,cAAc,oBAAoB,CAAC;AAEnC,wBAAwB;AACxB,cAAc,oBAAoB,CAAC;AAEnC,uBAAuB;AACvB,cAAc,mBAAmB,CAAC;AAElC,sBAAsB;AACtB,cAAc,kBAAkB,CAAC;AAEjC,uBAAuB;AACvB,OAAO,EAAE,mBAAmB,EAA4B,MAAM,aAAa,CAAC;AAM5E,OAAO,EAAE,eAAe,EAA8B,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AACnC,MAAM,CAAC,MAAM,OAAO,GAAG,sBAAsB,CAAC;AAE9C,iDAAiD;AACjD,IAAI,eAAe,GAA2B,IAAI,CAAC;AAEnD;;GAEG;AACH,SAAS,kBAAkB;IACzB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAuB;IACvD,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,kBAAkB,EAAE,GAAG,KAAK,CAAC;IACxD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAA8B;IAC3D,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,oCAAoC;AACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,KAAK,OAAO;;;;;;;;;;;;;CAapC,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,qFAAqF;IACrF,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,kCAAkC,CAAC,CAAC;IAC/E,CAAC;IAED,yBAAyB;IACzB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC9C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,UAAU,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,+DAA+D;IAC/D,kBAAkB,EAAE,CAAC;IAErB,sDAAsD;IACtD,MAAM,iBAAiB,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;QACnD,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,gBAAgB,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YACrD,WAAW,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;SACtC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,kBAAkB;IAClB,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAE/C,gBAAgB;IAChB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAEvD,6BAA6B;IAC7B,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAChC,IAAI,cAAc;YAAE,OAAO,CAAC,qCAAqC;QACjE,cAAc,GAAG,IAAI,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC3C,MAAM,QAAQ,EAAE,CAAC;QACjB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAEtC,iEAAiE;IACjE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACxC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAE1C,oBAAoB;IACpB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;AAC7D,CAAC;AAED,2EAA2E;AAC3E,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AACpG,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;IAClD,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -27,7 +27,7 @@ export function createMcpExecServer(pool, config = {}) {
|
|
|
27
27
|
// Create the get_mcp_tool_schema handler with the pool
|
|
28
28
|
const getToolSchemaHandler = createGetToolSchemaHandler(pool);
|
|
29
29
|
// Create the execute_code_with_wrappers handler with the pool
|
|
30
|
-
const executeWithWrappersHandler = createExecuteWithWrappersHandler(pool, config.handlerConfig);
|
|
30
|
+
const { handler: executeWithWrappersHandler, stopActiveBridge } = createExecuteWithWrappersHandler(pool, config.handlerConfig);
|
|
31
31
|
// Register all tools
|
|
32
32
|
const tools = [
|
|
33
33
|
listAvailableMcpServersTool,
|
|
@@ -89,8 +89,8 @@ export function createMcpExecServer(pool, config = {}) {
|
|
|
89
89
|
return callToolRequestHandler(request.params);
|
|
90
90
|
});
|
|
91
91
|
const shutdown = async () => {
|
|
92
|
-
//
|
|
93
|
-
|
|
92
|
+
// Stop any in-flight bridge so it doesn't keep the event loop alive
|
|
93
|
+
await stopActiveBridge();
|
|
94
94
|
};
|
|
95
95
|
return {
|
|
96
96
|
server,
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAGvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,2BAA2B,EAC3B,gCAAgC,EAChC,0BAA0B,GAE3B,MAAM,kBAAkB,CAAC;AAE1B,MAAM,OAAO,GAAG,OAAO,CAAC;AAYxB;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAgB,EAAE,SAA8B,EAAE;IACpF,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,gDAAgD;IAChD,MAAM,kBAAkB,GAAG,wBAAwB,EAAE,CAAC;IAEtD,uDAAuD;IACvD,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAE9D,8DAA8D;IAC9D,MAAM,0BAA0B,GAAG,gCAAgC,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,7 +76,10 @@ export declare function isExecuteWithWrappersInput(args: unknown): args is Execu
|
|
|
76
76
|
*
|
|
77
77
|
* @param pool - Server pool for MCP connections
|
|
78
78
|
* @param config - Optional handler configuration
|
|
79
|
-
* @returns
|
|
79
|
+
* @returns Object with handler function and stopActiveBridge for graceful shutdown
|
|
80
80
|
*/
|
|
81
|
-
export declare function createExecuteWithWrappersHandler(pool: ServerPool, config?: ExecuteWithWrappersHandlerConfig):
|
|
81
|
+
export declare function createExecuteWithWrappersHandler(pool: ServerPool, config?: ExecuteWithWrappersHandlerConfig): {
|
|
82
|
+
handler: (args: ExecuteWithWrappersInput) => Promise<CallToolResult>;
|
|
83
|
+
stopActiveBridge: () => Promise<void>;
|
|
84
|
+
};
|
|
82
85
|
//# sourceMappingURL=execute-with-wrappers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-with-wrappers.d.ts","sourceRoot":"","sources":["../../src/tools/execute-with-wrappers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;CAyBvC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,6CAA6C;IAC7C,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,uCAAuC;IACvC,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,wBAAwB,CAU1F;
|
|
1
|
+
{"version":3,"file":"execute-with-wrappers.d.ts","sourceRoot":"","sources":["../../src/tools/execute-with-wrappers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;CAyBvC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,6CAA6C;IAC7C,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,uCAAuC;IACvC,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,wBAAwB,CAU1F;AAgFD;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,UAAU,EAChB,MAAM,GAAE,gCAAqC;oBA0BrC,wBAAwB,KAC7B,OAAO,CAAC,cAAc,CAAC;4BAhBS,OAAO,CAAC,IAAI,CAAC;EAkIjD"}
|
|
@@ -42,6 +42,48 @@ export function isExecuteWithWrappersInput(args) {
|
|
|
42
42
|
Array.isArray(args.wrappers) &&
|
|
43
43
|
args.wrappers.every((w) => typeof w === 'string'));
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* REPL-like return value capture: if the last expression of userCode is a bare
|
|
47
|
+
* expression statement (not a declaration or control-flow keyword), transform it
|
|
48
|
+
* to an async IIFE that returns that expression and prints the result.
|
|
49
|
+
*
|
|
50
|
+
* Handles common cases:
|
|
51
|
+
* `42` → prints 42
|
|
52
|
+
* `someVar` → prints value of someVar
|
|
53
|
+
* `await mcp.callTool(...)` → prints result
|
|
54
|
+
*
|
|
55
|
+
* Skips if last statement starts with const/let/var/function/class/return/throw/if/for/…
|
|
56
|
+
*/
|
|
57
|
+
function wrapUserCodeForReturnCapture(code) {
|
|
58
|
+
const trimmed = code.trimEnd();
|
|
59
|
+
if (!trimmed)
|
|
60
|
+
return code;
|
|
61
|
+
const lines = trimmed.split('\n');
|
|
62
|
+
let lastIdx = lines.length - 1;
|
|
63
|
+
// Find last non-empty, non-comment line
|
|
64
|
+
while (lastIdx >= 0) {
|
|
65
|
+
const t = lines[lastIdx].trim();
|
|
66
|
+
if (t && !t.startsWith('//') && !t.startsWith('*') && !t.startsWith('/*'))
|
|
67
|
+
break;
|
|
68
|
+
lastIdx--;
|
|
69
|
+
}
|
|
70
|
+
if (lastIdx < 0)
|
|
71
|
+
return code;
|
|
72
|
+
const lastTrimmed = lines[lastIdx].trim();
|
|
73
|
+
// Skip if it's a statement keyword, declaration, or already a return
|
|
74
|
+
const isStatement = /^(const|let|var|function\s|class\s|import\s|export\s|return\b|throw\b|if\s*\(|else\b|for\s*[\({]|while\s*\(|do\s*\{|switch\s*\(|try\s*\{|catch\s*\(|finally\s*\{|break\b|continue\b|;)/.test(lastTrimmed);
|
|
75
|
+
if (isStatement)
|
|
76
|
+
return code;
|
|
77
|
+
// Strip trailing semicolon from the last expression before wrapping
|
|
78
|
+
const expr = lastTrimmed.replace(/;$/, '');
|
|
79
|
+
const indent = lines[lastIdx].match(/^(\s*)/)?.[1] ?? '';
|
|
80
|
+
lines[lastIdx] = `${indent}const __execResult = await Promise.resolve(${expr});
|
|
81
|
+
${indent}if (__execResult !== undefined) {
|
|
82
|
+
${indent} const __out = typeof __execResult === 'string' ? __execResult : JSON.stringify(__execResult, null, 2);
|
|
83
|
+
${indent} process.stdout.write(__out + '\\n');
|
|
84
|
+
${indent}}`;
|
|
85
|
+
return lines.join('\n');
|
|
86
|
+
}
|
|
45
87
|
/**
|
|
46
88
|
* Generate the MCP helper preamble that provides the global `mcp` object
|
|
47
89
|
* for calling MCP tools via the HTTP bridge
|
|
@@ -77,15 +119,31 @@ globalThis.mcp = {
|
|
|
77
119
|
*
|
|
78
120
|
* @param pool - Server pool for MCP connections
|
|
79
121
|
* @param config - Optional handler configuration
|
|
80
|
-
* @returns
|
|
122
|
+
* @returns Object with handler function and stopActiveBridge for graceful shutdown
|
|
81
123
|
*/
|
|
82
124
|
export function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
83
125
|
// Preferred port (actual port determined at runtime via dynamic allocation)
|
|
84
126
|
const preferredPort = config.bridgeConfig?.port ?? 3000;
|
|
127
|
+
// Track the bridge that is currently running (at most one per handler instance)
|
|
128
|
+
let activeBridge = null;
|
|
129
|
+
/**
|
|
130
|
+
* Stop the currently active bridge, if any. Called during graceful shutdown.
|
|
131
|
+
*/
|
|
132
|
+
async function stopActiveBridge() {
|
|
133
|
+
if (activeBridge?.isRunning()) {
|
|
134
|
+
try {
|
|
135
|
+
await activeBridge.stop();
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Ignore — process is shutting down anyway
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
activeBridge = null;
|
|
142
|
+
}
|
|
85
143
|
/**
|
|
86
144
|
* Execute code with wrappers handler - generates wrappers, composes code, and executes
|
|
87
145
|
*/
|
|
88
|
-
|
|
146
|
+
async function executeWithWrappersHandler(args) {
|
|
89
147
|
const { code, wrappers, timeout_ms = DEFAULT_TIMEOUT_MS } = args;
|
|
90
148
|
// Validate input
|
|
91
149
|
if (!code || typeof code !== 'string') {
|
|
@@ -118,6 +176,7 @@ export function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
118
176
|
...config.bridgeConfig,
|
|
119
177
|
port: preferredPort,
|
|
120
178
|
});
|
|
179
|
+
activeBridge = bridge;
|
|
121
180
|
try {
|
|
122
181
|
// Step 1: Start the MCP bridge server (gets dynamic port)
|
|
123
182
|
await bridge.start();
|
|
@@ -149,7 +208,8 @@ export function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
149
208
|
const generatedWrappers = wrapperModules.join('\n\n');
|
|
150
209
|
const mcpDictionary = generateMcpDictionary(wrappers);
|
|
151
210
|
const mcpPreamble = getMcpPreamble(actualPort);
|
|
152
|
-
const
|
|
211
|
+
const instrumentedCode = wrapUserCodeForReturnCapture(code);
|
|
212
|
+
const fullCode = `${generatedWrappers}\n\n${mcpDictionary}\n\n${mcpPreamble}\n${instrumentedCode}`;
|
|
153
213
|
// Step 4: Create executor with actual port for sandbox network config
|
|
154
214
|
const sandboxConfig = {
|
|
155
215
|
...config.sandboxConfig,
|
|
@@ -160,6 +220,7 @@ export function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
160
220
|
result = await executor.execute(fullCode, timeout_ms);
|
|
161
221
|
// Step 6: Stop the bridge server
|
|
162
222
|
await bridge.stop();
|
|
223
|
+
activeBridge = null;
|
|
163
224
|
// Step 7: Format and return result
|
|
164
225
|
return formatResult(result);
|
|
165
226
|
}
|
|
@@ -173,11 +234,13 @@ export function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
173
234
|
catch {
|
|
174
235
|
// Ignore cleanup errors
|
|
175
236
|
}
|
|
237
|
+
activeBridge = null;
|
|
176
238
|
// Return error with any partial output
|
|
177
239
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
178
240
|
return formatErrorResult(errorMessage, result);
|
|
179
241
|
}
|
|
180
|
-
}
|
|
242
|
+
}
|
|
243
|
+
return { handler: executeWithWrappersHandler, stopActiveBridge };
|
|
181
244
|
}
|
|
182
245
|
/**
|
|
183
246
|
* Format a successful execution result
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-with-wrappers.js","sourceRoot":"","sources":["../../src/tools/execute-with-wrappers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,eAAe,EAA8B,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAwB,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAwB,MAAM,uBAAuB,CAAC;AA8BjF;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,IAAI,EAAE,4BAA4B;IAClC,WAAW,EACT,mGAAmG;QACnG,gGAAgG;QAChG,kEAAkE;IACpE,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2FAA2F;aACzG;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,0DAA0D;aACxE;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oDAAoD,kBAAkB,GAAG;aACvF;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;KAC/B;CACF,CAAC;AAYF;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAa;IACtD,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,MAAM,IAAI,IAAI;QACd,OAAQ,IAAiC,CAAC,IAAI,KAAK,QAAQ;QAC3D,UAAU,IAAI,IAAI;QAClB,KAAK,CAAC,OAAO,CAAE,IAAiC,CAAC,QAAQ,CAAC;QACzD,IAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAChF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,UAAkB;IACxC,OAAO;;;;;;;;;;qDAU4C,UAAU;;;;;;;;;;;;;CAa9D,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAC9C,IAAgB,EAChB,SAA2C,EAAE;IAE7C,4EAA4E;IAC5E,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,EAAE,IAAI,IAAI,IAAI,CAAC;IAExD;;OAEG;IACH,
|
|
1
|
+
{"version":3,"file":"execute-with-wrappers.js","sourceRoot":"","sources":["../../src/tools/execute-with-wrappers.ts"],"names":[],"mappings":"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"}
|