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,417 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { McpToolError } from "./tool-result.js";
5
+ const INDEXED_ENV_PREFIX = "SSH_MCP_SERVER_";
6
+ const LEGACY_ENV_PREFIX = "SSH_SERVER_";
7
+ const FIELD_SUFFIXES = [
8
+ { suffix: "PRIVATE_KEY_PATH", field: "privateKeyPath" },
9
+ { suffix: "DISPLAY_NAME", field: "displayName" },
10
+ { suffix: "DEFAULT_DIR", field: "defaultDir" },
11
+ { suffix: "MAX_EDIT_FILE_BYTES", field: "maxEditFileBytes" },
12
+ { suffix: "BACKUP_BEFORE_EDIT", field: "backupBeforeEdit" },
13
+ { suffix: "ALLOW_BINARY_EDIT", field: "allowBinaryEdit" },
14
+ { suffix: "PRIVATE_KEY", field: "privateKey" },
15
+ { suffix: "DESCRIPTION", field: "description" },
16
+ { suffix: "PASSPHRASE", field: "passphrase" },
17
+ { suffix: "ALLOW_DELETE", field: "allowDelete" },
18
+ { suffix: "ALLOW_EDIT", field: "allowEdit" },
19
+ { suffix: "ALIASES", field: "aliases" },
20
+ { suffix: "PLATFORM", field: "platform" },
21
+ { suffix: "PASSWORD", field: "password" },
22
+ { suffix: "USERNAME", field: "username" },
23
+ { suffix: "BACKUP_DIR", field: "backupDir" },
24
+ { suffix: "EDIT_ROOT", field: "editRoot" },
25
+ { suffix: "AGENT", field: "agent" },
26
+ { suffix: "HOST", field: "host" },
27
+ { suffix: "IP", field: "host" },
28
+ { suffix: "PORT", field: "port" },
29
+ { suffix: "USER", field: "username" },
30
+ ];
31
+ export class ProfileRegistry {
32
+ envPath;
33
+ profiles = new Map();
34
+ constructor(envPath) {
35
+ this.envPath = envPath;
36
+ this.reload();
37
+ }
38
+ reload() {
39
+ this.profiles = loadProfilesFromEnvFile(this.envPath);
40
+ return this.list();
41
+ }
42
+ list() {
43
+ return [...this.profiles.values()]
44
+ .map((profile) => publicProfile(profile))
45
+ .sort((left, right) => left.name.localeCompare(right.name));
46
+ }
47
+ get(profileName) {
48
+ const normalizedName = normalizeProfileName(profileName);
49
+ const directProfile = this.profiles.get(normalizedName);
50
+ if (directProfile !== undefined) {
51
+ return directProfile;
52
+ }
53
+ const aliasMatches = [...this.profiles.values()].filter((profile) => profileMatchesName(profile, normalizedName));
54
+ if (aliasMatches.length === 1) {
55
+ const match = aliasMatches[0];
56
+ if (match !== undefined) {
57
+ return match;
58
+ }
59
+ }
60
+ if (aliasMatches.length > 1) {
61
+ throw new McpToolError("ssh_profile_name_ambiguous", "SSH profile name matched multiple profiles", {
62
+ profileName,
63
+ matches: aliasMatches.map((profile) => profile.name),
64
+ envPath: this.envPath,
65
+ });
66
+ }
67
+ {
68
+ throw new McpToolError("ssh_profile_not_found", "SSH profile was not found in .env", {
69
+ profileName,
70
+ envPath: this.envPath,
71
+ });
72
+ }
73
+ }
74
+ sourcePath() {
75
+ return this.envPath;
76
+ }
77
+ }
78
+ export function defaultEnvPath() {
79
+ if (process.env.SSH_MCP_ENV_FILE !== undefined && process.env.SSH_MCP_ENV_FILE.trim().length > 0) {
80
+ return resolve(process.env.SSH_MCP_ENV_FILE);
81
+ }
82
+ return resolve(projectRootFromEntrypoint(), ".env");
83
+ }
84
+ export function loadProfilesFromEnvFile(envPath) {
85
+ if (!existsSync(envPath)) {
86
+ return new Map();
87
+ }
88
+ const variables = parseEnvFile(readFileSync(envPath, "utf8"));
89
+ return parseProfiles(variables, envPath);
90
+ }
91
+ export function parseEnvFile(content) {
92
+ const variables = new Map();
93
+ const lines = content.split(/\r?\n/);
94
+ for (const [lineIndex, line] of lines.entries()) {
95
+ const trimmedLine = line.trim();
96
+ if (trimmedLine.length === 0 || trimmedLine.startsWith("#")) {
97
+ continue;
98
+ }
99
+ const equalsIndex = line.indexOf("=");
100
+ if (equalsIndex < 1) {
101
+ throw new McpToolError("invalid_env_line", "Invalid .env line; expected KEY=value", {
102
+ lineNumber: lineIndex + 1,
103
+ });
104
+ }
105
+ const rawKey = line.slice(0, equalsIndex).trim();
106
+ const key = rawKey.startsWith("export ") ? rawKey.slice("export ".length).trim() : rawKey;
107
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
108
+ throw new McpToolError("invalid_env_key", "Invalid .env key", { lineNumber: lineIndex + 1, key });
109
+ }
110
+ variables.set(key, parseEnvValue(line.slice(equalsIndex + 1), lineIndex + 1));
111
+ }
112
+ return variables;
113
+ }
114
+ export function parseProfiles(variables, sourcePath) {
115
+ const partialProfiles = new Map();
116
+ for (const [key, value] of variables.entries()) {
117
+ assertSupportedProfileKey(key, sourcePath);
118
+ const profileField = parseIndexedProfileField(key);
119
+ if (profileField === undefined) {
120
+ continue;
121
+ }
122
+ const existing = partialProfiles.get(profileField.groupKey) ?? {
123
+ name: "",
124
+ sourcePath,
125
+ };
126
+ if (profileField.field === "profileName") {
127
+ setProfileName(existing, value);
128
+ }
129
+ else {
130
+ setProfileField(existing, profileField.field, value);
131
+ }
132
+ partialProfiles.set(profileField.groupKey, existing);
133
+ }
134
+ const profiles = new Map();
135
+ for (const profile of partialProfiles.values()) {
136
+ const completedProfile = completeProfile(profile);
137
+ if (profiles.has(completedProfile.name)) {
138
+ throw new McpToolError("duplicate_ssh_profile_name", "SSH profile name is duplicated", {
139
+ profileName: completedProfile.name,
140
+ });
141
+ }
142
+ profiles.set(completedProfile.name, completedProfile);
143
+ }
144
+ return profiles;
145
+ }
146
+ function assertSupportedProfileKey(key, sourcePath) {
147
+ if (key.startsWith(LEGACY_ENV_PREFIX)) {
148
+ throw new McpToolError("unsupported_ssh_profile_env_schema", "Unsupported SSH profile env schema", {
149
+ key,
150
+ sourcePath,
151
+ expected: "SSH_MCP_SERVER_<N>_<FIELD>",
152
+ example: "SSH_MCP_SERVER_1_NAME=prod",
153
+ });
154
+ }
155
+ if (!key.startsWith(INDEXED_ENV_PREFIX)) {
156
+ return;
157
+ }
158
+ const profileField = parseIndexedProfileField(key);
159
+ if (profileField !== undefined) {
160
+ return;
161
+ }
162
+ throw new McpToolError("invalid_ssh_profile_env_key", "Invalid SSH profile env key", {
163
+ key,
164
+ sourcePath,
165
+ expected: "SSH_MCP_SERVER_<N>_<FIELD>",
166
+ allowedFields: ["NAME", ...FIELD_SUFFIXES.map((field) => field.suffix)],
167
+ });
168
+ }
169
+ export function publicProfile(profile) {
170
+ const publicValue = {
171
+ name: profile.name,
172
+ host: profile.host,
173
+ port: profile.port,
174
+ username: profile.username,
175
+ sourcePath: profile.sourcePath,
176
+ aliases: profile.aliases,
177
+ hasPassword: profile.password !== undefined,
178
+ hasPrivateKey: profile.privateKey !== undefined,
179
+ hasPrivateKeyPath: profile.privateKeyPath !== undefined,
180
+ hasPassphrase: profile.passphrase !== undefined,
181
+ hasAgent: profile.agent !== undefined,
182
+ allowEdit: profile.allowEdit ?? false,
183
+ backupBeforeEdit: profile.backupBeforeEdit ?? true,
184
+ allowDelete: profile.allowDelete ?? false,
185
+ allowBinaryEdit: profile.allowBinaryEdit ?? false,
186
+ };
187
+ if (profile.displayName !== undefined) {
188
+ publicValue.displayName = profile.displayName;
189
+ }
190
+ if (profile.defaultDir !== undefined) {
191
+ publicValue.defaultDir = profile.defaultDir;
192
+ }
193
+ if (profile.description !== undefined) {
194
+ publicValue.description = profile.description;
195
+ }
196
+ if (profile.platform !== undefined) {
197
+ publicValue.platform = profile.platform;
198
+ }
199
+ if (profile.editRoot !== undefined) {
200
+ publicValue.editRoot = profile.editRoot;
201
+ }
202
+ if (profile.maxEditFileBytes !== undefined) {
203
+ publicValue.maxEditFileBytes = profile.maxEditFileBytes;
204
+ }
205
+ if (profile.backupDir !== undefined) {
206
+ publicValue.backupDir = profile.backupDir;
207
+ }
208
+ return publicValue;
209
+ }
210
+ function parseEnvValue(rawValue, lineNumber) {
211
+ const value = rawValue.trimStart();
212
+ if (value.startsWith('"')) {
213
+ return parseDoubleQuotedValue(value, lineNumber);
214
+ }
215
+ if (value.startsWith("'")) {
216
+ return parseSingleQuotedValue(value, lineNumber);
217
+ }
218
+ const commentIndex = value.search(/\s#/);
219
+ const unquotedValue = commentIndex === -1 ? value : value.slice(0, commentIndex);
220
+ return unquotedValue.trim();
221
+ }
222
+ function parseDoubleQuotedValue(value, lineNumber) {
223
+ let output = "";
224
+ let escaped = false;
225
+ for (let index = 1; index < value.length; index += 1) {
226
+ const char = value[index];
227
+ if (char === undefined) {
228
+ break;
229
+ }
230
+ if (escaped) {
231
+ output += unescapeDoubleQuotedChar(char);
232
+ escaped = false;
233
+ continue;
234
+ }
235
+ if (char === "\\") {
236
+ escaped = true;
237
+ continue;
238
+ }
239
+ if (char === '"') {
240
+ return output;
241
+ }
242
+ output += char;
243
+ }
244
+ throw new McpToolError("invalid_env_value", "Unclosed double-quoted .env value", { lineNumber });
245
+ }
246
+ function parseSingleQuotedValue(value, lineNumber) {
247
+ const closingQuoteIndex = value.indexOf("'", 1);
248
+ if (closingQuoteIndex === -1) {
249
+ throw new McpToolError("invalid_env_value", "Unclosed single-quoted .env value", { lineNumber });
250
+ }
251
+ return value.slice(1, closingQuoteIndex);
252
+ }
253
+ function unescapeDoubleQuotedChar(char) {
254
+ if (char === "n") {
255
+ return "\n";
256
+ }
257
+ if (char === "r") {
258
+ return "\r";
259
+ }
260
+ if (char === "t") {
261
+ return "\t";
262
+ }
263
+ return char;
264
+ }
265
+ function parseIndexedProfileField(key) {
266
+ if (!key.startsWith(INDEXED_ENV_PREFIX)) {
267
+ return undefined;
268
+ }
269
+ const rest = key.slice(INDEXED_ENV_PREFIX.length);
270
+ const separatorIndex = rest.indexOf("_");
271
+ if (separatorIndex < 1) {
272
+ return undefined;
273
+ }
274
+ const index = rest.slice(0, separatorIndex);
275
+ if (!/^[1-9][0-9]*$/.test(index)) {
276
+ return undefined;
277
+ }
278
+ const suffix = rest.slice(separatorIndex + 1);
279
+ if (suffix === "NAME") {
280
+ return {
281
+ groupKey: `indexed:${index}`,
282
+ field: "profileName",
283
+ };
284
+ }
285
+ const profileField = FIELD_SUFFIXES.find((candidate) => candidate.suffix === suffix);
286
+ if (profileField === undefined) {
287
+ return undefined;
288
+ }
289
+ return {
290
+ groupKey: `indexed:${index}`,
291
+ field: profileField.field,
292
+ };
293
+ }
294
+ function setProfileName(profile, value) {
295
+ if (value.trim().length === 0) {
296
+ return;
297
+ }
298
+ profile.name = normalizeProfileName(value);
299
+ }
300
+ function setProfileField(profile, field, value) {
301
+ if (value.length === 0) {
302
+ return;
303
+ }
304
+ if (field === "port") {
305
+ const port = Number.parseInt(value, 10);
306
+ if (!Number.isInteger(port) || port < 1 || port > 65_535) {
307
+ throw new McpToolError("invalid_ssh_profile_port", "SSH profile port must be 1-65535", {
308
+ profileName: profile.name,
309
+ value,
310
+ });
311
+ }
312
+ profile.port = port;
313
+ return;
314
+ }
315
+ if (field === "aliases") {
316
+ profile.aliases = value
317
+ .split(",")
318
+ .map((alias) => alias.trim())
319
+ .filter((alias) => alias.length > 0);
320
+ return;
321
+ }
322
+ if (field === "allowEdit" || field === "backupBeforeEdit" || field === "allowDelete" || field === "allowBinaryEdit") {
323
+ profile[field] = parseBooleanProfileField(field, value, profile.name);
324
+ return;
325
+ }
326
+ if (field === "maxEditFileBytes") {
327
+ profile.maxEditFileBytes = parseIntegerProfileField(field, value, profile.name, 1, 64 * 1024 * 1024);
328
+ return;
329
+ }
330
+ profile[field] = value;
331
+ }
332
+ function completeProfile(profile) {
333
+ if (profile.name.length === 0) {
334
+ throw new McpToolError("invalid_ssh_profile", "SSH profile is missing NAME", { sourcePath: profile.sourcePath });
335
+ }
336
+ if (profile.host === undefined) {
337
+ throw new McpToolError("invalid_ssh_profile", "SSH profile is missing HOST", { profileName: profile.name });
338
+ }
339
+ if (profile.username === undefined) {
340
+ throw new McpToolError("invalid_ssh_profile", "SSH profile is missing USER or USERNAME", {
341
+ profileName: profile.name,
342
+ });
343
+ }
344
+ return {
345
+ name: profile.name,
346
+ host: profile.host,
347
+ port: profile.port ?? 22,
348
+ username: profile.username,
349
+ sourcePath: profile.sourcePath,
350
+ aliases: profile.aliases ?? [],
351
+ ...(profile.password === undefined ? {} : { password: profile.password }),
352
+ ...(profile.privateKey === undefined ? {} : { privateKey: profile.privateKey }),
353
+ ...(profile.privateKeyPath === undefined ? {} : { privateKeyPath: profile.privateKeyPath }),
354
+ ...(profile.passphrase === undefined ? {} : { passphrase: profile.passphrase }),
355
+ ...(profile.agent === undefined ? {} : { agent: profile.agent }),
356
+ ...(profile.displayName === undefined ? {} : { displayName: profile.displayName }),
357
+ ...(profile.defaultDir === undefined ? {} : { defaultDir: profile.defaultDir }),
358
+ ...(profile.description === undefined ? {} : { description: profile.description }),
359
+ ...(profile.platform === undefined ? {} : { platform: profile.platform }),
360
+ ...(profile.allowEdit === undefined ? {} : { allowEdit: profile.allowEdit }),
361
+ ...(profile.editRoot === undefined ? {} : { editRoot: profile.editRoot }),
362
+ ...(profile.maxEditFileBytes === undefined ? {} : { maxEditFileBytes: profile.maxEditFileBytes }),
363
+ ...(profile.backupBeforeEdit === undefined ? {} : { backupBeforeEdit: profile.backupBeforeEdit }),
364
+ ...(profile.backupDir === undefined ? {} : { backupDir: profile.backupDir }),
365
+ ...(profile.allowDelete === undefined ? {} : { allowDelete: profile.allowDelete }),
366
+ ...(profile.allowBinaryEdit === undefined ? {} : { allowBinaryEdit: profile.allowBinaryEdit }),
367
+ };
368
+ }
369
+ function parseBooleanProfileField(field, value, profileName) {
370
+ const normalized = value.trim().toLowerCase();
371
+ if (["true", "1", "yes", "y", "on"].includes(normalized)) {
372
+ return true;
373
+ }
374
+ if (["false", "0", "no", "n", "off"].includes(normalized)) {
375
+ return false;
376
+ }
377
+ throw new McpToolError("invalid_ssh_profile_boolean", "SSH profile boolean field is invalid", {
378
+ profileName,
379
+ field,
380
+ value,
381
+ });
382
+ }
383
+ function parseIntegerProfileField(field, value, profileName, minInclusive, maxInclusive) {
384
+ const parsed = Number.parseInt(value, 10);
385
+ if (!Number.isInteger(parsed) || String(parsed) !== value.trim()) {
386
+ throw new McpToolError("invalid_ssh_profile_integer", "SSH profile integer field is invalid", {
387
+ profileName,
388
+ field,
389
+ value,
390
+ });
391
+ }
392
+ if (parsed < minInclusive || parsed > maxInclusive) {
393
+ throw new McpToolError("invalid_ssh_profile_integer", "SSH profile integer field is outside the allowed range", {
394
+ profileName,
395
+ field,
396
+ value,
397
+ minInclusive,
398
+ maxInclusive,
399
+ });
400
+ }
401
+ return parsed;
402
+ }
403
+ function normalizeProfileName(profileName) {
404
+ return profileName.trim().replace(/[\s-]+/g, "_").toUpperCase();
405
+ }
406
+ function profileMatchesName(profile, normalizedName) {
407
+ return profile.aliases.some((alias) => normalizeProfileName(alias) === normalizedName);
408
+ }
409
+ function projectRootFromEntrypoint() {
410
+ const entrypointDir = dirname(fileURLToPath(import.meta.url));
411
+ const leaf = entrypointDir.replace(/\\/g, "/").split("/").at(-1);
412
+ if (leaf === "dist" || leaf === "src") {
413
+ return dirname(entrypointDir);
414
+ }
415
+ return process.cwd();
416
+ }
417
+ //# sourceMappingURL=env-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-profiles.js","sourceRoot":"","sources":["../src/env-profiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};