ssh-mcp-pro 1.0.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/AGENTS.md +127 -0
- package/ARCHITECTURE.md +145 -0
- package/LICENSE +21 -0
- package/LICENSES/MIT.txt +21 -0
- package/MIGRATION.md +14 -0
- package/README.md +175 -0
- package/REGISTRY_SUBMISSION.md +38 -0
- package/SECURITY.md +40 -0
- package/SECURITY_DECISIONS.md +59 -0
- package/dist/agent-bin.d.ts +3 -0
- package/dist/agent-bin.d.ts.map +1 -0
- package/dist/agent-bin.js +8 -0
- package/dist/agent-bin.js.map +1 -0
- package/dist/audit.d.ts +25 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +50 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth.d.ts +4 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +33 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +99 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +103 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +490 -0
- package/dist/config.js.map +1 -0
- package/dist/connector-credentials.d.ts +8 -0
- package/dist/connector-credentials.d.ts.map +1 -0
- package/dist/connector-credentials.js +132 -0
- package/dist/connector-credentials.js.map +1 -0
- package/dist/connector-profile.d.ts +17 -0
- package/dist/connector-profile.d.ts.map +1 -0
- package/dist/connector-profile.js +81 -0
- package/dist/connector-profile.js.map +1 -0
- package/dist/container.d.ts +18 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +52 -0
- package/dist/container.js.map +1 -0
- package/dist/detect.d.ts +7 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +271 -0
- package/dist/detect.js.map +1 -0
- package/dist/ensure.d.ts +17 -0
- package/dist/ensure.d.ts.map +1 -0
- package/dist/ensure.js +531 -0
- package/dist/ensure.js.map +1 -0
- package/dist/errors.d.ts +54 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +84 -0
- package/dist/errors.js.map +1 -0
- package/dist/fs-tools.d.ts +26 -0
- package/dist/fs-tools.d.ts.map +1 -0
- package/dist/fs-tools.js +599 -0
- package/dist/fs-tools.js.map +1 -0
- package/dist/http-rate-limit.d.ts +9 -0
- package/dist/http-rate-limit.d.ts.map +1 -0
- package/dist/http-rate-limit.js +41 -0
- package/dist/http-rate-limit.js.map +1 -0
- package/dist/http-security.d.ts +22 -0
- package/dist/http-security.d.ts.map +1 -0
- package/dist/http-security.js +88 -0
- package/dist/http-security.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +201 -0
- package/dist/index.js.map +1 -0
- package/dist/logging.d.ts +52 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +180 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp.d.ts +16 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +159 -0
- package/dist/mcp.js.map +1 -0
- package/dist/metrics.d.ts +95 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +204 -0
- package/dist/metrics.js.map +1 -0
- package/dist/oauth.d.ts +14 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +105 -0
- package/dist/oauth.js.map +1 -0
- package/dist/policy.d.ts +64 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +368 -0
- package/dist/policy.js.map +1 -0
- package/dist/process.d.ts +24 -0
- package/dist/process.d.ts.map +1 -0
- package/dist/process.js +212 -0
- package/dist/process.js.map +1 -0
- package/dist/prompts.d.ts +49 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +191 -0
- package/dist/prompts.js.map +1 -0
- package/dist/rate-limiter.d.ts +57 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +141 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/remote/agent-cli.d.ts +2 -0
- package/dist/remote/agent-cli.d.ts.map +1 -0
- package/dist/remote/agent-cli.js +270 -0
- package/dist/remote/agent-cli.js.map +1 -0
- package/dist/remote/agent-executor.d.ts +26 -0
- package/dist/remote/agent-executor.d.ts.map +1 -0
- package/dist/remote/agent-executor.js +400 -0
- package/dist/remote/agent-executor.js.map +1 -0
- package/dist/remote/config.d.ts +3 -0
- package/dist/remote/config.d.ts.map +1 -0
- package/dist/remote/config.js +52 -0
- package/dist/remote/config.js.map +1 -0
- package/dist/remote/control-plane.d.ts +57 -0
- package/dist/remote/control-plane.d.ts.map +1 -0
- package/dist/remote/control-plane.js +1248 -0
- package/dist/remote/control-plane.js.map +1 -0
- package/dist/remote/crypto.d.ts +38 -0
- package/dist/remote/crypto.d.ts.map +1 -0
- package/dist/remote/crypto.js +143 -0
- package/dist/remote/crypto.js.map +1 -0
- package/dist/remote/mcp-tools.d.ts +10 -0
- package/dist/remote/mcp-tools.d.ts.map +1 -0
- package/dist/remote/mcp-tools.js +201 -0
- package/dist/remote/mcp-tools.js.map +1 -0
- package/dist/remote/policy.d.ts +11 -0
- package/dist/remote/policy.d.ts.map +1 -0
- package/dist/remote/policy.js +94 -0
- package/dist/remote/policy.js.map +1 -0
- package/dist/remote/schemas.d.ts +298 -0
- package/dist/remote/schemas.d.ts.map +1 -0
- package/dist/remote/schemas.js +111 -0
- package/dist/remote/schemas.js.map +1 -0
- package/dist/remote/scopes.d.ts +6 -0
- package/dist/remote/scopes.d.ts.map +1 -0
- package/dist/remote/scopes.js +24 -0
- package/dist/remote/scopes.js.map +1 -0
- package/dist/remote/store.d.ts +45 -0
- package/dist/remote/store.d.ts.map +1 -0
- package/dist/remote/store.js +355 -0
- package/dist/remote/store.js.map +1 -0
- package/dist/remote/types.d.ts +183 -0
- package/dist/remote/types.d.ts.map +1 -0
- package/dist/remote/types.js +103 -0
- package/dist/remote/types.js.map +1 -0
- package/dist/remote/util.d.ts +6 -0
- package/dist/remote/util.d.ts.map +1 -0
- package/dist/remote/util.js +45 -0
- package/dist/remote/util.js.map +1 -0
- package/dist/remote/websocket.d.ts +26 -0
- package/dist/remote/websocket.d.ts.map +1 -0
- package/dist/remote/websocket.js +167 -0
- package/dist/remote/websocket.js.map +1 -0
- package/dist/render-http.d.ts +2 -0
- package/dist/render-http.d.ts.map +1 -0
- package/dist/render-http.js +14 -0
- package/dist/render-http.js.map +1 -0
- package/dist/resources.d.ts +19 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +96 -0
- package/dist/resources.js.map +1 -0
- package/dist/retry.d.ts +45 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +120 -0
- package/dist/retry.js.map +1 -0
- package/dist/safety.d.ts +31 -0
- package/dist/safety.d.ts.map +1 -0
- package/dist/safety.js +174 -0
- package/dist/safety.js.map +1 -0
- package/dist/server-http.d.ts +2 -0
- package/dist/server-http.d.ts.map +1 -0
- package/dist/server-http.js +432 -0
- package/dist/server-http.js.map +1 -0
- package/dist/session.d.ts +116 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +666 -0
- package/dist/session.js.map +1 -0
- package/dist/shell.d.ts +10 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +83 -0
- package/dist/shell.js.map +1 -0
- package/dist/ssh-config.d.ts +94 -0
- package/dist/ssh-config.d.ts.map +1 -0
- package/dist/ssh-config.js +234 -0
- package/dist/ssh-config.js.map +1 -0
- package/dist/streaming.d.ts +36 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +140 -0
- package/dist/streaming.js.map +1 -0
- package/dist/telemetry.d.ts +17 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +101 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tools/connector.provider.d.ts +28 -0
- package/dist/tools/connector.provider.d.ts.map +1 -0
- package/dist/tools/connector.provider.js +360 -0
- package/dist/tools/connector.provider.js.map +1 -0
- package/dist/tools/ensure.provider.d.ts +18 -0
- package/dist/tools/ensure.provider.d.ts.map +1 -0
- package/dist/tools/ensure.provider.js +173 -0
- package/dist/tools/ensure.provider.js.map +1 -0
- package/dist/tools/fs.provider.d.ts +21 -0
- package/dist/tools/fs.provider.d.ts.map +1 -0
- package/dist/tools/fs.provider.js +259 -0
- package/dist/tools/fs.provider.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +68 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/metadata.d.ts +11 -0
- package/dist/tools/metadata.d.ts.map +1 -0
- package/dist/tools/metadata.js +10 -0
- package/dist/tools/metadata.js.map +1 -0
- package/dist/tools/output-schemas.d.ts +217 -0
- package/dist/tools/output-schemas.d.ts.map +1 -0
- package/dist/tools/output-schemas.js +300 -0
- package/dist/tools/output-schemas.js.map +1 -0
- package/dist/tools/process.provider.d.ts +22 -0
- package/dist/tools/process.provider.d.ts.map +1 -0
- package/dist/tools/process.provider.js +146 -0
- package/dist/tools/process.provider.js.map +1 -0
- package/dist/tools/registry.d.ts +12 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +163 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/results.d.ts +4 -0
- package/dist/tools/results.d.ts.map +1 -0
- package/dist/tools/results.js +5 -0
- package/dist/tools/results.js.map +1 -0
- package/dist/tools/session.provider.d.ts +23 -0
- package/dist/tools/session.provider.d.ts.map +1 -0
- package/dist/tools/session.provider.js +299 -0
- package/dist/tools/session.provider.js.map +1 -0
- package/dist/tools/system.provider.d.ts +18 -0
- package/dist/tools/system.provider.d.ts.map +1 -0
- package/dist/tools/system.provider.js +81 -0
- package/dist/tools/system.provider.js.map +1 -0
- package/dist/tools/transfer.provider.d.ts +16 -0
- package/dist/tools/transfer.provider.d.ts.map +1 -0
- package/dist/tools/transfer.provider.js +85 -0
- package/dist/tools/transfer.provider.js.map +1 -0
- package/dist/tools/tunnel.provider.d.ts +18 -0
- package/dist/tools/tunnel.provider.d.ts.map +1 -0
- package/dist/tools/tunnel.provider.js +142 -0
- package/dist/tools/tunnel.provider.js.map +1 -0
- package/dist/tools/types.d.ts +16 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/transfer.d.ts +40 -0
- package/dist/transfer.d.ts.map +1 -0
- package/dist/transfer.js +363 -0
- package/dist/transfer.js.map +1 -0
- package/dist/tunnel.d.ts +37 -0
- package/dist/tunnel.d.ts.map +1 -0
- package/dist/tunnel.js +234 -0
- package/dist/tunnel.js.map +1 -0
- package/dist/types.d.ts +341 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +184 -0
- package/dist/types.js.map +1 -0
- package/docs/docker.md +22 -0
- package/examples/README.md +77 -0
- package/mcp.json +21 -0
- package/package.json +147 -0
- package/registry/ssh-mcp-pro/mcp.json +21 -0
- package/server.json +76 -0
package/dist/process.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { createSudoError, wrapError, createTimeoutError } from "./errors.js";
|
|
2
|
+
import { logger, createTimer } from "./logging.js";
|
|
3
|
+
import { buildRemoteCommandWithTimeout, buildSudoCommand } from "./shell.js";
|
|
4
|
+
import { ErrorCode } from "./types.js";
|
|
5
|
+
function truncateText(value, maxBytes) {
|
|
6
|
+
const valueBytes = Buffer.byteLength(value, "utf8");
|
|
7
|
+
if (valueBytes <= maxBytes) {
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
const marker = `\n[ssh-mcp-pro: output truncated after ${maxBytes} bytes]\n`;
|
|
11
|
+
const markerBytes = Buffer.byteLength(marker, "utf8");
|
|
12
|
+
const budget = Math.max(0, maxBytes - markerBytes);
|
|
13
|
+
let output = "";
|
|
14
|
+
let used = 0;
|
|
15
|
+
for (const char of value) {
|
|
16
|
+
const charBytes = Buffer.byteLength(char, "utf8");
|
|
17
|
+
if (used + charBytes > budget) {
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
output += char;
|
|
21
|
+
used += charBytes;
|
|
22
|
+
}
|
|
23
|
+
return `${output}${marker}`;
|
|
24
|
+
}
|
|
25
|
+
async function execWithTimeout(work, timeoutMs, label) {
|
|
26
|
+
let timeout;
|
|
27
|
+
try {
|
|
28
|
+
return await Promise.race([
|
|
29
|
+
work,
|
|
30
|
+
new Promise((_, reject) => {
|
|
31
|
+
timeout = setTimeout(() => {
|
|
32
|
+
reject(createTimeoutError(`${label} timed out after ${timeoutMs}ms`, "Increase timeout or optimize the command"));
|
|
33
|
+
}, timeoutMs);
|
|
34
|
+
}),
|
|
35
|
+
]);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
if (timeout) {
|
|
39
|
+
clearTimeout(timeout);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function createProcessService({ sessionManager, config, policy, }) {
|
|
44
|
+
async function execCommand(sessionId, command, cwd, env, timeoutMs) {
|
|
45
|
+
logger.debug("Executing command", { sessionId, command, cwd, timeoutMs });
|
|
46
|
+
const session = sessionManager.getSession(sessionId);
|
|
47
|
+
if (!session) {
|
|
48
|
+
throw new Error(`Session ${sessionId} not found or expired`);
|
|
49
|
+
}
|
|
50
|
+
const decision = policy.assertAllowed({
|
|
51
|
+
action: "proc.exec",
|
|
52
|
+
command,
|
|
53
|
+
mode: session.info.policyMode,
|
|
54
|
+
});
|
|
55
|
+
if (decision.mode === "explain") {
|
|
56
|
+
return {
|
|
57
|
+
code: 0,
|
|
58
|
+
stdout: JSON.stringify({ wouldExecute: true, command, policy: decision }, null, 2),
|
|
59
|
+
stderr: "",
|
|
60
|
+
durationMs: 0,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const osInfo = await sessionManager.getOSInfo(sessionId);
|
|
64
|
+
const timer = createTimer();
|
|
65
|
+
const effectiveTimeoutMs = timeoutMs ?? config.commandTimeoutMs;
|
|
66
|
+
try {
|
|
67
|
+
const shellCommand = buildRemoteCommandWithTimeout(command, osInfo, effectiveTimeoutMs, cwd, env);
|
|
68
|
+
const result = await execWithTimeout(session.ssh.execCommand(shellCommand), effectiveTimeoutMs, "Command");
|
|
69
|
+
const execResult = {
|
|
70
|
+
code: result.code ?? 0,
|
|
71
|
+
stdout: truncateText(result.stdout ?? "", config.maxCommandOutputBytes),
|
|
72
|
+
stderr: truncateText(result.stderr ?? "", config.maxCommandOutputBytes),
|
|
73
|
+
durationMs: timer.elapsed(),
|
|
74
|
+
};
|
|
75
|
+
if (execResult.code === 124 || execResult.code === 137 || execResult.code === 143) {
|
|
76
|
+
throw createTimeoutError(`Command timed out after ${effectiveTimeoutMs}ms and remote termination was requested`, "Increase timeout or optimize the command");
|
|
77
|
+
}
|
|
78
|
+
logger.debug("Command execution completed", {
|
|
79
|
+
sessionId,
|
|
80
|
+
code: execResult.code,
|
|
81
|
+
durationMs: execResult.durationMs,
|
|
82
|
+
});
|
|
83
|
+
return execResult;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
logger.error("Command execution failed", { sessionId, command, error });
|
|
87
|
+
if (error?.code === ErrorCode.ETIMEOUT) {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
throw wrapError(error, ErrorCode.ECONN, "Failed to execute command on remote system");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function execSudo(sessionId, command, password, cwd, timeoutMs, policyOptions = {}) {
|
|
94
|
+
logger.debug("Executing sudo command", {
|
|
95
|
+
sessionId,
|
|
96
|
+
command,
|
|
97
|
+
cwd,
|
|
98
|
+
timeoutMs,
|
|
99
|
+
});
|
|
100
|
+
const session = sessionManager.getSession(sessionId);
|
|
101
|
+
if (!session) {
|
|
102
|
+
throw new Error(`Session ${sessionId} not found or expired`);
|
|
103
|
+
}
|
|
104
|
+
const decision = policy.assertAllowed({
|
|
105
|
+
action: policyOptions.policyAction ?? "proc.sudo",
|
|
106
|
+
command,
|
|
107
|
+
mode: session.info.policyMode,
|
|
108
|
+
rawSudo: policyOptions.rawSudo ?? true,
|
|
109
|
+
...(policyOptions.path ? { path: policyOptions.path } : {}),
|
|
110
|
+
...(policyOptions.destructive !== undefined
|
|
111
|
+
? { destructive: policyOptions.destructive }
|
|
112
|
+
: {}),
|
|
113
|
+
});
|
|
114
|
+
if (decision.mode === "explain") {
|
|
115
|
+
return {
|
|
116
|
+
code: 0,
|
|
117
|
+
stdout: JSON.stringify({ wouldExecute: true, command, sudo: true, policy: decision }, null, 2),
|
|
118
|
+
stderr: "",
|
|
119
|
+
durationMs: 0,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const osInfo = await sessionManager.getOSInfo(sessionId);
|
|
123
|
+
if (osInfo.platform === "windows") {
|
|
124
|
+
throw createSudoError("Sudo is not supported on Windows hosts", "Use an elevated session instead of sudo commands");
|
|
125
|
+
}
|
|
126
|
+
const timer = createTimer();
|
|
127
|
+
const effectiveTimeoutMs = timeoutMs ?? config.commandTimeoutMs;
|
|
128
|
+
try {
|
|
129
|
+
if (password !== undefined) {
|
|
130
|
+
throw createSudoError("Password-based sudo through MCP inputs is disabled", "Configure a restricted NOPASSWD sudoers allowlist for approved commands.");
|
|
131
|
+
}
|
|
132
|
+
const fullCommand = buildSudoCommand(command, osInfo, cwd);
|
|
133
|
+
const result = await execWithTimeout(session.ssh.execCommand(fullCommand), effectiveTimeoutMs, "Sudo command");
|
|
134
|
+
if ((result.code ?? 0) !== 0 && result.stderr) {
|
|
135
|
+
const stderrLower = result.stderr.toLowerCase();
|
|
136
|
+
if (stderrLower.includes("password") ||
|
|
137
|
+
stderrLower.includes("authentication") ||
|
|
138
|
+
stderrLower.includes("sorry")) {
|
|
139
|
+
throw createSudoError("Sudo authentication failed", "Configure a restricted NOPASSWD sudoers profile for approved commands.");
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const execResult = {
|
|
143
|
+
code: result.code ?? 0,
|
|
144
|
+
stdout: truncateText(result.stdout ?? "", config.maxCommandOutputBytes),
|
|
145
|
+
stderr: truncateText(result.stderr ?? "", config.maxCommandOutputBytes),
|
|
146
|
+
durationMs: timer.elapsed(),
|
|
147
|
+
};
|
|
148
|
+
logger.debug("Sudo command execution completed", {
|
|
149
|
+
sessionId,
|
|
150
|
+
code: execResult.code,
|
|
151
|
+
durationMs: execResult.durationMs,
|
|
152
|
+
});
|
|
153
|
+
return execResult;
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
if (error?.code === ErrorCode.ETIMEOUT) {
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
if (error instanceof Error && error.message.includes("sudo")) {
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
logger.error("Sudo command execution failed", {
|
|
163
|
+
sessionId,
|
|
164
|
+
command,
|
|
165
|
+
error,
|
|
166
|
+
});
|
|
167
|
+
throw wrapError(error, ErrorCode.ENOSUDO, "Failed to execute sudo command on remote system");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async function commandExists(sessionId, command) {
|
|
171
|
+
try {
|
|
172
|
+
const result = await execCommand(sessionId, `which ${command}`);
|
|
173
|
+
return result.code === 0;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function getAvailableShell(sessionId) {
|
|
180
|
+
const shells = ["bash", "zsh", "sh"];
|
|
181
|
+
for (const shell of shells) {
|
|
182
|
+
if (await commandExists(sessionId, shell)) {
|
|
183
|
+
logger.debug("Found available shell", { sessionId, shell });
|
|
184
|
+
return shell;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
logger.warn("No standard shell found, defaulting to sh", { sessionId });
|
|
188
|
+
return "sh";
|
|
189
|
+
}
|
|
190
|
+
async function execWithShell(sessionId, command, cwd, env) {
|
|
191
|
+
const shell = await getAvailableShell(sessionId);
|
|
192
|
+
let fullCommand = command;
|
|
193
|
+
if (env && Object.keys(env).length > 0) {
|
|
194
|
+
const envVars = Object.entries(env)
|
|
195
|
+
.map(([key, value]) => `${key}=${JSON.stringify(value)}`)
|
|
196
|
+
.join(" ");
|
|
197
|
+
fullCommand = `${envVars} ${command}`;
|
|
198
|
+
}
|
|
199
|
+
if (cwd) {
|
|
200
|
+
fullCommand = `cd ${JSON.stringify(cwd)} && ${fullCommand}`;
|
|
201
|
+
}
|
|
202
|
+
return execCommand(sessionId, `${shell} -lc ${JSON.stringify(fullCommand)}`);
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
execCommand,
|
|
206
|
+
execSudo,
|
|
207
|
+
commandExists,
|
|
208
|
+
getAvailableShell,
|
|
209
|
+
execWithShell,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type ToolProfile } from "./connector-profile.js";
|
|
2
|
+
/**
|
|
3
|
+
* Prompt suggestions for AI assistants (ChatGPT, Claude, etc.)
|
|
4
|
+
* These help users understand what they can do with the SSH MCP tool
|
|
5
|
+
*/
|
|
6
|
+
export interface PromptSuggestion {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
prompt: string;
|
|
10
|
+
category: "session" | "command" | "file" | "system" | "package";
|
|
11
|
+
}
|
|
12
|
+
export interface MCPPromptDefinition {
|
|
13
|
+
name: string;
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
arguments?: Array<{
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
required?: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
export declare const PROMPT_SUGGESTIONS: PromptSuggestion[];
|
|
23
|
+
export declare const MCP_PROMPTS: MCPPromptDefinition[];
|
|
24
|
+
export declare function listMCPPrompts(profile?: ToolProfile): {
|
|
25
|
+
prompts: MCPPromptDefinition[];
|
|
26
|
+
};
|
|
27
|
+
export declare function getMCPPrompt(name: string, args?: Record<string, string>, profile?: ToolProfile): {
|
|
28
|
+
description: string;
|
|
29
|
+
messages: {
|
|
30
|
+
role: "user";
|
|
31
|
+
content: {
|
|
32
|
+
type: "text";
|
|
33
|
+
text: string;
|
|
34
|
+
};
|
|
35
|
+
}[];
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Get prompts by category
|
|
39
|
+
*/
|
|
40
|
+
export declare function getPromptsByCategory(category: PromptSuggestion["category"]): PromptSuggestion[];
|
|
41
|
+
/**
|
|
42
|
+
* Get a random subset of prompts for initial suggestions
|
|
43
|
+
*/
|
|
44
|
+
export declare function getRandomPrompts(count?: number): PromptSuggestion[];
|
|
45
|
+
/**
|
|
46
|
+
* Format prompts for display in AI assistant
|
|
47
|
+
*/
|
|
48
|
+
export declare function formatPromptsForDisplay(): string;
|
|
49
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAEhC;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CACjE;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EA0EhD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,mBAAmB,EA6B5C,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,GAAE,WAAoB;;EAO3D;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACjC,OAAO,GAAE,WAAoB;;;;;;;;;EAwB9B;AAkCD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,GAAG,gBAAgB,EAAE,CAE/F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,SAAI,GAAG,gBAAgB,EAAE,CAG9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAgBhD"}
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { filterPromptsForProfile, isPromptAllowedForProfile, } from "./connector-profile.js";
|
|
2
|
+
export const PROMPT_SUGGESTIONS = [
|
|
3
|
+
// Session management
|
|
4
|
+
{
|
|
5
|
+
name: "Connect to Server",
|
|
6
|
+
description: "Open an SSH connection to a remote server",
|
|
7
|
+
prompt: "Connect to my server at hostname with username user1",
|
|
8
|
+
category: "session",
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "List Active Sessions",
|
|
12
|
+
description: "Show all currently active SSH sessions",
|
|
13
|
+
prompt: "Show me all my active SSH sessions",
|
|
14
|
+
category: "session",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: "Check Server Health",
|
|
18
|
+
description: "Ping a session to verify the connection is alive",
|
|
19
|
+
prompt: "Check if my SSH session is still connected",
|
|
20
|
+
category: "session",
|
|
21
|
+
},
|
|
22
|
+
// Command execution
|
|
23
|
+
{
|
|
24
|
+
name: "Run Command",
|
|
25
|
+
description: "Execute a command on the remote server",
|
|
26
|
+
prompt: 'Run "ls -la /var/log" on my server',
|
|
27
|
+
category: "command",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "Check Disk Space",
|
|
31
|
+
description: "Check available disk space on the server",
|
|
32
|
+
prompt: "How much disk space is left on my server?",
|
|
33
|
+
category: "command",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "Get System Info",
|
|
37
|
+
description: "Detect OS, architecture, and system details",
|
|
38
|
+
prompt: "What operating system is running on my server?",
|
|
39
|
+
category: "system",
|
|
40
|
+
},
|
|
41
|
+
// File operations
|
|
42
|
+
{
|
|
43
|
+
name: "Read Configuration",
|
|
44
|
+
description: "Read contents of a configuration file",
|
|
45
|
+
prompt: "Show me the contents of /etc/nginx/nginx.conf",
|
|
46
|
+
category: "file",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "Edit File",
|
|
50
|
+
description: "Modify a configuration file on the server",
|
|
51
|
+
prompt: "Add a new server block to my nginx config",
|
|
52
|
+
category: "file",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "List Directory",
|
|
56
|
+
description: "List files and directories in a path",
|
|
57
|
+
prompt: "List all files in /var/www",
|
|
58
|
+
category: "file",
|
|
59
|
+
},
|
|
60
|
+
// Package management
|
|
61
|
+
{
|
|
62
|
+
name: "Install Package",
|
|
63
|
+
description: "Install a software package on the server",
|
|
64
|
+
prompt: "Install nginx on my server",
|
|
65
|
+
category: "package",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "Manage Service",
|
|
69
|
+
description: "Start, stop, or restart a service",
|
|
70
|
+
prompt: "Restart the nginx service",
|
|
71
|
+
category: "package",
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
export const MCP_PROMPTS = [
|
|
75
|
+
{
|
|
76
|
+
name: "safe-connect",
|
|
77
|
+
title: "Safely connect to an SSH host",
|
|
78
|
+
description: "Open an SSH session using strict host-key verification and explain the safety posture.",
|
|
79
|
+
arguments: [
|
|
80
|
+
{ name: "host", description: "SSH hostname, IP, or configured host alias", required: true },
|
|
81
|
+
{ name: "username", description: "SSH username", required: true },
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: "inspect-host-capabilities",
|
|
86
|
+
title: "Inspect remote host capabilities",
|
|
87
|
+
description: "Detect OS, package manager, init system, SFTP availability, and active policy.",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "plan-mutation",
|
|
91
|
+
title: "Plan a remote change before executing",
|
|
92
|
+
description: "Use explain mode and policy resources to summarize a risky remote change first.",
|
|
93
|
+
arguments: [{ name: "goal", description: "Desired remote change", required: true }],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: "managed-config-change",
|
|
97
|
+
title: "Apply a managed config change",
|
|
98
|
+
description: "Read a config, produce a minimal patch, dry-run it, and apply only if policy allows it.",
|
|
99
|
+
arguments: [{ name: "path", description: "Remote configuration file path", required: true }],
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
export function listMCPPrompts(profile = "full") {
|
|
103
|
+
return {
|
|
104
|
+
prompts: filterPromptsForProfile(MCP_PROMPTS.map((prompt) => ({ ...prompt })), profile),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function getMCPPrompt(name, args = {}, profile = "full") {
|
|
108
|
+
if (!isPromptAllowedForProfile(name, profile)) {
|
|
109
|
+
throw new Error(`Prompt ${name} is not exposed by the ${profile} connector profile`);
|
|
110
|
+
}
|
|
111
|
+
const prompt = MCP_PROMPTS.find((item) => item.name === name);
|
|
112
|
+
if (!prompt) {
|
|
113
|
+
throw new Error(`Unknown prompt: ${name}`);
|
|
114
|
+
}
|
|
115
|
+
const text = renderPrompt(name, args);
|
|
116
|
+
return {
|
|
117
|
+
description: prompt.description,
|
|
118
|
+
messages: [
|
|
119
|
+
{
|
|
120
|
+
role: "user",
|
|
121
|
+
content: {
|
|
122
|
+
type: "text",
|
|
123
|
+
text,
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function renderPrompt(name, args) {
|
|
130
|
+
switch (name) {
|
|
131
|
+
case "safe-connect":
|
|
132
|
+
return [
|
|
133
|
+
"Open a safe SSH session using ssh-mcp-pro.",
|
|
134
|
+
`Host: ${args.host ?? "<host>"}`,
|
|
135
|
+
`Username: ${args.username ?? "<username>"}`,
|
|
136
|
+
"Prefer hostKeyPolicy=strict, verify known_hosts, and do not request root login unless policy explicitly allows it.",
|
|
137
|
+
].join("\n");
|
|
138
|
+
case "inspect-host-capabilities":
|
|
139
|
+
return [
|
|
140
|
+
"Inspect the current SSH MCP environment.",
|
|
141
|
+
"List active sessions, read the effective policy resource, then run os_detect for the chosen session.",
|
|
142
|
+
"Summarize supported tools, SFTP availability, package manager, init system, and any policy restrictions.",
|
|
143
|
+
].join("\n");
|
|
144
|
+
case "plan-mutation":
|
|
145
|
+
return [
|
|
146
|
+
`Goal: ${args.goal ?? "<describe change>"}`,
|
|
147
|
+
"Before executing, use explain mode or read policy resources to produce a concise action plan.",
|
|
148
|
+
"Call out destructive operations, sudo needs, path policy, rollback, and commands/files that would change.",
|
|
149
|
+
].join("\n");
|
|
150
|
+
case "managed-config-change":
|
|
151
|
+
return [
|
|
152
|
+
`Remote file: ${args.path ?? "<path>"}`,
|
|
153
|
+
"Read the file, propose a minimal unified diff, dry-run the patch, then apply only if policy permits.",
|
|
154
|
+
"If the path is denied or the file is too large, stop and explain the safer alternative.",
|
|
155
|
+
].join("\n");
|
|
156
|
+
default:
|
|
157
|
+
return "Use ssh-mcp-pro safely and prefer explain mode before mutations.";
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get prompts by category
|
|
162
|
+
*/
|
|
163
|
+
export function getPromptsByCategory(category) {
|
|
164
|
+
return PROMPT_SUGGESTIONS.filter((p) => p.category === category);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get a random subset of prompts for initial suggestions
|
|
168
|
+
*/
|
|
169
|
+
export function getRandomPrompts(count = 5) {
|
|
170
|
+
const shuffled = [...PROMPT_SUGGESTIONS].sort(() => Math.random() - 0.5);
|
|
171
|
+
return shuffled.slice(0, count);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Format prompts for display in AI assistant
|
|
175
|
+
*/
|
|
176
|
+
export function formatPromptsForDisplay() {
|
|
177
|
+
const categories = ["session", "command", "file", "system", "package"];
|
|
178
|
+
const lines = ["## ssh-mcp-pro - What You Can Do\n"];
|
|
179
|
+
for (const category of categories) {
|
|
180
|
+
const prompts = getPromptsByCategory(category);
|
|
181
|
+
if (prompts.length > 0) {
|
|
182
|
+
lines.push(`### ${category.charAt(0).toUpperCase() + category.slice(1)} Operations`);
|
|
183
|
+
for (const p of prompts) {
|
|
184
|
+
lines.push(`- **${p.name}**: "${p.prompt}"`);
|
|
185
|
+
}
|
|
186
|
+
lines.push("");
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return lines.join("\n");
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for rate limiter
|
|
3
|
+
*/
|
|
4
|
+
export interface RateLimiterConfig {
|
|
5
|
+
/** Maximum number of requests in the window */
|
|
6
|
+
maxRequests: number;
|
|
7
|
+
/** Time window in milliseconds */
|
|
8
|
+
windowMs: number;
|
|
9
|
+
/** Whether to block requests that exceed the limit */
|
|
10
|
+
blockOnLimit: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Rate limit check result
|
|
14
|
+
*/
|
|
15
|
+
export interface RateLimitResult {
|
|
16
|
+
allowed: boolean;
|
|
17
|
+
remaining: number;
|
|
18
|
+
resetIn: number;
|
|
19
|
+
blocked: boolean;
|
|
20
|
+
}
|
|
21
|
+
export type RateLimitCheckOptions = Partial<Pick<RateLimiterConfig, "maxRequests" | "windowMs">>;
|
|
22
|
+
/**
|
|
23
|
+
* Rate limiter using the Sliding Window Log algorithm.
|
|
24
|
+
*/
|
|
25
|
+
export declare class RateLimiter {
|
|
26
|
+
private readonly logs;
|
|
27
|
+
private readonly keyWindowMs;
|
|
28
|
+
private readonly config;
|
|
29
|
+
private cleanupTimer;
|
|
30
|
+
private destroyed;
|
|
31
|
+
constructor(config?: Partial<RateLimiterConfig>);
|
|
32
|
+
/**
|
|
33
|
+
* Check if request is allowed under the rate limit
|
|
34
|
+
*/
|
|
35
|
+
check(key: string, options?: RateLimitCheckOptions): RateLimitResult;
|
|
36
|
+
/**
|
|
37
|
+
* Reset rate limit for a specific key
|
|
38
|
+
*/
|
|
39
|
+
reset(key: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get current usage for a key
|
|
42
|
+
*/
|
|
43
|
+
getUsage(key: string, options?: RateLimitCheckOptions): {
|
|
44
|
+
count: number;
|
|
45
|
+
remaining: number;
|
|
46
|
+
resetIn: number;
|
|
47
|
+
} | null;
|
|
48
|
+
/**
|
|
49
|
+
* Cleanup expired logs
|
|
50
|
+
*/
|
|
51
|
+
private pruneExpiredLogs;
|
|
52
|
+
/**
|
|
53
|
+
* Destroy the rate limiter
|
|
54
|
+
*/
|
|
55
|
+
destroy(): void;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC;AAEjG;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAWnD;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,eAAe;IA6DxE;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMxB;;OAEG;IACH,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,qBAA0B,GAClC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAuB/D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;IACH,OAAO,IAAI,IAAI;CAShB"}
|