enterprise-ssh-mcp-server 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.
@@ -0,0 +1,618 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { createServer, createConnection } from "node:net";
3
+ import { randomUUID } from "node:crypto";
4
+ import { Client, } from "ssh2";
5
+ import { ByteCollector, ShellRingBuffer } from "./buffers.js";
6
+ import { McpToolError } from "./tool-result.js";
7
+ export class SshSession {
8
+ id;
9
+ client;
10
+ name;
11
+ host;
12
+ port;
13
+ username;
14
+ createdAt;
15
+ shells = new Map();
16
+ localTunnels = new Map();
17
+ remoteTunnels = new Map();
18
+ sftpPromise;
19
+ connected = false;
20
+ lastUsedAt;
21
+ lastError;
22
+ constructor(id, input, client) {
23
+ this.id = id;
24
+ this.client = client;
25
+ if (input.name !== undefined) {
26
+ this.name = input.name;
27
+ }
28
+ this.host = input.host;
29
+ this.port = input.port;
30
+ this.username = input.username;
31
+ this.createdAt = new Date().toISOString();
32
+ this.lastUsedAt = this.createdAt;
33
+ this.installConnectionEventHandlers();
34
+ }
35
+ static async connect(input) {
36
+ const client = new Client();
37
+ const session = new SshSession(randomUUID(), input, client);
38
+ await session.open(input);
39
+ return session;
40
+ }
41
+ summary() {
42
+ const summary = {
43
+ id: this.id,
44
+ host: this.host,
45
+ port: this.port,
46
+ username: this.username,
47
+ connected: this.connected,
48
+ createdAt: this.createdAt,
49
+ lastUsedAt: this.lastUsedAt,
50
+ shellCount: this.shells.size,
51
+ localTunnelCount: this.localTunnels.size,
52
+ remoteTunnelCount: this.remoteTunnels.size,
53
+ };
54
+ if (this.name !== undefined) {
55
+ summary.name = this.name;
56
+ }
57
+ if (this.lastError !== undefined) {
58
+ summary.lastError = this.lastError;
59
+ }
60
+ return summary;
61
+ }
62
+ async disconnect() {
63
+ for (const shell of this.shells.values()) {
64
+ shell.channel.close();
65
+ shell.closed = true;
66
+ }
67
+ for (const tunnel of [...this.localTunnels.values()]) {
68
+ await this.stopLocalTunnel(tunnel.id);
69
+ }
70
+ for (const tunnel of [...this.remoteTunnels.values()]) {
71
+ await this.stopRemoteTunnel(tunnel.id);
72
+ }
73
+ if (this.sftpPromise !== undefined) {
74
+ const sftp = await this.sftpPromise;
75
+ sftp.end();
76
+ this.sftpPromise = undefined;
77
+ }
78
+ await new Promise((resolve) => {
79
+ if (!this.connected) {
80
+ resolve();
81
+ return;
82
+ }
83
+ const timeout = setTimeout(resolve, 1_000);
84
+ this.client.once("close", () => {
85
+ clearTimeout(timeout);
86
+ resolve();
87
+ });
88
+ this.client.end();
89
+ });
90
+ this.connected = false;
91
+ this.touch();
92
+ return this.summary();
93
+ }
94
+ async rekey() {
95
+ this.ensureConnected();
96
+ const rekeyClient = this.client;
97
+ if (typeof rekeyClient.rekey !== "function") {
98
+ throw new McpToolError("ssh_rekey_unsupported", "The installed ssh2 client does not expose a rekey method", {
99
+ sessionId: this.id,
100
+ });
101
+ }
102
+ await new Promise((resolve, reject) => {
103
+ rekeyClient.rekey?.(() => {
104
+ resolve();
105
+ });
106
+ this.client.once("error", (err) => {
107
+ reject(new McpToolError("ssh_rekey_failed", err.message, { sessionId: this.id }));
108
+ });
109
+ });
110
+ this.touch();
111
+ return { ok: true, sessionId: this.id };
112
+ }
113
+ exec(input) {
114
+ this.ensureConnected();
115
+ this.touch();
116
+ const startedAt = Date.now();
117
+ const stdout = new ByteCollector(input.maxOutputBytes);
118
+ const stderr = new ByteCollector(input.maxOutputBytes);
119
+ return new Promise((resolve, reject) => {
120
+ const options = buildExecOptions(input);
121
+ this.client.exec(input.command, options, (err, channel) => {
122
+ if (err != null) {
123
+ reject(new McpToolError("ssh_exec_open_failed", err.message, { sessionId: this.id, command: input.command }));
124
+ return;
125
+ }
126
+ let exitCode = null;
127
+ let signal = null;
128
+ let timedOut = false;
129
+ const timeout = setTimeout(() => {
130
+ timedOut = true;
131
+ channel.close();
132
+ }, input.timeoutMs);
133
+ channel.on("data", (chunk) => {
134
+ stdout.append(chunk);
135
+ });
136
+ channel.stderr.on("data", (chunk) => {
137
+ stderr.append(chunk);
138
+ });
139
+ channel.on("exit", (codeOrNull, signalName) => {
140
+ exitCode = codeOrNull;
141
+ if (signalName !== undefined) {
142
+ signal = signalName;
143
+ }
144
+ });
145
+ channel.on("close", () => {
146
+ clearTimeout(timeout);
147
+ resolve({
148
+ command: input.command,
149
+ exitCode,
150
+ signal,
151
+ timedOut,
152
+ durationMs: Date.now() - startedAt,
153
+ stdout: stdout.snapshot(input.outputEncoding),
154
+ stderr: stderr.snapshot(input.outputEncoding),
155
+ });
156
+ });
157
+ channel.on("error", (streamError) => {
158
+ clearTimeout(timeout);
159
+ reject(new McpToolError("ssh_exec_stream_failed", streamError.message, {
160
+ sessionId: this.id,
161
+ command: input.command,
162
+ }));
163
+ });
164
+ if (input.stdin !== undefined) {
165
+ const stdin = input.stdinEncoding === "base64" ? Buffer.from(input.stdin, "base64") : input.stdin;
166
+ channel.end(stdin);
167
+ return;
168
+ }
169
+ channel.eof();
170
+ });
171
+ });
172
+ }
173
+ openShell(input) {
174
+ this.ensureConnected();
175
+ this.touch();
176
+ return new Promise((resolve, reject) => {
177
+ const window = input.allocatePty ? input.pty ?? {} : false;
178
+ const options = input.env === undefined ? {} : { env: input.env };
179
+ this.client.shell(window, options, (err, channel) => {
180
+ if (err != null) {
181
+ reject(new McpToolError("ssh_shell_open_failed", err.message, { sessionId: this.id }));
182
+ return;
183
+ }
184
+ const shell = {
185
+ id: randomUUID(),
186
+ channel,
187
+ buffer: new ShellRingBuffer(input.ringBufferBytes),
188
+ openedAt: new Date().toISOString(),
189
+ lastUsedAt: new Date().toISOString(),
190
+ closed: false,
191
+ exitCode: null,
192
+ exitSignal: null,
193
+ };
194
+ channel.on("data", (chunk) => {
195
+ shell.buffer.append("stdout", chunk);
196
+ });
197
+ channel.stderr.on("data", (chunk) => {
198
+ shell.buffer.append("stderr", chunk);
199
+ });
200
+ channel.on("exit", (codeOrNull, signalName) => {
201
+ shell.exitCode = codeOrNull;
202
+ if (signalName !== undefined) {
203
+ shell.exitSignal = signalName;
204
+ }
205
+ });
206
+ channel.on("close", () => {
207
+ shell.closed = true;
208
+ shell.lastUsedAt = new Date().toISOString();
209
+ });
210
+ channel.on("error", (streamError) => {
211
+ shell.closed = true;
212
+ this.lastError = streamError.message;
213
+ });
214
+ this.shells.set(shell.id, shell);
215
+ resolve(this.shellSummary(shell));
216
+ });
217
+ });
218
+ }
219
+ listShells() {
220
+ return [...this.shells.values()].map((shell) => this.shellSummary(shell));
221
+ }
222
+ writeShell(shellId, data, encoding) {
223
+ const shell = this.getShell(shellId);
224
+ if (shell.closed) {
225
+ throw new McpToolError("ssh_shell_closed", "Shell channel is closed", { sessionId: this.id, shellId });
226
+ }
227
+ const payload = encoding === "base64" ? Buffer.from(data, "base64") : data;
228
+ shell.channel.write(payload);
229
+ shell.lastUsedAt = new Date().toISOString();
230
+ this.touch();
231
+ return this.shellSummary(shell);
232
+ }
233
+ readShell(input) {
234
+ const shell = this.getShell(input.shellId);
235
+ shell.lastUsedAt = new Date().toISOString();
236
+ this.touch();
237
+ return {
238
+ shell: this.shellSummary(shell),
239
+ output: shell.buffer.read(input.maxBytes, input.encoding, input.drain),
240
+ };
241
+ }
242
+ resizeShell(shellId, rows, cols, height, width) {
243
+ const shell = this.getShell(shellId);
244
+ if (shell.closed) {
245
+ throw new McpToolError("ssh_shell_closed", "Shell channel is closed", { sessionId: this.id, shellId });
246
+ }
247
+ shell.channel.setWindow(rows, cols, height, width);
248
+ shell.lastUsedAt = new Date().toISOString();
249
+ this.touch();
250
+ return this.shellSummary(shell);
251
+ }
252
+ closeShell(shellId) {
253
+ const shell = this.getShell(shellId);
254
+ shell.channel.close();
255
+ shell.closed = true;
256
+ shell.lastUsedAt = new Date().toISOString();
257
+ this.touch();
258
+ return this.shellSummary(shell);
259
+ }
260
+ getSftp() {
261
+ this.ensureConnected();
262
+ this.touch();
263
+ if (this.sftpPromise !== undefined) {
264
+ return this.sftpPromise;
265
+ }
266
+ this.sftpPromise = new Promise((resolve, reject) => {
267
+ this.client.sftp((err, sftp) => {
268
+ if (err != null) {
269
+ this.sftpPromise = undefined;
270
+ reject(new McpToolError("sftp_open_failed", err.message, { sessionId: this.id }));
271
+ return;
272
+ }
273
+ sftp.on("error", (streamError) => {
274
+ this.lastError = streamError.message;
275
+ this.sftpPromise = undefined;
276
+ });
277
+ sftp.on("end", () => {
278
+ this.sftpPromise = undefined;
279
+ });
280
+ sftp.on("close", () => {
281
+ this.sftpPromise = undefined;
282
+ });
283
+ resolve(sftp);
284
+ });
285
+ });
286
+ return this.sftpPromise;
287
+ }
288
+ startLocalForward(input) {
289
+ this.ensureConnected();
290
+ this.touch();
291
+ const tunnelId = randomUUID();
292
+ const server = createServer((socket) => {
293
+ const tunnel = this.localTunnels.get(tunnelId);
294
+ if (tunnel === undefined) {
295
+ socket.destroy();
296
+ return;
297
+ }
298
+ this.handleLocalForwardConnection(tunnel, socket);
299
+ });
300
+ return new Promise((resolve, reject) => {
301
+ server.once("error", (err) => {
302
+ reject(new McpToolError("local_forward_listen_failed", err.message, {
303
+ sessionId: this.id,
304
+ localHost: input.localHost,
305
+ localPort: input.localPort,
306
+ }));
307
+ });
308
+ server.listen(input.localPort, input.localHost, () => {
309
+ const address = server.address();
310
+ const bindPort = typeof address === "object" && address !== null ? address.port : input.localPort;
311
+ const tunnel = {
312
+ id: tunnelId,
313
+ server,
314
+ bindHost: input.localHost,
315
+ bindPort,
316
+ targetHost: input.targetHost,
317
+ targetPort: input.targetPort,
318
+ openedAt: new Date().toISOString(),
319
+ connectionCount: 0,
320
+ };
321
+ this.localTunnels.set(tunnel.id, tunnel);
322
+ resolve(this.localTunnelSummary(tunnel));
323
+ });
324
+ });
325
+ }
326
+ async startRemoteForward(input) {
327
+ this.ensureConnected();
328
+ this.touch();
329
+ const bindPort = await new Promise((resolve, reject) => {
330
+ this.client.forwardIn(input.remoteHost, input.remotePort, (err, port) => {
331
+ if (err != null) {
332
+ reject(new McpToolError("remote_forward_bind_failed", err.message, {
333
+ sessionId: this.id,
334
+ remoteHost: input.remoteHost,
335
+ remotePort: input.remotePort,
336
+ }));
337
+ return;
338
+ }
339
+ resolve(port);
340
+ });
341
+ });
342
+ const tunnel = {
343
+ id: randomUUID(),
344
+ bindHost: input.remoteHost,
345
+ bindPort,
346
+ targetHost: input.targetHost,
347
+ targetPort: input.targetPort,
348
+ openedAt: new Date().toISOString(),
349
+ connectionCount: 0,
350
+ };
351
+ this.remoteTunnels.set(tunnel.id, tunnel);
352
+ return this.remoteTunnelSummary(tunnel);
353
+ }
354
+ listTunnels() {
355
+ const local = [...this.localTunnels.values()].map((tunnel) => this.localTunnelSummary(tunnel));
356
+ const remote = [...this.remoteTunnels.values()].map((tunnel) => this.remoteTunnelSummary(tunnel));
357
+ return [...local, ...remote];
358
+ }
359
+ async stopTunnel(tunnelId) {
360
+ const localTunnel = this.localTunnels.get(tunnelId);
361
+ if (localTunnel !== undefined) {
362
+ const summary = this.localTunnelSummary(localTunnel);
363
+ await this.stopLocalTunnel(tunnelId);
364
+ return summary;
365
+ }
366
+ const remoteTunnel = this.remoteTunnels.get(tunnelId);
367
+ if (remoteTunnel !== undefined) {
368
+ const summary = this.remoteTunnelSummary(remoteTunnel);
369
+ await this.stopRemoteTunnel(tunnelId);
370
+ return summary;
371
+ }
372
+ throw new McpToolError("tunnel_not_found", "Tunnel id was not found", { sessionId: this.id, tunnelId });
373
+ }
374
+ async open(input) {
375
+ const privateKey = await loadPrivateKey(input);
376
+ const config = buildConnectConfig(input, privateKey);
377
+ if (input.tryKeyboard) {
378
+ this.client.on("keyboard-interactive", (_name, _instructions, _lang, prompts, finish) => {
379
+ finish(input.keyboardResponses.slice(0, prompts.length));
380
+ });
381
+ }
382
+ await new Promise((resolve, reject) => {
383
+ let settled = false;
384
+ const fail = (err) => {
385
+ if (settled) {
386
+ return;
387
+ }
388
+ settled = true;
389
+ cleanup();
390
+ reject(new McpToolError("ssh_connect_failed", err.message, {
391
+ host: input.host,
392
+ port: input.port,
393
+ username: input.username,
394
+ }));
395
+ };
396
+ const ready = () => {
397
+ if (settled) {
398
+ return;
399
+ }
400
+ settled = true;
401
+ cleanup();
402
+ this.connected = true;
403
+ resolve();
404
+ };
405
+ const closedBeforeReady = () => {
406
+ fail(new Error("SSH connection closed before ready"));
407
+ };
408
+ const cleanup = () => {
409
+ this.client.off("ready", ready);
410
+ this.client.off("error", fail);
411
+ this.client.off("close", closedBeforeReady);
412
+ };
413
+ this.client.once("ready", ready);
414
+ this.client.once("error", fail);
415
+ this.client.once("close", closedBeforeReady);
416
+ this.client.connect(config);
417
+ });
418
+ }
419
+ installConnectionEventHandlers() {
420
+ this.client.on("error", (err) => {
421
+ this.lastError = err.message;
422
+ });
423
+ this.client.on("close", () => {
424
+ this.connected = false;
425
+ for (const shell of this.shells.values()) {
426
+ shell.closed = true;
427
+ }
428
+ this.sftpPromise = undefined;
429
+ });
430
+ this.client.on("tcp connection", (details, accept, reject) => {
431
+ this.handleRemoteForwardConnection(details, accept, reject);
432
+ });
433
+ }
434
+ ensureConnected() {
435
+ if (!this.connected) {
436
+ throw new McpToolError("ssh_session_not_connected", "SSH session is not connected", { sessionId: this.id });
437
+ }
438
+ }
439
+ touch() {
440
+ this.lastUsedAt = new Date().toISOString();
441
+ }
442
+ getShell(shellId) {
443
+ const shell = this.shells.get(shellId);
444
+ if (shell === undefined) {
445
+ throw new McpToolError("ssh_shell_not_found", "Shell id was not found", { sessionId: this.id, shellId });
446
+ }
447
+ return shell;
448
+ }
449
+ shellSummary(shell) {
450
+ return {
451
+ id: shell.id,
452
+ openedAt: shell.openedAt,
453
+ lastUsedAt: shell.lastUsedAt,
454
+ closed: shell.closed,
455
+ bufferedBytes: shell.buffer.size(),
456
+ exitCode: shell.exitCode,
457
+ exitSignal: shell.exitSignal,
458
+ };
459
+ }
460
+ handleLocalForwardConnection(tunnel, socket) {
461
+ tunnel.connectionCount += 1;
462
+ this.client.forwardOut(socket.remoteAddress ?? "127.0.0.1", socket.remotePort ?? 0, tunnel.targetHost, tunnel.targetPort, (err, channel) => {
463
+ if (err != null) {
464
+ tunnel.lastError = err.message;
465
+ socket.destroy(err);
466
+ return;
467
+ }
468
+ socket.pipe(channel).pipe(socket);
469
+ channel.on("error", (streamError) => {
470
+ tunnel.lastError = streamError.message;
471
+ socket.destroy(streamError);
472
+ });
473
+ });
474
+ }
475
+ handleRemoteForwardConnection(details, accept, reject) {
476
+ const tunnel = [...this.remoteTunnels.values()].find((candidate) => candidate.bindPort === details.destPort);
477
+ if (tunnel === undefined) {
478
+ reject();
479
+ return;
480
+ }
481
+ const channel = accept();
482
+ const socket = createConnection({ host: tunnel.targetHost, port: tunnel.targetPort });
483
+ tunnel.connectionCount += 1;
484
+ channel.pipe(socket).pipe(channel);
485
+ socket.on("error", (err) => {
486
+ tunnel.lastError = err.message;
487
+ channel.destroy();
488
+ });
489
+ channel.on("error", (err) => {
490
+ tunnel.lastError = err.message;
491
+ socket.destroy(err);
492
+ });
493
+ }
494
+ async stopLocalTunnel(tunnelId) {
495
+ const tunnel = this.localTunnels.get(tunnelId);
496
+ if (tunnel === undefined) {
497
+ return;
498
+ }
499
+ await new Promise((resolve, reject) => {
500
+ tunnel.server.close((err) => {
501
+ if (err !== undefined) {
502
+ reject(new McpToolError("local_forward_close_failed", err.message, { sessionId: this.id, tunnelId }));
503
+ return;
504
+ }
505
+ resolve();
506
+ });
507
+ });
508
+ this.localTunnels.delete(tunnelId);
509
+ }
510
+ async stopRemoteTunnel(tunnelId) {
511
+ const tunnel = this.remoteTunnels.get(tunnelId);
512
+ if (tunnel === undefined) {
513
+ return;
514
+ }
515
+ await new Promise((resolve, reject) => {
516
+ this.client.unforwardIn(tunnel.bindHost, tunnel.bindPort, (err) => {
517
+ if (err != null) {
518
+ reject(new McpToolError("remote_forward_close_failed", err.message, { sessionId: this.id, tunnelId }));
519
+ return;
520
+ }
521
+ resolve();
522
+ });
523
+ });
524
+ this.remoteTunnels.delete(tunnelId);
525
+ }
526
+ localTunnelSummary(tunnel) {
527
+ const summary = {
528
+ id: tunnel.id,
529
+ type: "local",
530
+ bindHost: tunnel.bindHost,
531
+ bindPort: tunnel.bindPort,
532
+ targetHost: tunnel.targetHost,
533
+ targetPort: tunnel.targetPort,
534
+ openedAt: tunnel.openedAt,
535
+ connectionCount: tunnel.connectionCount,
536
+ };
537
+ if (tunnel.lastError !== undefined) {
538
+ summary.lastError = tunnel.lastError;
539
+ }
540
+ return summary;
541
+ }
542
+ remoteTunnelSummary(tunnel) {
543
+ const summary = {
544
+ id: tunnel.id,
545
+ type: "remote",
546
+ bindHost: tunnel.bindHost,
547
+ bindPort: tunnel.bindPort,
548
+ targetHost: tunnel.targetHost,
549
+ targetPort: tunnel.targetPort,
550
+ openedAt: tunnel.openedAt,
551
+ connectionCount: tunnel.connectionCount,
552
+ };
553
+ if (tunnel.lastError !== undefined) {
554
+ summary.lastError = tunnel.lastError;
555
+ }
556
+ return summary;
557
+ }
558
+ }
559
+ async function loadPrivateKey(input) {
560
+ if (input.privateKey !== undefined) {
561
+ return input.privateKey;
562
+ }
563
+ if (input.privateKeyPath === undefined) {
564
+ return undefined;
565
+ }
566
+ return readFile(input.privateKeyPath, "utf8");
567
+ }
568
+ function buildConnectConfig(input, privateKey) {
569
+ const config = {
570
+ host: input.host,
571
+ port: input.port,
572
+ username: input.username,
573
+ agentForward: input.agentForward,
574
+ tryKeyboard: input.tryKeyboard,
575
+ keepaliveInterval: input.keepaliveIntervalMs,
576
+ keepaliveCountMax: input.keepaliveCountMax,
577
+ readyTimeout: input.readyTimeoutMs,
578
+ timeout: input.connectionTimeoutMs,
579
+ strictVendor: input.strictVendor,
580
+ };
581
+ if (input.password !== undefined) {
582
+ config.password = input.password;
583
+ }
584
+ if (privateKey !== undefined) {
585
+ config.privateKey = privateKey;
586
+ }
587
+ if (input.passphrase !== undefined) {
588
+ config.passphrase = input.passphrase;
589
+ }
590
+ if (input.agent !== undefined) {
591
+ config.agent = input.agent;
592
+ }
593
+ if (input.hostHash !== undefined) {
594
+ config.hostHash = input.hostHash;
595
+ }
596
+ if (input.expectedHostHash !== undefined) {
597
+ config.hostVerifier = (hashedKey) => {
598
+ return hashedKey.toLowerCase() === input.expectedHostHash?.toLowerCase();
599
+ };
600
+ }
601
+ if (input.debug) {
602
+ config.debug = (message) => {
603
+ process.stderr.write(`[ssh2] ${message}\n`);
604
+ };
605
+ }
606
+ return config;
607
+ }
608
+ function buildExecOptions(input) {
609
+ const options = {};
610
+ if (input.env !== undefined) {
611
+ options.env = input.env;
612
+ }
613
+ if (input.pty !== undefined) {
614
+ options.pty = input.pty;
615
+ }
616
+ return options;
617
+ }
618
+ //# sourceMappingURL=ssh-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-session.js","sourceRoot":"","sources":["../src/ssh-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare class McpToolError extends Error {
3
+ readonly code: string;
4
+ readonly details?: object;
5
+ constructor(code: string, message: string, details?: object);
6
+ }
7
+ export declare function setCompactJsonResponse(enabled: boolean): void;
8
+ export declare function jsonResponse(payload: object): CallToolResult;
9
+ export declare function toToolResult(task: () => Promise<object>): Promise<CallToolResult>;
10
+ export declare function serializeError(error: Error | McpToolError): object;
11
+ export declare function assertNonEmpty(value: string, fieldName: string): void;