mcp-terminal-runner 0.2.1 → 0.3.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 +49 -3
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -164
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +81 -3
- package/dist/index.test.js.map +1 -1
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +15 -0
- package/dist/server.js.map +1 -0
- package/dist/services/SessionManager.d.ts +26 -0
- package/dist/services/SessionManager.d.ts.map +1 -0
- package/dist/services/SessionManager.js +97 -0
- package/dist/services/SessionManager.js.map +1 -0
- package/dist/services/session-manager.d.ts +26 -0
- package/dist/services/session-manager.d.ts.map +1 -0
- package/dist/services/session-manager.js +105 -0
- package/dist/services/session-manager.js.map +1 -0
- package/dist/tools/execute.d.ts +3 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +50 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/session.d.ts +3 -0
- package/dist/tools/session.d.ts.map +1 -0
- package/dist/tools/session.js +151 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/command.d.ts +7 -0
- package/dist/utils/command.d.ts.map +1 -0
- package/dist/utils/command.js +63 -0
- package/dist/utils/command.js.map +1 -0
- package/dist/utils/env.d.ts +2 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +14 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/paths.d.ts +4 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +87 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,6 +5,7 @@ An MCP server that allows AI agents to execute terminal commands on the host sys
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
7
|
- **Execute Command**: Run shell commands and retrieve stdout, stderr, and exit code. Supports pipes, redirects, and command chaining (e.g., `&&`).
|
|
8
|
+
- **Interactive Sessions**: Start background processes, write to stdin, and read stdout/stderr in real-time. Perfect for long-running tasks or interactive tools.
|
|
8
9
|
- **Security**: Strict allowlist system via `ALLOWED_COMMANDS` environment variable.
|
|
9
10
|
- **Cross-Platform**: Works on Linux, macOS, and Windows.
|
|
10
11
|
|
|
@@ -74,17 +75,62 @@ Add the following to your MCP client configuration (e.g., VS Code `settings.json
|
|
|
74
75
|
### Available Tools
|
|
75
76
|
|
|
76
77
|
#### `execute_command`
|
|
77
|
-
|
|
78
|
+
Execute a shell command. Note: This tool is for non-interactive, short-lived commands. For interactive or long-running processes, use `start_command` instead.
|
|
78
79
|
|
|
79
80
|
- **Input**:
|
|
80
|
-
- `command` (string): The
|
|
81
|
-
- `cwd` (string, optional):
|
|
81
|
+
- `command` (string): The shell command to execute.
|
|
82
|
+
- `cwd` (string, optional): Optional working directory to execute the command within.
|
|
83
|
+
- `input` (string, optional): Optional input to write to stdin. Useful for commands that require user interaction.
|
|
82
84
|
- **Output**:
|
|
83
85
|
- Returns a YAML-formatted string containing:
|
|
84
86
|
- `exit_code`: The command's exit code.
|
|
85
87
|
- `stdout`: Standard output.
|
|
86
88
|
- `stderr`: Standard error.
|
|
87
89
|
|
|
90
|
+
#### `start_command`
|
|
91
|
+
Start a background command session. Use this for interactive commands or long-running processes.
|
|
92
|
+
|
|
93
|
+
- **Input**:
|
|
94
|
+
- `command` (string): The shell command to execute.
|
|
95
|
+
- `cwd` (string, optional): Optional working directory to execute the command within.
|
|
96
|
+
- `timeout` (number, optional): Maximum time (in milliseconds) to wait for initial output. Default is 0 (no wait).
|
|
97
|
+
- **Output**:
|
|
98
|
+
- Returns a YAML-formatted string containing:
|
|
99
|
+
- `sessionId`: The ID of the created session.
|
|
100
|
+
- `pid`: The process ID.
|
|
101
|
+
- `stdout`: Initial standard output (if timeout > 0).
|
|
102
|
+
- `stderr`: Initial standard error (if timeout > 0).
|
|
103
|
+
|
|
104
|
+
#### `read_output`
|
|
105
|
+
Read buffered output from a command session.
|
|
106
|
+
|
|
107
|
+
- **Input**:
|
|
108
|
+
- `sessionId` (string): The ID of the session.
|
|
109
|
+
- `timeout` (number, optional): Maximum time (in milliseconds) to wait for new output if the buffer is empty. Default is 0 (no wait).
|
|
110
|
+
- **Output**:
|
|
111
|
+
- Returns a YAML-formatted string containing:
|
|
112
|
+
- `stdout`: Standard output since last read.
|
|
113
|
+
- `stderr`: Standard error since last read.
|
|
114
|
+
- `isActive`: Boolean indicating if the process is still running.
|
|
115
|
+
|
|
116
|
+
#### `write_input`
|
|
117
|
+
Write input to a command session.
|
|
118
|
+
|
|
119
|
+
- **Input**:
|
|
120
|
+
- `sessionId` (string): The ID of the session.
|
|
121
|
+
- `input` (string): The input to write.
|
|
122
|
+
- **Output**:
|
|
123
|
+
- Returns a YAML-formatted string containing `success: true`.
|
|
124
|
+
|
|
125
|
+
#### `stop_command`
|
|
126
|
+
Stop a command session.
|
|
127
|
+
|
|
128
|
+
- **Input**:
|
|
129
|
+
- `sessionId` (string): The ID of the session.
|
|
130
|
+
- `signal` (string, optional): The signal to send (default: SIGTERM).
|
|
131
|
+
- **Output**:
|
|
132
|
+
- Returns a YAML-formatted string containing `success: true`.
|
|
133
|
+
|
|
88
134
|
## Development
|
|
89
135
|
|
|
90
136
|
### Setup
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,174 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
-
};
|
|
6
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
4
|
exports.server = void 0;
|
|
8
|
-
const promises_1 = require("node:fs/promises");
|
|
9
|
-
const node_path_1 = require("node:path");
|
|
10
|
-
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
11
5
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const version = '0.1.0';
|
|
18
|
-
const server = new mcp_js_1.McpServer({
|
|
19
|
-
name: 'mcp-terminal-runner',
|
|
20
|
-
version,
|
|
21
|
-
}, {
|
|
22
|
-
capabilities: {
|
|
23
|
-
tools: {},
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
exports.server = server;
|
|
27
|
-
const parseCommaSeparatedEnv = (value) => {
|
|
28
|
-
if (!value) {
|
|
29
|
-
return [];
|
|
30
|
-
}
|
|
31
|
-
return value
|
|
32
|
-
.split(',')
|
|
33
|
-
.map((item) => item.trim())
|
|
34
|
-
.filter((item) => item.length > 0);
|
|
35
|
-
};
|
|
36
|
-
const isWithinRoot = (root, target) => {
|
|
37
|
-
const rel = (0, node_path_1.relative)(root, target);
|
|
38
|
-
if (rel === '') {
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
const isOutsideRoot = rel.startsWith('..') || (0, node_path_1.isAbsolute)(rel);
|
|
42
|
-
return !isOutsideRoot;
|
|
43
|
-
};
|
|
44
|
-
const resolveAndValidateCwd = async (cwdInput) => {
|
|
45
|
-
if (process.platform === 'win32' && cwdInput.startsWith('/')) {
|
|
46
|
-
const allowedRoots = parseCommaSeparatedEnv(process.env.ALLOWED_CWD_ROOTS);
|
|
47
|
-
if (allowedRoots.length === 0) {
|
|
48
|
-
return cwdInput;
|
|
49
|
-
}
|
|
50
|
-
const cwdNormalized = node_path_1.posix.normalize(cwdInput);
|
|
51
|
-
const allowed = allowedRoots.some((root) => {
|
|
52
|
-
const rel = node_path_1.posix.relative(root, cwdNormalized);
|
|
53
|
-
return rel === '' || !(rel.startsWith('..') || node_path_1.posix.isAbsolute(rel));
|
|
54
|
-
});
|
|
55
|
-
if (!allowed) {
|
|
56
|
-
throw new Error('cwd is not allowed by ALLOWED_CWD_ROOTS');
|
|
57
|
-
}
|
|
58
|
-
return cwdInput;
|
|
59
|
-
}
|
|
60
|
-
const cwdResolved = (0, node_path_1.resolve)(process.cwd(), cwdInput);
|
|
61
|
-
try {
|
|
62
|
-
const cwdStat = await (0, promises_1.stat)(cwdResolved);
|
|
63
|
-
if (!cwdStat.isDirectory()) {
|
|
64
|
-
throw new Error(`cwd is not a directory: ${cwdInput}`);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
catch (error) {
|
|
68
|
-
if (error instanceof Error &&
|
|
69
|
-
error.message.includes('cwd is not a directory')) {
|
|
70
|
-
throw error;
|
|
71
|
-
}
|
|
72
|
-
throw new Error(`cwd does not exist: ${cwdInput}`);
|
|
73
|
-
}
|
|
74
|
-
const cwdCanonical = await (0, promises_1.realpath)(cwdResolved);
|
|
75
|
-
const allowedRoots = parseCommaSeparatedEnv(process.env.ALLOWED_CWD_ROOTS);
|
|
76
|
-
if (allowedRoots.length === 0) {
|
|
77
|
-
return cwdResolved;
|
|
78
|
-
}
|
|
79
|
-
const canonicalRoots = await Promise.all(allowedRoots.map(async (root) => {
|
|
80
|
-
const rootResolved = (0, node_path_1.resolve)(process.cwd(), root);
|
|
81
|
-
try {
|
|
82
|
-
return await (0, promises_1.realpath)(rootResolved);
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
throw new Error(`Invalid configuration: ALLOWED_CWD_ROOTS contains an invalid root: ${root}`);
|
|
86
|
-
}
|
|
87
|
-
}));
|
|
88
|
-
const allowed = canonicalRoots.some((root) => isWithinRoot(root, cwdCanonical));
|
|
89
|
-
if (!allowed) {
|
|
90
|
-
throw new Error('cwd is not allowed by ALLOWED_CWD_ROOTS');
|
|
91
|
-
}
|
|
92
|
-
return cwdResolved;
|
|
93
|
-
};
|
|
94
|
-
const runCommand = async (command, cwd) => new Promise((resolvePromise, rejectPromise) => {
|
|
95
|
-
const child = (0, cross_spawn_1.default)(command, {
|
|
96
|
-
cwd,
|
|
97
|
-
shell: true,
|
|
98
|
-
windowsHide: true,
|
|
99
|
-
});
|
|
100
|
-
let stdout = '';
|
|
101
|
-
let stderr = '';
|
|
102
|
-
child.stdout?.setEncoding('utf8');
|
|
103
|
-
child.stderr?.setEncoding('utf8');
|
|
104
|
-
child.stdout?.on('data', (chunk) => {
|
|
105
|
-
stdout += chunk;
|
|
106
|
-
});
|
|
107
|
-
child.stderr?.on('data', (chunk) => {
|
|
108
|
-
stderr += chunk;
|
|
109
|
-
});
|
|
110
|
-
child.on('error', (error) => {
|
|
111
|
-
rejectPromise(error);
|
|
112
|
-
});
|
|
113
|
-
child.on('close', (code) => {
|
|
114
|
-
resolvePromise({
|
|
115
|
-
exitCode: typeof code === 'number' ? code : 1,
|
|
116
|
-
stdout,
|
|
117
|
-
stderr,
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
server.tool('execute_command', 'Execute a shell command', {
|
|
122
|
-
command: zod_1.z.string().describe('The shell command to execute'),
|
|
123
|
-
cwd: zod_1.z
|
|
124
|
-
.string()
|
|
125
|
-
.optional()
|
|
126
|
-
.describe('Optional working directory to execute the command within'),
|
|
127
|
-
}, async (args) => {
|
|
128
|
-
const [bin, ...commandArgs] = (0, args_tokenizer_1.tokenizeArgs)(args.command);
|
|
129
|
-
const allowedCommands = parseCommaSeparatedEnv(process.env.ALLOWED_COMMANDS);
|
|
130
|
-
try {
|
|
131
|
-
if (!(allowedCommands.includes('*') || allowedCommands.includes(bin))) {
|
|
132
|
-
throw new Error(`Command "${bin}" is not allowed, allowed commands: ${allowedCommands.length > 0 ? allowedCommands.join(', ') : '(none)'}`);
|
|
133
|
-
}
|
|
134
|
-
const cwdResolved = args.cwd
|
|
135
|
-
? await resolveAndValidateCwd(args.cwd)
|
|
136
|
-
: undefined;
|
|
137
|
-
let finalCommand = args.command;
|
|
138
|
-
let finalCwd = cwdResolved;
|
|
139
|
-
if (process.platform === 'win32' && cwdResolved?.startsWith('/')) {
|
|
140
|
-
finalCommand = `wsl --cd "${cwdResolved}" -- bash -c "${args.command.replace(/"/g, '\\"')}"`;
|
|
141
|
-
finalCwd = undefined;
|
|
142
|
-
}
|
|
143
|
-
const result = await runCommand(finalCommand, finalCwd);
|
|
144
|
-
return {
|
|
145
|
-
content: [
|
|
146
|
-
{
|
|
147
|
-
type: 'text',
|
|
148
|
-
text: (0, js_yaml_1.dump)({
|
|
149
|
-
exit_code: result.exitCode,
|
|
150
|
-
stdout: result.stdout,
|
|
151
|
-
stderr: result.stderr,
|
|
152
|
-
}),
|
|
153
|
-
},
|
|
154
|
-
],
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
catch (error) {
|
|
158
|
-
return {
|
|
159
|
-
content: [
|
|
160
|
-
{
|
|
161
|
-
type: 'text',
|
|
162
|
-
text: `Error executing command: ${error instanceof Error ? error.message : String(error)}`,
|
|
163
|
-
},
|
|
164
|
-
],
|
|
165
|
-
isError: true,
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
});
|
|
6
|
+
const server_js_1 = require("./server.js");
|
|
7
|
+
const index_js_1 = require("./tools/index.js");
|
|
8
|
+
// biome-ignore lint/performance/noBarrelFile: entry point
|
|
9
|
+
var server_js_2 = require("./server.js");
|
|
10
|
+
Object.defineProperty(exports, "server", { enumerable: true, get: function () { return server_js_2.server; } });
|
|
169
11
|
async function main() {
|
|
12
|
+
(0, index_js_1.registerTools)(server_js_1.server);
|
|
170
13
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
171
|
-
await server.connect(transport);
|
|
14
|
+
await server_js_1.server.connect(transport);
|
|
172
15
|
}
|
|
173
16
|
if (require.main === module) {
|
|
174
17
|
main().catch((error) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAEA,wEAAiF;AACjF,2CAAqC;AACrC,+CAAiD;AAEjD,0DAA0D;AAC1D,yCAAqC;AAA5B,mGAAA,MAAM,OAAA;AAEf,KAAK,UAAU,IAAI;IACjB,IAAA,wBAAa,EAAC,kBAAM,CAAC,CAAC;IACtB,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,kBAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.test.js
CHANGED
|
@@ -7,8 +7,12 @@ const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
|
|
|
7
7
|
const inMemory_js_1 = require("@modelcontextprotocol/sdk/inMemory.js");
|
|
8
8
|
const js_yaml_1 = require("js-yaml");
|
|
9
9
|
const index_js_2 = require("./index.js");
|
|
10
|
+
const index_js_3 = require("./tools/index.js");
|
|
10
11
|
describe('MCP Server', () => {
|
|
11
12
|
let client;
|
|
13
|
+
beforeAll(() => {
|
|
14
|
+
(0, index_js_3.registerTools)(index_js_2.server);
|
|
15
|
+
});
|
|
12
16
|
beforeEach(async () => {
|
|
13
17
|
const [clientTransport, serverTransport] = inMemory_js_1.InMemoryTransport.createLinkedPair();
|
|
14
18
|
// Connect server
|
|
@@ -61,13 +65,72 @@ describe('MCP Server', () => {
|
|
|
61
65
|
const output = (0, js_yaml_1.load)(text);
|
|
62
66
|
expect(output.exit_code).toBe(0);
|
|
63
67
|
});
|
|
68
|
+
describe('Interactive Session', () => {
|
|
69
|
+
it('should support full interactive flow', async () => {
|
|
70
|
+
process.env.ALLOWED_COMMANDS = 'cat';
|
|
71
|
+
// 1. Start command
|
|
72
|
+
const startResult = await client.callTool({
|
|
73
|
+
name: 'start_command',
|
|
74
|
+
arguments: { command: 'cat' },
|
|
75
|
+
});
|
|
76
|
+
expect(startResult.isError).not.toBe(true);
|
|
77
|
+
const startOutput = (0, js_yaml_1.load)(startResult.content[0].text);
|
|
78
|
+
const sessionId = startOutput.sessionId;
|
|
79
|
+
expect(sessionId).toBeDefined();
|
|
80
|
+
// 2. Write input
|
|
81
|
+
const writeResult = await client.callTool({
|
|
82
|
+
name: 'write_input',
|
|
83
|
+
arguments: { sessionId, input: 'hello interactive\n' },
|
|
84
|
+
});
|
|
85
|
+
expect(writeResult.isError).not.toBe(true);
|
|
86
|
+
// 3. Read output (might need a small delay for process to echo)
|
|
87
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
88
|
+
const readResult = await client.callTool({
|
|
89
|
+
name: 'read_output',
|
|
90
|
+
arguments: { sessionId },
|
|
91
|
+
});
|
|
92
|
+
expect(readResult.isError).not.toBe(true);
|
|
93
|
+
const readOutput = (0, js_yaml_1.load)(readResult.content[0].text);
|
|
94
|
+
expect(readOutput.stdout).toContain('hello interactive');
|
|
95
|
+
expect(readOutput.isActive).toBe(true);
|
|
96
|
+
// 4. Stop command
|
|
97
|
+
const stopResult = await client.callTool({
|
|
98
|
+
name: 'stop_command',
|
|
99
|
+
arguments: { sessionId },
|
|
100
|
+
});
|
|
101
|
+
expect(stopResult.isError).not.toBe(true);
|
|
102
|
+
// 5. Verify stopped
|
|
103
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
104
|
+
const finalReadResult = await client.callTool({
|
|
105
|
+
name: 'read_output',
|
|
106
|
+
arguments: { sessionId },
|
|
107
|
+
});
|
|
108
|
+
const finalReadOutput = (0, js_yaml_1.load)(finalReadResult.content[0].text);
|
|
109
|
+
expect(finalReadOutput.isActive).toBe(false);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
it('should execute command with input', async () => {
|
|
113
|
+
process.env.ALLOWED_COMMANDS = 'cat';
|
|
114
|
+
const result = await client.callTool({
|
|
115
|
+
name: 'execute_command',
|
|
116
|
+
arguments: {
|
|
117
|
+
command: 'cat',
|
|
118
|
+
input: 'hello world',
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
expect(result.content).toBeDefined();
|
|
122
|
+
const text = result.content[0].text;
|
|
123
|
+
const output = (0, js_yaml_1.load)(text);
|
|
124
|
+
expect(output.exit_code).toBe(0);
|
|
125
|
+
expect(output.stdout).toContain('hello world');
|
|
126
|
+
});
|
|
64
127
|
it('should execute command within absolute cwd', async () => {
|
|
65
128
|
process.env.ALLOWED_COMMANDS = 'node';
|
|
66
129
|
const cwdDir = await (0, promises_1.mkdtemp)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'mcp-terminal-runner-cwd-'));
|
|
67
130
|
const result = await client.callTool({
|
|
68
131
|
name: 'execute_command',
|
|
69
132
|
arguments: {
|
|
70
|
-
command:
|
|
133
|
+
command: "node -p 'process.cwd()'",
|
|
71
134
|
cwd: cwdDir,
|
|
72
135
|
},
|
|
73
136
|
});
|
|
@@ -90,7 +153,7 @@ describe('MCP Server', () => {
|
|
|
90
153
|
const result = await client.callTool({
|
|
91
154
|
name: 'execute_command',
|
|
92
155
|
arguments: {
|
|
93
|
-
command:
|
|
156
|
+
command: "node -p 'process.cwd()'",
|
|
94
157
|
cwd: relativeCwd,
|
|
95
158
|
},
|
|
96
159
|
});
|
|
@@ -125,7 +188,7 @@ describe('MCP Server', () => {
|
|
|
125
188
|
const allowedResult = await client.callTool({
|
|
126
189
|
name: 'execute_command',
|
|
127
190
|
arguments: {
|
|
128
|
-
command:
|
|
191
|
+
command: "node -p 'process.cwd()'",
|
|
129
192
|
cwd: childDir,
|
|
130
193
|
},
|
|
131
194
|
});
|
|
@@ -161,5 +224,20 @@ describe('MCP Server', () => {
|
|
|
161
224
|
expect(result.content[0].text).toContain('Invalid configuration');
|
|
162
225
|
expect(result.content[0].text).toContain('ALLOWED_CWD_ROOTS');
|
|
163
226
|
});
|
|
227
|
+
it('should execute chained commands with &&', async () => {
|
|
228
|
+
process.env.ALLOWED_COMMANDS = 'echo';
|
|
229
|
+
const result = await client.callTool({
|
|
230
|
+
name: 'execute_command',
|
|
231
|
+
arguments: {
|
|
232
|
+
command: 'echo hello && echo world',
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
expect(result.isError).not.toBe(true);
|
|
236
|
+
const text = result.content[0].text;
|
|
237
|
+
const output = (0, js_yaml_1.load)(text);
|
|
238
|
+
expect(output.exit_code).toBe(0);
|
|
239
|
+
expect(output.stdout).toContain('hello');
|
|
240
|
+
expect(output.stdout).toContain('world');
|
|
241
|
+
});
|
|
164
242
|
});
|
|
165
243
|
//# sourceMappingURL=index.test.js.map
|
package/dist/index.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,eAAO,MAAM,MAAM,WAUlB,CAAC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.server = void 0;
|
|
4
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
5
|
+
// Hardcoded version to avoid import issues with outside rootDir
|
|
6
|
+
const version = '0.1.0';
|
|
7
|
+
exports.server = new mcp_js_1.McpServer({
|
|
8
|
+
name: 'mcp-terminal-runner',
|
|
9
|
+
version,
|
|
10
|
+
}, {
|
|
11
|
+
capabilities: {
|
|
12
|
+
tools: {},
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;AAAA,oEAAoE;AAEpE,gEAAgE;AAChE,MAAM,OAAO,GAAG,OAAO,CAAC;AAEX,QAAA,MAAM,GAAG,IAAI,kBAAS,CACjC;IACE,IAAI,EAAE,qBAAqB;IAC3B,OAAO;CACR,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ChildProcess } from 'node:child_process';
|
|
2
|
+
export interface Session {
|
|
3
|
+
id: string;
|
|
4
|
+
process: ChildProcess;
|
|
5
|
+
stdoutBuffer: string[];
|
|
6
|
+
stderrBuffer: string[];
|
|
7
|
+
createdAt: number;
|
|
8
|
+
outputListeners: (() => void)[];
|
|
9
|
+
}
|
|
10
|
+
export declare class SessionManager {
|
|
11
|
+
private readonly sessions;
|
|
12
|
+
createSession(process: ChildProcess): {
|
|
13
|
+
sessionId: string;
|
|
14
|
+
pid: number;
|
|
15
|
+
};
|
|
16
|
+
getSession(id: string): Session | undefined;
|
|
17
|
+
readOutput(id: string, timeout?: number): Promise<{
|
|
18
|
+
stdout: string;
|
|
19
|
+
stderr: string;
|
|
20
|
+
isActive: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
writeInput(id: string, input: string): void;
|
|
23
|
+
stopSession(id: string, signal?: NodeJS.Signals): void;
|
|
24
|
+
}
|
|
25
|
+
export declare const sessionManager: SessionManager;
|
|
26
|
+
//# sourceMappingURL=SessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/services/SessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,YAAY,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;CACjC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAmCxE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,UAAU,CACR,EAAE,EAAE,MAAM,EACV,OAAO,SAAI,GACV,OAAO,CAAC;QACT,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IAkDF,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAa3C,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,OAAmB,GAAG,IAAI;CAQlE;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sessionManager = exports.SessionManager = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
class SessionManager {
|
|
6
|
+
sessions = new Map();
|
|
7
|
+
createSession(process) {
|
|
8
|
+
const id = (0, node_crypto_1.randomUUID)();
|
|
9
|
+
const session = {
|
|
10
|
+
id,
|
|
11
|
+
process,
|
|
12
|
+
stdoutBuffer: [],
|
|
13
|
+
stderrBuffer: [],
|
|
14
|
+
createdAt: Date.now(),
|
|
15
|
+
outputListeners: [],
|
|
16
|
+
};
|
|
17
|
+
process.stdout?.setEncoding('utf8');
|
|
18
|
+
process.stderr?.setEncoding('utf8');
|
|
19
|
+
const notifyListeners = () => {
|
|
20
|
+
const listeners = session.outputListeners;
|
|
21
|
+
session.outputListeners = [];
|
|
22
|
+
for (const listener of listeners) {
|
|
23
|
+
listener();
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
process.stdout?.on('data', (chunk) => {
|
|
27
|
+
session.stdoutBuffer.push(chunk);
|
|
28
|
+
notifyListeners();
|
|
29
|
+
});
|
|
30
|
+
process.stderr?.on('data', (chunk) => {
|
|
31
|
+
session.stderrBuffer.push(chunk);
|
|
32
|
+
notifyListeners();
|
|
33
|
+
});
|
|
34
|
+
this.sessions.set(id, session);
|
|
35
|
+
return { sessionId: id, pid: process.pid ?? -1 };
|
|
36
|
+
}
|
|
37
|
+
getSession(id) {
|
|
38
|
+
return this.sessions.get(id);
|
|
39
|
+
}
|
|
40
|
+
readOutput(id, timeout = 0) {
|
|
41
|
+
const session = this.sessions.get(id);
|
|
42
|
+
if (!session) {
|
|
43
|
+
throw new Error(`Session not found: ${id}`);
|
|
44
|
+
}
|
|
45
|
+
const flush = () => {
|
|
46
|
+
const stdout = session.stdoutBuffer.join('');
|
|
47
|
+
const stderr = session.stderrBuffer.join('');
|
|
48
|
+
session.stdoutBuffer = [];
|
|
49
|
+
session.stderrBuffer = [];
|
|
50
|
+
const isActive = session.process.exitCode === null &&
|
|
51
|
+
session.process.signalCode === null;
|
|
52
|
+
return { stdout, stderr, isActive };
|
|
53
|
+
};
|
|
54
|
+
// If there is data or no timeout, return immediately
|
|
55
|
+
if (session.stdoutBuffer.length > 0 ||
|
|
56
|
+
session.stderrBuffer.length > 0 ||
|
|
57
|
+
timeout <= 0) {
|
|
58
|
+
return Promise.resolve(flush());
|
|
59
|
+
}
|
|
60
|
+
// Wait for data or timeout
|
|
61
|
+
return new Promise((resolvePromise) => {
|
|
62
|
+
let timer;
|
|
63
|
+
const onData = () => {
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
resolvePromise(flush());
|
|
66
|
+
};
|
|
67
|
+
timer = setTimeout(() => {
|
|
68
|
+
// Remove listener if timed out
|
|
69
|
+
session.outputListeners = session.outputListeners.filter((l) => l !== onData);
|
|
70
|
+
resolvePromise(flush());
|
|
71
|
+
}, timeout);
|
|
72
|
+
session.outputListeners.push(onData);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
writeInput(id, input) {
|
|
76
|
+
const session = this.sessions.get(id);
|
|
77
|
+
if (!session) {
|
|
78
|
+
throw new Error(`Session not found: ${id}`);
|
|
79
|
+
}
|
|
80
|
+
if (session.process.stdin) {
|
|
81
|
+
session.process.stdin.write(input);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
throw new Error('Process stdin is not available');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
stopSession(id, signal = 'SIGTERM') {
|
|
88
|
+
const session = this.sessions.get(id);
|
|
89
|
+
if (!session) {
|
|
90
|
+
throw new Error(`Session not found: ${id}`);
|
|
91
|
+
}
|
|
92
|
+
session.process.kill(signal);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.SessionManager = SessionManager;
|
|
96
|
+
exports.sessionManager = new SessionManager();
|
|
97
|
+
//# sourceMappingURL=SessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../src/services/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ChildProcess } from 'node:child_process';
|
|
2
|
+
export interface Session {
|
|
3
|
+
id: string;
|
|
4
|
+
process: ChildProcess;
|
|
5
|
+
stdoutBuffer: string[];
|
|
6
|
+
stderrBuffer: string[];
|
|
7
|
+
createdAt: number;
|
|
8
|
+
outputListeners: (() => void)[];
|
|
9
|
+
}
|
|
10
|
+
export declare class SessionManager {
|
|
11
|
+
private readonly sessions;
|
|
12
|
+
createSession(process: ChildProcess): {
|
|
13
|
+
sessionId: string;
|
|
14
|
+
pid: number;
|
|
15
|
+
};
|
|
16
|
+
getSession(id: string): Session | undefined;
|
|
17
|
+
readOutput(id: string, timeout?: number): Promise<{
|
|
18
|
+
stdout: string;
|
|
19
|
+
stderr: string;
|
|
20
|
+
isActive: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
writeInput(id: string, input: string): void;
|
|
23
|
+
stopSession(id: string, signal?: NodeJS.Signals): void;
|
|
24
|
+
}
|
|
25
|
+
export declare const sessionManager: SessionManager;
|
|
26
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/services/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,YAAY,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;CACjC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAmCxE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,UAAU,CACR,EAAE,EAAE,MAAM,EACV,OAAO,SAAI,GACV,OAAO,CAAC;QACT,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IA2DF,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAa3C,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,OAAmB,GAAG,IAAI;CAQlE;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|