microsandbox-mcp 0.5.6 → 0.5.10
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/README.md +142 -27
- package/dist/config.d.ts +10 -0
- package/dist/config.js +42 -0
- package/dist/config.js.map +1 -0
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/resources.d.ts +2 -0
- package/dist/resources.js +71 -0
- package/dist/resources.js.map +1 -0
- package/dist/schemas/common.d.ts +7 -0
- package/dist/schemas/common.js +8 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/state/exec-sessions.d.ts +19 -0
- package/dist/state/exec-sessions.js +151 -0
- package/dist/state/exec-sessions.js.map +1 -0
- package/dist/tools/exec.js +283 -56
- package/dist/tools/exec.js.map +1 -1
- package/dist/tools/filesystem.js +195 -59
- package/dist/tools/filesystem.js.map +1 -1
- package/dist/tools/image.d.ts +2 -0
- package/dist/tools/image.js +99 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/logs.d.ts +2 -0
- package/dist/tools/logs.js +128 -0
- package/dist/tools/logs.js.map +1 -0
- package/dist/tools/metrics.js +48 -65
- package/dist/tools/metrics.js.map +1 -1
- package/dist/tools/runtime.d.ts +2 -0
- package/dist/tools/runtime.js +61 -0
- package/dist/tools/runtime.js.map +1 -0
- package/dist/tools/sandbox.d.ts +216 -0
- package/dist/tools/sandbox.js +619 -202
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/tools/snapshot.d.ts +2 -0
- package/dist/tools/snapshot.js +234 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/ssh.d.ts +2 -0
- package/dist/tools/ssh.js +323 -0
- package/dist/tools/ssh.js.map +1 -0
- package/dist/tools/volume.js +287 -23
- package/dist/tools/volume.js.map +1 -1
- package/dist/utils/errors.d.ts +2 -7
- package/dist/utils/errors.js +6 -5
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/exec-output.d.ts +20 -0
- package/dist/utils/exec-output.js +15 -0
- package/dist/utils/exec-output.js.map +1 -0
- package/dist/utils/output.d.ts +11 -0
- package/dist/utils/output.js +21 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/policy.d.ts +8 -0
- package/dist/utils/policy.js +47 -0
- package/dist/utils/policy.js.map +1 -0
- package/dist/utils/redaction.d.ts +1 -0
- package/dist/utils/redaction.js +15 -0
- package/dist/utils/redaction.js.map +1 -0
- package/dist/utils/response.d.ts +34 -0
- package/dist/utils/response.js +38 -0
- package/dist/utils/response.js.map +1 -0
- package/dist/utils/serialization.d.ts +15 -0
- package/dist/utils/serialization.js +164 -0
- package/dist/utils/serialization.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Sandbox } from "microsandbox";
|
|
3
|
+
import { formatError } from "../utils/errors.js";
|
|
4
|
+
import { compactTruncations, limitText } from "../utils/output.js";
|
|
5
|
+
import { ok } from "../utils/response.js";
|
|
6
|
+
const encodingSchema = z.enum(["utf8", "base64"]);
|
|
7
|
+
const sshClientSchema = z.object({
|
|
8
|
+
name: z.string().describe("Sandbox name"),
|
|
9
|
+
user: z.string().optional().describe("SSH user"),
|
|
10
|
+
term: z.string().optional().describe("Terminal type"),
|
|
11
|
+
});
|
|
12
|
+
export function registerSshTools(server) {
|
|
13
|
+
server.registerTool("sandbox_ssh_exec", {
|
|
14
|
+
title: "Execute Command Over Sandbox SSH",
|
|
15
|
+
description: "Execute a command through the sandbox SSH subsystem.",
|
|
16
|
+
inputSchema: sshClientSchema.extend({
|
|
17
|
+
command: z.string().describe("Command to execute"),
|
|
18
|
+
tty: z.boolean().optional().describe("Allocate a TTY"),
|
|
19
|
+
maxBytes: z.number().int().positive().optional().describe("Maximum stdout/stderr bytes to return"),
|
|
20
|
+
}),
|
|
21
|
+
annotations: {
|
|
22
|
+
readOnlyHint: false,
|
|
23
|
+
destructiveHint: false,
|
|
24
|
+
idempotentHint: false,
|
|
25
|
+
},
|
|
26
|
+
}, async ({ name, user, term, command, tty, maxBytes }) => {
|
|
27
|
+
let client;
|
|
28
|
+
try {
|
|
29
|
+
client = await openSshClient(name, { user, term });
|
|
30
|
+
const output = await client.exec(command, { tty });
|
|
31
|
+
const stdout = limitText(output.stdout.toString("utf8"), "stdout", maxBytes);
|
|
32
|
+
const stderr = limitText(output.stderr.toString("utf8"), "stderr", maxBytes);
|
|
33
|
+
return ok({
|
|
34
|
+
status: output.status,
|
|
35
|
+
success: output.status === 0,
|
|
36
|
+
stdout: stdout.text,
|
|
37
|
+
stderr: stderr.text,
|
|
38
|
+
}, {
|
|
39
|
+
truncated: compactTruncations([stdout.truncated, stderr.truncated]),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
return formatError(error);
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
if (client)
|
|
47
|
+
await client.close();
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
server.registerTool("sandbox_sftp_read", {
|
|
51
|
+
title: "Read File Over Sandbox SFTP",
|
|
52
|
+
description: "Read a file through the sandbox SSH/SFTP subsystem.",
|
|
53
|
+
inputSchema: sshClientSchema.extend({
|
|
54
|
+
path: z.string().describe("Path to read"),
|
|
55
|
+
encoding: encodingSchema.optional().describe("Output encoding. Defaults to utf8."),
|
|
56
|
+
maxBytes: z.number().int().positive().optional().describe("Maximum bytes to return"),
|
|
57
|
+
}),
|
|
58
|
+
annotations: {
|
|
59
|
+
readOnlyHint: true,
|
|
60
|
+
destructiveHint: false,
|
|
61
|
+
idempotentHint: true,
|
|
62
|
+
},
|
|
63
|
+
}, async ({ name, user, term, path, encoding, maxBytes }) => {
|
|
64
|
+
let client;
|
|
65
|
+
let sftp;
|
|
66
|
+
try {
|
|
67
|
+
client = await openSshClient(name, { user, term, sftp: true });
|
|
68
|
+
sftp = await client.sftp();
|
|
69
|
+
const data = await sftp.read(path);
|
|
70
|
+
if ((encoding ?? "utf8") === "base64") {
|
|
71
|
+
const encoded = encodeBytes(data, "content", maxBytes);
|
|
72
|
+
return ok({ path, encoding: "base64", content: encoded.content }, {
|
|
73
|
+
truncated: encoded.truncated ? [encoded.truncated] : undefined,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const limited = limitText(data.toString("utf8"), "content", maxBytes);
|
|
77
|
+
return ok({ path, encoding: "utf8", content: limited.text }, {
|
|
78
|
+
truncated: limited.truncated ? [limited.truncated] : undefined,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
return formatError(error);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
if (sftp)
|
|
86
|
+
await sftp.close();
|
|
87
|
+
if (client)
|
|
88
|
+
await client.close();
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
server.registerTool("sandbox_sftp_write", {
|
|
92
|
+
title: "Write File Over Sandbox SFTP",
|
|
93
|
+
description: "Write a file through the sandbox SSH/SFTP subsystem.",
|
|
94
|
+
inputSchema: sshClientSchema.extend({
|
|
95
|
+
path: z.string().describe("Path to write"),
|
|
96
|
+
content: z.string().describe("Content to write"),
|
|
97
|
+
encoding: encodingSchema.optional().describe("Input encoding. Defaults to utf8."),
|
|
98
|
+
}),
|
|
99
|
+
annotations: {
|
|
100
|
+
readOnlyHint: false,
|
|
101
|
+
destructiveHint: false,
|
|
102
|
+
idempotentHint: true,
|
|
103
|
+
},
|
|
104
|
+
}, async ({ name, user, term, path, content, encoding }) => {
|
|
105
|
+
let client;
|
|
106
|
+
let sftp;
|
|
107
|
+
try {
|
|
108
|
+
client = await openSshClient(name, { user, term, sftp: true });
|
|
109
|
+
sftp = await client.sftp();
|
|
110
|
+
const data = (encoding ?? "utf8") === "base64" ? Buffer.from(content, "base64") : Buffer.from(content, "utf8");
|
|
111
|
+
await sftp.write(path, data);
|
|
112
|
+
return ok({ path, encoding: encoding ?? "utf8", written: data.byteLength });
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
return formatError(error);
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
if (sftp)
|
|
119
|
+
await sftp.close();
|
|
120
|
+
if (client)
|
|
121
|
+
await client.close();
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
server.registerTool("sandbox_sftp_mkdir", {
|
|
125
|
+
title: "Create Directory Over Sandbox SFTP",
|
|
126
|
+
description: "Create a directory through the sandbox SSH/SFTP subsystem.",
|
|
127
|
+
inputSchema: sshClientSchema.extend({
|
|
128
|
+
path: z.string().describe("Directory path"),
|
|
129
|
+
}),
|
|
130
|
+
annotations: {
|
|
131
|
+
readOnlyHint: false,
|
|
132
|
+
destructiveHint: false,
|
|
133
|
+
idempotentHint: true,
|
|
134
|
+
},
|
|
135
|
+
}, async ({ name, user, term, path }) => {
|
|
136
|
+
let client;
|
|
137
|
+
let sftp;
|
|
138
|
+
try {
|
|
139
|
+
client = await openSshClient(name, { user, term, sftp: true });
|
|
140
|
+
sftp = await client.sftp();
|
|
141
|
+
await sftp.mkdir(path);
|
|
142
|
+
return ok({ path, created: true });
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
return formatError(error);
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
if (sftp)
|
|
149
|
+
await sftp.close();
|
|
150
|
+
if (client)
|
|
151
|
+
await client.close();
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
server.registerTool("sandbox_sftp_remove", {
|
|
155
|
+
title: "Remove Path Over Sandbox SFTP",
|
|
156
|
+
description: "Remove a file or directory through the sandbox SSH/SFTP subsystem.",
|
|
157
|
+
inputSchema: sshClientSchema.extend({
|
|
158
|
+
path: z.string().describe("Path to remove"),
|
|
159
|
+
kind: z.enum(["file", "dir"]).describe("Whether to remove a file or directory"),
|
|
160
|
+
}),
|
|
161
|
+
annotations: {
|
|
162
|
+
readOnlyHint: false,
|
|
163
|
+
destructiveHint: true,
|
|
164
|
+
idempotentHint: true,
|
|
165
|
+
},
|
|
166
|
+
}, async ({ name, user, term, path, kind }) => {
|
|
167
|
+
let client;
|
|
168
|
+
let sftp;
|
|
169
|
+
try {
|
|
170
|
+
client = await openSshClient(name, { user, term, sftp: true });
|
|
171
|
+
sftp = await client.sftp();
|
|
172
|
+
if (kind === "dir")
|
|
173
|
+
await sftp.removeDir(path);
|
|
174
|
+
else
|
|
175
|
+
await sftp.removeFile(path);
|
|
176
|
+
return ok({ path, removed: true });
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
return formatError(error);
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
if (sftp)
|
|
183
|
+
await sftp.close();
|
|
184
|
+
if (client)
|
|
185
|
+
await client.close();
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
server.registerTool("sandbox_sftp_rename", {
|
|
189
|
+
title: "Rename Path Over Sandbox SFTP",
|
|
190
|
+
description: "Rename a path through the sandbox SSH/SFTP subsystem.",
|
|
191
|
+
inputSchema: sshClientSchema.extend({
|
|
192
|
+
from: z.string().describe("Old path"),
|
|
193
|
+
to: z.string().describe("New path"),
|
|
194
|
+
}),
|
|
195
|
+
annotations: {
|
|
196
|
+
readOnlyHint: false,
|
|
197
|
+
destructiveHint: false,
|
|
198
|
+
idempotentHint: false,
|
|
199
|
+
},
|
|
200
|
+
}, async ({ name, user, term, from, to }) => {
|
|
201
|
+
let client;
|
|
202
|
+
let sftp;
|
|
203
|
+
try {
|
|
204
|
+
client = await openSshClient(name, { user, term, sftp: true });
|
|
205
|
+
sftp = await client.sftp();
|
|
206
|
+
await sftp.rename(from, to);
|
|
207
|
+
return ok({ from, to, renamed: true });
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
return formatError(error);
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
if (sftp)
|
|
214
|
+
await sftp.close();
|
|
215
|
+
if (client)
|
|
216
|
+
await client.close();
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
server.registerTool("sandbox_sftp_realpath", {
|
|
220
|
+
title: "Resolve SFTP Real Path",
|
|
221
|
+
description: "Resolve a path through the sandbox SSH/SFTP subsystem.",
|
|
222
|
+
inputSchema: sshClientSchema.extend({
|
|
223
|
+
path: z.string().describe("Path to resolve"),
|
|
224
|
+
}),
|
|
225
|
+
annotations: {
|
|
226
|
+
readOnlyHint: true,
|
|
227
|
+
destructiveHint: false,
|
|
228
|
+
idempotentHint: true,
|
|
229
|
+
},
|
|
230
|
+
}, async ({ name, user, term, path }) => {
|
|
231
|
+
let client;
|
|
232
|
+
let sftp;
|
|
233
|
+
try {
|
|
234
|
+
client = await openSshClient(name, { user, term, sftp: true });
|
|
235
|
+
sftp = await client.sftp();
|
|
236
|
+
return ok({ path, realPath: await sftp.realPath(path) });
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
return formatError(error);
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
if (sftp)
|
|
243
|
+
await sftp.close();
|
|
244
|
+
if (client)
|
|
245
|
+
await client.close();
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
server.registerTool("sandbox_sftp_readlink", {
|
|
249
|
+
title: "Read SFTP Symlink",
|
|
250
|
+
description: "Read a symlink target through the sandbox SSH/SFTP subsystem.",
|
|
251
|
+
inputSchema: sshClientSchema.extend({
|
|
252
|
+
path: z.string().describe("Symlink path"),
|
|
253
|
+
}),
|
|
254
|
+
annotations: {
|
|
255
|
+
readOnlyHint: true,
|
|
256
|
+
destructiveHint: false,
|
|
257
|
+
idempotentHint: true,
|
|
258
|
+
},
|
|
259
|
+
}, async ({ name, user, term, path }) => {
|
|
260
|
+
let client;
|
|
261
|
+
let sftp;
|
|
262
|
+
try {
|
|
263
|
+
client = await openSshClient(name, { user, term, sftp: true });
|
|
264
|
+
sftp = await client.sftp();
|
|
265
|
+
return ok({ path, target: await sftp.readLink(path) });
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
return formatError(error);
|
|
269
|
+
}
|
|
270
|
+
finally {
|
|
271
|
+
if (sftp)
|
|
272
|
+
await sftp.close();
|
|
273
|
+
if (client)
|
|
274
|
+
await client.close();
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
server.registerTool("sandbox_sftp_symlink", {
|
|
278
|
+
title: "Create SFTP Symlink",
|
|
279
|
+
description: "Create a symlink through the sandbox SSH/SFTP subsystem.",
|
|
280
|
+
inputSchema: sshClientSchema.extend({
|
|
281
|
+
target: z.string().describe("Symlink target"),
|
|
282
|
+
linkPath: z.string().describe("Symlink path"),
|
|
283
|
+
}),
|
|
284
|
+
annotations: {
|
|
285
|
+
readOnlyHint: false,
|
|
286
|
+
destructiveHint: false,
|
|
287
|
+
idempotentHint: false,
|
|
288
|
+
},
|
|
289
|
+
}, async ({ name, user, term, target, linkPath }) => {
|
|
290
|
+
let client;
|
|
291
|
+
let sftp;
|
|
292
|
+
try {
|
|
293
|
+
client = await openSshClient(name, { user, term, sftp: true });
|
|
294
|
+
sftp = await client.sftp();
|
|
295
|
+
await sftp.symlink(target, linkPath);
|
|
296
|
+
return ok({ target, linkPath, created: true });
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
return formatError(error);
|
|
300
|
+
}
|
|
301
|
+
finally {
|
|
302
|
+
if (sftp)
|
|
303
|
+
await sftp.close();
|
|
304
|
+
if (client)
|
|
305
|
+
await client.close();
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
async function openSshClient(name, options) {
|
|
310
|
+
const handle = await Sandbox.get(name);
|
|
311
|
+
const sandbox = await handle.connect();
|
|
312
|
+
return sandbox.ssh().openClient(options);
|
|
313
|
+
}
|
|
314
|
+
function encodeBytes(data, field, maxBytes) {
|
|
315
|
+
const totalBytes = data.byteLength;
|
|
316
|
+
const returnedBytes = maxBytes && totalBytes > maxBytes ? maxBytes : totalBytes;
|
|
317
|
+
const content = Buffer.from(data.subarray(0, returnedBytes)).toString("base64");
|
|
318
|
+
return {
|
|
319
|
+
content,
|
|
320
|
+
truncated: returnedBytes < totalBytes ? { field, returnedBytes, totalBytes } : undefined,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=ssh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/tools/ssh.ts"],"names":[],"mappings":"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"}
|