microsandbox-mcp 0.3.8
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/LICENSE +201 -0
- package/README.md +193 -0
- package/bin/microsandbox-mcp.js +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/exec.d.ts +2 -0
- package/dist/tools/exec.js +95 -0
- package/dist/tools/exec.js.map +1 -0
- package/dist/tools/filesystem.d.ts +2 -0
- package/dist/tools/filesystem.js +175 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/metrics.d.ts +2 -0
- package/dist/tools/metrics.js +94 -0
- package/dist/tools/metrics.js.map +1 -0
- package/dist/tools/sandbox.d.ts +2 -0
- package/dist/tools/sandbox.js +291 -0
- package/dist/tools/sandbox.js.map +1 -0
- package/dist/tools/volume.d.ts +2 -0
- package/dist/tools/volume.js +81 -0
- package/dist/tools/volume.js.map +1 -0
- package/dist/utils/errors.d.ts +7 -0
- package/dist/utils/errors.js +8 -0
- package/dist/utils/errors.js.map +1 -0
- package/package.json +46 -0
- package/postinstall.cjs +39 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Sandbox } from "microsandbox";
|
|
3
|
+
import { formatError } from "../utils/errors.js";
|
|
4
|
+
export function registerFilesystemTools(server) {
|
|
5
|
+
server.registerTool("sandbox_fs_read", {
|
|
6
|
+
title: "Read File from Sandbox",
|
|
7
|
+
description: "Read a file from the sandbox filesystem and return its contents as text.",
|
|
8
|
+
inputSchema: z.object({
|
|
9
|
+
name: z.string().describe("Sandbox name"),
|
|
10
|
+
path: z.string().describe("Absolute path inside the sandbox"),
|
|
11
|
+
}),
|
|
12
|
+
annotations: {
|
|
13
|
+
readOnlyHint: true,
|
|
14
|
+
destructiveHint: false,
|
|
15
|
+
idempotentHint: true,
|
|
16
|
+
},
|
|
17
|
+
}, async ({ name, path }) => {
|
|
18
|
+
try {
|
|
19
|
+
const handle = await Sandbox.get(name);
|
|
20
|
+
const sandbox = await handle.connect();
|
|
21
|
+
const content = await sandbox.fs().readString(path);
|
|
22
|
+
return {
|
|
23
|
+
content: [{ type: "text", text: content }],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return formatError(error);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
server.registerTool("sandbox_fs_write", {
|
|
31
|
+
title: "Write File to Sandbox",
|
|
32
|
+
description: "Write content to a file inside the sandbox. Creates parent directories as needed.",
|
|
33
|
+
inputSchema: z.object({
|
|
34
|
+
name: z.string().describe("Sandbox name"),
|
|
35
|
+
path: z.string().describe("Absolute path inside the sandbox"),
|
|
36
|
+
content: z.string().describe("File content to write"),
|
|
37
|
+
}),
|
|
38
|
+
annotations: {
|
|
39
|
+
readOnlyHint: false,
|
|
40
|
+
destructiveHint: false,
|
|
41
|
+
idempotentHint: true,
|
|
42
|
+
},
|
|
43
|
+
}, async ({ name, path, content }) => {
|
|
44
|
+
try {
|
|
45
|
+
const handle = await Sandbox.get(name);
|
|
46
|
+
const sandbox = await handle.connect();
|
|
47
|
+
await sandbox.fs().write(path, Buffer.from(content));
|
|
48
|
+
return {
|
|
49
|
+
content: [{ type: "text", text: JSON.stringify({ path, written: true }, null, 2) }],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return formatError(error);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
server.registerTool("sandbox_fs_list", {
|
|
57
|
+
title: "List Directory in Sandbox",
|
|
58
|
+
description: "List directory contents inside the sandbox.",
|
|
59
|
+
inputSchema: z.object({
|
|
60
|
+
name: z.string().describe("Sandbox name"),
|
|
61
|
+
path: z.string().describe("Directory path to list"),
|
|
62
|
+
}),
|
|
63
|
+
annotations: {
|
|
64
|
+
readOnlyHint: true,
|
|
65
|
+
destructiveHint: false,
|
|
66
|
+
idempotentHint: true,
|
|
67
|
+
},
|
|
68
|
+
}, async ({ name, path }) => {
|
|
69
|
+
try {
|
|
70
|
+
const handle = await Sandbox.get(name);
|
|
71
|
+
const sandbox = await handle.connect();
|
|
72
|
+
const entries = await sandbox.fs().list(path);
|
|
73
|
+
const results = entries.map((e) => ({
|
|
74
|
+
path: e.path,
|
|
75
|
+
kind: e.kind,
|
|
76
|
+
size: e.size,
|
|
77
|
+
}));
|
|
78
|
+
return {
|
|
79
|
+
content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return formatError(error);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
server.registerTool("sandbox_fs_mkdir", {
|
|
87
|
+
title: "Create Directory in Sandbox",
|
|
88
|
+
description: "Create a directory with parent directories inside the sandbox.",
|
|
89
|
+
inputSchema: z.object({
|
|
90
|
+
name: z.string().describe("Sandbox name"),
|
|
91
|
+
path: z.string().describe("Directory path to create"),
|
|
92
|
+
}),
|
|
93
|
+
annotations: {
|
|
94
|
+
readOnlyHint: false,
|
|
95
|
+
destructiveHint: false,
|
|
96
|
+
idempotentHint: true,
|
|
97
|
+
},
|
|
98
|
+
}, async ({ name, path }) => {
|
|
99
|
+
try {
|
|
100
|
+
const handle = await Sandbox.get(name);
|
|
101
|
+
const sandbox = await handle.connect();
|
|
102
|
+
await sandbox.fs().mkdir(path);
|
|
103
|
+
return {
|
|
104
|
+
content: [{ type: "text", text: JSON.stringify({ path, created: true }, null, 2) }],
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return formatError(error);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
server.registerTool("sandbox_fs_remove", {
|
|
112
|
+
title: "Remove File or Directory in Sandbox",
|
|
113
|
+
description: "Remove a file or directory inside the sandbox.",
|
|
114
|
+
inputSchema: z.object({
|
|
115
|
+
name: z.string().describe("Sandbox name"),
|
|
116
|
+
path: z.string().describe("Path to remove"),
|
|
117
|
+
}),
|
|
118
|
+
annotations: {
|
|
119
|
+
readOnlyHint: false,
|
|
120
|
+
destructiveHint: true,
|
|
121
|
+
idempotentHint: true,
|
|
122
|
+
},
|
|
123
|
+
}, async ({ name, path }) => {
|
|
124
|
+
try {
|
|
125
|
+
const handle = await Sandbox.get(name);
|
|
126
|
+
const sandbox = await handle.connect();
|
|
127
|
+
try {
|
|
128
|
+
await sandbox.fs().remove(path);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
await sandbox.fs().removeDir(path);
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
content: [{ type: "text", text: JSON.stringify({ path, removed: true }, null, 2) }],
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
return formatError(error);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
server.registerTool("sandbox_fs_stat", {
|
|
142
|
+
title: "Get File Metadata in Sandbox",
|
|
143
|
+
description: "Get file or directory metadata (kind, size, mode, modified time) inside the sandbox.",
|
|
144
|
+
inputSchema: z.object({
|
|
145
|
+
name: z.string().describe("Sandbox name"),
|
|
146
|
+
path: z.string().describe("Path to stat"),
|
|
147
|
+
}),
|
|
148
|
+
annotations: {
|
|
149
|
+
readOnlyHint: true,
|
|
150
|
+
destructiveHint: false,
|
|
151
|
+
idempotentHint: true,
|
|
152
|
+
},
|
|
153
|
+
}, async ({ name, path }) => {
|
|
154
|
+
try {
|
|
155
|
+
const handle = await Sandbox.get(name);
|
|
156
|
+
const sandbox = await handle.connect();
|
|
157
|
+
const meta = await sandbox.fs().stat(path);
|
|
158
|
+
return {
|
|
159
|
+
content: [{
|
|
160
|
+
type: "text",
|
|
161
|
+
text: JSON.stringify({
|
|
162
|
+
kind: meta.kind,
|
|
163
|
+
size: meta.size,
|
|
164
|
+
mode: meta.mode,
|
|
165
|
+
modified: meta.modified,
|
|
166
|
+
}, null, 2),
|
|
167
|
+
}],
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
return formatError(error);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/tools/filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Sandbox, isInstalled, install } from "microsandbox";
|
|
3
|
+
import { formatError } from "../utils/errors.js";
|
|
4
|
+
export function registerMetricsTools(server) {
|
|
5
|
+
server.registerTool("check_installed", {
|
|
6
|
+
title: "Check Installation",
|
|
7
|
+
description: "Verify that msb and libkrunfw are available on the system. " +
|
|
8
|
+
"Returns installation status. If not installed, the server can attempt to install them.",
|
|
9
|
+
inputSchema: z.object({}),
|
|
10
|
+
annotations: {
|
|
11
|
+
readOnlyHint: true,
|
|
12
|
+
destructiveHint: false,
|
|
13
|
+
idempotentHint: true,
|
|
14
|
+
},
|
|
15
|
+
}, async () => {
|
|
16
|
+
try {
|
|
17
|
+
const installed = await isInstalled();
|
|
18
|
+
if (installed) {
|
|
19
|
+
return {
|
|
20
|
+
content: [{
|
|
21
|
+
type: "text",
|
|
22
|
+
text: JSON.stringify({ installed: true }, null, 2),
|
|
23
|
+
}],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Attempt automatic installation.
|
|
27
|
+
try {
|
|
28
|
+
await install();
|
|
29
|
+
return {
|
|
30
|
+
content: [{
|
|
31
|
+
type: "text",
|
|
32
|
+
text: JSON.stringify({
|
|
33
|
+
installed: true,
|
|
34
|
+
message: "Runtime dependencies were just installed.",
|
|
35
|
+
}, null, 2),
|
|
36
|
+
}],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (installError) {
|
|
40
|
+
return {
|
|
41
|
+
content: [{
|
|
42
|
+
type: "text",
|
|
43
|
+
text: JSON.stringify({
|
|
44
|
+
installed: false,
|
|
45
|
+
message: "msb and libkrunfw are not installed. " +
|
|
46
|
+
"Install manually: curl -fsSL https://install.microsandbox.dev | sh",
|
|
47
|
+
}, null, 2),
|
|
48
|
+
}],
|
|
49
|
+
isError: true,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
return formatError(error);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
server.registerTool("sandbox_metrics", {
|
|
58
|
+
title: "Get Sandbox Metrics",
|
|
59
|
+
description: "Get live resource usage metrics (CPU, memory, disk, network) for a running sandbox.",
|
|
60
|
+
inputSchema: z.object({
|
|
61
|
+
name: z.string().describe("Sandbox name"),
|
|
62
|
+
}),
|
|
63
|
+
annotations: {
|
|
64
|
+
readOnlyHint: true,
|
|
65
|
+
destructiveHint: false,
|
|
66
|
+
idempotentHint: true,
|
|
67
|
+
},
|
|
68
|
+
}, async ({ name }) => {
|
|
69
|
+
try {
|
|
70
|
+
const handle = await Sandbox.get(name);
|
|
71
|
+
const sandbox = await handle.connect();
|
|
72
|
+
const m = await sandbox.metrics();
|
|
73
|
+
return {
|
|
74
|
+
content: [{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: JSON.stringify({
|
|
77
|
+
cpuPercent: m.cpuPercent,
|
|
78
|
+
memoryBytes: m.memoryBytes,
|
|
79
|
+
memoryLimitBytes: m.memoryLimitBytes,
|
|
80
|
+
diskReadBytes: m.diskReadBytes,
|
|
81
|
+
diskWriteBytes: m.diskWriteBytes,
|
|
82
|
+
netRxBytes: m.netRxBytes,
|
|
83
|
+
netTxBytes: m.netTxBytes,
|
|
84
|
+
uptimeSecs: m.uptimeMs ? Math.round(m.uptimeMs / 1000) : undefined,
|
|
85
|
+
}, null, 2),
|
|
86
|
+
}],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
return formatError(error);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/tools/metrics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,6DAA6D;YAC7D,wFAAwF;QAC1F,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,WAAW,EAAE,CAAC;YACtC,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;yBACnD,CAAC;iBACH,CAAC;YACJ,CAAC;YAED,kCAAkC;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,EAAE,CAAC;gBAChB,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,SAAS,EAAE,IAAI;gCACf,OAAO,EAAE,2CAA2C;6BACrD,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ,CAAC;iBACH,CAAC;YACJ,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,SAAS,EAAE,KAAK;gCAChB,OAAO,EACL,uCAAuC;oCACvC,oEAAoE;6BACvE,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ,CAAC;oBACF,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,qFAAqF;QAClG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;SAC1C,CAAC;QACF,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;SACrB;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,UAAU,EAAE,CAAC,CAAC,UAAU;4BACxB,WAAW,EAAE,CAAC,CAAC,WAAW;4BAC1B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;4BACpC,aAAa,EAAE,CAAC,CAAC,aAAa;4BAC9B,cAAc,EAAE,CAAC,CAAC,cAAc;4BAChC,UAAU,EAAE,CAAC,CAAC,UAAU;4BACxB,UAAU,EAAE,CAAC,CAAC,UAAU;4BACxB,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;yBACnE,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Sandbox, Mount, Patch } from "microsandbox";
|
|
3
|
+
import { formatError } from "../utils/errors.js";
|
|
4
|
+
async function waitForStopped(name, timeoutMs = 10000) {
|
|
5
|
+
const start = Date.now();
|
|
6
|
+
while (Date.now() - start < timeoutMs) {
|
|
7
|
+
try {
|
|
8
|
+
const h = await Sandbox.get(name);
|
|
9
|
+
if (h.status !== "running")
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return; // Sandbox gone, that's fine.
|
|
14
|
+
}
|
|
15
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function registerSandboxTools(server) {
|
|
19
|
+
server.registerTool("sandbox_run", {
|
|
20
|
+
title: "Run Command in Ephemeral Sandbox",
|
|
21
|
+
description: "Create an ephemeral sandbox, run a shell command, return the output, and destroy the sandbox. " +
|
|
22
|
+
"Best for quick one-off tasks like running a script, checking a command, or testing code.",
|
|
23
|
+
inputSchema: z.object({
|
|
24
|
+
image: z.string().describe('OCI image (e.g. "python:3.12", "node:22", "alpine")'),
|
|
25
|
+
command: z.string().describe("Shell command to execute"),
|
|
26
|
+
memoryMib: z.number().int().min(128).optional().describe("Memory in MiB (default: 512)"),
|
|
27
|
+
cpus: z.number().int().min(1).max(16).optional().describe("Number of vCPUs (default: 1)"),
|
|
28
|
+
env: z.record(z.string(), z.string()).optional().describe("Environment variables"),
|
|
29
|
+
}),
|
|
30
|
+
annotations: {
|
|
31
|
+
readOnlyHint: false,
|
|
32
|
+
destructiveHint: false,
|
|
33
|
+
idempotentHint: false,
|
|
34
|
+
},
|
|
35
|
+
}, async ({ image, command, memoryMib, cpus, env }) => {
|
|
36
|
+
const name = `mcp-run-${Date.now()}`;
|
|
37
|
+
let sandbox;
|
|
38
|
+
try {
|
|
39
|
+
sandbox = await Sandbox.create({
|
|
40
|
+
name,
|
|
41
|
+
image,
|
|
42
|
+
memoryMib: memoryMib ?? 512,
|
|
43
|
+
cpus: cpus ?? 1,
|
|
44
|
+
env: env ?? {},
|
|
45
|
+
});
|
|
46
|
+
const output = await sandbox.shell(command);
|
|
47
|
+
return {
|
|
48
|
+
content: [{
|
|
49
|
+
type: "text",
|
|
50
|
+
text: JSON.stringify({
|
|
51
|
+
stdout: output.stdout(),
|
|
52
|
+
stderr: output.stderr(),
|
|
53
|
+
exitCode: output.code,
|
|
54
|
+
success: output.success,
|
|
55
|
+
}, null, 2),
|
|
56
|
+
}],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return formatError(error);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
if (sandbox) {
|
|
64
|
+
try {
|
|
65
|
+
await sandbox.stop();
|
|
66
|
+
await waitForStopped(name);
|
|
67
|
+
await Sandbox.remove(name);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Best-effort cleanup.
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
server.registerTool("sandbox_create", {
|
|
76
|
+
title: "Create Sandbox",
|
|
77
|
+
description: "Create and boot a persistent named sandbox with full configuration. " +
|
|
78
|
+
"The sandbox stays running until explicitly stopped.",
|
|
79
|
+
inputSchema: z.object({
|
|
80
|
+
name: z.string().describe("Unique sandbox name"),
|
|
81
|
+
image: z.string().describe('OCI image reference (e.g. "python:3.12", "ubuntu:24.04")'),
|
|
82
|
+
cpus: z.number().int().min(1).max(16).optional().describe("Virtual CPUs (default: 1)"),
|
|
83
|
+
memoryMib: z.number().int().min(128).optional().describe("Memory in MiB (default: 512)"),
|
|
84
|
+
workdir: z.string().optional().describe("Default working directory inside the sandbox"),
|
|
85
|
+
env: z.record(z.string(), z.string()).optional().describe("Environment variables"),
|
|
86
|
+
volumes: z.array(z.object({
|
|
87
|
+
guestPath: z.string().describe("Mount point inside sandbox"),
|
|
88
|
+
type: z.enum(["bind", "named", "tmpfs"]).describe("Volume type"),
|
|
89
|
+
source: z.string().optional().describe("Host path (bind) or volume name (named)"),
|
|
90
|
+
readonly: z.boolean().optional().describe("Mount as read-only"),
|
|
91
|
+
sizeMib: z.number().optional().describe("Size for tmpfs volumes"),
|
|
92
|
+
})).optional().describe("Volume mounts"),
|
|
93
|
+
patches: z.array(z.object({
|
|
94
|
+
type: z.enum(["text", "mkdir", "append", "remove", "symlink"]).describe("Patch type"),
|
|
95
|
+
path: z.string().describe("Target path inside sandbox"),
|
|
96
|
+
content: z.string().optional().describe("File content (text, append)"),
|
|
97
|
+
target: z.string().optional().describe("Symlink target"),
|
|
98
|
+
mode: z.number().optional().describe("Unix permissions"),
|
|
99
|
+
})).optional().describe("Rootfs modifications applied before boot"),
|
|
100
|
+
entrypoint: z.array(z.string()).optional().describe("Override image entrypoint"),
|
|
101
|
+
hostname: z.string().optional().describe("Guest hostname"),
|
|
102
|
+
maxDuration: z.number().optional().describe("Auto-stop after N seconds"),
|
|
103
|
+
idleTimeout: z.number().optional().describe("Auto-stop after N seconds of inactivity"),
|
|
104
|
+
}),
|
|
105
|
+
annotations: {
|
|
106
|
+
readOnlyHint: false,
|
|
107
|
+
destructiveHint: false,
|
|
108
|
+
idempotentHint: false,
|
|
109
|
+
},
|
|
110
|
+
}, async ({ name, image, cpus, memoryMib, workdir, env, volumes, patches, entrypoint, hostname, maxDuration, idleTimeout }) => {
|
|
111
|
+
try {
|
|
112
|
+
const volumeMap = {};
|
|
113
|
+
if (volumes) {
|
|
114
|
+
for (const v of volumes) {
|
|
115
|
+
switch (v.type) {
|
|
116
|
+
case "bind":
|
|
117
|
+
volumeMap[v.guestPath] = Mount.bind(v.source, { readonly: v.readonly });
|
|
118
|
+
break;
|
|
119
|
+
case "named":
|
|
120
|
+
volumeMap[v.guestPath] = Mount.named(v.source, { readonly: v.readonly });
|
|
121
|
+
break;
|
|
122
|
+
case "tmpfs":
|
|
123
|
+
volumeMap[v.guestPath] = Mount.tmpfs({ sizeMib: v.sizeMib });
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const patchList = patches?.map((p) => {
|
|
129
|
+
switch (p.type) {
|
|
130
|
+
case "text":
|
|
131
|
+
return Patch.text(p.path, p.content, { mode: p.mode });
|
|
132
|
+
case "mkdir":
|
|
133
|
+
return Patch.mkdir(p.path, { mode: p.mode });
|
|
134
|
+
case "append":
|
|
135
|
+
return Patch.append(p.path, p.content);
|
|
136
|
+
case "remove":
|
|
137
|
+
return Patch.remove(p.path);
|
|
138
|
+
case "symlink":
|
|
139
|
+
return Patch.symlink(p.target, p.path);
|
|
140
|
+
default:
|
|
141
|
+
throw new Error(`Unknown patch type: ${p.type}`);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
const config = {
|
|
145
|
+
name,
|
|
146
|
+
image,
|
|
147
|
+
cpus: cpus ?? 1,
|
|
148
|
+
memoryMib: memoryMib ?? 512,
|
|
149
|
+
...(workdir && { workdir }),
|
|
150
|
+
...(env && { env }),
|
|
151
|
+
...(Object.keys(volumeMap).length > 0 && { volumes: volumeMap }),
|
|
152
|
+
...(patchList && patchList.length > 0 && { patches: patchList }),
|
|
153
|
+
...(entrypoint && { entrypoint }),
|
|
154
|
+
...(hostname && { hostname }),
|
|
155
|
+
...(maxDuration && { maxDurationSecs: maxDuration }),
|
|
156
|
+
};
|
|
157
|
+
await Sandbox.create(config);
|
|
158
|
+
return {
|
|
159
|
+
content: [{
|
|
160
|
+
type: "text",
|
|
161
|
+
text: JSON.stringify({ name, status: "running", image }, null, 2),
|
|
162
|
+
}],
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
return formatError(error);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
server.registerTool("sandbox_list", {
|
|
170
|
+
title: "List Sandboxes",
|
|
171
|
+
description: "List all sandboxes with their status.",
|
|
172
|
+
inputSchema: z.object({}),
|
|
173
|
+
annotations: {
|
|
174
|
+
readOnlyHint: true,
|
|
175
|
+
destructiveHint: false,
|
|
176
|
+
idempotentHint: true,
|
|
177
|
+
},
|
|
178
|
+
}, async () => {
|
|
179
|
+
try {
|
|
180
|
+
const handles = await Sandbox.list();
|
|
181
|
+
const results = handles.map((h) => ({
|
|
182
|
+
name: h.name,
|
|
183
|
+
status: h.status,
|
|
184
|
+
createdAt: h.createdAt,
|
|
185
|
+
}));
|
|
186
|
+
return {
|
|
187
|
+
content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
return formatError(error);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
server.registerTool("sandbox_inspect", {
|
|
195
|
+
title: "Inspect Sandbox",
|
|
196
|
+
description: "Get detailed information about a specific sandbox including full configuration.",
|
|
197
|
+
inputSchema: z.object({
|
|
198
|
+
name: z.string().describe("Sandbox name"),
|
|
199
|
+
}),
|
|
200
|
+
annotations: {
|
|
201
|
+
readOnlyHint: true,
|
|
202
|
+
destructiveHint: false,
|
|
203
|
+
idempotentHint: true,
|
|
204
|
+
},
|
|
205
|
+
}, async ({ name }) => {
|
|
206
|
+
try {
|
|
207
|
+
const handle = await Sandbox.get(name);
|
|
208
|
+
return {
|
|
209
|
+
content: [{
|
|
210
|
+
type: "text",
|
|
211
|
+
text: JSON.stringify({
|
|
212
|
+
name: handle.name,
|
|
213
|
+
status: handle.status,
|
|
214
|
+
config: handle.configJson,
|
|
215
|
+
createdAt: handle.createdAt,
|
|
216
|
+
updatedAt: handle.updatedAt,
|
|
217
|
+
}, null, 2),
|
|
218
|
+
}],
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
return formatError(error);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
server.registerTool("sandbox_stop", {
|
|
226
|
+
title: "Stop Sandbox",
|
|
227
|
+
description: "Stop a running sandbox. Use force to kill with SIGKILL instead of graceful SIGTERM.",
|
|
228
|
+
inputSchema: z.object({
|
|
229
|
+
name: z.string().describe("Sandbox name"),
|
|
230
|
+
force: z.boolean().optional().describe("Force kill with SIGKILL instead of graceful SIGTERM"),
|
|
231
|
+
}),
|
|
232
|
+
annotations: {
|
|
233
|
+
readOnlyHint: false,
|
|
234
|
+
destructiveHint: true,
|
|
235
|
+
idempotentHint: false,
|
|
236
|
+
},
|
|
237
|
+
}, async ({ name, force }) => {
|
|
238
|
+
try {
|
|
239
|
+
const handle = await Sandbox.get(name);
|
|
240
|
+
if (force) {
|
|
241
|
+
await handle.kill();
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
await handle.stop();
|
|
245
|
+
}
|
|
246
|
+
await waitForStopped(name);
|
|
247
|
+
return {
|
|
248
|
+
content: [{ type: "text", text: JSON.stringify({ name, status: "stopped" }, null, 2) }],
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
return formatError(error);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
server.registerTool("sandbox_remove", {
|
|
256
|
+
title: "Remove Sandbox",
|
|
257
|
+
description: "Remove a sandbox. Must be stopped unless force is true.",
|
|
258
|
+
inputSchema: z.object({
|
|
259
|
+
name: z.string().describe("Sandbox name"),
|
|
260
|
+
force: z.boolean().optional().describe("Stop and remove in one step if still running"),
|
|
261
|
+
}),
|
|
262
|
+
annotations: {
|
|
263
|
+
readOnlyHint: false,
|
|
264
|
+
destructiveHint: true,
|
|
265
|
+
idempotentHint: true,
|
|
266
|
+
},
|
|
267
|
+
}, async ({ name, force }) => {
|
|
268
|
+
try {
|
|
269
|
+
if (force) {
|
|
270
|
+
try {
|
|
271
|
+
const handle = await Sandbox.get(name);
|
|
272
|
+
if (handle.status === "running") {
|
|
273
|
+
await handle.kill();
|
|
274
|
+
await waitForStopped(name);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// Sandbox may already be stopped or not exist.
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
await Sandbox.remove(name);
|
|
282
|
+
return {
|
|
283
|
+
content: [{ type: "text", text: JSON.stringify({ name, removed: true }, null, 2) }],
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
return formatError(error);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/tools/sandbox.ts"],"names":[],"mappings":"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"}
|