ssh-agent-workspace 1.0.5 → 1.0.6
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 +471 -471
- package/dist/__tests__/SSHManager.test.js +59 -37
- package/dist/__tests__/SSHManager.test.js.map +1 -1
- package/dist/__tests__/SessionManager.test.js +53 -51
- package/dist/__tests__/SessionManager.test.js.map +1 -1
- package/dist/__tests__/StorageManager.test.js +74 -74
- package/dist/__tests__/StorageManager.test.js.map +1 -1
- package/dist/__tests__/ansi.test.js +33 -33
- package/dist/__tests__/ansi.test.js.map +1 -1
- package/dist/__tests__/security.test.js +54 -54
- package/dist/__tests__/security.test.js.map +1 -1
- package/dist/__tests__/validation.test.js +17 -17
- package/dist/__tests__/validation.test.js.map +1 -1
- package/dist/core/HostSecurityManager.d.ts.map +1 -1
- package/dist/core/HostSecurityManager.js +9 -9
- package/dist/core/HostSecurityManager.js.map +1 -1
- package/dist/core/SSHManager.d.ts +1 -1
- package/dist/core/SSHManager.d.ts.map +1 -1
- package/dist/core/SSHManager.js +31 -31
- package/dist/core/SSHManager.js.map +1 -1
- package/dist/core/SessionManager.d.ts +4 -4
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +14 -14
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/StorageManager.d.ts.map +1 -1
- package/dist/core/StorageManager.js +11 -11
- package/dist/core/StorageManager.js.map +1 -1
- package/dist/core/TmuxManager.d.ts +3 -3
- package/dist/core/TmuxManager.d.ts.map +1 -1
- package/dist/core/TmuxManager.js +16 -16
- package/dist/core/TmuxManager.js.map +1 -1
- package/dist/core/ToolConfigManager.d.ts.map +1 -1
- package/dist/core/ToolConfigManager.js +10 -10
- package/dist/core/ToolConfigManager.js.map +1 -1
- package/dist/index.js +35 -35
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +4 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +41 -41
- package/dist/server.js.map +1 -1
- package/dist/tools/backup.d.ts +3 -3
- package/dist/tools/backup.d.ts.map +1 -1
- package/dist/tools/backup.js +86 -49
- package/dist/tools/backup.js.map +1 -1
- package/dist/tools/connect.d.ts +4 -4
- package/dist/tools/connect.d.ts.map +1 -1
- package/dist/tools/connect.js +54 -42
- package/dist/tools/connect.js.map +1 -1
- package/dist/tools/connection_status.d.ts +4 -4
- package/dist/tools/connection_status.d.ts.map +1 -1
- package/dist/tools/connection_status.js +23 -16
- package/dist/tools/connection_status.js.map +1 -1
- package/dist/tools/db_query.d.ts +3 -3
- package/dist/tools/db_query.d.ts.map +1 -1
- package/dist/tools/db_query.js +130 -78
- package/dist/tools/db_query.js.map +1 -1
- package/dist/tools/deploy.d.ts +3 -3
- package/dist/tools/deploy.d.ts.map +1 -1
- package/dist/tools/deploy.js +103 -53
- package/dist/tools/deploy.js.map +1 -1
- package/dist/tools/disconnect.d.ts +3 -3
- package/dist/tools/disconnect.d.ts.map +1 -1
- package/dist/tools/disconnect.js +16 -19
- package/dist/tools/disconnect.js.map +1 -1
- package/dist/tools/exec.d.ts +3 -3
- package/dist/tools/exec.d.ts.map +1 -1
- package/dist/tools/exec.js +40 -45
- package/dist/tools/exec.js.map +1 -1
- package/dist/tools/group_exec.d.ts +3 -3
- package/dist/tools/group_exec.d.ts.map +1 -1
- package/dist/tools/group_exec.js +60 -44
- package/dist/tools/group_exec.js.map +1 -1
- package/dist/tools/health_check.d.ts +3 -3
- package/dist/tools/health_check.d.ts.map +1 -1
- package/dist/tools/health_check.js +27 -23
- package/dist/tools/health_check.js.map +1 -1
- package/dist/tools/host_security.d.ts +1 -1
- package/dist/tools/host_security.d.ts.map +1 -1
- package/dist/tools/host_security.js +30 -36
- package/dist/tools/host_security.js.map +1 -1
- package/dist/tools/index.d.ts +23 -23
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +23 -23
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/interrupt.d.ts +3 -3
- package/dist/tools/interrupt.d.ts.map +1 -1
- package/dist/tools/interrupt.js +18 -18
- package/dist/tools/interrupt.js.map +1 -1
- package/dist/tools/list_hosts.d.ts.map +1 -1
- package/dist/tools/list_hosts.js +5 -7
- package/dist/tools/list_hosts.js.map +1 -1
- package/dist/tools/list_sessions.d.ts +1 -1
- package/dist/tools/list_sessions.js +4 -4
- package/dist/tools/list_sessions.js.map +1 -1
- package/dist/tools/read_output.d.ts +3 -3
- package/dist/tools/read_output.d.ts.map +1 -1
- package/dist/tools/read_output.js +17 -17
- package/dist/tools/read_output.js.map +1 -1
- package/dist/tools/reconnect_to_tmux.d.ts +4 -4
- package/dist/tools/reconnect_to_tmux.d.ts.map +1 -1
- package/dist/tools/reconnect_to_tmux.js +44 -37
- package/dist/tools/reconnect_to_tmux.js.map +1 -1
- package/dist/tools/send_input.d.ts +3 -3
- package/dist/tools/send_input.d.ts.map +1 -1
- package/dist/tools/send_input.js +18 -18
- package/dist/tools/send_input.js.map +1 -1
- package/dist/tools/sftp_download.d.ts +3 -3
- package/dist/tools/sftp_download.d.ts.map +1 -1
- package/dist/tools/sftp_download.js +41 -27
- package/dist/tools/sftp_download.js.map +1 -1
- package/dist/tools/sftp_list.d.ts +3 -3
- package/dist/tools/sftp_list.d.ts.map +1 -1
- package/dist/tools/sftp_list.js +35 -26
- package/dist/tools/sftp_list.js.map +1 -1
- package/dist/tools/sftp_upload.d.ts +3 -3
- package/dist/tools/sftp_upload.d.ts.map +1 -1
- package/dist/tools/sftp_upload.js +43 -29
- package/dist/tools/sftp_upload.js.map +1 -1
- package/dist/tools/ssh_tunnel.d.ts +3 -3
- package/dist/tools/ssh_tunnel.d.ts.map +1 -1
- package/dist/tools/ssh_tunnel.js +130 -76
- package/dist/tools/ssh_tunnel.js.map +1 -1
- package/dist/tools/sync.d.ts +3 -3
- package/dist/tools/sync.d.ts.map +1 -1
- package/dist/tools/sync.js +103 -61
- package/dist/tools/sync.js.map +1 -1
- package/dist/tools/tail_log.d.ts +3 -3
- package/dist/tools/tail_log.d.ts.map +1 -1
- package/dist/tools/tail_log.js +38 -26
- package/dist/tools/tail_log.js.map +1 -1
- package/dist/tools/tools_config.d.ts +1 -1
- package/dist/tools/tools_config.d.ts.map +1 -1
- package/dist/tools/tools_config.js +25 -35
- package/dist/tools/tools_config.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/ansi.js +1 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +2 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/security.d.ts +1 -1
- package/dist/utils/security.js +3 -3
- package/dist/utils/security.js.map +1 -1
- package/dist/utils/ssh.d.ts +2 -2
- package/dist/utils/ssh.js +5 -5
- package/dist/utils/ssh.js.map +1 -1
- package/dist/utils/sshConfig.d.ts +1 -1
- package/dist/utils/sshConfig.d.ts.map +1 -1
- package/dist/utils/sshConfig.js +21 -21
- package/dist/utils/sshConfig.js.map +1 -1
- package/dist/utils/validation.d.ts +1 -1
- package/dist/utils/validation.js +3 -3
- package/dist/utils/validation.js.map +1 -1
- package/docs/SECURITY.md +213 -213
- package/docs/TOOLS.md +425 -425
- package/package.json +59 -48
- package/vitest.config.ts +10 -10
package/dist/core/TmuxManager.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { logger } from
|
|
2
|
-
export const MCP_PROMPT =
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
export const MCP_PROMPT = "__MCP_PROMPT__> ";
|
|
3
3
|
function q(value) {
|
|
4
4
|
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
5
5
|
}
|
|
@@ -10,11 +10,11 @@ export class TmuxManager {
|
|
|
10
10
|
}
|
|
11
11
|
async isInstalled(ssh) {
|
|
12
12
|
try {
|
|
13
|
-
const result = await this.sshManager.exec(ssh,
|
|
13
|
+
const result = await this.sshManager.exec(ssh, "tmux -V");
|
|
14
14
|
return result.code === 0;
|
|
15
15
|
}
|
|
16
16
|
catch (err) {
|
|
17
|
-
logger.debug({ error: err.message },
|
|
17
|
+
logger.debug({ error: err.message }, "tmux check failed");
|
|
18
18
|
return false;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
@@ -23,12 +23,12 @@ export class TmuxManager {
|
|
|
23
23
|
if (result.code !== 0) {
|
|
24
24
|
throw new Error(`Failed to create/attach tmux session '${sessionName}': ${result.stderr || result.stdout}`);
|
|
25
25
|
}
|
|
26
|
-
logger.info({ sessionName },
|
|
26
|
+
logger.info({ sessionName }, "Tmux session created/attached");
|
|
27
27
|
}
|
|
28
28
|
async applyOptions(ssh, sessionName) {
|
|
29
29
|
await this.sshManager.exec(ssh, `tmux set-option -t ${q(sessionName)} history-limit 50000`);
|
|
30
30
|
await this.sshManager.exec(ssh, `tmux set-option -t ${q(sessionName)} mouse off`);
|
|
31
|
-
logger.info({ sessionName },
|
|
31
|
+
logger.info({ sessionName }, "Applied tmux options (history-limit=50000, mouse=off)");
|
|
32
32
|
}
|
|
33
33
|
async detectShell(ssh, sessionName) {
|
|
34
34
|
const result = await this.sshManager.exec(ssh, `tmux display-message -t ${q(sessionName)} -p '#{pane_current_command}'`);
|
|
@@ -36,24 +36,24 @@ export class TmuxManager {
|
|
|
36
36
|
return null;
|
|
37
37
|
}
|
|
38
38
|
const shell = result.stdout.trim().toLowerCase();
|
|
39
|
-
logger.info({ sessionName, shell },
|
|
39
|
+
logger.info({ sessionName, shell }, "Shell detected");
|
|
40
40
|
return shell;
|
|
41
41
|
}
|
|
42
42
|
async injectPrompt(ssh, sessionName) {
|
|
43
43
|
const cmd = `export PS1='${MCP_PROMPT}'`;
|
|
44
44
|
await this.sendCommand(ssh, sessionName, cmd);
|
|
45
|
-
logger.info({ sessionName },
|
|
45
|
+
logger.info({ sessionName }, "Injected deterministic prompt");
|
|
46
46
|
}
|
|
47
47
|
async healthCheck(ssh, sessionName) {
|
|
48
48
|
const result = await this.sshManager.exec(ssh, `tmux has-session -t ${q(sessionName)}`);
|
|
49
49
|
if (result.code !== 0) {
|
|
50
|
-
logger.warn({ sessionName },
|
|
50
|
+
logger.warn({ sessionName }, "Tmux health check failed: session missing");
|
|
51
51
|
return false;
|
|
52
52
|
}
|
|
53
53
|
return true;
|
|
54
54
|
}
|
|
55
55
|
async sendInput(ssh, sessionName, input) {
|
|
56
|
-
const base64 = Buffer.from(input).toString(
|
|
56
|
+
const base64 = Buffer.from(input).toString("base64");
|
|
57
57
|
const command = `printf '%s' ${q(base64)} | base64 -d | tmux load-buffer - && tmux paste-buffer -t ${q(sessionName)} -d`;
|
|
58
58
|
const result = await this.sshManager.exec(ssh, command);
|
|
59
59
|
if (result.code !== 0) {
|
|
@@ -61,7 +61,7 @@ export class TmuxManager {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
async sendCommand(ssh, sessionName, command) {
|
|
64
|
-
const base64 = Buffer.from(command +
|
|
64
|
+
const base64 = Buffer.from(command + "\n").toString("base64");
|
|
65
65
|
const shellCommand = `printf '%s' ${q(base64)} | base64 -d | tmux load-buffer - && tmux paste-buffer -t ${q(sessionName)} -d`;
|
|
66
66
|
const result = await this.sshManager.exec(ssh, shellCommand);
|
|
67
67
|
if (result.code !== 0) {
|
|
@@ -69,12 +69,12 @@ export class TmuxManager {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
async sendSignal(ssh, sessionName, signal) {
|
|
72
|
-
const key = signal ===
|
|
72
|
+
const key = signal === "SIGINT" ? "C-c" : "C-c";
|
|
73
73
|
const result = await this.sshManager.exec(ssh, `tmux send-keys -t ${q(sessionName)} ${key}`);
|
|
74
74
|
if (result.code !== 0) {
|
|
75
75
|
throw new Error(`Failed to send signal ${signal} to tmux session '${sessionName}': ${result.stderr || result.stdout}`);
|
|
76
76
|
}
|
|
77
|
-
logger.info({ sessionName, signal },
|
|
77
|
+
logger.info({ sessionName, signal }, "Signal sent to tmux pane");
|
|
78
78
|
}
|
|
79
79
|
async capturePane(ssh, sessionName, lines) {
|
|
80
80
|
const result = await this.sshManager.exec(ssh, `tmux capture-pane -t ${q(sessionName)} -p -S -${lines}`);
|
|
@@ -93,17 +93,17 @@ export class TmuxManager {
|
|
|
93
93
|
return [];
|
|
94
94
|
}
|
|
95
95
|
return result.stdout
|
|
96
|
-
.split(
|
|
96
|
+
.split("\n")
|
|
97
97
|
.map((s) => s.trim())
|
|
98
98
|
.filter(Boolean);
|
|
99
99
|
}
|
|
100
100
|
async killSession(ssh, sessionName) {
|
|
101
101
|
const result = await this.sshManager.exec(ssh, `tmux kill-session -t ${q(sessionName)}`);
|
|
102
102
|
if (result.code !== 0) {
|
|
103
|
-
logger.warn({ sessionName, error: result.stderr },
|
|
103
|
+
logger.warn({ sessionName, error: result.stderr }, "Failed to kill tmux session");
|
|
104
104
|
}
|
|
105
105
|
else {
|
|
106
|
-
logger.info({ sessionName },
|
|
106
|
+
logger.info({ sessionName }, "Tmux session killed");
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TmuxManager.js","sourceRoot":"","sources":["../../src/core/TmuxManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAE7C,SAAS,CAAC,CAAC,KAAa;
|
|
1
|
+
{"version":3,"file":"TmuxManager.js","sourceRoot":"","sources":["../../src/core/TmuxManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolConfigManager.d.ts","sourceRoot":"","sources":["../../src/core/ToolConfigManager.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;
|
|
1
|
+
{"version":3,"file":"ToolConfigManager.d.ts","sourceRoot":"","sources":["../../src/core/ToolConfigManager.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACvB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAKD,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAEf,SAAS,CAAC,EAAE,MAAM;IAK9B,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,IAAI;IAYZ,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMpC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAKpD,KAAK,IAAI,IAAI;IAKb,MAAM,IAAI,UAAU;CAGvB"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { logger } from
|
|
2
|
-
import * as fs from
|
|
3
|
-
import * as path from
|
|
4
|
-
import * as os from
|
|
5
|
-
const DEFAULT_DIR = path.join(os.homedir(),
|
|
6
|
-
const CONFIG_FILE =
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import * as os from "os";
|
|
5
|
+
const DEFAULT_DIR = path.join(os.homedir(), ".dynamic-ssh-mcp");
|
|
6
|
+
const CONFIG_FILE = "tools.json";
|
|
7
7
|
export class ToolConfigManager {
|
|
8
8
|
config;
|
|
9
9
|
configPath;
|
|
@@ -14,12 +14,12 @@ export class ToolConfigManager {
|
|
|
14
14
|
load() {
|
|
15
15
|
try {
|
|
16
16
|
if (fs.existsSync(this.configPath)) {
|
|
17
|
-
const raw = fs.readFileSync(this.configPath,
|
|
17
|
+
const raw = fs.readFileSync(this.configPath, "utf-8");
|
|
18
18
|
return JSON.parse(raw);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
catch (err) {
|
|
22
|
-
logger.warn({ err },
|
|
22
|
+
logger.warn({ err }, "Failed to load tool config, using defaults");
|
|
23
23
|
}
|
|
24
24
|
return {};
|
|
25
25
|
}
|
|
@@ -32,11 +32,11 @@ export class ToolConfigManager {
|
|
|
32
32
|
fs.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));
|
|
33
33
|
}
|
|
34
34
|
catch (err) {
|
|
35
|
-
logger.error({ err },
|
|
35
|
+
logger.error({ err }, "Failed to save tool config");
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
isEnabled(toolName) {
|
|
39
|
-
if (toolName ===
|
|
39
|
+
if (toolName === "tools_config")
|
|
40
40
|
return true;
|
|
41
41
|
if (!(toolName in this.config))
|
|
42
42
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolConfigManager.js","sourceRoot":"","sources":["../../src/core/ToolConfigManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAMzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAChE,MAAM,WAAW,GAAG,YAAY,CAAC;AAEjC,MAAM,OAAO,iBAAiB;
|
|
1
|
+
{"version":3,"file":"ToolConfigManager.js","sourceRoot":"","sources":["../../src/core/ToolConfigManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAMzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAChE,MAAM,WAAW,GAAG,YAAY,CAAC;AAEjC,MAAM,OAAO,iBAAiB;IAClB,MAAM,CAAa;IACnB,UAAU,CAAS;IAE3B,YAAY,SAAkB;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,WAAW,EAAE,WAAW,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAEO,IAAI;QACR,IAAI,CAAC;YACD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACtD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,4CAA4C,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAEO,IAAI;QACR,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,CAAC;YACD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,4BAA4B,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IAED,SAAS,CAAC,QAAgB;QACtB,IAAI,QAAQ,KAAK,cAAc;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,UAAU,CAAC,QAAgB,EAAE,OAAgB;QACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC;IAED,MAAM;QACF,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;CACJ"}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { createServer } from
|
|
3
|
-
import { StorageManager } from
|
|
4
|
-
import { SSHManager } from
|
|
5
|
-
import { TmuxManager, MCP_PROMPT } from
|
|
6
|
-
import { listHostAliases, getHostConfig } from
|
|
7
|
-
import { buildSshConfig } from
|
|
8
|
-
import { isHostAllowed } from
|
|
9
|
-
import { logger } from
|
|
10
|
-
const RESTORE_ENABLED = process.env.MCP_SSH_RESTORE_SESSIONS !==
|
|
2
|
+
import { createServer } from "./server.js";
|
|
3
|
+
import { StorageManager } from "./core/StorageManager.js";
|
|
4
|
+
import { SSHManager } from "./core/SSHManager.js";
|
|
5
|
+
import { TmuxManager, MCP_PROMPT } from "./core/TmuxManager.js";
|
|
6
|
+
import { listHostAliases, getHostConfig } from "./utils/sshConfig.js";
|
|
7
|
+
import { buildSshConfig } from "./utils/ssh.js";
|
|
8
|
+
import { isHostAllowed } from "./utils/security.js";
|
|
9
|
+
import { logger } from "./utils/logger.js";
|
|
10
|
+
const RESTORE_ENABLED = process.env.MCP_SSH_RESTORE_SESSIONS !== "false";
|
|
11
11
|
async function restoreSessions(storage, sshManager, tmuxManager, sessionManager) {
|
|
12
12
|
if (!RESTORE_ENABLED) {
|
|
13
|
-
logger.info(
|
|
13
|
+
logger.info("Session restore disabled (MCP_SSH_RESTORE_SESSIONS=false)");
|
|
14
14
|
return 0;
|
|
15
15
|
}
|
|
16
16
|
// Strategy 1: Restore from persistent storage (known sessions from last run)
|
|
@@ -24,10 +24,10 @@ async function restoreSessions(storage, sshManager, tmuxManager, sessionManager)
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
if (hosts.length === 0) {
|
|
27
|
-
logger.debug(
|
|
27
|
+
logger.debug("No hosts to restore");
|
|
28
28
|
return 0;
|
|
29
29
|
}
|
|
30
|
-
logger.info({ hosts },
|
|
30
|
+
logger.info({ hosts }, "Attempting session restore");
|
|
31
31
|
let restored = 0;
|
|
32
32
|
const knownTmuxSessions = new Set(storage.listTmuxSessions());
|
|
33
33
|
for (const host of hosts) {
|
|
@@ -35,12 +35,12 @@ async function restoreSessions(storage, sshManager, tmuxManager, sessionManager)
|
|
|
35
35
|
continue;
|
|
36
36
|
const hostConfig = getHostConfig(host);
|
|
37
37
|
if (!hostConfig) {
|
|
38
|
-
logger.debug({ host },
|
|
38
|
+
logger.debug({ host }, "Skip restore: no SSH config");
|
|
39
39
|
continue;
|
|
40
40
|
}
|
|
41
41
|
const baseSshConfig = buildSshConfig(hostConfig, 15000);
|
|
42
42
|
if (!baseSshConfig) {
|
|
43
|
-
logger.warn({ host },
|
|
43
|
+
logger.warn({ host }, "Skip restore: failed to build SSH config");
|
|
44
44
|
continue;
|
|
45
45
|
}
|
|
46
46
|
// First, connect temporarily to discover mcp_* tmux sessions
|
|
@@ -49,13 +49,13 @@ async function restoreSessions(storage, sshManager, tmuxManager, sessionManager)
|
|
|
49
49
|
probeSsh = await sshManager.connect({ ...baseSshConfig });
|
|
50
50
|
}
|
|
51
51
|
catch (err) {
|
|
52
|
-
logger.warn({ host, error: err.message },
|
|
52
|
+
logger.warn({ host, error: err.message }, "Restore: SSH probe failed");
|
|
53
53
|
continue;
|
|
54
54
|
}
|
|
55
55
|
const tmuxInstalled = await tmuxManager.isInstalled(probeSsh);
|
|
56
56
|
if (!tmuxInstalled) {
|
|
57
57
|
sshManager.disconnect(probeSsh);
|
|
58
|
-
logger.debug({ host },
|
|
58
|
+
logger.debug({ host }, "Restore: tmux not installed, skipping");
|
|
59
59
|
continue;
|
|
60
60
|
}
|
|
61
61
|
let tmuxSessions = [];
|
|
@@ -64,14 +64,14 @@ async function restoreSessions(storage, sshManager, tmuxManager, sessionManager)
|
|
|
64
64
|
}
|
|
65
65
|
catch (err) {
|
|
66
66
|
sshManager.disconnect(probeSsh);
|
|
67
|
-
logger.warn({ host, error: err.message },
|
|
67
|
+
logger.warn({ host, error: err.message }, "Restore: list sessions failed");
|
|
68
68
|
continue;
|
|
69
69
|
}
|
|
70
70
|
// Filter for MCP-managed sessions (mcp_ prefix)
|
|
71
|
-
const mcpSessions = tmuxSessions.filter((s) => s.startsWith(
|
|
71
|
+
const mcpSessions = tmuxSessions.filter((s) => s.startsWith("mcp_"));
|
|
72
72
|
sshManager.disconnect(probeSsh);
|
|
73
73
|
if (mcpSessions.length === 0) {
|
|
74
|
-
logger.debug({ host },
|
|
74
|
+
logger.debug({ host }, "Restore: no mcp_* tmux sessions found");
|
|
75
75
|
continue;
|
|
76
76
|
}
|
|
77
77
|
// Reconnect to each MCP tmux session with its own SSH connection
|
|
@@ -83,7 +83,7 @@ async function restoreSessions(storage, sshManager, tmuxManager, sessionManager)
|
|
|
83
83
|
ssh = await sshManager.connect({ ...baseSshConfig });
|
|
84
84
|
}
|
|
85
85
|
catch (err) {
|
|
86
|
-
logger.warn({ host, tmuxSession, error: err.message },
|
|
86
|
+
logger.warn({ host, tmuxSession, error: err.message }, "Restore: SSH session connect failed");
|
|
87
87
|
continue;
|
|
88
88
|
}
|
|
89
89
|
try {
|
|
@@ -103,16 +103,16 @@ async function restoreSessions(storage, sshManager, tmuxManager, sessionManager)
|
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
catch {
|
|
106
|
-
logger.warn({ host, tmuxSession },
|
|
106
|
+
logger.warn({ host, tmuxSession }, "Restore: prompt check failed, continuing");
|
|
107
107
|
}
|
|
108
108
|
const session = sessionManager.create(host, ssh, tmuxSession, storedSession?.shell, storedSession?.id);
|
|
109
|
-
logger.info({ sessionId: session.id, host, tmuxSession },
|
|
109
|
+
logger.info({ sessionId: session.id, host, tmuxSession }, "Session restored");
|
|
110
110
|
restored++;
|
|
111
111
|
knownTmuxSessions.add(tmuxSession);
|
|
112
112
|
}
|
|
113
113
|
catch (err) {
|
|
114
114
|
sshManager.disconnect(ssh);
|
|
115
|
-
logger.warn({ host, tmuxSession, error: err.message },
|
|
115
|
+
logger.warn({ host, tmuxSession, error: err.message }, "Restore: session skipped");
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
}
|
|
@@ -120,10 +120,10 @@ async function restoreSessions(storage, sshManager, tmuxManager, sessionManager)
|
|
|
120
120
|
for (const stored of storedSessions) {
|
|
121
121
|
if (!knownTmuxSessions.has(stored.tmuxSession)) {
|
|
122
122
|
storage.remove(stored.id);
|
|
123
|
-
logger.debug({ sessionId: stored.id, tmuxSession: stored.tmuxSession },
|
|
123
|
+
logger.debug({ sessionId: stored.id, tmuxSession: stored.tmuxSession }, "Cleaned up stale session record");
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
logger.info({ restored },
|
|
126
|
+
logger.info({ restored }, "Session restore complete");
|
|
127
127
|
return restored;
|
|
128
128
|
}
|
|
129
129
|
async function main() {
|
|
@@ -132,20 +132,20 @@ async function main() {
|
|
|
132
132
|
const sshManager = new SSHManager();
|
|
133
133
|
const tmuxManager = new TmuxManager(sshManager);
|
|
134
134
|
// Prevent silent crashes from unhandled errors
|
|
135
|
-
process.on(
|
|
136
|
-
logger.fatal({ error: err.message, stack: err.stack },
|
|
135
|
+
process.on("uncaughtException", (err) => {
|
|
136
|
+
logger.fatal({ error: err.message, stack: err.stack }, "Uncaught exception");
|
|
137
137
|
process.exit(1);
|
|
138
138
|
});
|
|
139
|
-
process.on(
|
|
140
|
-
logger.fatal({ error: reason?.message || String(reason) },
|
|
139
|
+
process.on("unhandledRejection", (reason) => {
|
|
140
|
+
logger.fatal({ error: reason?.message || String(reason) }, "Unhandled rejection");
|
|
141
141
|
});
|
|
142
142
|
// Restore previous sessions on startup (fire-and-forget, doesn't block MCP)
|
|
143
143
|
restoreSessions(storage, sshManager, tmuxManager, sessionManager).catch((err) => {
|
|
144
|
-
logger.error({ error: err.message },
|
|
144
|
+
logger.error({ error: err.message }, "Session restore failed");
|
|
145
145
|
});
|
|
146
146
|
// Graceful shutdown
|
|
147
147
|
const cleanup = () => {
|
|
148
|
-
logger.info(
|
|
148
|
+
logger.info("Shutting down...");
|
|
149
149
|
sessionManager.disconnectAll();
|
|
150
150
|
storage.shutdown();
|
|
151
151
|
server
|
|
@@ -157,13 +157,13 @@ async function main() {
|
|
|
157
157
|
process.exit(1);
|
|
158
158
|
});
|
|
159
159
|
};
|
|
160
|
-
process.on(
|
|
161
|
-
process.on(
|
|
160
|
+
process.on("SIGINT", cleanup);
|
|
161
|
+
process.on("SIGTERM", cleanup);
|
|
162
162
|
await server.connect(transport);
|
|
163
|
-
logger.info(
|
|
163
|
+
logger.info("Dynamic SSH MCP server running on stdio");
|
|
164
164
|
}
|
|
165
165
|
main().catch((err) => {
|
|
166
|
-
logger.error({ error: err.message },
|
|
166
|
+
logger.error({ error: err.message }, "Fatal error");
|
|
167
167
|
process.exit(1);
|
|
168
168
|
});
|
|
169
169
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,OAAO,CAAC;AAEzE,KAAK,UAAU,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Server } from
|
|
2
|
-
import { StdioServerTransport } from
|
|
3
|
-
import { SessionManager } from
|
|
4
|
-
import { StorageManager } from
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { SessionManager } from "./core/SessionManager.js";
|
|
4
|
+
import { StorageManager } from "./core/StorageManager.js";
|
|
5
5
|
export declare function createServer(storage?: StorageManager): {
|
|
6
6
|
server: Server<{
|
|
7
7
|
method: string;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAsF1D,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuHpD"}
|
package/dist/server.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { Server } from
|
|
2
|
-
import { StdioServerTransport } from
|
|
3
|
-
import { CallToolRequestSchema, ListToolsRequestSchema, McpError, ErrorCode
|
|
4
|
-
import { SessionManager } from
|
|
5
|
-
import { SSHManager } from
|
|
6
|
-
import { TmuxManager } from
|
|
7
|
-
import { StorageManager } from
|
|
8
|
-
import { ToolConfigManager } from
|
|
9
|
-
import { HostSecurityManager } from
|
|
10
|
-
import { setHostSecurityManager } from
|
|
11
|
-
import { logger } from
|
|
12
|
-
import { listHostsTool, handleListHosts, connectTool, handleConnect, reconnectTool, handleReconnect, sendInputTool, handleSendInput, readOutputTool, handleReadOutput, execTool, handleExec, interruptTool, handleInterrupt, disconnectTool, handleDisconnect, listSessionsTool, handleListSessions, sftpUploadTool, handleSftpUpload, sftpDownloadTool, handleSftpDownload, sftpListTool, handleSftpList, connectionStatusTool, handleConnectionStatus, healthCheckTool, handleHealthCheck, tailLogTool, handleTailLog, tunnelOpenTool, tunnelCloseTool, tunnelListTool, handleTunnelOpen, handleTunnelClose, handleTunnelList, deployTool, handleDeploy, backupTool, handleBackup, syncTool, handleSync, groupExecTool, handleGroupExec, dbQueryTool, handleDbQuery, toolsConfigTool, handleToolsConfig, hostSecurityTool, handleHostSecurity, } from
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
|
|
4
|
+
import { SessionManager } from "./core/SessionManager.js";
|
|
5
|
+
import { SSHManager } from "./core/SSHManager.js";
|
|
6
|
+
import { TmuxManager } from "./core/TmuxManager.js";
|
|
7
|
+
import { StorageManager } from "./core/StorageManager.js";
|
|
8
|
+
import { ToolConfigManager } from "./core/ToolConfigManager.js";
|
|
9
|
+
import { HostSecurityManager } from "./core/HostSecurityManager.js";
|
|
10
|
+
import { setHostSecurityManager } from "./utils/security.js";
|
|
11
|
+
import { logger } from "./utils/logger.js";
|
|
12
|
+
import { listHostsTool, handleListHosts, connectTool, handleConnect, reconnectTool, handleReconnect, sendInputTool, handleSendInput, readOutputTool, handleReadOutput, execTool, handleExec, interruptTool, handleInterrupt, disconnectTool, handleDisconnect, listSessionsTool, handleListSessions, sftpUploadTool, handleSftpUpload, sftpDownloadTool, handleSftpDownload, sftpListTool, handleSftpList, connectionStatusTool, handleConnectionStatus, healthCheckTool, handleHealthCheck, tailLogTool, handleTailLog, tunnelOpenTool, tunnelCloseTool, tunnelListTool, handleTunnelOpen, handleTunnelClose, handleTunnelList, deployTool, handleDeploy, backupTool, handleBackup, syncTool, handleSync, groupExecTool, handleGroupExec, dbQueryTool, handleDbQuery, toolsConfigTool, handleToolsConfig, hostSecurityTool, handleHostSecurity, } from "./tools/index.js";
|
|
13
13
|
const allTools = [
|
|
14
14
|
listHostsTool,
|
|
15
15
|
connectTool,
|
|
@@ -40,8 +40,8 @@ const allTools = [
|
|
|
40
40
|
export function createServer(storage) {
|
|
41
41
|
const storageManager = storage || new StorageManager();
|
|
42
42
|
const server = new Server({
|
|
43
|
-
name:
|
|
44
|
-
version:
|
|
43
|
+
name: "dynamic-ssh-mcp",
|
|
44
|
+
version: "1.0.0",
|
|
45
45
|
}, {
|
|
46
46
|
capabilities: {
|
|
47
47
|
tools: {},
|
|
@@ -58,82 +58,82 @@ export function createServer(storage) {
|
|
|
58
58
|
}));
|
|
59
59
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
60
60
|
const { name, arguments: args } = request.params;
|
|
61
|
-
logger.info({ tool: name },
|
|
61
|
+
logger.info({ tool: name }, "Tool called");
|
|
62
62
|
try {
|
|
63
63
|
switch (name) {
|
|
64
|
-
case
|
|
64
|
+
case "list_hosts": {
|
|
65
65
|
return await handleListHosts();
|
|
66
66
|
}
|
|
67
|
-
case
|
|
67
|
+
case "connect": {
|
|
68
68
|
return await handleConnect(args, sessionManager, sshManager, tmuxManager);
|
|
69
69
|
}
|
|
70
|
-
case
|
|
70
|
+
case "reconnect_to_tmux": {
|
|
71
71
|
return await handleReconnect(args, sessionManager, sshManager, tmuxManager);
|
|
72
72
|
}
|
|
73
|
-
case
|
|
73
|
+
case "send_input": {
|
|
74
74
|
return await handleSendInput(args, sessionManager, tmuxManager);
|
|
75
75
|
}
|
|
76
|
-
case
|
|
76
|
+
case "read_output": {
|
|
77
77
|
return await handleReadOutput(args, sessionManager, tmuxManager);
|
|
78
78
|
}
|
|
79
|
-
case
|
|
79
|
+
case "exec": {
|
|
80
80
|
return await handleExec(args, sessionManager, tmuxManager);
|
|
81
81
|
}
|
|
82
|
-
case
|
|
82
|
+
case "interrupt": {
|
|
83
83
|
return await handleInterrupt(args, sessionManager, tmuxManager);
|
|
84
84
|
}
|
|
85
|
-
case
|
|
85
|
+
case "disconnect": {
|
|
86
86
|
return await handleDisconnect(args, sessionManager, tmuxManager);
|
|
87
87
|
}
|
|
88
|
-
case
|
|
88
|
+
case "list_sessions": {
|
|
89
89
|
return await handleListSessions(sessionManager);
|
|
90
90
|
}
|
|
91
|
-
case
|
|
91
|
+
case "sftp_upload": {
|
|
92
92
|
return await handleSftpUpload(args, sessionManager, sshManager);
|
|
93
93
|
}
|
|
94
|
-
case
|
|
94
|
+
case "sftp_download": {
|
|
95
95
|
return await handleSftpDownload(args, sessionManager, sshManager);
|
|
96
96
|
}
|
|
97
|
-
case
|
|
97
|
+
case "sftp_list": {
|
|
98
98
|
return await handleSftpList(args, sessionManager, sshManager);
|
|
99
99
|
}
|
|
100
|
-
case
|
|
100
|
+
case "connection_status": {
|
|
101
101
|
return await handleConnectionStatus(args, sessionManager, sshManager, tmuxManager);
|
|
102
102
|
}
|
|
103
|
-
case
|
|
103
|
+
case "health_check": {
|
|
104
104
|
return await handleHealthCheck(args, sessionManager, sshManager);
|
|
105
105
|
}
|
|
106
|
-
case
|
|
106
|
+
case "tail_log": {
|
|
107
107
|
return await handleTailLog(args, sessionManager, sshManager);
|
|
108
108
|
}
|
|
109
|
-
case
|
|
109
|
+
case "ssh_tunnel_open": {
|
|
110
110
|
return await handleTunnelOpen(args, sessionManager, sshManager);
|
|
111
111
|
}
|
|
112
|
-
case
|
|
112
|
+
case "ssh_tunnel_close": {
|
|
113
113
|
return await handleTunnelClose(args);
|
|
114
114
|
}
|
|
115
|
-
case
|
|
115
|
+
case "ssh_tunnel_list": {
|
|
116
116
|
return await handleTunnelList();
|
|
117
117
|
}
|
|
118
|
-
case
|
|
118
|
+
case "deploy": {
|
|
119
119
|
return await handleDeploy(args, sessionManager, sshManager);
|
|
120
120
|
}
|
|
121
|
-
case
|
|
121
|
+
case "backup": {
|
|
122
122
|
return await handleBackup(args, sessionManager, sshManager);
|
|
123
123
|
}
|
|
124
|
-
case
|
|
124
|
+
case "sync": {
|
|
125
125
|
return await handleSync(args, sessionManager, sshManager);
|
|
126
126
|
}
|
|
127
|
-
case
|
|
127
|
+
case "group_exec": {
|
|
128
128
|
return await handleGroupExec(args, sessionManager, tmuxManager);
|
|
129
129
|
}
|
|
130
|
-
case
|
|
130
|
+
case "db_query": {
|
|
131
131
|
return await handleDbQuery(args, sessionManager, sshManager);
|
|
132
132
|
}
|
|
133
|
-
case
|
|
133
|
+
case "tools_config": {
|
|
134
134
|
return await handleToolsConfig(args, toolConfigManager);
|
|
135
135
|
}
|
|
136
|
-
case
|
|
136
|
+
case "host_security": {
|
|
137
137
|
return await handleHostSecurity(args, hostSecurityManager);
|
|
138
138
|
}
|
|
139
139
|
default: {
|
|
@@ -143,7 +143,7 @@ export function createServer(storage) {
|
|
|
143
143
|
}
|
|
144
144
|
catch (err) {
|
|
145
145
|
const message = err instanceof Error ? err.message : String(err);
|
|
146
|
-
logger.error({ tool: name, error: message },
|
|
146
|
+
logger.error({ tool: name, error: message }, "Unhandled tool error");
|
|
147
147
|
throw new McpError(ErrorCode.InternalError, `Tool execution failed: ${message}`);
|
|
148
148
|
}
|
|
149
149
|
});
|