@ellery/terminal-mcp 0.2.0 → 0.2.2
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 +151 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +4 -62
- package/dist/client.js.map +1 -1
- package/dist/index.js +235 -13
- package/dist/index.js.map +1 -1
- package/dist/recording/index.d.ts +4 -0
- package/dist/recording/index.d.ts.map +1 -0
- package/dist/recording/index.js +3 -0
- package/dist/recording/index.js.map +1 -0
- package/dist/recording/manager.d.ts +62 -0
- package/dist/recording/manager.d.ts.map +1 -0
- package/dist/recording/manager.js +123 -0
- package/dist/recording/manager.js.map +1 -0
- package/dist/recording/recorder.d.ts +95 -0
- package/dist/recording/recorder.d.ts.map +1 -0
- package/dist/recording/recorder.js +296 -0
- package/dist/recording/recorder.js.map +1 -0
- package/dist/recording/types.d.ts +65 -0
- package/dist/recording/types.d.ts.map +1 -0
- package/dist/recording/types.js +2 -0
- package/dist/recording/types.js.map +1 -0
- package/dist/sandbox/config.d.ts +46 -0
- package/dist/sandbox/config.d.ts.map +1 -0
- package/dist/sandbox/config.js +144 -0
- package/dist/sandbox/config.js.map +1 -0
- package/dist/sandbox/controller.d.ts +72 -0
- package/dist/sandbox/controller.d.ts.map +1 -0
- package/dist/sandbox/controller.js +208 -0
- package/dist/sandbox/controller.js.map +1 -0
- package/dist/sandbox/index.d.ts +6 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +4 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/prompt.d.ts +10 -0
- package/dist/sandbox/prompt.d.ts.map +1 -0
- package/dist/sandbox/prompt.js +434 -0
- package/dist/sandbox/prompt.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/terminal/index.d.ts +1 -0
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/manager.d.ts +58 -3
- package/dist/terminal/manager.d.ts.map +1 -1
- package/dist/terminal/manager.js +118 -3
- package/dist/terminal/manager.js.map +1 -1
- package/dist/terminal/session.d.ts +21 -1
- package/dist/terminal/session.d.ts.map +1 -1
- package/dist/terminal/session.js +44 -3
- package/dist/terminal/session.js.map +1 -1
- package/dist/tools/definitions.d.ts +18 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +110 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +7 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/startRecording.d.ts +68 -0
- package/dist/tools/startRecording.d.ts.map +1 -0
- package/dist/tools/startRecording.js +111 -0
- package/dist/tools/startRecording.js.map +1 -0
- package/dist/tools/stopRecording.d.ts +31 -0
- package/dist/tools/stopRecording.d.ts.map +1 -0
- package/dist/tools/stopRecording.js +76 -0
- package/dist/tools/stopRecording.js.map +1 -0
- package/dist/transport/socket.d.ts.map +1 -1
- package/dist/transport/socket.js +10 -0
- package/dist/transport/socket.js.map +1 -1
- package/dist/ui/index.d.ts +1 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +18 -2
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/platform.d.ts +6 -0
- package/dist/utils/platform.d.ts.map +1 -1
- package/dist/utils/platform.js +15 -0
- package/dist/utils/platform.js.map +1 -1
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +9 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -27,7 +27,9 @@ curl -fsSL https://raw.githubusercontent.com/elleryfamilia/terminal-mcp/main/ins
|
|
|
27
27
|
- **Full Terminal Emulation**: Uses xterm.js headless for accurate VT100/ANSI emulation
|
|
28
28
|
- **Cross-Platform PTY**: Native pseudo-terminal support via node-pty (macOS, Linux, Windows)
|
|
29
29
|
- **MCP Protocol**: Implements Model Context Protocol for AI assistant integration
|
|
30
|
-
- **
|
|
30
|
+
- **Session Recording**: Record terminal sessions to asciicast format for playback with asciinema
|
|
31
|
+
- **Simple API**: Six intuitive tools for complete terminal control
|
|
32
|
+
- **Sandbox Mode**: Optional security restrictions for filesystem and network access
|
|
31
33
|
|
|
32
34
|
## Building from Source
|
|
33
35
|
|
|
@@ -71,10 +73,22 @@ With custom options:
|
|
|
71
73
|
terminal-mcp [OPTIONS]
|
|
72
74
|
|
|
73
75
|
Options:
|
|
74
|
-
--cols <number>
|
|
75
|
-
--rows <number>
|
|
76
|
-
--shell <path>
|
|
77
|
-
--
|
|
76
|
+
--cols <number> Terminal width in columns (default: 120)
|
|
77
|
+
--rows <number> Terminal height in rows (default: 40)
|
|
78
|
+
--shell <path> Shell to use (default: $SHELL or bash)
|
|
79
|
+
--sandbox Enable sandbox mode (restricts filesystem/network)
|
|
80
|
+
--sandbox-config <path> Load sandbox config from JSON file
|
|
81
|
+
--version, -v Show version number
|
|
82
|
+
--help, -h Show help message
|
|
83
|
+
|
|
84
|
+
Recording Options:
|
|
85
|
+
--record [mode] Enable recording (default mode: always)
|
|
86
|
+
Modes: always, on-failure, off
|
|
87
|
+
--record-dir <dir> Recording output directory
|
|
88
|
+
(default: ~/.local/state/terminal-mcp/recordings)
|
|
89
|
+
--idle-time-limit <sec> Max idle time between events (default: 2s)
|
|
90
|
+
--max-duration <sec> Max recording duration (default: 3600s)
|
|
91
|
+
--inactivity-timeout <sec> Stop after no output (default: 600s)
|
|
78
92
|
```
|
|
79
93
|
|
|
80
94
|
## MCP Tools
|
|
@@ -132,6 +146,136 @@ Capture the terminal state with cursor position and dimensions.
|
|
|
132
146
|
}
|
|
133
147
|
```
|
|
134
148
|
|
|
149
|
+
### `startRecording`
|
|
150
|
+
Start recording terminal output to an asciicast v2 file.
|
|
151
|
+
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"name": "startRecording",
|
|
155
|
+
"arguments": {
|
|
156
|
+
"mode": "always",
|
|
157
|
+
"idleTimeLimit": 2,
|
|
158
|
+
"maxDuration": 3600
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Options:
|
|
164
|
+
- `mode`: `always` (save all) or `on-failure` (save only on non-zero exit)
|
|
165
|
+
- `outputDir`: Custom output directory
|
|
166
|
+
- `idleTimeLimit`: Max seconds between events (caps pauses in playback)
|
|
167
|
+
- `maxDuration`: Auto-stop after N seconds
|
|
168
|
+
- `inactivityTimeout`: Auto-stop after N seconds of no output
|
|
169
|
+
|
|
170
|
+
### `stopRecording`
|
|
171
|
+
Stop a recording and finalize the asciicast file.
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"name": "stopRecording",
|
|
176
|
+
"arguments": {
|
|
177
|
+
"recordingId": "abc123"
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Sandbox Mode
|
|
183
|
+
|
|
184
|
+
Run the terminal with restricted filesystem and network access:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
# Interactive permission configuration
|
|
188
|
+
terminal-mcp --sandbox
|
|
189
|
+
|
|
190
|
+
# With a config file
|
|
191
|
+
terminal-mcp --sandbox --sandbox-config ~/.terminal-mcp-sandbox.json
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
The interactive mode shows a TUI dialog to configure permissions:
|
|
195
|
+
- **Read/Write**: Full access (current directory, /tmp, caches)
|
|
196
|
+
- **Read-Only**: Can read but not modify (home directory)
|
|
197
|
+
- **Blocked**: No access (SSH keys, cloud credentials, auth tokens)
|
|
198
|
+
|
|
199
|
+
Example config file:
|
|
200
|
+
|
|
201
|
+
```json
|
|
202
|
+
{
|
|
203
|
+
"filesystem": {
|
|
204
|
+
"readWrite": [".", "/tmp", "~/.cache"],
|
|
205
|
+
"readOnly": ["~"],
|
|
206
|
+
"blocked": ["~/.ssh", "~/.aws", "~/.gnupg"]
|
|
207
|
+
},
|
|
208
|
+
"network": {
|
|
209
|
+
"mode": "all"
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Platform support:
|
|
215
|
+
- **macOS**: Full support via sandbox-exec (Seatbelt)
|
|
216
|
+
- **Linux**: Full support via bubblewrap (requires `bwrap` installed)
|
|
217
|
+
- **Windows**: Graceful fallback (runs without sandbox)
|
|
218
|
+
|
|
219
|
+
See [Sandbox Documentation](./docs/sandbox.md) for detailed configuration options.
|
|
220
|
+
|
|
221
|
+
## Recording
|
|
222
|
+
|
|
223
|
+
Terminal MCP can record sessions to [asciicast v2](https://docs.asciinema.org/manual/asciicast/v2/) format, compatible with [asciinema](https://asciinema.org/) for playback.
|
|
224
|
+
|
|
225
|
+
### Quick Start
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
# Start with recording enabled
|
|
229
|
+
terminal-mcp --record
|
|
230
|
+
|
|
231
|
+
# Run your commands, then exit
|
|
232
|
+
exit
|
|
233
|
+
|
|
234
|
+
# Output shows the saved file path:
|
|
235
|
+
# Recordings saved:
|
|
236
|
+
# ~/.local/state/terminal-mcp/recordings/20240115_143022.cast
|
|
237
|
+
#
|
|
238
|
+
# Play with: asciinema play <file>
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Playback
|
|
242
|
+
|
|
243
|
+
Install asciinema to play back recordings:
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
# macOS
|
|
247
|
+
brew install asciinema
|
|
248
|
+
|
|
249
|
+
# Linux/pip
|
|
250
|
+
pip install asciinema
|
|
251
|
+
|
|
252
|
+
# Play a recording
|
|
253
|
+
asciinema play ~/.local/state/terminal-mcp/recordings/20240115_143022.cast
|
|
254
|
+
|
|
255
|
+
# Play at 2x speed
|
|
256
|
+
asciinema play -s 2 recording.cast
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Recording Modes
|
|
260
|
+
|
|
261
|
+
- **`always`** (default): Save every recording
|
|
262
|
+
- **`on-failure`**: Only save if the session exits with a non-zero code (useful for debugging failed CI runs)
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
# Only save recordings when something fails
|
|
266
|
+
terminal-mcp --record=on-failure
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### MCP Tool Recording
|
|
270
|
+
|
|
271
|
+
AI assistants can also control recording programmatically via MCP tools:
|
|
272
|
+
|
|
273
|
+
1. Call `startRecording` to begin capturing
|
|
274
|
+
2. Perform terminal operations
|
|
275
|
+
3. Call `stopRecording` to finalize and save
|
|
276
|
+
|
|
277
|
+
This enables AI-driven workflows like "record this debugging session" or "capture this demo".
|
|
278
|
+
|
|
135
279
|
## Architecture
|
|
136
280
|
|
|
137
281
|
```
|
|
@@ -174,7 +318,9 @@ See the [docs](./docs/) folder for detailed documentation:
|
|
|
174
318
|
- [Overview](./docs/index.md)
|
|
175
319
|
- [Installation](./docs/installation.md)
|
|
176
320
|
- [Tools Reference](./docs/tools.md)
|
|
321
|
+
- [Recording](./docs/recording.md)
|
|
177
322
|
- [Configuration](./docs/configuration.md)
|
|
323
|
+
- [Sandbox Mode](./docs/sandbox.md)
|
|
178
324
|
- [Examples](./docs/examples.md)
|
|
179
325
|
- [Architecture](./docs/architecture.md)
|
|
180
326
|
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAsBA;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoH1E"}
|
package/dist/client.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as net from "net";
|
|
2
2
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { VERSION } from "./utils/version.js";
|
|
4
5
|
import { ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
6
|
+
import { toolDefinitions } from "./tools/definitions.js";
|
|
5
7
|
/**
|
|
6
8
|
* MCP Client Mode - connects to existing terminal socket and serves MCP over stdio
|
|
7
9
|
*/
|
|
@@ -11,7 +13,7 @@ export async function startMcpClientMode(socketPath) {
|
|
|
11
13
|
// Create MCP server
|
|
12
14
|
const server = new Server({
|
|
13
15
|
name: "terminal-mcp",
|
|
14
|
-
version:
|
|
16
|
+
version: VERSION,
|
|
15
17
|
}, {
|
|
16
18
|
capabilities: {
|
|
17
19
|
tools: {},
|
|
@@ -71,69 +73,9 @@ export async function startMcpClientMode(socketPath) {
|
|
|
71
73
|
});
|
|
72
74
|
});
|
|
73
75
|
}
|
|
74
|
-
// Define tools that proxy to the interactive terminal
|
|
75
|
-
const tools = [
|
|
76
|
-
{
|
|
77
|
-
name: "type",
|
|
78
|
-
description: "Type text into the terminal",
|
|
79
|
-
inputSchema: {
|
|
80
|
-
type: "object",
|
|
81
|
-
properties: {
|
|
82
|
-
text: {
|
|
83
|
-
type: "string",
|
|
84
|
-
description: "The text to type",
|
|
85
|
-
},
|
|
86
|
-
},
|
|
87
|
-
required: ["text"],
|
|
88
|
-
},
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
name: "sendKey",
|
|
92
|
-
description: "Send a special key to the terminal (e.g., enter, tab, ctrl+c)",
|
|
93
|
-
inputSchema: {
|
|
94
|
-
type: "object",
|
|
95
|
-
properties: {
|
|
96
|
-
key: {
|
|
97
|
-
type: "string",
|
|
98
|
-
description: "The key to send (e.g., enter, tab, escape, up, down, left, right, ctrl+c, ctrl+d)",
|
|
99
|
-
},
|
|
100
|
-
},
|
|
101
|
-
required: ["key"],
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
name: "getContent",
|
|
106
|
-
description: "Get the current content of the terminal buffer",
|
|
107
|
-
inputSchema: {
|
|
108
|
-
type: "object",
|
|
109
|
-
properties: {
|
|
110
|
-
visibleOnly: {
|
|
111
|
-
type: "boolean",
|
|
112
|
-
description: "If true, only return visible content (default: false)",
|
|
113
|
-
},
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
name: "takeScreenshot",
|
|
119
|
-
description: "Take a screenshot of the terminal showing current screen and cursor position",
|
|
120
|
-
inputSchema: {
|
|
121
|
-
type: "object",
|
|
122
|
-
properties: {},
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
name: "clear",
|
|
127
|
-
description: "Clear the terminal screen",
|
|
128
|
-
inputSchema: {
|
|
129
|
-
type: "object",
|
|
130
|
-
properties: {},
|
|
131
|
-
},
|
|
132
|
-
},
|
|
133
|
-
];
|
|
134
76
|
// Register list tools handler
|
|
135
77
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
136
|
-
tools,
|
|
78
|
+
tools: toolDefinitions,
|
|
137
79
|
}));
|
|
138
80
|
// Register call tool handler - proxy to socket
|
|
139
81
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import * as fs from "fs";
|
|
3
|
+
import { createRequire } from "module";
|
|
3
4
|
import { startMcpClientMode } from "./client.js";
|
|
4
5
|
import { TerminalManager } from "./terminal/index.js";
|
|
5
6
|
import { createToolProxyServer } from "./transport/index.js";
|
|
6
7
|
import { getBanner } from "./ui/index.js";
|
|
7
8
|
import { getDefaultSocketPath, getDefaultShell } from "./utils/platform.js";
|
|
9
|
+
import { SandboxController, loadConfigFromFile, promptForPermissions, } from "./sandbox/index.js";
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
const { version } = require("../package.json");
|
|
8
12
|
// Default socket path
|
|
9
13
|
const DEFAULT_SOCKET_PATH = getDefaultSocketPath();
|
|
10
14
|
// Parse command line arguments
|
|
@@ -38,29 +42,135 @@ for (let i = 0; i < args.length; i++) {
|
|
|
38
42
|
i++;
|
|
39
43
|
}
|
|
40
44
|
break;
|
|
45
|
+
case "--sandbox":
|
|
46
|
+
options.sandbox = true;
|
|
47
|
+
break;
|
|
48
|
+
case "--sandbox-config":
|
|
49
|
+
if (next) {
|
|
50
|
+
options.sandboxConfig = next;
|
|
51
|
+
options.sandbox = true; // Implicitly enable sandbox
|
|
52
|
+
i++;
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
case "--record":
|
|
56
|
+
// Support bare --record (defaults to 'always')
|
|
57
|
+
if (!next || next.startsWith('-')) {
|
|
58
|
+
options.record = 'always';
|
|
59
|
+
}
|
|
60
|
+
else if (['always', 'on-failure', 'off'].includes(next)) {
|
|
61
|
+
options.record = next;
|
|
62
|
+
i++;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// Unknown value, treat as bare --record
|
|
66
|
+
options.record = 'always';
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
case "--record-dir":
|
|
70
|
+
if (next) {
|
|
71
|
+
options.recordDir = next;
|
|
72
|
+
i++;
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
case "--record-format":
|
|
76
|
+
if (next) {
|
|
77
|
+
options.recordFormat = next;
|
|
78
|
+
i++;
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
81
|
+
case "--idle-time-limit":
|
|
82
|
+
if (next) {
|
|
83
|
+
options.idleTimeLimit = parseFloat(next);
|
|
84
|
+
i++;
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
case "--max-duration":
|
|
88
|
+
if (next) {
|
|
89
|
+
options.maxDuration = parseFloat(next);
|
|
90
|
+
i++;
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
case "--inactivity-timeout":
|
|
94
|
+
if (next) {
|
|
95
|
+
options.inactivityTimeout = parseFloat(next);
|
|
96
|
+
i++;
|
|
97
|
+
}
|
|
98
|
+
break;
|
|
99
|
+
case "--version":
|
|
100
|
+
case "-v":
|
|
101
|
+
console.log(`terminal-mcp v${version}`);
|
|
102
|
+
process.exit(0);
|
|
41
103
|
case "--help":
|
|
42
104
|
case "-h":
|
|
43
105
|
console.log(`
|
|
44
|
-
terminal-mcp - A headless terminal emulator exposed via MCP
|
|
106
|
+
terminal-mcp v${version} - A headless terminal emulator exposed via MCP
|
|
45
107
|
|
|
46
108
|
Usage: terminal-mcp [options]
|
|
47
109
|
|
|
48
110
|
Options:
|
|
49
|
-
--cols <number>
|
|
50
|
-
--rows <number>
|
|
51
|
-
--shell <path>
|
|
52
|
-
--socket <path>
|
|
53
|
-
--
|
|
111
|
+
--cols <number> Terminal width in columns (default: auto or 120)
|
|
112
|
+
--rows <number> Terminal height in rows (default: auto or 40)
|
|
113
|
+
--shell <path> Shell to use (default: $SHELL or bash)
|
|
114
|
+
--socket <path> Unix socket path for MCP (default: ${DEFAULT_SOCKET_PATH})
|
|
115
|
+
--sandbox Enable sandbox mode (restricts filesystem/network access)
|
|
116
|
+
--sandbox-config <path> Load sandbox config from JSON file
|
|
117
|
+
--version, -v Show version number
|
|
118
|
+
--help, -h Show this help message
|
|
119
|
+
|
|
120
|
+
Recording Options:
|
|
121
|
+
--record [mode] Enable recording (default mode: always)
|
|
122
|
+
Modes: always, on-failure, off
|
|
123
|
+
- always: Save all recordings
|
|
124
|
+
- on-failure: Only save recordings on non-zero exit
|
|
125
|
+
- off: Disable recording
|
|
126
|
+
--record-dir <dir> Recording output directory
|
|
127
|
+
Default: ~/.local/state/terminal-mcp/recordings
|
|
128
|
+
Override: TERMINAL_MCP_RECORD_DIR env var
|
|
129
|
+
--record-format <f> Recording format: v2 (default: v2, asciicast v2 format)
|
|
130
|
+
--idle-time-limit <sec> Max idle time between events (default: 2s)
|
|
131
|
+
Caps idle time in recordings to prevent long pauses
|
|
132
|
+
--max-duration <sec> Max recording duration (default: 3600 = 60 min)
|
|
133
|
+
Recording auto-stops when this limit is reached
|
|
134
|
+
--inactivity-timeout <sec> Stop after no output (default: 600 = 10 min)
|
|
135
|
+
Resets on each terminal output event
|
|
136
|
+
|
|
137
|
+
Environment Variables:
|
|
138
|
+
TERMINAL_MCP_RECORD_DIR Default recording output directory
|
|
54
139
|
|
|
55
140
|
Mode Detection:
|
|
56
141
|
- If stdin is a TTY: Interactive mode (gives you a shell, exposes socket)
|
|
57
142
|
- If stdin is not a TTY: MCP client mode (connects to socket, serves MCP)
|
|
58
143
|
|
|
59
144
|
Interactive Mode (run in your terminal):
|
|
60
|
-
terminal-mcp
|
|
145
|
+
terminal-mcp # Normal mode
|
|
146
|
+
terminal-mcp --sandbox # With sandbox (interactive permission prompt)
|
|
61
147
|
|
|
62
148
|
This gives you an interactive shell. AI can observe/interact via MCP.
|
|
63
149
|
|
|
150
|
+
With recording:
|
|
151
|
+
terminal-mcp --record
|
|
152
|
+
terminal-mcp --record --record-dir=./project-recordings
|
|
153
|
+
terminal-mcp --record=on-failure --idle-time-limit=5
|
|
154
|
+
|
|
155
|
+
Sandbox Mode:
|
|
156
|
+
When --sandbox is enabled, the terminal runs with restricted access:
|
|
157
|
+
- Filesystem: Configurable read/write, read-only, and blocked paths
|
|
158
|
+
- Network: Allow all, block all, or custom domain allowlist
|
|
159
|
+
|
|
160
|
+
Without --sandbox-config, an interactive prompt lets you configure permissions.
|
|
161
|
+
|
|
162
|
+
Example config file (~/.terminal-mcp-sandbox.json):
|
|
163
|
+
{
|
|
164
|
+
"filesystem": {
|
|
165
|
+
"readWrite": [".", "/tmp"],
|
|
166
|
+
"readOnly": ["~"],
|
|
167
|
+
"blocked": ["~/.ssh", "~/.aws"]
|
|
168
|
+
},
|
|
169
|
+
"network": {
|
|
170
|
+
"mode": "all"
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
64
174
|
MCP Client Mode (add to your MCP client config):
|
|
65
175
|
{
|
|
66
176
|
"mcpServers": {
|
|
@@ -76,6 +186,13 @@ MCP Client Mode (add to your MCP client config):
|
|
|
76
186
|
async function main() {
|
|
77
187
|
const socketPath = options.socket || DEFAULT_SOCKET_PATH;
|
|
78
188
|
const isInteractive = process.stdin.isTTY;
|
|
189
|
+
// Prevent recursive invocation
|
|
190
|
+
if (process.env.TERMINAL_MCP === '1') {
|
|
191
|
+
console.error('Error: terminal-mcp cannot be run from within itself.\n' +
|
|
192
|
+
'You are already inside a terminal-mcp session.\n\n' +
|
|
193
|
+
'To use MCP tools, configure your MCP client to connect to this session.');
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
79
196
|
if (isInteractive) {
|
|
80
197
|
// Interactive mode: Shell on stdin/stdout, tool proxy on Unix socket
|
|
81
198
|
await startInteractiveMode(socketPath);
|
|
@@ -90,17 +207,100 @@ async function startInteractiveMode(socketPath) {
|
|
|
90
207
|
const cols = options.cols ?? (process.stdout.columns || 120);
|
|
91
208
|
const rows = options.rows ?? (process.stdout.rows || 40);
|
|
92
209
|
const shell = options.shell || getDefaultShell();
|
|
210
|
+
// Initialize sandbox if enabled
|
|
211
|
+
let sandboxController;
|
|
212
|
+
let sandboxEnabled = false;
|
|
213
|
+
if (options.sandbox) {
|
|
214
|
+
sandboxController = new SandboxController();
|
|
215
|
+
// Check platform support and dependencies BEFORE showing the modal
|
|
216
|
+
if (!sandboxController.isSupported()) {
|
|
217
|
+
const platform = sandboxController.getPlatform();
|
|
218
|
+
if (platform === "win32") {
|
|
219
|
+
console.error("[terminal-mcp] Error: Sandbox mode is not supported on Windows.");
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
console.error(`[terminal-mcp] Error: Sandbox mode is not supported on platform '${platform}'.`);
|
|
223
|
+
}
|
|
224
|
+
console.error("[terminal-mcp] Please run without the --sandbox flag.");
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
// Check Linux-specific dependencies
|
|
228
|
+
const depCheck = sandboxController.checkLinuxDependencies();
|
|
229
|
+
if (!depCheck.supported) {
|
|
230
|
+
console.error(`[terminal-mcp] Error: Sandbox dependencies not available.`);
|
|
231
|
+
console.error(`[terminal-mcp] Missing: ${depCheck.message}`);
|
|
232
|
+
console.error("");
|
|
233
|
+
console.error("To install on Arch Linux:");
|
|
234
|
+
console.error(" sudo pacman -S bubblewrap socat");
|
|
235
|
+
console.error("");
|
|
236
|
+
console.error("To install on Debian/Ubuntu:");
|
|
237
|
+
console.error(" sudo apt install bubblewrap socat");
|
|
238
|
+
console.error("");
|
|
239
|
+
console.error("Or run without the --sandbox flag.");
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
// Determine permissions
|
|
243
|
+
let permissions;
|
|
244
|
+
if (options.sandboxConfig) {
|
|
245
|
+
try {
|
|
246
|
+
permissions = loadConfigFromFile(options.sandboxConfig);
|
|
247
|
+
console.log(`[terminal-mcp] Loaded sandbox config from ${options.sandboxConfig}`);
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
console.error(`[terminal-mcp] Failed to load sandbox config: ${error}`);
|
|
251
|
+
process.exit(1);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// Interactive permission prompt
|
|
256
|
+
try {
|
|
257
|
+
permissions = await promptForPermissions();
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
if (error instanceof Error && error.message === "cancelled") {
|
|
261
|
+
console.log("[terminal-mcp] Cancelled.");
|
|
262
|
+
process.exit(0);
|
|
263
|
+
}
|
|
264
|
+
throw error;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Initialize sandbox
|
|
268
|
+
const status = await sandboxController.initialize(permissions);
|
|
269
|
+
sandboxEnabled = status.enabled;
|
|
270
|
+
if (status.enabled) {
|
|
271
|
+
console.log(`[terminal-mcp] Sandbox enabled (${status.platform})`);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
// If we get here, something unexpected failed during initialization
|
|
275
|
+
console.error(`[terminal-mcp] Error: Failed to initialize sandbox: ${status.reason}`);
|
|
276
|
+
console.error("[terminal-mcp] Please run without the --sandbox flag or fix the issue above.");
|
|
277
|
+
process.exit(1);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
93
280
|
// Generate startup banner
|
|
94
|
-
const startupBanner = getBanner({
|
|
281
|
+
const startupBanner = getBanner({
|
|
282
|
+
socketPath,
|
|
283
|
+
cols,
|
|
284
|
+
rows,
|
|
285
|
+
shell,
|
|
286
|
+
sandboxEnabled,
|
|
287
|
+
});
|
|
95
288
|
// Create terminal manager (prompt customization handled in session.ts)
|
|
96
289
|
const manager = new TerminalManager({
|
|
97
290
|
cols,
|
|
98
291
|
rows,
|
|
99
292
|
shell: options.shell,
|
|
100
293
|
startupBanner,
|
|
294
|
+
sandboxController,
|
|
295
|
+
record: options.record,
|
|
296
|
+
recordDir: options.recordDir,
|
|
297
|
+
recordFormat: options.recordFormat,
|
|
298
|
+
idleTimeLimit: options.idleTimeLimit,
|
|
299
|
+
maxDuration: options.maxDuration,
|
|
300
|
+
inactivityTimeout: options.inactivityTimeout,
|
|
101
301
|
});
|
|
102
302
|
// Get the session and set up interactive I/O
|
|
103
|
-
const session = manager.
|
|
303
|
+
const session = await manager.initSession();
|
|
104
304
|
// Track if we've shown the banner (for Windows, show after shell init)
|
|
105
305
|
let bannerShown = false;
|
|
106
306
|
const isWindows = process.platform === "win32";
|
|
@@ -120,8 +320,20 @@ async function startInteractiveMode(socketPath) {
|
|
|
120
320
|
bannerShown = true;
|
|
121
321
|
}
|
|
122
322
|
// Handle PTY exit
|
|
123
|
-
session.onExit((code) => {
|
|
323
|
+
session.onExit(async (code) => {
|
|
324
|
+
// Finalize recordings and get results
|
|
325
|
+
const recordings = await manager.finalizeRecordings(code);
|
|
124
326
|
console.log(`\n[terminal-mcp] Shell exited with code ${code}`);
|
|
327
|
+
// Show recording info if any were saved
|
|
328
|
+
const savedRecordings = recordings.filter(r => r.saved);
|
|
329
|
+
if (savedRecordings.length > 0) {
|
|
330
|
+
console.log('\nRecordings saved:');
|
|
331
|
+
for (const rec of savedRecordings) {
|
|
332
|
+
console.log(` ${rec.path}`);
|
|
333
|
+
}
|
|
334
|
+
console.log('\nPlay with: asciinema play <file>');
|
|
335
|
+
console.log('Install: pip install asciinema or brew install asciinema');
|
|
336
|
+
}
|
|
125
337
|
cleanup();
|
|
126
338
|
process.exit(code);
|
|
127
339
|
});
|
|
@@ -142,7 +354,7 @@ async function startInteractiveMode(socketPath) {
|
|
|
142
354
|
});
|
|
143
355
|
// Start tool proxy socket server
|
|
144
356
|
const socketServer = createToolProxyServer(socketPath, manager);
|
|
145
|
-
// Cleanup function
|
|
357
|
+
// Cleanup function (sync version for exit handler)
|
|
146
358
|
function cleanup() {
|
|
147
359
|
manager.dispose();
|
|
148
360
|
socketServer.close();
|
|
@@ -153,14 +365,24 @@ async function startInteractiveMode(socketPath) {
|
|
|
153
365
|
// Ignore
|
|
154
366
|
}
|
|
155
367
|
}
|
|
368
|
+
// Async cleanup that also cleans up sandbox resources
|
|
369
|
+
async function cleanupAsync() {
|
|
370
|
+
await manager.disposeAsync();
|
|
371
|
+
socketServer.close();
|
|
372
|
+
try {
|
|
373
|
+
fs.unlinkSync(socketPath);
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
// Ignore
|
|
377
|
+
}
|
|
378
|
+
}
|
|
156
379
|
// Handle signals
|
|
157
380
|
process.on("SIGINT", () => {
|
|
158
381
|
// Pass Ctrl+C to the shell instead of exiting
|
|
159
382
|
session.write("\x03");
|
|
160
383
|
});
|
|
161
384
|
process.on("SIGTERM", () => {
|
|
162
|
-
|
|
163
|
-
process.exit(0);
|
|
385
|
+
cleanupAsync().then(() => process.exit(0));
|
|
164
386
|
});
|
|
165
387
|
process.on("exit", () => {
|
|
166
388
|
cleanup();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { Recorder } from "./recorder.js";
|
|
2
|
+
export { RecordingManager } from "./manager.js";
|
|
3
|
+
export type { RecordingMode, RecordingFormat, RecordingOptions, AsciicastHeader, AsciicastEvent, AsciicastOutputEvent, AsciicastResizeEvent, RecordingMetadata, StopReason, } from "./types.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recording/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EACV,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,GACX,MAAM,YAAY,CAAC"}
|