just-bash-mcp 2.7.0 → 2.9.0
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 +58 -4
- package/package.json +24 -22
- package/src/config/index.ts +402 -0
- package/{build/index.js → src/index.ts} +12 -6
- package/src/just-bash-security.d.ts +705 -0
- package/src/tools/bash-instance.ts +212 -0
- package/src/tools/exec-tools.ts +165 -0
- package/src/tools/file-tools.ts +206 -0
- package/src/tools/index.ts +45 -0
- package/src/tools/info-tools.ts +175 -0
- package/src/tools/sandbox-tools.ts +217 -0
- package/src/types.ts +111 -0
- package/src/utils/index.ts +84 -0
- package/tsconfig.json +18 -0
- package/build/config/index.d.ts +0 -79
- package/build/config/index.d.ts.map +0 -1
- package/build/config/index.js +0 -178
- package/build/config/index.js.map +0 -1
- package/build/index.d.ts +0 -12
- package/build/index.d.ts.map +0 -1
- package/build/index.js.map +0 -1
- package/build/tools/bash-instance.d.ts +0 -26
- package/build/tools/bash-instance.d.ts.map +0 -1
- package/build/tools/bash-instance.js +0 -106
- package/build/tools/bash-instance.js.map +0 -1
- package/build/tools/exec-tools.d.ts +0 -10
- package/build/tools/exec-tools.d.ts.map +0 -1
- package/build/tools/exec-tools.js +0 -98
- package/build/tools/exec-tools.js.map +0 -1
- package/build/tools/file-tools.d.ts +0 -10
- package/build/tools/file-tools.d.ts.map +0 -1
- package/build/tools/file-tools.js +0 -171
- package/build/tools/file-tools.js.map +0 -1
- package/build/tools/index.d.ts +0 -15
- package/build/tools/index.d.ts.map +0 -1
- package/build/tools/index.js +0 -29
- package/build/tools/index.js.map +0 -1
- package/build/tools/info-tools.d.ts +0 -10
- package/build/tools/info-tools.d.ts.map +0 -1
- package/build/tools/info-tools.js +0 -95
- package/build/tools/info-tools.js.map +0 -1
- package/build/tools/sandbox-tools.d.ts +0 -10
- package/build/tools/sandbox-tools.d.ts.map +0 -1
- package/build/tools/sandbox-tools.js +0 -124
- package/build/tools/sandbox-tools.js.map +0 -1
- package/build/utils/index.d.ts +0 -52
- package/build/utils/index.d.ts.map +0 -1
- package/build/utils/index.js +0 -56
- package/build/utils/index.js.map +0 -1
package/build/config/index.js
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration module for just-bash-mcp
|
|
3
|
-
* Handles environment variable parsing and configuration building
|
|
4
|
-
*/
|
|
5
|
-
import { OverlayFs, ReadWriteFs, } from "just-bash";
|
|
6
|
-
// ============================================================================
|
|
7
|
-
// Environment Variable Parsing
|
|
8
|
-
// ============================================================================
|
|
9
|
-
function parseEnvString(key, defaultValue) {
|
|
10
|
-
return process.env[key] || defaultValue;
|
|
11
|
-
}
|
|
12
|
-
function parseEnvBoolean(key, defaultValue) {
|
|
13
|
-
return process.env[key] === "true" ? true : defaultValue;
|
|
14
|
-
}
|
|
15
|
-
function parseEnvInt(key, defaultValue) {
|
|
16
|
-
const value = process.env[key];
|
|
17
|
-
if (!value)
|
|
18
|
-
return defaultValue;
|
|
19
|
-
const parsed = Number.parseInt(value, 10);
|
|
20
|
-
return Number.isNaN(parsed) ? defaultValue : parsed;
|
|
21
|
-
}
|
|
22
|
-
function parseEnvStringArray(key) {
|
|
23
|
-
return process.env[key]?.split(",").filter(Boolean) || [];
|
|
24
|
-
}
|
|
25
|
-
function getAllowedMethods() {
|
|
26
|
-
const methods = parseEnvStringArray("JUST_BASH_ALLOWED_METHODS");
|
|
27
|
-
return methods.length > 0 ? methods : ["GET", "HEAD"];
|
|
28
|
-
}
|
|
29
|
-
function getAllowedCommands() {
|
|
30
|
-
const commands = parseEnvStringArray("JUST_BASH_ALLOWED_COMMANDS");
|
|
31
|
-
return commands.length > 0 ? commands : undefined;
|
|
32
|
-
}
|
|
33
|
-
export const config = {
|
|
34
|
-
// Server info
|
|
35
|
-
VERSION: "2.7.0",
|
|
36
|
-
SERVER_NAME: "just-bash-mcp",
|
|
37
|
-
// Filesystem configuration
|
|
38
|
-
OVERLAY_ROOT: process.env.JUST_BASH_OVERLAY_ROOT,
|
|
39
|
-
READ_WRITE_ROOT: process.env.JUST_BASH_READ_WRITE_ROOT,
|
|
40
|
-
MOUNTS_CONFIG: process.env.JUST_BASH_MOUNTS,
|
|
41
|
-
INITIAL_CWD: parseEnvString("JUST_BASH_CWD", "/home/user"),
|
|
42
|
-
// Network configuration
|
|
43
|
-
ALLOW_NETWORK: parseEnvBoolean("JUST_BASH_ALLOW_NETWORK", false),
|
|
44
|
-
ALLOWED_URL_PREFIXES: parseEnvStringArray("JUST_BASH_ALLOWED_URLS"),
|
|
45
|
-
ALLOWED_METHODS: getAllowedMethods(),
|
|
46
|
-
MAX_REDIRECTS: parseEnvInt("JUST_BASH_MAX_REDIRECTS", 20),
|
|
47
|
-
NETWORK_TIMEOUT_MS: parseEnvInt("JUST_BASH_NETWORK_TIMEOUT_MS", 30000),
|
|
48
|
-
// Execution limits
|
|
49
|
-
MAX_CALL_DEPTH: parseEnvInt("JUST_BASH_MAX_CALL_DEPTH", 100),
|
|
50
|
-
MAX_COMMAND_COUNT: parseEnvInt("JUST_BASH_MAX_COMMAND_COUNT", 10000),
|
|
51
|
-
MAX_LOOP_ITERATIONS: parseEnvInt("JUST_BASH_MAX_LOOP_ITERATIONS", 10000),
|
|
52
|
-
MAX_SQLITE_TIMEOUT_MS: parseEnvInt("JUST_BASH_MAX_SQLITE_TIMEOUT_MS", 5000),
|
|
53
|
-
MAX_PYTHON_TIMEOUT_MS: parseEnvInt("JUST_BASH_MAX_PYTHON_TIMEOUT_MS", 30000),
|
|
54
|
-
// Output limits
|
|
55
|
-
MAX_OUTPUT_LENGTH: parseEnvInt("JUST_BASH_MAX_OUTPUT_LENGTH", 30000),
|
|
56
|
-
// Debugging
|
|
57
|
-
ENABLE_LOGGING: parseEnvBoolean("JUST_BASH_ENABLE_LOGGING", false),
|
|
58
|
-
ENABLE_TRACING: parseEnvBoolean("JUST_BASH_ENABLE_TRACING", false),
|
|
59
|
-
// Command filtering
|
|
60
|
-
ALLOWED_COMMANDS: getAllowedCommands(),
|
|
61
|
-
};
|
|
62
|
-
// ============================================================================
|
|
63
|
-
// Logger and Trace Callback
|
|
64
|
-
// ============================================================================
|
|
65
|
-
export const bashLogger = config.ENABLE_LOGGING
|
|
66
|
-
? {
|
|
67
|
-
info(message, data) {
|
|
68
|
-
console.error(`[just-bash] INFO: ${message}`, data || "");
|
|
69
|
-
},
|
|
70
|
-
debug(message, data) {
|
|
71
|
-
console.error(`[just-bash] DEBUG: ${message}`, data || "");
|
|
72
|
-
},
|
|
73
|
-
}
|
|
74
|
-
: undefined;
|
|
75
|
-
export const traceCallback = config.ENABLE_TRACING
|
|
76
|
-
? (event) => {
|
|
77
|
-
console.error(`[just-bash] TRACE: ${event.category}/${event.name} ${event.durationMs}ms`, event.details ? JSON.stringify(event.details) : "");
|
|
78
|
-
}
|
|
79
|
-
: undefined;
|
|
80
|
-
// ============================================================================
|
|
81
|
-
// Configuration Builders
|
|
82
|
-
// ============================================================================
|
|
83
|
-
export function buildNetworkConfig() {
|
|
84
|
-
if (!config.ALLOW_NETWORK) {
|
|
85
|
-
return undefined;
|
|
86
|
-
}
|
|
87
|
-
if (config.ALLOWED_URL_PREFIXES.length > 0) {
|
|
88
|
-
return {
|
|
89
|
-
allowedUrlPrefixes: config.ALLOWED_URL_PREFIXES,
|
|
90
|
-
allowedMethods: config.ALLOWED_METHODS,
|
|
91
|
-
maxRedirects: config.MAX_REDIRECTS,
|
|
92
|
-
timeoutMs: config.NETWORK_TIMEOUT_MS,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
return {
|
|
96
|
-
dangerouslyAllowFullInternetAccess: true,
|
|
97
|
-
maxRedirects: config.MAX_REDIRECTS,
|
|
98
|
-
timeoutMs: config.NETWORK_TIMEOUT_MS,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
export function buildExecutionLimits() {
|
|
102
|
-
return {
|
|
103
|
-
maxCallDepth: config.MAX_CALL_DEPTH,
|
|
104
|
-
maxCommandCount: config.MAX_COMMAND_COUNT,
|
|
105
|
-
maxLoopIterations: config.MAX_LOOP_ITERATIONS,
|
|
106
|
-
maxAwkIterations: config.MAX_LOOP_ITERATIONS,
|
|
107
|
-
maxSedIterations: config.MAX_LOOP_ITERATIONS,
|
|
108
|
-
maxJqIterations: config.MAX_LOOP_ITERATIONS,
|
|
109
|
-
maxSqliteTimeoutMs: config.MAX_SQLITE_TIMEOUT_MS,
|
|
110
|
-
maxPythonTimeoutMs: config.MAX_PYTHON_TIMEOUT_MS,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
export function parseMountsConfig() {
|
|
114
|
-
if (!config.MOUNTS_CONFIG)
|
|
115
|
-
return [];
|
|
116
|
-
try {
|
|
117
|
-
const parsed = JSON.parse(config.MOUNTS_CONFIG);
|
|
118
|
-
if (!Array.isArray(parsed))
|
|
119
|
-
return [];
|
|
120
|
-
return parsed.map((mount) => {
|
|
121
|
-
const fsType = mount.type || "overlay";
|
|
122
|
-
const filesystem = fsType === "readwrite"
|
|
123
|
-
? new ReadWriteFs({ root: mount.root })
|
|
124
|
-
: new OverlayFs({ root: mount.root });
|
|
125
|
-
return { mountPoint: mount.mountPoint, filesystem };
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
return [];
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
// ============================================================================
|
|
133
|
-
// Environment Variables Documentation
|
|
134
|
-
// ============================================================================
|
|
135
|
-
export const ENVIRONMENT_VARIABLES = {
|
|
136
|
-
JUST_BASH_OVERLAY_ROOT: "Real directory to mount as overlay (read from disk, write to memory)",
|
|
137
|
-
JUST_BASH_READ_WRITE_ROOT: "Real directory with read-write access",
|
|
138
|
-
JUST_BASH_MOUNTS: "JSON array of mount configurations",
|
|
139
|
-
JUST_BASH_CWD: "Initial working directory (default: /home/user)",
|
|
140
|
-
JUST_BASH_ALLOW_NETWORK: "Enable network access (default: false)",
|
|
141
|
-
JUST_BASH_ALLOWED_URLS: "Comma-separated URL prefixes to allow",
|
|
142
|
-
JUST_BASH_ALLOWED_METHODS: "Comma-separated HTTP methods (default: GET,HEAD)",
|
|
143
|
-
JUST_BASH_ALLOWED_COMMANDS: "Comma-separated list of allowed commands",
|
|
144
|
-
JUST_BASH_MAX_REDIRECTS: "Max HTTP redirects (default: 20)",
|
|
145
|
-
JUST_BASH_NETWORK_TIMEOUT_MS: "Network timeout (default: 30000)",
|
|
146
|
-
JUST_BASH_MAX_CALL_DEPTH: "Max recursion depth (default: 100)",
|
|
147
|
-
JUST_BASH_MAX_COMMAND_COUNT: "Max commands per execution (default: 10000)",
|
|
148
|
-
JUST_BASH_MAX_LOOP_ITERATIONS: "Max loop iterations (default: 10000)",
|
|
149
|
-
JUST_BASH_MAX_SQLITE_TIMEOUT_MS: "SQLite timeout (default: 5000)",
|
|
150
|
-
JUST_BASH_MAX_PYTHON_TIMEOUT_MS: "Python timeout (default: 30000)",
|
|
151
|
-
JUST_BASH_MAX_OUTPUT_LENGTH: "Max output length (default: 30000)",
|
|
152
|
-
JUST_BASH_ENABLE_LOGGING: "Enable debug logging (default: false)",
|
|
153
|
-
JUST_BASH_ENABLE_TRACING: "Enable performance tracing (default: false)",
|
|
154
|
-
};
|
|
155
|
-
// ============================================================================
|
|
156
|
-
// Command Categories Documentation
|
|
157
|
-
// ============================================================================
|
|
158
|
-
export const COMMAND_CATEGORIES = {
|
|
159
|
-
fileOperations: "cat, cp, file, ln, ls, mkdir, mv, readlink, rm, rmdir, split, stat, touch, tree",
|
|
160
|
-
textProcessing: "awk, base64, column, comm, cut, diff, expand, fold, grep (egrep, fgrep), head, join, md5sum, nl, od, paste, printf, rev, rg (ripgrep), sed, sha1sum, sha256sum, sort, strings, tac, tail, tr, unexpand, uniq, wc, xargs",
|
|
161
|
-
dataProcessing: "jq (JSON), python3/python (Python via Pyodide), sqlite3 (SQLite), xan (CSV), yq (YAML/XML/TOML/CSV)",
|
|
162
|
-
compression: "gzip (gunzip, zcat), tar",
|
|
163
|
-
navigation: "basename, cd, dirname, du, echo, env, export, find, hostname, printenv, pwd, tee, whoami",
|
|
164
|
-
shellUtilities: "alias, bash, chmod, clear, date, expr, false, help, history, seq, sh, sleep, time, timeout, true, unalias, which",
|
|
165
|
-
network: "curl, html-to-markdown (when network enabled)",
|
|
166
|
-
};
|
|
167
|
-
// ============================================================================
|
|
168
|
-
// Features Documentation
|
|
169
|
-
// ============================================================================
|
|
170
|
-
export const FEATURES = {
|
|
171
|
-
customCommands: "Define custom TypeScript commands using defineCommand()",
|
|
172
|
-
rawScript: "Preserve leading whitespace in scripts (useful for here-docs)",
|
|
173
|
-
logger: "Optional execution logging via BashLogger interface",
|
|
174
|
-
trace: "Performance profiling via TraceCallback",
|
|
175
|
-
commandFilter: "Restrict available commands via JUST_BASH_ALLOWED_COMMANDS env var",
|
|
176
|
-
sandboxApi: "Vercel Sandbox compatible API via bash_sandbox_* tools",
|
|
177
|
-
};
|
|
178
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* just-bash-mcp - MCP Server for sandboxed bash execution
|
|
4
|
-
*
|
|
5
|
-
* A Model Context Protocol (MCP) server that provides AI agents with a
|
|
6
|
-
* secure, sandboxed bash environment powered by just-bash from Vercel Labs.
|
|
7
|
-
*
|
|
8
|
-
* @see https://github.com/vercel-labs/just-bash
|
|
9
|
-
* @see https://modelcontextprotocol.io
|
|
10
|
-
*/
|
|
11
|
-
export {};
|
|
12
|
-
//# sourceMappingURL=index.d.ts.map
|
package/build/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
|
package/build/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC,WAAW;IACxB,OAAO,EAAE,MAAM,CAAC,OAAO;CACvB,CAAC,CAAC;AAEH,qCAAqC;AACrC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEzB,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,CACZ,GAAG,MAAM,CAAC,WAAW,YAAY,MAAM,CAAC,OAAO,mBAAmB,CAClE,CAAC"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bash instance management
|
|
3
|
-
* Handles creation and lifecycle of Bash instances
|
|
4
|
-
*/
|
|
5
|
-
import { Bash, type CustomCommand, Sandbox } from "just-bash";
|
|
6
|
-
/**
|
|
7
|
-
* Create a new Bash instance with the given configuration
|
|
8
|
-
*/
|
|
9
|
-
export declare function createBashInstance(files?: Record<string, string>, customCommands?: CustomCommand[], env?: Record<string, string>): Bash;
|
|
10
|
-
/**
|
|
11
|
-
* Get or create the persistent Bash instance
|
|
12
|
-
*/
|
|
13
|
-
export declare function getPersistentBash(): Bash;
|
|
14
|
-
/**
|
|
15
|
-
* Reset the persistent Bash instance
|
|
16
|
-
*/
|
|
17
|
-
export declare function resetPersistentBash(): void;
|
|
18
|
-
/**
|
|
19
|
-
* Get or create the persistent Sandbox instance
|
|
20
|
-
*/
|
|
21
|
-
export declare function getPersistentSandbox(): Promise<Sandbox>;
|
|
22
|
-
/**
|
|
23
|
-
* Reset the persistent Sandbox instance
|
|
24
|
-
*/
|
|
25
|
-
export declare function resetPersistentSandbox(): void;
|
|
26
|
-
//# sourceMappingURL=bash-instance.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bash-instance.d.ts","sourceRoot":"","sources":["../../src/tools/bash-instance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,IAAI,EAEJ,KAAK,aAAa,EAKlB,OAAO,EAEP,MAAM,WAAW,CAAC;AAenB;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,cAAc,CAAC,EAAE,aAAa,EAAE,EAChC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,IAAI,CAsDN;AAQD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAQD;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAU7D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bash instance management
|
|
3
|
-
* Handles creation and lifecycle of Bash instances
|
|
4
|
-
*/
|
|
5
|
-
import { Bash, InMemoryFs, MountableFs, OverlayFs, ReadWriteFs, Sandbox, } from "just-bash";
|
|
6
|
-
import { bashLogger, buildExecutionLimits, buildNetworkConfig, config, parseMountsConfig, traceCallback, } from "../config/index.js";
|
|
7
|
-
// ============================================================================
|
|
8
|
-
// Bash Instance Factory
|
|
9
|
-
// ============================================================================
|
|
10
|
-
/**
|
|
11
|
-
* Create a new Bash instance with the given configuration
|
|
12
|
-
*/
|
|
13
|
-
export function createBashInstance(files, customCommands, env) {
|
|
14
|
-
const networkConfig = buildNetworkConfig();
|
|
15
|
-
const executionLimits = buildExecutionLimits();
|
|
16
|
-
const baseOptions = {
|
|
17
|
-
network: networkConfig,
|
|
18
|
-
executionLimits,
|
|
19
|
-
files,
|
|
20
|
-
env,
|
|
21
|
-
logger: bashLogger,
|
|
22
|
-
trace: traceCallback,
|
|
23
|
-
customCommands,
|
|
24
|
-
commands: config.ALLOWED_COMMANDS,
|
|
25
|
-
};
|
|
26
|
-
// Check for mountable filesystem configuration
|
|
27
|
-
const mounts = parseMountsConfig();
|
|
28
|
-
if (mounts.length > 0) {
|
|
29
|
-
const mountableFs = new MountableFs({
|
|
30
|
-
base: new InMemoryFs(),
|
|
31
|
-
mounts,
|
|
32
|
-
});
|
|
33
|
-
return new Bash({
|
|
34
|
-
...baseOptions,
|
|
35
|
-
fs: mountableFs,
|
|
36
|
-
cwd: config.INITIAL_CWD,
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
// Check for read-write filesystem configuration
|
|
40
|
-
if (config.READ_WRITE_ROOT) {
|
|
41
|
-
const rwfs = new ReadWriteFs({ root: config.READ_WRITE_ROOT });
|
|
42
|
-
return new Bash({
|
|
43
|
-
...baseOptions,
|
|
44
|
-
fs: rwfs,
|
|
45
|
-
cwd: config.READ_WRITE_ROOT,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
// Check for overlay filesystem configuration
|
|
49
|
-
if (config.OVERLAY_ROOT) {
|
|
50
|
-
const overlay = new OverlayFs({ root: config.OVERLAY_ROOT });
|
|
51
|
-
return new Bash({
|
|
52
|
-
...baseOptions,
|
|
53
|
-
fs: overlay,
|
|
54
|
-
cwd: overlay.getMountPoint(),
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
// Default: in-memory filesystem
|
|
58
|
-
return new Bash({
|
|
59
|
-
...baseOptions,
|
|
60
|
-
cwd: config.INITIAL_CWD,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
// ============================================================================
|
|
64
|
-
// Persistent Bash Instance (singleton pattern)
|
|
65
|
-
// ============================================================================
|
|
66
|
-
let persistentBash = null;
|
|
67
|
-
/**
|
|
68
|
-
* Get or create the persistent Bash instance
|
|
69
|
-
*/
|
|
70
|
-
export function getPersistentBash() {
|
|
71
|
-
if (!persistentBash) {
|
|
72
|
-
persistentBash = createBashInstance();
|
|
73
|
-
}
|
|
74
|
-
return persistentBash;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Reset the persistent Bash instance
|
|
78
|
-
*/
|
|
79
|
-
export function resetPersistentBash() {
|
|
80
|
-
persistentBash = null;
|
|
81
|
-
}
|
|
82
|
-
// ============================================================================
|
|
83
|
-
// Persistent Sandbox Instance (singleton pattern)
|
|
84
|
-
// ============================================================================
|
|
85
|
-
let persistentSandbox = null;
|
|
86
|
-
/**
|
|
87
|
-
* Get or create the persistent Sandbox instance
|
|
88
|
-
*/
|
|
89
|
-
export async function getPersistentSandbox() {
|
|
90
|
-
if (!persistentSandbox) {
|
|
91
|
-
const networkConfig = buildNetworkConfig();
|
|
92
|
-
const options = {
|
|
93
|
-
cwd: config.INITIAL_CWD,
|
|
94
|
-
network: networkConfig,
|
|
95
|
-
};
|
|
96
|
-
persistentSandbox = await Sandbox.create(options);
|
|
97
|
-
}
|
|
98
|
-
return persistentSandbox;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Reset the persistent Sandbox instance
|
|
102
|
-
*/
|
|
103
|
-
export function resetPersistentSandbox() {
|
|
104
|
-
persistentSandbox = null;
|
|
105
|
-
}
|
|
106
|
-
//# sourceMappingURL=bash-instance.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bash-instance.js","sourceRoot":"","sources":["../../src/tools/bash-instance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bash execution tools
|
|
3
|
-
* Core tools for executing bash commands
|
|
4
|
-
*/
|
|
5
|
-
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
-
/**
|
|
7
|
-
* Register bash execution tools with the MCP server
|
|
8
|
-
*/
|
|
9
|
-
export declare function registerExecTools(server: McpServer): void;
|
|
10
|
-
//# sourceMappingURL=exec-tools.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exec-tools.d.ts","sourceRoot":"","sources":["../../src/tools/exec-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmIzD"}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bash execution tools
|
|
3
|
-
* Core tools for executing bash commands
|
|
4
|
-
*/
|
|
5
|
-
import { z } from "zod/v4";
|
|
6
|
-
import { createErrorResponse, formatExecResult } from "../utils/index.js";
|
|
7
|
-
import { createBashInstance, getPersistentBash, resetPersistentBash, } from "./bash-instance.js";
|
|
8
|
-
/**
|
|
9
|
-
* Register bash execution tools with the MCP server
|
|
10
|
-
*/
|
|
11
|
-
export function registerExecTools(server) {
|
|
12
|
-
// ========================================================================
|
|
13
|
-
// bash_exec - Isolated execution
|
|
14
|
-
// ========================================================================
|
|
15
|
-
server.registerTool("bash_exec", {
|
|
16
|
-
description: "Execute a bash command in a sandboxed environment. Each execution is isolated - environment variables, functions, and cwd don't persist across calls (filesystem does).",
|
|
17
|
-
inputSchema: {
|
|
18
|
-
command: z.string().describe("The bash command to execute"),
|
|
19
|
-
cwd: z
|
|
20
|
-
.string()
|
|
21
|
-
.optional()
|
|
22
|
-
.describe("Working directory for the command"),
|
|
23
|
-
env: z
|
|
24
|
-
.record(z.string(), z.string())
|
|
25
|
-
.optional()
|
|
26
|
-
.describe("Environment variables to set for execution"),
|
|
27
|
-
initialEnv: z
|
|
28
|
-
.record(z.string(), z.string())
|
|
29
|
-
.optional()
|
|
30
|
-
.describe("Initial environment variables to set when creating the bash instance"),
|
|
31
|
-
files: z
|
|
32
|
-
.record(z.string(), z.string())
|
|
33
|
-
.optional()
|
|
34
|
-
.describe("Files to create before execution (path -> content)"),
|
|
35
|
-
rawScript: z
|
|
36
|
-
.boolean()
|
|
37
|
-
.optional()
|
|
38
|
-
.describe("If true, skip normalizing the script (preserves leading whitespace). Useful for here-docs."),
|
|
39
|
-
},
|
|
40
|
-
}, async ({ command, cwd, env, initialEnv, files, rawScript, }) => {
|
|
41
|
-
try {
|
|
42
|
-
const bash = createBashInstance(files, undefined, initialEnv);
|
|
43
|
-
const result = await bash.exec(command, { cwd, env, rawScript });
|
|
44
|
-
return formatExecResult(result);
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
return createErrorResponse(error, "Execution error");
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
// ========================================================================
|
|
51
|
-
// bash_exec_persistent - Persistent execution
|
|
52
|
-
// ========================================================================
|
|
53
|
-
server.registerTool("bash_exec_persistent", {
|
|
54
|
-
description: "Execute a bash command in a persistent sandboxed environment. The filesystem persists across calls, but env vars, functions, and cwd are reset each call.",
|
|
55
|
-
inputSchema: {
|
|
56
|
-
command: z.string().describe("The bash command to execute"),
|
|
57
|
-
cwd: z
|
|
58
|
-
.string()
|
|
59
|
-
.optional()
|
|
60
|
-
.describe("Working directory for the command"),
|
|
61
|
-
env: z
|
|
62
|
-
.record(z.string(), z.string())
|
|
63
|
-
.optional()
|
|
64
|
-
.describe("Environment variables to set"),
|
|
65
|
-
rawScript: z
|
|
66
|
-
.boolean()
|
|
67
|
-
.optional()
|
|
68
|
-
.describe("If true, skip normalizing the script (preserves leading whitespace). Useful for here-docs."),
|
|
69
|
-
},
|
|
70
|
-
}, async ({ command, cwd, env, rawScript, }) => {
|
|
71
|
-
try {
|
|
72
|
-
const bash = getPersistentBash();
|
|
73
|
-
const result = await bash.exec(command, { cwd, env, rawScript });
|
|
74
|
-
return formatExecResult(result);
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
return createErrorResponse(error, "Execution error");
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
// ========================================================================
|
|
81
|
-
// bash_reset - Reset persistent environment
|
|
82
|
-
// ========================================================================
|
|
83
|
-
server.registerTool("bash_reset", {
|
|
84
|
-
description: "Reset the persistent bash environment, clearing all files and state.",
|
|
85
|
-
inputSchema: {},
|
|
86
|
-
}, async () => {
|
|
87
|
-
resetPersistentBash();
|
|
88
|
-
return {
|
|
89
|
-
content: [
|
|
90
|
-
{
|
|
91
|
-
type: "text",
|
|
92
|
-
text: "Persistent bash environment has been reset.",
|
|
93
|
-
},
|
|
94
|
-
],
|
|
95
|
-
};
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=exec-tools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exec-tools.js","sourceRoot":"","sources":["../../src/tools/exec-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File operation tools
|
|
3
|
-
* Tools for reading, writing, and listing files in the bash environment
|
|
4
|
-
*/
|
|
5
|
-
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
-
/**
|
|
7
|
-
* Register file operation tools with the MCP server
|
|
8
|
-
*/
|
|
9
|
-
export declare function registerFileTools(server: McpServer): void;
|
|
10
|
-
//# sourceMappingURL=file-tools.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-tools.d.ts","sourceRoot":"","sources":["../../src/tools/file-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkNzD"}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File operation tools
|
|
3
|
-
* Tools for reading, writing, and listing files in the bash environment
|
|
4
|
-
*/
|
|
5
|
-
import { z } from "zod/v4";
|
|
6
|
-
import { config } from "../config/index.js";
|
|
7
|
-
import { createErrorResponse, createSuccessResponse, truncateOutput, } from "../utils/index.js";
|
|
8
|
-
import { getPersistentBash } from "./bash-instance.js";
|
|
9
|
-
/**
|
|
10
|
-
* Register file operation tools with the MCP server
|
|
11
|
-
*/
|
|
12
|
-
export function registerFileTools(server) {
|
|
13
|
-
// ========================================================================
|
|
14
|
-
// bash_write_file - Write file via shell
|
|
15
|
-
// ========================================================================
|
|
16
|
-
server.registerTool("bash_write_file", {
|
|
17
|
-
description: "Write content to a file in the persistent bash environment.",
|
|
18
|
-
inputSchema: {
|
|
19
|
-
path: z.string().describe("The file path to write to"),
|
|
20
|
-
content: z.string().describe("The content to write"),
|
|
21
|
-
},
|
|
22
|
-
}, async ({ path, content }) => {
|
|
23
|
-
try {
|
|
24
|
-
const bash = getPersistentBash();
|
|
25
|
-
const escapedContent = content.replace(/'/g, "'\\''");
|
|
26
|
-
const result = await bash.exec(`mkdir -p "$(dirname '${path}')" && cat > '${path}' << 'JUST_BASH_EOF'\n${escapedContent}\nJUST_BASH_EOF`);
|
|
27
|
-
if (result.exitCode !== 0) {
|
|
28
|
-
return {
|
|
29
|
-
content: [
|
|
30
|
-
{
|
|
31
|
-
type: "text",
|
|
32
|
-
text: `Failed to write file: ${result.stderr}`,
|
|
33
|
-
},
|
|
34
|
-
],
|
|
35
|
-
isError: true,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
return createSuccessResponse(`Successfully wrote ${content.length} bytes to ${path}`);
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
return createErrorResponse(error, "Write error");
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
// ========================================================================
|
|
45
|
-
// bash_read_file - Read file via shell
|
|
46
|
-
// ========================================================================
|
|
47
|
-
server.registerTool("bash_read_file", {
|
|
48
|
-
description: "Read content from a file in the persistent bash environment.",
|
|
49
|
-
inputSchema: {
|
|
50
|
-
path: z.string().describe("The file path to read"),
|
|
51
|
-
},
|
|
52
|
-
}, async ({ path }) => {
|
|
53
|
-
try {
|
|
54
|
-
const bash = getPersistentBash();
|
|
55
|
-
const result = await bash.exec(`cat '${path}'`);
|
|
56
|
-
if (result.exitCode !== 0) {
|
|
57
|
-
return {
|
|
58
|
-
content: [
|
|
59
|
-
{
|
|
60
|
-
type: "text",
|
|
61
|
-
text: `Failed to read file: ${result.stderr}`,
|
|
62
|
-
},
|
|
63
|
-
],
|
|
64
|
-
isError: true,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
return {
|
|
68
|
-
content: [
|
|
69
|
-
{
|
|
70
|
-
type: "text",
|
|
71
|
-
text: truncateOutput(result.stdout, config.MAX_OUTPUT_LENGTH, "stdout"),
|
|
72
|
-
},
|
|
73
|
-
],
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
return createErrorResponse(error, "Read error");
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
// ========================================================================
|
|
81
|
-
// bash_list_files - List files
|
|
82
|
-
// ========================================================================
|
|
83
|
-
server.registerTool("bash_list_files", {
|
|
84
|
-
description: "List files and directories in the persistent bash environment.",
|
|
85
|
-
inputSchema: {
|
|
86
|
-
path: z
|
|
87
|
-
.string()
|
|
88
|
-
.optional()
|
|
89
|
-
.describe("The directory path to list (defaults to current directory)"),
|
|
90
|
-
recursive: z
|
|
91
|
-
.boolean()
|
|
92
|
-
.optional()
|
|
93
|
-
.describe("Whether to list recursively"),
|
|
94
|
-
showHidden: z
|
|
95
|
-
.boolean()
|
|
96
|
-
.optional()
|
|
97
|
-
.describe("Whether to show hidden files"),
|
|
98
|
-
},
|
|
99
|
-
}, async ({ path = ".", recursive = false, showHidden = false, }) => {
|
|
100
|
-
try {
|
|
101
|
-
const bash = getPersistentBash();
|
|
102
|
-
let cmd;
|
|
103
|
-
if (recursive) {
|
|
104
|
-
cmd = showHidden
|
|
105
|
-
? `find '${path}' -type f`
|
|
106
|
-
: `find '${path}' -type f ! -name '.*' ! -path '*/.*'`;
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
cmd = showHidden ? `ls -la '${path}'` : `ls -l '${path}'`;
|
|
110
|
-
}
|
|
111
|
-
const result = await bash.exec(cmd);
|
|
112
|
-
return {
|
|
113
|
-
content: [
|
|
114
|
-
{
|
|
115
|
-
type: "text",
|
|
116
|
-
text: result.stdout || "(empty directory)",
|
|
117
|
-
},
|
|
118
|
-
],
|
|
119
|
-
isError: result.exitCode !== 0,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
return createErrorResponse(error, "List error");
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
// ========================================================================
|
|
127
|
-
// bash_direct_read - Direct filesystem read
|
|
128
|
-
// ========================================================================
|
|
129
|
-
server.registerTool("bash_direct_read", {
|
|
130
|
-
description: "Read a file directly from the persistent bash filesystem (without running cat).",
|
|
131
|
-
inputSchema: {
|
|
132
|
-
path: z.string().describe("The file path to read"),
|
|
133
|
-
},
|
|
134
|
-
}, async ({ path }) => {
|
|
135
|
-
try {
|
|
136
|
-
const bash = getPersistentBash();
|
|
137
|
-
const content = await bash.readFile(path);
|
|
138
|
-
return {
|
|
139
|
-
content: [
|
|
140
|
-
{
|
|
141
|
-
type: "text",
|
|
142
|
-
text: truncateOutput(content, config.MAX_OUTPUT_LENGTH, "stdout"),
|
|
143
|
-
},
|
|
144
|
-
],
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
return createErrorResponse(error, "Read error");
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
// ========================================================================
|
|
152
|
-
// bash_direct_write - Direct filesystem write
|
|
153
|
-
// ========================================================================
|
|
154
|
-
server.registerTool("bash_direct_write", {
|
|
155
|
-
description: "Write a file directly to the persistent bash filesystem (without running shell commands).",
|
|
156
|
-
inputSchema: {
|
|
157
|
-
path: z.string().describe("The file path to write"),
|
|
158
|
-
content: z.string().describe("The content to write"),
|
|
159
|
-
},
|
|
160
|
-
}, async ({ path, content }) => {
|
|
161
|
-
try {
|
|
162
|
-
const bash = getPersistentBash();
|
|
163
|
-
await bash.writeFile(path, content);
|
|
164
|
-
return createSuccessResponse(`Successfully wrote ${content.length} bytes to ${path}`);
|
|
165
|
-
}
|
|
166
|
-
catch (error) {
|
|
167
|
-
return createErrorResponse(error, "Write error");
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
//# sourceMappingURL=file-tools.js.map
|