microsandbox-mcp 0.4.3 → 0.4.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microsandbox-mcp",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "description": "MCP server for microsandbox — manage microVM sandboxes from any AI agent",
5
5
  "type": "module",
6
6
  "bin": {
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@modelcontextprotocol/sdk": "^1.29.0",
21
- "microsandbox": "^0.4.3",
21
+ "microsandbox": "^0.4.4",
22
22
  "zod": "^4.3.6"
23
23
  },
24
24
  "devDependencies": {
package/dist/index.d.ts DELETED
@@ -1 +0,0 @@
1
- export {};
package/dist/index.js DELETED
@@ -1,19 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
- import { registerSandboxTools } from "./tools/sandbox.js";
4
- import { registerExecTools } from "./tools/exec.js";
5
- import { registerFilesystemTools } from "./tools/filesystem.js";
6
- import { registerVolumeTools } from "./tools/volume.js";
7
- import { registerMetricsTools } from "./tools/metrics.js";
8
- const server = new McpServer({
9
- name: "microsandbox",
10
- version: "0.4.3",
11
- });
12
- registerSandboxTools(server);
13
- registerExecTools(server);
14
- registerFilesystemTools(server);
15
- registerVolumeTools(server);
16
- registerMetricsTools(server);
17
- const transport = new StdioServerTransport();
18
- await server.connect(transport);
19
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAE7B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerExecTools(server: McpServer): void;
@@ -1,95 +0,0 @@
1
- import { z } from "zod";
2
- import { Sandbox } from "microsandbox";
3
- import { formatError } from "../utils/errors.js";
4
- export function registerExecTools(server) {
5
- server.registerTool("sandbox_exec", {
6
- title: "Execute Command in Sandbox",
7
- description: "Execute a command inside a running sandbox and return stdout/stderr/exit code.",
8
- inputSchema: z.object({
9
- name: z.string().describe("Sandbox name"),
10
- command: z.string().describe("Command to execute"),
11
- args: z.array(z.string()).optional().describe("Command arguments"),
12
- cwd: z.string().optional().describe("Working directory override"),
13
- env: z.record(z.string(), z.string()).optional().describe("Additional environment variables"),
14
- timeout: z.number().optional().describe("Timeout in seconds"),
15
- }),
16
- annotations: {
17
- readOnlyHint: false,
18
- destructiveHint: false,
19
- idempotentHint: false,
20
- },
21
- }, async ({ name, command, args, cwd, env, timeout }) => {
22
- try {
23
- const handle = await Sandbox.get(name);
24
- const sandbox = await handle.connect();
25
- const output = await sandbox.execWith(command, (b) => {
26
- let acc = b;
27
- if (args)
28
- acc = acc.args(args);
29
- if (cwd)
30
- acc = acc.cwd(cwd);
31
- if (env)
32
- acc = acc.envs(env);
33
- if (timeout)
34
- acc = acc.timeout(timeout * 1000);
35
- return acc;
36
- });
37
- return {
38
- content: [{
39
- type: "text",
40
- text: JSON.stringify({
41
- stdout: output.stdout(),
42
- stderr: output.stderr(),
43
- exitCode: output.code,
44
- success: output.success,
45
- }, null, 2),
46
- }],
47
- };
48
- }
49
- catch (error) {
50
- return formatError(error);
51
- }
52
- });
53
- server.registerTool("sandbox_shell", {
54
- title: "Run Shell Command in Sandbox",
55
- description: "Execute a shell command or script string inside a running sandbox. " +
56
- "Interprets pipes, redirects, and shell syntax.",
57
- inputSchema: z.object({
58
- name: z.string().describe("Sandbox name"),
59
- command: z.string().describe("Shell command or script to execute"),
60
- timeout: z.number().optional().describe("Timeout in seconds"),
61
- }),
62
- annotations: {
63
- readOnlyHint: false,
64
- destructiveHint: false,
65
- idempotentHint: false,
66
- },
67
- }, async ({ name, command, timeout }) => {
68
- try {
69
- const handle = await Sandbox.get(name);
70
- const sandbox = await handle.connect();
71
- let output;
72
- if (timeout) {
73
- output = await sandbox.execWith("sh", (b) => b.args(["-c", command]).timeout(timeout * 1000));
74
- }
75
- else {
76
- output = await sandbox.shell(command);
77
- }
78
- return {
79
- content: [{
80
- type: "text",
81
- text: JSON.stringify({
82
- stdout: output.stdout(),
83
- stderr: output.stderr(),
84
- exitCode: output.code,
85
- success: output.success,
86
- }, null, 2),
87
- }],
88
- };
89
- }
90
- catch (error) {
91
- return formatError(error);
92
- }
93
- });
94
- }
95
- //# sourceMappingURL=exec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/tools/exec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerFilesystemTools(server: McpServer): void;
@@ -1,175 +0,0 @@
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().readToString(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, 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
@@ -1 +0,0 @@
1
- {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/tools/filesystem.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerMetricsTools(server: McpServer): void;
@@ -1,94 +0,0 @@
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 = 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
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/tools/metrics.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerSandboxTools(server: McpServer): void;
@@ -1,315 +0,0 @@
1
- import { z } from "zod";
2
- import { Sandbox } 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
- let builder = Sandbox.builder(name)
40
- .image(image)
41
- .memory(memoryMib ?? 512)
42
- .cpus(cpus ?? 1);
43
- if (env)
44
- builder = builder.envs(env);
45
- sandbox = await builder.create();
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
- let builder = Sandbox.builder(name)
113
- .image(image)
114
- .cpus(cpus ?? 1)
115
- .memory(memoryMib ?? 512);
116
- if (workdir)
117
- builder = builder.workdir(workdir);
118
- if (env)
119
- builder = builder.envs(env);
120
- if (entrypoint)
121
- builder = builder.entrypoint(entrypoint);
122
- if (hostname)
123
- builder = builder.hostname(hostname);
124
- if (maxDuration)
125
- builder = builder.maxDuration(maxDuration);
126
- if (idleTimeout)
127
- builder = builder.idleTimeout(idleTimeout);
128
- if (volumes) {
129
- for (const v of volumes) {
130
- builder = builder.volume(v.guestPath, (m) => {
131
- switch (v.type) {
132
- case "bind": {
133
- let b = m.bind(v.source);
134
- if (v.readonly)
135
- b = b.readonly();
136
- return b;
137
- }
138
- case "named": {
139
- let b = m.named(v.source);
140
- if (v.readonly)
141
- b = b.readonly();
142
- return b;
143
- }
144
- case "tmpfs": {
145
- let b = m.tmpfs();
146
- if (typeof v.sizeMib === "number")
147
- b = b.size(v.sizeMib);
148
- if (v.readonly)
149
- b = b.readonly();
150
- return b;
151
- }
152
- }
153
- });
154
- }
155
- }
156
- if (patches && patches.length > 0) {
157
- builder = builder.patch((p) => {
158
- let acc = p;
159
- for (const patch of patches) {
160
- switch (patch.type) {
161
- case "text":
162
- acc = acc.text(patch.path, patch.content, { mode: patch.mode });
163
- break;
164
- case "mkdir":
165
- acc = acc.mkdir(patch.path, { mode: patch.mode });
166
- break;
167
- case "append":
168
- acc = acc.append(patch.path, patch.content);
169
- break;
170
- case "remove":
171
- acc = acc.remove(patch.path);
172
- break;
173
- case "symlink":
174
- acc = acc.symlink(patch.target, patch.path);
175
- break;
176
- }
177
- }
178
- return acc;
179
- });
180
- }
181
- await builder.create();
182
- return {
183
- content: [{
184
- type: "text",
185
- text: JSON.stringify({ name, status: "running", image }, null, 2),
186
- }],
187
- };
188
- }
189
- catch (error) {
190
- return formatError(error);
191
- }
192
- });
193
- server.registerTool("sandbox_list", {
194
- title: "List Sandboxes",
195
- description: "List all sandboxes with their status.",
196
- inputSchema: z.object({}),
197
- annotations: {
198
- readOnlyHint: true,
199
- destructiveHint: false,
200
- idempotentHint: true,
201
- },
202
- }, async () => {
203
- try {
204
- const handles = await Sandbox.list();
205
- const results = handles.map((h) => ({
206
- name: h.name,
207
- status: h.status,
208
- createdAt: h.createdAt,
209
- }));
210
- return {
211
- content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
212
- };
213
- }
214
- catch (error) {
215
- return formatError(error);
216
- }
217
- });
218
- server.registerTool("sandbox_inspect", {
219
- title: "Inspect Sandbox",
220
- description: "Get detailed information about a specific sandbox including full configuration.",
221
- inputSchema: z.object({
222
- name: z.string().describe("Sandbox name"),
223
- }),
224
- annotations: {
225
- readOnlyHint: true,
226
- destructiveHint: false,
227
- idempotentHint: true,
228
- },
229
- }, async ({ name }) => {
230
- try {
231
- const handle = await Sandbox.get(name);
232
- return {
233
- content: [{
234
- type: "text",
235
- text: JSON.stringify({
236
- name: handle.name,
237
- status: handle.status,
238
- config: handle.configJson,
239
- createdAt: handle.createdAt,
240
- updatedAt: handle.updatedAt,
241
- }, null, 2),
242
- }],
243
- };
244
- }
245
- catch (error) {
246
- return formatError(error);
247
- }
248
- });
249
- server.registerTool("sandbox_stop", {
250
- title: "Stop Sandbox",
251
- description: "Stop a running sandbox. Use force to kill with SIGKILL instead of graceful SIGTERM.",
252
- inputSchema: z.object({
253
- name: z.string().describe("Sandbox name"),
254
- force: z.boolean().optional().describe("Force kill with SIGKILL instead of graceful SIGTERM"),
255
- }),
256
- annotations: {
257
- readOnlyHint: false,
258
- destructiveHint: true,
259
- idempotentHint: false,
260
- },
261
- }, async ({ name, force }) => {
262
- try {
263
- const handle = await Sandbox.get(name);
264
- if (force) {
265
- await handle.kill();
266
- }
267
- else {
268
- await handle.stop();
269
- }
270
- await waitForStopped(name);
271
- return {
272
- content: [{ type: "text", text: JSON.stringify({ name, status: "stopped" }, null, 2) }],
273
- };
274
- }
275
- catch (error) {
276
- return formatError(error);
277
- }
278
- });
279
- server.registerTool("sandbox_remove", {
280
- title: "Remove Sandbox",
281
- description: "Remove a sandbox. Must be stopped unless force is true.",
282
- inputSchema: z.object({
283
- name: z.string().describe("Sandbox name"),
284
- force: z.boolean().optional().describe("Stop and remove in one step if still running"),
285
- }),
286
- annotations: {
287
- readOnlyHint: false,
288
- destructiveHint: true,
289
- idempotentHint: true,
290
- },
291
- }, async ({ name, force }) => {
292
- try {
293
- if (force) {
294
- try {
295
- const handle = await Sandbox.get(name);
296
- if (handle.status === "running") {
297
- await handle.kill();
298
- await waitForStopped(name);
299
- }
300
- }
301
- catch {
302
- // Sandbox may already be stopped or not exist.
303
- }
304
- }
305
- await Sandbox.remove(name);
306
- return {
307
- content: [{ type: "text", text: JSON.stringify({ name, removed: true }, null, 2) }],
308
- };
309
- }
310
- catch (error) {
311
- return formatError(error);
312
- }
313
- });
314
- }
315
- //# sourceMappingURL=sandbox.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/tools/sandbox.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerVolumeTools(server: McpServer): void;
@@ -1,80 +0,0 @@
1
- import { z } from "zod";
2
- import { Volume } from "microsandbox";
3
- import { formatError } from "../utils/errors.js";
4
- export function registerVolumeTools(server) {
5
- server.registerTool("volume_create", {
6
- title: "Create Volume",
7
- description: "Create a named persistent volume. Volumes survive sandbox restarts and can be shared across sandboxes.",
8
- inputSchema: z.object({
9
- name: z.string().describe("Volume name"),
10
- sizeMib: z.number().int().min(1).optional().describe("Quota in MiB"),
11
- }),
12
- annotations: {
13
- readOnlyHint: false,
14
- destructiveHint: false,
15
- idempotentHint: false,
16
- },
17
- }, async ({ name, sizeMib }) => {
18
- try {
19
- let builder = Volume.builder(name);
20
- if (typeof sizeMib === "number")
21
- builder = builder.quota(sizeMib);
22
- await builder.create();
23
- return {
24
- content: [{ type: "text", text: JSON.stringify({ name, created: true }, null, 2) }],
25
- };
26
- }
27
- catch (error) {
28
- return formatError(error);
29
- }
30
- });
31
- server.registerTool("volume_list", {
32
- title: "List Volumes",
33
- description: "List all named volumes.",
34
- inputSchema: z.object({}),
35
- annotations: {
36
- readOnlyHint: true,
37
- destructiveHint: false,
38
- idempotentHint: true,
39
- },
40
- }, async () => {
41
- try {
42
- const handles = await Volume.list();
43
- const results = handles.map((h) => ({
44
- name: h.name,
45
- quotaMib: h.quotaMib,
46
- usedBytes: h.usedBytes,
47
- createdAt: h.createdAt,
48
- }));
49
- return {
50
- content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
51
- };
52
- }
53
- catch (error) {
54
- return formatError(error);
55
- }
56
- });
57
- server.registerTool("volume_remove", {
58
- title: "Remove Volume",
59
- description: "Remove a named volume.",
60
- inputSchema: z.object({
61
- name: z.string().describe("Volume name"),
62
- }),
63
- annotations: {
64
- readOnlyHint: false,
65
- destructiveHint: true,
66
- idempotentHint: true,
67
- },
68
- }, async ({ name }) => {
69
- try {
70
- await Volume.remove(name);
71
- return {
72
- content: [{ type: "text", text: JSON.stringify({ name, removed: true }, null, 2) }],
73
- };
74
- }
75
- catch (error) {
76
- return formatError(error);
77
- }
78
- });
79
- }
80
- //# sourceMappingURL=volume.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"volume.js","sourceRoot":"","sources":["../../src/tools/volume.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- export declare function formatError(error: unknown): {
2
- content: {
3
- type: "text";
4
- text: string;
5
- }[];
6
- isError: true;
7
- };
@@ -1,8 +0,0 @@
1
- export function formatError(error) {
2
- const message = error instanceof Error ? error.message : String(error);
3
- return {
4
- content: [{ type: "text", text: message }],
5
- isError: true,
6
- };
7
- }
8
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}